Repository: boto/botocore
Pull request #2625 (2022-02-28 18:41:46)

Including additional endpoint data for modeled variants
Merging in additional endpoint data beyond `hostname`, `dnsSuffix` and `tags` for modeled endpoint variants


Patch:
diff --git a/.changes/1.24.9.json b/.changes/1.24.9.json
new file mode 100644
index 000000000..c165e908f
--- /dev/null
+++ b/.changes/1.24.9.json
@@ -0,0 +1,47 @@
+[
+  {
+    "category": "``finspace-data``",
+    "description": "Add new APIs for managing Users and Permission Groups.",
+    "type": "api-change"
+  },
+  {
+    "category": "``amplify``",
+    "description": "Add repositoryCloneMethod field for hosting an Amplify app. This field shows what authorization method is used to clone the repo: SSH, TOKEN, or SIGV4.",
+    "type": "api-change"
+  },
+  {
+    "category": "``fsx``",
+    "description": "This release adds support for the following FSx for OpenZFS features: snapshot lifecycle transition messages, force flag for deleting file systems with child resources, LZ4 data compression, custom record sizes, and unsetting volume quotas and reservations.",
+    "type": "api-change"
+  },
+  {
+    "category": "``fis``",
+    "description": "This release adds logging support for AWS Fault Injection Simulator experiments. Experiment templates can now be configured to send experiment activity logs to Amazon CloudWatch Logs or to an S3 bucket.",
+    "type": "api-change"
+  },
+  {
+    "category": "``route53-recovery-cluster``",
+    "description": "This release adds a new API option to enable overriding safety rules to allow routing control state updates.",
+    "type": "api-change"
+  },
+  {
+    "category": "``amplifyuibuilder``",
+    "description": "We are adding the ability to configure workflows and actions for components.",
+    "type": "api-change"
+  },
+  {
+    "category": "``athena``",
+    "description": "This release adds support for updating an existing named query.",
+    "type": "api-change"
+  },
+  {
+    "category": "``ec2``",
+    "description": "This release adds support for new AMI property 'lastLaunchedTime'",
+    "type": "api-change"
+  },
+  {
+    "category": "``servicecatalog-appregistry``",
+    "description": "AppRegistry is deprecating Application and Attribute-Group Name update feature. In this release, we are marking the name attributes for Update APIs as deprecated to give a heads up to our customers.",
+    "type": "api-change"
+  }
+]
\ No newline at end of file
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 69cb44973..5526e6c85 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,20 @@
 CHANGELOG
 =========
 
+1.24.9
+======
+
+* api-change:``finspace-data``: Add new APIs for managing Users and Permission Groups.
+* api-change:``amplify``: Add repositoryCloneMethod field for hosting an Amplify app. This field shows what authorization method is used to clone the repo: SSH, TOKEN, or SIGV4.
+* api-change:``fsx``: This release adds support for the following FSx for OpenZFS features: snapshot lifecycle transition messages, force flag for deleting file systems with child resources, LZ4 data compression, custom record sizes, and unsetting volume quotas and reservations.
+* api-change:``fis``: This release adds logging support for AWS Fault Injection Simulator experiments. Experiment templates can now be configured to send experiment activity logs to Amazon CloudWatch Logs or to an S3 bucket.
+* api-change:``route53-recovery-cluster``: This release adds a new API option to enable overriding safety rules to allow routing control state updates.
+* api-change:``amplifyuibuilder``: We are adding the ability to configure workflows and actions for components.
+* api-change:``athena``: This release adds support for updating an existing named query.
+* api-change:``ec2``: This release adds support for new AMI property 'lastLaunchedTime'
+* api-change:``servicecatalog-appregistry``: AppRegistry is deprecating Application and Attribute-Group Name update feature. In this release, we are marking the name attributes for Update APIs as deprecated to give a heads up to our customers.
+
+
 1.24.8
 ======
 
diff --git a/botocore/__init__.py b/botocore/__init__.py
index 0710165a7..4c63fae9e 100644
--- a/botocore/__init__.py
+++ b/botocore/__init__.py
@@ -16,7 +16,7 @@ import os
 import re
 import logging
 
-__version__ = '1.24.8'
+__version__ = '1.24.9'
 
 
 class NullHandler(logging.Handler):
diff --git a/botocore/data/amplify/2017-07-25/service-2.json b/botocore/data/amplify/2017-07-25/service-2.json
index ed3e0c902..65b0b2252 100644
--- a/botocore/data/amplify/2017-07-25/service-2.json
+++ b/botocore/data/amplify/2017-07-25/service-2.json
@@ -627,6 +627,7 @@
       "type":"string",
       "max":255,
       "min":1,
+      "pattern":"(?s).+",
       "sensitive":true
     },
     "ActiveJobId":{
@@ -672,7 +673,7 @@
         },
         "repository":{
           "shape":"Repository",
-          "documentation":"<p> The repository for the Amplify app. </p>"
+          "documentation":"<p> The Git repository for the Amplify app. </p>"
         },
         "platform":{
           "shape":"Platform",
@@ -741,6 +742,10 @@
         "autoBranchCreationConfig":{
           "shape":"AutoBranchCreationConfig",
           "documentation":"<p> Describes the automated branch creation configuration for the Amplify app. </p>"
+        },
+        "repositoryCloneMethod":{
+          "shape":"RepositoryCloneMethod",
+          "documentation":"<p>The authentication protocol to use to access the Git repository for an Amplify app. For a GitHub repository, specify <code>TOKEN</code>. For an Amazon Web Services CodeCommit repository, specify <code>SIGV4</code>. For GitLab and Bitbucket repositories, specify <code>SSH</code>.</p>"
         }
       },
       "documentation":"<p> Represents the different branches of a repository for building, deploying, and hosting an Amplify app. </p>"
@@ -783,7 +788,8 @@
     },
     "ArtifactId":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "ArtifactUrl":{
       "type":"string",
@@ -855,7 +861,8 @@
     "AutoBranchCreationPattern":{
       "type":"string",
       "max":2048,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "AutoBranchCreationPatterns":{
       "type":"list",
@@ -864,7 +871,8 @@
     "AutoSubDomainCreationPattern":{
       "type":"string",
       "max":2048,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "AutoSubDomainCreationPatterns":{
       "type":"list",
@@ -914,7 +922,8 @@
     "BackendEnvironmentArn":{
       "type":"string",
       "max":1000,
-      "min":1
+      "min":0,
+      "pattern":"(?s).*"
     },
     "BackendEnvironments":{
       "type":"list",
@@ -932,6 +941,7 @@
     "BasicAuthCredentials":{
       "type":"string",
       "max":2000,
+      "pattern":"(?s).*",
       "sensitive":true
     },
     "Branch":{
@@ -1069,12 +1079,14 @@
     },
     "BranchArn":{
       "type":"string",
-      "max":1000
+      "max":1000,
+      "pattern":"(?s).*"
     },
     "BranchName":{
       "type":"string",
       "max":255,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "Branches":{
       "type":"list",
@@ -1085,7 +1097,9 @@
       "type":"string",
       "documentation":"<p> The build specification (build spec) file for an Amplify app build. </p>",
       "max":25000,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+",
+      "sensitive":true
     },
     "CertificateVerificationDNSRecord":{
       "type":"string",
@@ -1094,17 +1108,20 @@
     "Code":{"type":"string"},
     "CommitId":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "CommitMessage":{
       "type":"string",
-      "max":10000
+      "max":10000,
+      "pattern":"(?s).*"
     },
     "CommitTime":{"type":"timestamp"},
     "Condition":{
       "type":"string",
       "max":2048,
-      "min":1
+      "min":0,
+      "pattern":"(?s).*"
     },
     "Context":{"type":"string"},
     "CreateAppRequest":{
@@ -1475,7 +1492,8 @@
     "CustomHeaders":{
       "type":"string",
       "max":25000,
-      "min":1
+      "min":0,
+      "pattern":"(?s).*"
     },
     "CustomRule":{
       "type":"structure",
@@ -1705,15 +1723,18 @@
     "DeploymentArtifacts":{
       "type":"string",
       "max":1000,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "Description":{
       "type":"string",
-      "max":1000
+      "max":1000,
+      "pattern":"(?s).*"
     },
     "DisplayName":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "DomainAssociation":{
       "type":"structure",
@@ -1776,11 +1797,13 @@
     },
     "DomainName":{
       "type":"string",
-      "max":255
+      "max":64,
+      "pattern":"^(((?!-)[A-Za-z0-9-]{0,62}[A-Za-z0-9])\\.)+((?!-)[A-Za-z0-9-]{1,62}[A-Za-z0-9])(\\.)?$"
     },
     "DomainPrefix":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "DomainStatus":{
       "type":"string",
@@ -1807,16 +1830,19 @@
     "EndTime":{"type":"timestamp"},
     "EnvKey":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "EnvValue":{
       "type":"string",
-      "max":1000
+      "max":5500,
+      "pattern":"(?s).*"
     },
     "EnvironmentName":{
       "type":"string",
       "max":255,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "EnvironmentVariables":{
       "type":"map",
@@ -1834,7 +1860,8 @@
     },
     "FileName":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "FileUploadUrls":{
       "type":"map",
@@ -1843,7 +1870,8 @@
     },
     "Framework":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "GenerateAccessLogsRequest":{
       "type":"structure",
@@ -2123,11 +2151,13 @@
     },
     "JobId":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"[0-9]+"
     },
     "JobReason":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "JobStatus":{
       "type":"string",
@@ -2550,7 +2580,8 @@
     },
     "MD5Hash":{
       "type":"string",
-      "max":32
+      "max":32,
+      "pattern":"(?s).*"
     },
     "MaxResults":{
       "type":"integer",
@@ -2560,11 +2591,13 @@
     "Name":{
       "type":"string",
       "max":255,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "NextToken":{
       "type":"string",
-      "max":2000
+      "max":2000,
+      "pattern":"(?s).*"
     },
     "NotFoundException":{
       "type":"structure",
@@ -2578,11 +2611,15 @@
     "OauthToken":{
       "type":"string",
       "max":1000,
+      "pattern":"(?s).*",
       "sensitive":true
     },
     "Platform":{
       "type":"string",
-      "enum":["WEB"]
+      "enum":[
+        "WEB",
+        "WEB_DYNAMIC"
+      ]
     },
     "ProductionBranch":{
       "type":"structure",
@@ -2608,14 +2645,26 @@
     },
     "PullRequestEnvironmentName":{
       "type":"string",
-      "max":20
+      "max":20,
+      "pattern":"(?s).*"
     },
     "Repository":{
       "type":"string",
-      "max":1000
+      "max":1000,
+      "pattern":"(?s).*"
+    },
+    "RepositoryCloneMethod":{
+      "type":"string",
+      "enum":[
+        "SSH",
+        "TOKEN",
+        "SIGV4"
+      ]
     },
     "ResourceArn":{
       "type":"string",
+      "max":2048,
+      "min":0,
       "pattern":"^arn:aws:amplify:.*"
     },
     "ResourceNotFoundException":{
@@ -2640,21 +2689,25 @@
     "ServiceRoleArn":{
       "type":"string",
       "max":1000,
-      "min":1
+      "min":0,
+      "pattern":"(?s).*"
     },
     "Source":{
       "type":"string",
       "max":2048,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "SourceUrl":{
       "type":"string",
-      "max":1000
+      "max":3000,
+      "pattern":"(?s).*"
     },
     "StackName":{
       "type":"string",
       "max":255,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "Stage":{
       "type":"string",
@@ -2769,7 +2822,8 @@
     "Status":{
       "type":"string",
       "max":7,
-      "min":3
+      "min":3,
+      "pattern":".{3,7}"
     },
     "StatusReason":{
       "type":"string",
@@ -2932,7 +2986,10 @@
     },
     "TTL":{
       "type":"string",
-      "documentation":"<p> The content Time to Live (TTL) for the website in seconds. </p>"
+      "documentation":"<p> The content Time to Live (TTL) for the website in seconds. </p>",
+      "max":32,
+      "min":0,
+      "pattern":"\\d*"
     },
     "TagKey":{
       "type":"string",
@@ -2951,7 +3008,7 @@
       "key":{"shape":"TagKey"},
       "value":{"shape":"TagValue"},
       "max":50,
-      "min":1
+      "min":0
     },
     "TagResourceRequest":{
       "type":"structure",
@@ -2981,12 +3038,14 @@
     },
     "TagValue":{
       "type":"string",
-      "max":256
+      "max":256,
+      "pattern":"^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$"
     },
     "Target":{
       "type":"string",
       "max":2048,
-      "min":1
+      "min":1,
+      "pattern":"(?s).+"
     },
     "TestArtifactsUrl":{
       "type":"string",
@@ -3239,8 +3298,7 @@
       "type":"structure",
       "required":[
         "appId",
-        "domainName",
-        "subDomainSettings"
+        "domainName"
       ],
       "members":{
         "appId":{
@@ -3372,7 +3430,8 @@
     },
     "WebhookId":{
       "type":"string",
-      "max":255
+      "max":255,
+      "pattern":"(?s).*"
     },
     "WebhookUrl":{
       "type":"string",
diff --git a/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json b/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json
index 7cb8a4b8a..a96240484 100644
--- a/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json
+++ b/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json
@@ -11,6 +11,16 @@
       "output_token": "nextToken",
       "limit_key": "maxResults",
       "result_key": "entities"
+    },
+    "ExportComponents": {
+      "input_token": "nextToken",
+      "output_token": "nextToken",
+      "result_key": "entities"
+    },
+    "ExportThemes": {
+      "input_token": "nextToken",
+      "output_token": "nextToken",
+      "result_key": "entities"
     }
   }
 }
diff --git a/botocore/data/amplifyuibuilder/2021-08-11/service-2.json b/botocore/data/amplifyuibuilder/2021-08-11/service-2.json
index 341b14979..c6ef0a47f 100644
--- a/botocore/data/amplifyuibuilder/2021-08-11/service-2.json
+++ b/botocore/data/amplifyuibuilder/2021-08-11/service-2.json
@@ -236,6 +236,48 @@
     }
   },
   "shapes":{
+    "ActionParameters":{
+      "type":"structure",
+      "members":{
+        "anchor":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>The HTML anchor link to the location to open. Specify this value for a navigation action.</p>"
+        },
+        "fields":{
+          "shape":"ComponentProperties",
+          "documentation":"<p>A dictionary of key-value pairs mapping Amplify Studio properties to fields in a data model. Use when the action performs an operation on an Amplify DataStore model.</p>"
+        },
+        "global":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>Specifies whether the user should be signed out globally. Specify this value for an auth sign out action.</p>"
+        },
+        "id":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>The unique ID of the component that the <code>ActionParameters</code> apply to.</p>"
+        },
+        "model":{
+          "shape":"String",
+          "documentation":"<p>The name of the data model. Use when the action performs an operation on an Amplify DataStore model.</p>"
+        },
+        "state":{
+          "shape":"MutationActionSetStateParameter",
+          "documentation":"<p>A key-value pair that specifies the state property name and its initial value.</p>"
+        },
+        "target":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>The element within the same component to modify when the action occurs.</p>"
+        },
+        "type":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>The type of navigation action. Valid values are <code>url</code> and <code>anchor</code>. This value is required for a navigation action.</p>"
+        },
+        "url":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>The URL to the location to open. Specify this value for a navigation action.</p>"
+        }
+      },
+      "documentation":"<p>Represents the event action configuration for an element of a <code>Component</code> or <code>ComponentChild</code>. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components. <code>ActionParameters</code> defines the action that is performed when an event occurs on the component.</p>"
+    },
     "Boolean":{
       "type":"boolean",
       "box":true
@@ -261,7 +303,7 @@
         },
         "bindingProperties":{
           "shape":"ComponentBindingProperties",
-          "documentation":"<p>The information to connect a component's properties to data at runtime.</p>"
+          "documentation":"<p>The information to connect a component's properties to data at runtime. You can't specify <code>tags</code> as a valid property for <code>bindingProperties</code>.</p> <p/>"
         },
         "children":{
           "shape":"ComponentChildList",
@@ -269,7 +311,7 @@
         },
         "collectionProperties":{
           "shape":"ComponentCollectionProperties",
-          "documentation":"<p>The data binding configuration for the component's properties. Use this for a collection component.</p>"
+          "documentation":"<p>The data binding configuration for the component's properties. Use this for a collection component. You can't specify <code>tags</code> as a valid property for <code>collectionProperties</code>.</p>"
         },
         "componentType":{
           "shape":"ComponentType",
@@ -283,6 +325,10 @@
           "shape":"String",
           "documentation":"<p>The name of the backend environment that is a part of the Amplify app.</p>"
         },
+        "events":{
+          "shape":"ComponentEvents",
+          "documentation":"<p>Describes the events that can be raised on the component. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components.</p>"
+        },
         "id":{
           "shape":"Uuid",
           "documentation":"<p>The unique ID of the component.</p>"
@@ -297,11 +343,15 @@
         },
         "overrides":{
           "shape":"ComponentOverrides",
-          "documentation":"<p>Describes the component's properties that can be overriden in a customized instance of the component.</p>"
+          "documentation":"<p>Describes the component's properties that can be overriden in a customized instance of the component. You can't specify <code>tags</code> as a valid property for <code>overrides</code>.</p>"
         },
         "properties":{
           "shape":"ComponentProperties",
-          "documentation":"<p>Describes the component's properties.</p>"
+          "documentation":"<p>Describes the component's properties. You can't specify <code>tags</code> as a valid property for <code>properties</code>.</p>"
+        },
+        "schemaVersion":{
+          "shape":"String",
+          "documentation":"<p>The schema version of the component when it was imported.</p>"
         },
         "sourceId":{
           "shape":"String",
@@ -391,13 +441,17 @@
           "shape":"String",
           "documentation":"<p>The type of the child component. </p>"
         },
+        "events":{
+          "shape":"ComponentEvents",
+          "documentation":"<p>Describes the events that can be raised on the child component. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components.</p>"
+        },
         "name":{
           "shape":"String",
           "documentation":"<p>The name of the child component.</p>"
         },
         "properties":{
           "shape":"ComponentProperties",
-          "documentation":"<p>Describes the properties of the child component.</p>"
+          "documentation":"<p>Describes the properties of the child component. You can't specify <code>tags</code> as a valid property for <code>properties</code>.</p>"
         }
       },
       "documentation":"<p>A nested UI configuration within a parent <code>Component</code>.</p>"
@@ -426,6 +480,10 @@
           "shape":"String",
           "documentation":"<p>The value of the property to evaluate.</p>"
         },
+        "operandType":{
+          "shape":"String",
+          "documentation":"<p>The type of the property to evaluate.</p>"
+        },
         "operator":{
           "shape":"String",
           "documentation":"<p>The operator to use to perform the evaluation, such as <code>eq</code> to represent equals.</p>"
@@ -464,6 +522,25 @@
       },
       "documentation":"<p>Describes the configuration for binding a component's properties to data.</p>"
     },
+    "ComponentEvent":{
+      "type":"structure",
+      "members":{
+        "action":{
+          "shape":"String",
+          "documentation":"<p>The action to perform when a specific event is raised.</p>"
+        },
+        "parameters":{
+          "shape":"ActionParameters",
+          "documentation":"<p>Describes information about the action.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration of an event. You can bind an event and a corresponding action to a <code>Component</code> or a <code>ComponentChild</code>. A button click is an example of an event. </p>"
+    },
+    "ComponentEvents":{
+      "type":"map",
+      "key":{"shape":"String"},
+      "value":{"shape":"ComponentEvent"}
+    },
     "ComponentList":{
       "type":"list",
       "member":{"shape":"Component"}
@@ -503,13 +580,17 @@
           "shape":"ComponentPropertyBindingProperties",
           "documentation":"<p>The information to bind the component property to data at runtime. Use this for collection components.</p>"
         },
+        "componentName":{
+          "shape":"String",
+          "documentation":"<p>The name of the component that is affected by an event.</p>"
+        },
         "concat":{
           "shape":"ComponentPropertyList",
           "documentation":"<p>A list of component properties to concatenate to create the value to assign to this component property.</p>"
         },
         "condition":{
           "shape":"ComponentConditionProperty",
-          "documentation":"<p>The conditional expression to use to assign a value to the component property..</p>"
+          "documentation":"<p>The conditional expression to use to assign a value to the component property.</p>"
         },
         "configured":{
           "shape":"Boolean",
@@ -525,12 +606,16 @@
         },
         "importedValue":{
           "shape":"String",
-          "documentation":"<p>The default value assigned to property when the component is imported into an app.</p>"
+          "documentation":"<p>The default value assigned to the property when the component is imported into an app.</p>"
         },
         "model":{
           "shape":"String",
           "documentation":"<p>The data model to use to assign a value to the component property.</p>"
         },
+        "property":{
+          "shape":"String",
+          "documentation":"<p>The name of the component's property that is affected by an event.</p>"
+        },
         "type":{
           "shape":"String",
           "documentation":"<p>The component type.</p>"
@@ -612,11 +697,11 @@
       "members":{
         "overrides":{
           "shape":"ComponentOverrides",
-          "documentation":"<p>The properties of the component variant that can be overriden when customizing an instance of the component.</p>"
+          "documentation":"<p>The properties of the component variant that can be overriden when customizing an instance of the component. You can't specify <code>tags</code> as a valid property for <code>overrides</code>.</p>"
         },
         "variantValues":{
           "shape":"ComponentVariantValues",
-          "documentation":"<p>The combination of variants that comprise this variant.</p>"
+          "documentation":"<p>The combination of variants that comprise this variant. You can't specify <code>tags</code> as a valid property for <code>variantValues</code>.</p>"
         }
       },
       "documentation":"<p>Describes the style configuration of a unique variation of a main component.</p>"
@@ -657,6 +742,10 @@
           "shape":"ComponentType",
           "documentation":"<p>The component type. This can be an Amplify custom UI component or another custom component.</p>"
         },
+        "events":{
+          "shape":"ComponentEvents",
+          "documentation":"<p>The event configuration for the component. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components.</p>"
+        },
         "name":{
           "shape":"ComponentName",
           "documentation":"<p>The name of the component</p>"
@@ -669,6 +758,10 @@
           "shape":"ComponentProperties",
           "documentation":"<p>Describes the component's properties.</p>"
         },
+        "schemaVersion":{
+          "shape":"String",
+          "documentation":"<p>The schema version of the component when it was imported.</p>"
+        },
         "sourceId":{
           "shape":"String",
           "documentation":"<p>The unique ID of the component in its original source system, such as Figma.</p>"
@@ -932,6 +1025,12 @@
           "documentation":"<p>The name of the backend environment that is a part of the Amplify app.</p>",
           "location":"uri",
           "locationName":"environmentName"
+        },
+        "nextToken":{
+          "shape":"String",
+          "documentation":"<p>The token to request the next page of results.</p>",
+          "location":"querystring",
+          "locationName":"nextToken"
         }
       }
     },
@@ -942,6 +1041,10 @@
         "entities":{
           "shape":"ComponentList",
           "documentation":"<p>Represents the configuration of the exported components.</p>"
+        },
+        "nextToken":{
+          "shape":"String",
+          "documentation":"<p>The pagination token that's included if more results are available.</p>"
         }
       }
     },
@@ -963,6 +1066,12 @@
           "documentation":"<p>The name of the backend environment that is part of the Amplify app.</p>",
           "location":"uri",
           "locationName":"environmentName"
+        },
+        "nextToken":{
+          "shape":"String",
+          "documentation":"<p>The token to request the next page of results.</p>",
+          "location":"querystring",
+          "locationName":"nextToken"
         }
       }
     },
@@ -973,6 +1082,10 @@
         "entities":{
           "shape":"ThemeList",
           "documentation":"<p>Represents the configuration of the exported themes.</p>"
+        },
+        "nextToken":{
+          "shape":"String",
+          "documentation":"<p>The pagination token that's included if more results are available.</p>"
         }
       }
     },
@@ -1209,6 +1322,29 @@
         }
       }
     },
+    "MutationActionSetStateParameter":{
+      "type":"structure",
+      "required":[
+        "componentName",
+        "property",
+        "set"
+      ],
+      "members":{
+        "componentName":{
+          "shape":"String",
+          "documentation":"<p>The name of the component that is being modified.</p>"
+        },
+        "property":{
+          "shape":"String",
+          "documentation":"<p>The name of the component property to apply the state configuration to.</p>"
+        },
+        "set":{
+          "shape":"ComponentProperty",
+          "documentation":"<p>The state configuration to assign to the property.</p>"
+        }
+      },
+      "documentation":"<p>Represents the state configuration when an action modifies a property of another element within the same component.</p>"
+    },
     "Predicate":{
       "type":"structure",
       "members":{
@@ -1535,6 +1671,10 @@
           "shape":"ComponentType",
           "documentation":"<p>The type of the component. This can be an Amplify custom UI component or another custom component.</p>"
         },
+        "events":{
+          "shape":"ComponentEvents",
+          "documentation":"<p>The event configuration for the component. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components.</p>"
+        },
         "id":{
           "shape":"Uuid",
           "documentation":"<p>The unique ID of the component to update.</p>"
@@ -1551,6 +1691,10 @@
           "shape":"ComponentProperties",
           "documentation":"<p>Describes the component's properties.</p>"
         },
+        "schemaVersion":{
+          "shape":"String",
+          "documentation":"<p>The schema version of the component when it was imported.</p>"
+        },
         "sourceId":{
           "shape":"String",
           "documentation":"<p>The unique ID of the component in its original source system, such as Figma.</p>"
@@ -1689,5 +1833,5 @@
     },
     "Uuid":{"type":"string"}
   },
-  "documentation":"<p>The Amplify UI Builder API provides a programmatic interface for creating and configuring user interface (UI) component libraries and themes for use in your Amplify applications. You can then connect these UI components to an application's backend Amazon Web Services resources.</p> <p>You can also use the Amplify Studio visual designer to create UI components and model data for an app. For more information, see <a href=\"https://docs.amplify.aws/console/adminui/intro\">Introduction</a> in the <i>Amplify Docs</i>.</p> <p>The Amplify Framework is a comprehensive set of SDKs, libraries, tools, and documentation for client app development. For more information, see the <a href=\"https://docs.amplify.aws/\">Amplify Framework</a>. For more information about deploying an Amplify application to Amazon Web Services, see the <a href=\"https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html\">Amplify Console User Guide</a>.</p>"
+  "documentation":"<p>The Amplify UI Builder API provides a programmatic interface for creating and configuring user interface (UI) component libraries and themes for use in your Amplify applications. You can then connect these UI components to an application's backend Amazon Web Services resources.</p> <p>You can also use the Amplify Studio visual designer to create UI components and model data for an app. For more information, see <a href=\"https://docs.amplify.aws/console/adminui/intro\">Introduction</a> in the <i>Amplify Docs</i>.</p> <p>The Amplify Framework is a comprehensive set of SDKs, libraries, tools, and documentation for client app development. For more information, see the <a href=\"https://docs.amplify.aws/\">Amplify Framework</a>. For more information about deploying an Amplify application to Amazon Web Services, see the <a href=\"https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html\">Amplify User Guide</a>.</p>"
 }
diff --git a/botocore/data/athena/2017-05-18/service-2.json b/botocore/data/athena/2017-05-18/service-2.json
index c5c51ac08..6f6062d8d 100644
--- a/botocore/data/athena/2017-05-18/service-2.json
+++ b/botocore/data/athena/2017-05-18/service-2.json
@@ -475,6 +475,21 @@
       ],
       "documentation":"<p>Updates the data catalog that has the specified name.</p>"
     },
+    "UpdateNamedQuery":{
+      "name":"UpdateNamedQuery",
+      "http":{
+        "method":"POST",
+        "requestUri":"/"
+      },
+      "input":{"shape":"UpdateNamedQueryInput"},
+      "output":{"shape":"UpdateNamedQueryOutput"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"InvalidRequestException"}
+      ],
+      "documentation":"<p>Updates a <a>NamedQuery</a> object. The database or workgroup cannot be updated.</p>",
+      "idempotent":true
+    },
     "UpdatePreparedStatement":{
       "name":"UpdatePreparedStatement",
       "http":{
@@ -516,14 +531,14 @@
       "members":{
         "ErrorCategory":{
           "shape":"ErrorCategory",
-          "documentation":"<p>An integer value that specifies the category of a query failure error. The following list shows the category for each integer value.</p> <p> <b>1</b> - System</p> <p> <b>2</b> - User</p> <p> <b>3</b> - Unknown</p>"
+          "documentation":"<p>An integer value that specifies the category of a query failure error. The following list shows the category for each integer value.</p> <p> <b>1</b> - System</p> <p> <b>2</b> - User</p> <p> <b>3</b> - Other</p>"
         },
         "ErrorType":{
           "shape":"ErrorType",
           "documentation":"<p>An integer value that provides specific information about an Athena query error. For the meaning of specific values, see the <a href=\"https://docs.aws.amazon.com/athena/latest/ug/error-reference.html#error-reference-error-type-reference\">Error Type Reference</a> in the <i>Amazon Athena User Guide</i>.</p>"
         }
       },
-      "documentation":"<p>Provides information about an Athena query error. The <code>AthenaError</code> feature provides standardized error information to help you understand failed queries and take steps after a query failure occurs. <code>AthenaError</code> includes an <code>ErrorCategory</code> field that specifies whether the cause of the failed query is due to system error, user error, or unknown error.</p>"
+      "documentation":"<p>Provides information about an Athena query error. The <code>AthenaError</code> feature provides standardized error information to help you understand failed queries and take steps after a query failure occurs. <code>AthenaError</code> includes an <code>ErrorCategory</code> field that specifies whether the cause of the failed query is due to system error, user error, or other error.</p>"
     },
     "BatchGetNamedQueryInput":{
       "type":"structure",
@@ -1637,7 +1652,7 @@
         },
         "QueryString":{
           "shape":"QueryString",
-          "documentation":"<p>The SQL query statements that comprise the query.</p>"
+          "documentation":"<p>The SQL statements that make up the query.</p>"
         },
         "NamedQueryId":{
           "shape":"NamedQueryId",
@@ -1648,7 +1663,12 @@
           "documentation":"<p>The name of the workgroup that contains the named query.</p>"
         }
       },
-      "documentation":"<p>A query, where <code>QueryString</code> is the list of SQL query statements that comprise the query.</p>"
+      "documentation":"<p>A query, where <code>QueryString</code> contains the SQL statements that make up the query.</p>"
+    },
+    "NamedQueryDescriptionString":{
+      "type":"string",
+      "max":1024,
+      "min":0
     },
     "NamedQueryId":{"type":"string"},
     "NamedQueryIdList":{
@@ -1927,7 +1947,7 @@
           "documentation":"<p>The metadata that describes the column structure and data types of a table of query results.</p>"
         }
       },
-      "documentation":"<p>The metadata and rows that comprise a query result set. The metadata describes the column structure and data types. To return a <code>ResultSet</code> object, use <a>GetQueryResults</a>.</p>"
+      "documentation":"<p>The metadata and rows that make up a query result set. The metadata describes the column structure and data types. To return a <code>ResultSet</code> object, use <a>GetQueryResults</a>.</p>"
     },
     "ResultSetMetadata":{
       "type":"structure",
@@ -1947,7 +1967,7 @@
           "documentation":"<p>The data that populates a row in a query result table.</p>"
         }
       },
-      "documentation":"<p>The rows that comprise a query result table.</p>"
+      "documentation":"<p>The rows that make up a query result table.</p>"
     },
     "RowList":{
       "type":"list",
@@ -2239,6 +2259,37 @@
       "members":{
       }
     },
+    "UpdateNamedQueryInput":{
+      "type":"structure",
+      "required":[
+        "NamedQueryId",
+        "Name",
+        "QueryString"
+      ],
+      "members":{
+        "NamedQueryId":{
+          "shape":"NamedQueryId",
+          "documentation":"<p>The unique identifier (UUID) of the query.</p>"
+        },
+        "Name":{
+          "shape":"NameString",
+          "documentation":"<p>The name of the query.</p>"
+        },
+        "Description":{
+          "shape":"NamedQueryDescriptionString",
+          "documentation":"<p>The query description.</p>"
+        },
+        "QueryString":{
+          "shape":"QueryString",
+          "documentation":"<p>The contents of the query with all query statements.</p>"
+        }
+      }
+    },
+    "UpdateNamedQueryOutput":{
+      "type":"structure",
+      "members":{
+      }
+    },
     "UpdatePreparedStatementInput":{
       "type":"structure",
       "required":[
diff --git a/botocore/data/ec2/2016-11-15/service-2.json b/botocore/data/ec2/2016-11-15/service-2.json
index 534504372..19cfa159f 100644
--- a/botocore/data/ec2/2016-11-15/service-2.json
+++ b/botocore/data/ec2/2016-11-15/service-2.json
@@ -27665,7 +27665,13 @@
         },
         "BootMode":{
           "shape":"AttributeValue",
+          "documentation":"<p>The boot mode.</p>",
           "locationName":"bootMode"
+        },
+        "LastLaunchedTime":{
+          "shape":"AttributeValue",
+          "documentation":"<p>The date and time, in <a href=\"http://www.iso.org/iso/iso8601\">ISO 8601 date-time format</a>, when the AMI was last used to launch an EC2 instance. When the AMI is used, there is a 24-hour delay before that usage is reported.</p> <note> <p> <code>lastLaunchedTime</code> data is available starting April 2017.</p> </note>",
+          "locationName":"lastLaunchedTime"
         }
       },
       "documentation":"<p>Describes an image attribute.</p>"
@@ -27680,7 +27686,8 @@
         "productCodes",
         "blockDeviceMapping",
         "sriovNetSupport",
-        "bootMode"
+        "bootMode",
+        "lastLaunchedTime"
       ]
     },
     "ImageDiskContainer":{
@@ -42201,6 +42208,7 @@
         "spot-fleet-request",
         "spot-instances-request",
         "subnet",
+        "subnet-cidr-reservation",
         "traffic-mirror-filter",
         "traffic-mirror-session",
         "traffic-mirror-target",
diff --git a/botocore/data/endpoints.json b/botocore/data/endpoints.json
index 32ccdb69a..3e2e236f0 100644
--- a/botocore/data/endpoints.json
+++ b/botocore/data/endpoints.json
@@ -1599,6 +1599,7 @@
       },
       "braket" : {
         "endpoints" : {
+          "eu-west-2" : { },
           "us-east-1" : { },
           "us-west-1" : { },
           "us-west-2" : { }
diff --git a/botocore/data/finspace-data/2020-07-13/paginators-1.json b/botocore/data/finspace-data/2020-07-13/paginators-1.json
index 59f6af47d..aa6632a20 100644
--- a/botocore/data/finspace-data/2020-07-13/paginators-1.json
+++ b/botocore/data/finspace-data/2020-07-13/paginators-1.json
@@ -17,6 +17,18 @@
       "output_token": "nextToken",
       "limit_key": "maxResults",
       "result_key": "datasets"
+    },
+    "ListPermissionGroups": {
+      "input_token": "nextToken",
+      "output_token": "nextToken",
+      "limit_key": "maxResults",
+      "result_key": "permissionGroups"
+    },
+    "ListUsers": {
+      "input_token": "nextToken",
+      "output_token": "nextToken",
+      "limit_key": "maxResults",
+      "result_key": "users"
     }
   }
 }
diff --git a/botocore/data/finspace-data/2020-07-13/service-2.json b/botocore/data/finspace-data/2020-07-13/service-2.json
index 90814ca7f..9b2657cd6 100644
--- a/botocore/data/finspace-data/2020-07-13/service-2.json
+++ b/botocore/data/finspace-data/2020-07-13/service-2.json
@@ -69,6 +69,42 @@
       ],
       "documentation":"<p>Creates a new FinSpace Dataset.</p>"
     },
+    "CreatePermissionGroup":{
+      "name":"CreatePermissionGroup",
+      "http":{
+        "method":"POST",
+        "requestUri":"/permission-group"
+      },
+      "input":{"shape":"CreatePermissionGroupRequest"},
+      "output":{"shape":"CreatePermissionGroupResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"LimitExceededException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Creates a group of permissions for various actions that a user can perform in FinSpace.</p>"
+    },
+    "CreateUser":{
+      "name":"CreateUser",
+      "http":{
+        "method":"POST",
+        "requestUri":"/user"
+      },
+      "input":{"shape":"CreateUserRequest"},
+      "output":{"shape":"CreateUserResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"LimitExceededException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Creates a new user in FinSpace.</p>"
+    },
     "DeleteDataset":{
       "name":"DeleteDataset",
       "http":{
@@ -88,6 +124,62 @@
       ],
       "documentation":"<p>Deletes a FinSpace Dataset.</p>"
     },
+    "DeletePermissionGroup":{
+      "name":"DeletePermissionGroup",
+      "http":{
+        "method":"DELETE",
+        "requestUri":"/permission-group/{permissionGroupId}"
+      },
+      "input":{"shape":"DeletePermissionGroupRequest"},
+      "output":{"shape":"DeletePermissionGroupResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"LimitExceededException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Deletes a permission group. This action is irreversible.</p>"
+    },
+    "DisableUser":{
+      "name":"DisableUser",
+      "http":{
+        "method":"POST",
+        "requestUri":"/user/{userId}/disable"
+      },
+      "input":{"shape":"DisableUserRequest"},
+      "output":{"shape":"DisableUserResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Denies access to the FinSpace web application and API for the specified user.</p>"
+    },
+    "EnableUser":{
+      "name":"EnableUser",
+      "http":{
+        "method":"POST",
+        "requestUri":"/user/{userId}/enable"
+      },
+      "input":{"shape":"EnableUserRequest"},
+      "output":{"shape":"EnableUserResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"LimitExceededException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p> Allows the specified user to access the FinSpace web application and API.</p>"
+    },
     "GetChangeset":{
       "name":"GetChangeset",
       "http":{
@@ -157,6 +249,23 @@
       ],
       "documentation":"<p>Request programmatic credentials to use with FinSpace SDK.</p>"
     },
+    "GetUser":{
+      "name":"GetUser",
+      "http":{
+        "method":"GET",
+        "requestUri":"/user/{userId}"
+      },
+      "input":{"shape":"GetUserRequest"},
+      "output":{"shape":"GetUserResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"}
+      ],
+      "documentation":"<p>Retrieves details for a specific user.</p>"
+    },
     "GetWorkingLocation":{
       "name":"GetWorkingLocation",
       "http":{
@@ -225,6 +334,56 @@
       ],
       "documentation":"<p>Lists all of the active Datasets that a user has access to.</p>"
     },
+    "ListPermissionGroups":{
+      "name":"ListPermissionGroups",
+      "http":{
+        "method":"GET",
+        "requestUri":"/permission-group"
+      },
+      "input":{"shape":"ListPermissionGroupsRequest"},
+      "output":{"shape":"ListPermissionGroupsResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Lists all available permission groups in FinSpace.</p>"
+    },
+    "ListUsers":{
+      "name":"ListUsers",
+      "http":{
+        "method":"GET",
+        "requestUri":"/user"
+      },
+      "input":{"shape":"ListUsersRequest"},
+      "output":{"shape":"ListUsersResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Lists all available user accounts in FinSpace.</p>"
+    },
+    "ResetUserPassword":{
+      "name":"ResetUserPassword",
+      "http":{
+        "method":"POST",
+        "requestUri":"/user/{userId}/password"
+      },
+      "input":{"shape":"ResetUserPasswordRequest"},
+      "output":{"shape":"ResetUserPasswordResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Resets the password for a specified user ID and generates a temporary one. Only a superuser can reset password for other users. Resetting the password immediately invalidates the previous password associated with the user.</p>"
+    },
     "UpdateChangeset":{
       "name":"UpdateChangeset",
       "http":{
@@ -260,6 +419,42 @@
         {"shape":"ResourceNotFoundException"}
       ],
       "documentation":"<p>Updates a FinSpace Dataset.</p>"
+    },
+    "UpdatePermissionGroup":{
+      "name":"UpdatePermissionGroup",
+      "http":{
+        "method":"PUT",
+        "requestUri":"/permission-group/{permissionGroupId}"
+      },
+      "input":{"shape":"UpdatePermissionGroupRequest"},
+      "output":{"shape":"UpdatePermissionGroupResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Modifies the details of a permission group. You cannot modify a <code>permissionGroupID</code>.</p>"
+    },
+    "UpdateUser":{
+      "name":"UpdateUser",
+      "http":{
+        "method":"PUT",
+        "requestUri":"/user/{userId}"
+      },
+      "input":{"shape":"UpdateUserRequest"},
+      "output":{"shape":"UpdateUserResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"ThrottlingException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"}
+      ],
+      "documentation":"<p>Modifies the details of the specified user account. You cannot update the <code>userId</code> for a user.</p>"
     }
   },
   "shapes":{
@@ -278,6 +473,29 @@
       "min":1,
       "pattern":"^alias\\/\\S+"
     },
+    "ApiAccess":{
+      "type":"string",
+      "enum":[
+        "ENABLED",
+        "DISABLED"
+      ]
+    },
+    "ApplicationPermission":{
+      "type":"string",
+      "enum":[
+        "CreateDataset",
+        "ManageClusters",
+        "ManageUsersAndGroups",
+        "ManageAttributeSets",
+        "ViewAuditData",
+        "AccessNotebooks",
+        "GetTemporaryCredentials"
+      ]
+    },
+    "ApplicationPermissionList":{
+      "type":"list",
+      "member":{"shape":"ApplicationPermission"}
+    },
     "Boolean":{
       "type":"boolean",
       "documentation":"Common Boolean data type"
@@ -304,7 +522,7 @@
         },
         "errorCategory":{
           "shape":"ErrorCategory",
-          "documentation":"<p>The category of the error.</p> <ul> <li> <p> <code>VALIDATION</code> -The inputs to this request are invalid.</p> </li> <li> <p> <code>SERVICE_QUOTA_EXCEEDED</code> - Service quotas have been exceeded. Please contact AWS support to increase quotas.</p> </li> <li> <p> <code>ACCESS_DENIED</code> - Missing required permission to perform this request.</p> </li> <li> <p> <code>RESOURCE_NOT_FOUND</code> - One or more inputs to this request were not found.</p> </li> <li> <p> <code>THROTTLING</code> - The system temporarily lacks sufficient resources to process the request.</p> </li> <li> <p> <code>INTERNAL_SERVICE_EXCEPTION</code> - An internal service error has occurred.</p> </li> <li> <p> <code>CANCELLED</code> - Cancelled.</p> </li> <li> <p> <code>USER_RECOVERABLE</code> - A user recoverable error has occurred.</p> </li> </ul>"
+          "documentation":"<p>The category of the error.</p> <ul> <li> <p> <code>VALIDATION</code> – The inputs to this request are invalid.</p> </li> <li> <p> <code>SERVICE_QUOTA_EXCEEDED</code> – Service quotas have been exceeded. Please contact AWS support to increase quotas.</p> </li> <li> <p> <code>ACCESS_DENIED</code> – Missing required permission to perform this request.</p> </li> <li> <p> <code>RESOURCE_NOT_FOUND</code> – One or more inputs to this request were not found.</p> </li> <li> <p> <code>THROTTLING</code> – The system temporarily lacks sufficient resources to process the request.</p> </li> <li> <p> <code>INTERNAL_SERVICE_EXCEPTION</code> – An internal service error has occurred.</p> </li> <li> <p> <code>CANCELLED</code> – Cancelled.</p> </li> <li> <p> <code>USER_RECOVERABLE</code> – A user recoverable error has occurred.</p> </li> </ul>"
         }
       },
       "documentation":"<p>The structure with error messages.</p>"
@@ -337,7 +555,7 @@
         },
         "changeType":{
           "shape":"ChangeType",
-          "documentation":"<p>Type that indicates how a Changeset is applied to a Dataset.</p> <ul> <li> <p> <code>REPLACE</code> - Changeset is considered as a replacement to all prior loaded Changesets.</p> </li> <li> <p> <code>APPEND</code> - Changeset is considered as an addition to the end of all prior loaded Changesets.</p> </li> <li> <p> <code>MODIFY</code> - Changeset is considered as a replacement to a specific prior ingested Changeset.</p> </li> </ul>"
+          "documentation":"<p>Type that indicates how a Changeset is applied to a Dataset.</p> <ul> <li> <p> <code>REPLACE</code> – Changeset is considered as a replacement to all prior loaded Changesets.</p> </li> <li> <p> <code>APPEND</code> – Changeset is considered as an addition to the end of all prior loaded Changesets.</p> </li> <li> <p> <code>MODIFY</code> – Changeset is considered as a replacement to a specific prior ingested Changeset.</p> </li> </ul>"
         },
         "sourceParams":{
           "shape":"SourceParams",
@@ -349,11 +567,11 @@
         },
         "createTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The timestamp at which the Changeset was created in FinSpace. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The timestamp at which the Changeset was created in FinSpace. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "status":{
           "shape":"IngestionStatus",
-          "documentation":"<p>Status of the Changeset ingestion.</p> <ul> <li> <p> <code>PENDING</code> - Changeset is pending creation.</p> </li> <li> <p> <code>FAILED</code> - Changeset creation has failed.</p> </li> <li> <p> <code>SUCCESS</code> - Changeset creation has succeeded.</p> </li> <li> <p> <code>RUNNING</code> - Changeset creation is running.</p> </li> <li> <p> <code>STOP_REQUESTED</code> - User requested Changeset creation to stop.</p> </li> </ul>"
+          "documentation":"<p>Status of the Changeset ingestion.</p> <ul> <li> <p> <code>PENDING</code> – Changeset is pending creation.</p> </li> <li> <p> <code>FAILED</code> – Changeset creation has failed.</p> </li> <li> <p> <code>SUCCESS</code> – Changeset creation has succeeded.</p> </li> <li> <p> <code>RUNNING</code> – Changeset creation is running.</p> </li> <li> <p> <code>STOP_REQUESTED</code> – User requested Changeset creation to stop.</p> </li> </ul>"
         },
         "errorInfo":{
           "shape":"ChangesetErrorInfo",
@@ -361,12 +579,12 @@
         },
         "activeUntilTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Time until which the Changeset is active. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Time until which the Changeset is active. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "activeFromTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Beginning time from which the Changeset is active. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Beginning time from which the Changeset is active. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "updatesChangesetId":{
@@ -410,11 +628,11 @@
       "members":{
         "dataType":{
           "shape":"ColumnDataType",
-          "documentation":"<p>Data type of a column.</p> <ul> <li> <p> <code>STRING</code> - A String data type.</p> <p> <code>CHAR</code> - A char data type.</p> <p> <code>INTEGER</code> - An integer data type.</p> <p> <code>TINYINT</code> - A tinyint data type.</p> <p> <code>SMALLINT</code> - A smallint data type.</p> <p> <code>BIGINT</code> - A bigint data type.</p> <p> <code>FLOAT</code> - A float data type.</p> <p> <code>DOUBLE</code> - A double data type.</p> <p> <code>DATE</code> - A date data type.</p> <p> <code>DATETIME</code> - A datetime data type.</p> <p> <code>BOOLEAN</code> - A boolean data type.</p> <p> <code>BINARY</code> - A binary data type.</p> </li> </ul>"
+          "documentation":"<p>Data type of a column.</p> <ul> <li> <p> <code>STRING</code> – A String data type.</p> <p> <code>CHAR</code> – A char data type.</p> <p> <code>INTEGER</code> – An integer data type.</p> <p> <code>TINYINT</code> – A tinyint data type.</p> <p> <code>SMALLINT</code> – A smallint data type.</p> <p> <code>BIGINT</code> – A bigint data type.</p> <p> <code>FLOAT</code> – A float data type.</p> <p> <code>DOUBLE</code> – A double data type.</p> <p> <code>DATE</code> – A date data type.</p> <p> <code>DATETIME</code> – A datetime data type.</p> <p> <code>BOOLEAN</code> – A boolean data type.</p> <p> <code>BINARY</code> – A binary data type.</p> </li> </ul>"
         },
         "columnName":{
           "shape":"ColumnName",
-          "documentation":"<p>Name for a column.</p>"
+          "documentation":"<p>The name of a column.</p>"
         },
         "columnDescription":{
           "shape":"ColumnDescription",
@@ -448,7 +666,8 @@
     "ConflictException":{
       "type":"structure",
       "members":{
-        "message":{"shape":"errorMessage"}
+        "message":{"shape":"errorMessage"},
+        "reason":{"shape":"errorMessage"}
       },
       "documentation":"<p>The request conflicts with an existing resource.</p>",
       "error":{"httpStatusCode":409},
@@ -476,15 +695,15 @@
         },
         "changeType":{
           "shape":"ChangeType",
-          "documentation":"<p>Option to indicate how a Changeset will be applied to a Dataset.</p> <ul> <li> <p> <code>REPLACE</code> - Changeset will be considered as a replacement to all prior loaded Changesets.</p> </li> <li> <p> <code>APPEND</code> - Changeset will be considered as an addition to the end of all prior loaded Changesets.</p> </li> <li> <p> <code>MODIFY</code> - Changeset is considered as a replacement to a specific prior ingested Changeset.</p> </li> </ul>"
+          "documentation":"<p>The option to indicate how a Changeset will be applied to a Dataset.</p> <ul> <li> <p> <code>REPLACE</code> – Changeset will be considered as a replacement to all prior loaded Changesets.</p> </li> <li> <p> <code>APPEND</code> – Changeset will be considered as an addition to the end of all prior loaded Changesets.</p> </li> <li> <p> <code>MODIFY</code> – Changeset is considered as a replacement to a specific prior ingested Changeset.</p> </li> </ul>"
         },
         "sourceParams":{
           "shape":"SourceParams",
-          "documentation":"<p>Options that define the location of the data being ingested (<code>s3SourcePath</code>) and the source of the changeset (<code>sourceType</code>).</p> <p>Both <code>s3SourcePath</code> and <code>sourceType</code> are required attributes.</p> <p>Here is an example of how you could specify the <code>sourceParams</code>:</p> <p> <code> \"sourceParams\": { \"s3SourcePath\": \"s3://finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d/scratch/wr5hh8pwkpqqkxa4sxrmcw/ingestion/equity.csv\", \"sourceType\": \"S3\" } </code> </p> <p>The S3 path that you specify must allow the FinSpace role access. To do that, you first need to configure the IAM policy on S3 bucket. For more information, see <a href=\"https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets\">Loading data from an Amazon S3 Bucket using the FinSpace API</a>section.</p>"
+          "documentation":"<p>Options that define the location of the data being ingested (<code>s3SourcePath</code>) and the source of the changeset (<code>sourceType</code>).</p> <p>Both <code>s3SourcePath</code> and <code>sourceType</code> are required attributes.</p> <p>Here is an example of how you could specify the <code>sourceParams</code>:</p> <p> <code> \"sourceParams\": { \"s3SourcePath\": \"s3://finspace-landing-us-east-2-bk7gcfvitndqa6ebnvys4d/scratch/wr5hh8pwkpqqkxa4sxrmcw/ingestion/equity.csv\", \"sourceType\": \"S3\" } </code> </p> <p>The S3 path that you specify must allow the FinSpace role access. To do that, you first need to configure the IAM policy on S3 bucket. For more information, see <a href=\"https://docs.aws.amazon.com/finspace/latest/data-api/fs-using-the-finspace-api.html#access-s3-buckets\">Loading data from an Amazon S3 Bucket using the FinSpace API</a> section.</p>"
         },
         "formatParams":{
           "shape":"FormatParams",
-          "documentation":"<p>Options that define the structure of the source file(s) including the format type (<code>formatType</code>), header row (<code>withHeader</code>), data separation character (<code>separator</code>) and the type of compression (<code>compression</code>). </p> <p> <code>formatType</code> is a required attribute and can have the following values: </p> <ul> <li> <p> <code>PARQUET</code> - Parquet source file format.</p> </li> <li> <p> <code>CSV</code> - CSV source file format.</p> </li> <li> <p> <code>JSON</code> - JSON source file format.</p> </li> <li> <p> <code>XML</code> - XML source file format.</p> </li> </ul> <p>Here is an example of how you could specify the <code>formatParams</code>:</p> <p> <code> \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } </code> </p> <p>Note that if you only provide <code>formatType</code> as <code>CSV</code>, the rest of the attributes will automatically default to CSV values as following:</p> <p> <code> { \"withHeader\": \"true\", \"separator\": \",\" } </code> </p> <p> For more information about supported file formats, see <a href=\"https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html\">Supported Data Types and File Formats</a> in the FinSpace User Guide.</p>"
+          "documentation":"<p>Options that define the structure of the source file(s) including the format type (<code>formatType</code>), header row (<code>withHeader</code>), data separation character (<code>separator</code>) and the type of compression (<code>compression</code>). </p> <p> <code>formatType</code> is a required attribute and can have the following values: </p> <ul> <li> <p> <code>PARQUET</code> – Parquet source file format.</p> </li> <li> <p> <code>CSV</code> – CSV source file format.</p> </li> <li> <p> <code>JSON</code> – JSON source file format.</p> </li> <li> <p> <code>XML</code> – XML source file format.</p> </li> </ul> <p>Here is an example of how you could specify the <code>formatParams</code>:</p> <p> <code> \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } </code> </p> <p>Note that if you only provide <code>formatType</code> as <code>CSV</code>, the rest of the attributes will automatically default to CSV values as following:</p> <p> <code> { \"withHeader\": \"true\", \"separator\": \",\" } </code> </p> <p> For more information about supported file formats, see <a href=\"https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html\">Supported Data Types and File Formats</a> in the FinSpace User Guide.</p>"
         }
       },
       "documentation":"The request for a CreateChangeset operation."
@@ -535,7 +754,7 @@
         },
         "asOfTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Beginning time to use for the Dataview. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Beginning time to use for the Dataview. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "destinationTypeParams":{
@@ -578,7 +797,7 @@
         },
         "kind":{
           "shape":"DatasetKind",
-          "documentation":"<p>The format in which Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> - Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> - Data is structured in a non-tabular format.</p> </li> </ul>"
+          "documentation":"<p>The format in which Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> – Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> – Data is structured in a non-tabular format.</p> </li> </ul>"
         },
         "datasetDescription":{
           "shape":"DatasetDescription",
@@ -613,6 +832,88 @@
       },
       "documentation":"The response from a CreateDataset operation"
     },
+    "CreatePermissionGroupRequest":{
+      "type":"structure",
+      "required":[
+        "name",
+        "applicationPermissions"
+      ],
+      "members":{
+        "name":{
+          "shape":"PermissionGroupName",
+          "documentation":"<p>The name of the permission group.</p>"
+        },
+        "description":{
+          "shape":"PermissionGroupDescription",
+          "documentation":"<p>A brief description for the permission group.</p>"
+        },
+        "applicationPermissions":{
+          "shape":"ApplicationPermissionList",
+          "documentation":"<p>The option to indicate FinSpace application permissions that are granted to a specific group.</p> <ul> <li> <p> <code>CreateDataset</code> – Group members can create new datasets.</p> </li> <li> <p> <code>ManageClusters</code> – Group members can manage Apache Spark clusters from FinSpace notebooks.</p> </li> <li> <p> <code>ManageUsersAndGroups</code> – Group members can manage users and permission groups.</p> </li> <li> <p> <code>ManageAttributeSets</code> – Group members can manage attribute sets.</p> </li> <li> <p> <code>ViewAuditData</code> – Group members can view audit data.</p> </li> <li> <p> <code>AccessNotebooks</code> – Group members will have access to FinSpace notebooks.</p> </li> <li> <p> <code>GetTemporaryCredentials</code> – Group members can get temporary API credentials.</p> </li> </ul>"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "CreatePermissionGroupResponse":{
+      "type":"structure",
+      "members":{
+        "permissionGroupId":{
+          "shape":"PermissionGroupId",
+          "documentation":"<p>The unique identifier for the permission group.</p>"
+        }
+      }
+    },
+    "CreateUserRequest":{
+      "type":"structure",
+      "required":[
+        "emailAddress",
+        "type"
+      ],
+      "members":{
+        "emailAddress":{
+          "shape":"Email",
+          "documentation":"<p>The email address of the user that you want to register. The email address serves as a uniquer identifier for each user and cannot be changed after it's created.</p>"
+        },
+        "type":{
+          "shape":"UserType",
+          "documentation":"<p>The option to indicate the type of user. Use one of the following options to specify this parameter:</p> <ul> <li> <p> <code>SUPER_USER</code> – A user with permission to all the functionality and data in FinSpace.</p> </li> <li> <p> <code>APP_USER</code> – A user with specific permissions in FinSpace. The users are assigned permissions by adding them to a permission group.</p> </li> </ul>"
+        },
+        "firstName":{
+          "shape":"FirstName",
+          "documentation":"<p>The first name of the user that you want to register.</p>"
+        },
+        "lastName":{
+          "shape":"LastName",
+          "documentation":"<p>The last name of the user that you want to register.</p>"
+        },
+        "ApiAccess":{
+          "shape":"ApiAccess",
+          "documentation":"<p>The option to indicate whether the user can use the <code>GetProgrammaticAccessCredentials</code> API to obtain credentials that can then be used to access other FinSpace Data API operations.</p> <ul> <li> <p> <code>ENABLED</code> – The user has permissions to use the APIs.</p> </li> <li> <p> <code>DISABLED</code> – The user does not have permissions to use any APIs.</p> </li> </ul>"
+        },
+        "apiAccessPrincipalArn":{
+          "shape":"RoleArn",
+          "documentation":"<p>The ARN identifier of an AWS user or role that is allowed to call the <code>GetProgrammaticAccessCredentials</code> API to obtain a credentials token for a specific FinSpace user. This must be an IAM role within your FinSpace account.</p>"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "CreateUserResponse":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the user.</p>"
+        }
+      }
+    },
     "Credentials":{
       "type":"structure",
       "members":{
@@ -645,11 +946,11 @@
       "members":{
         "destinationType":{
           "shape":"DataViewDestinationType",
-          "documentation":"<p>Destination type for a Dataview.</p> <ul> <li> <p> <code>GLUE_TABLE</code> - Glue table destination type.</p> </li> <li> <p> <code>S3</code> - S3 destination type.</p> </li> </ul>"
+          "documentation":"<p>Destination type for a Dataview.</p> <ul> <li> <p> <code>GLUE_TABLE</code> – Glue table destination type.</p> </li> <li> <p> <code>S3</code> – S3 destination type.</p> </li> </ul>"
         },
         "s3DestinationExportFileFormat":{
           "shape":"ExportFileFormat",
-          "documentation":"<p>Data view export file format.</p> <ul> <li> <p> <code>PARQUET</code> - Parquet export file format.</p> </li> <li> <p> <code>DELIMITED_TEXT</code> - Delimited text export file format.</p> </li> </ul>"
+          "documentation":"<p>Data view export file format.</p> <ul> <li> <p> <code>PARQUET</code> – Parquet export file format.</p> </li> <li> <p> <code>DELIMITED_TEXT</code> – Delimited text export file format.</p> </li> </ul>"
         },
         "s3DestinationExportFileFormatOptions":{
           "shape":"S3DestinationFormatOptions",
@@ -667,7 +968,7 @@
         },
         "errorCategory":{
           "shape":"ErrorCategory",
-          "documentation":"<p>The category of the error.</p> <ul> <li> <p> <code>VALIDATION</code> -The inputs to this request are invalid.</p> </li> <li> <p> <code>SERVICE_QUOTA_EXCEEDED</code> - Service quotas have been exceeded. Please contact AWS support to increase quotas.</p> </li> <li> <p> <code>ACCESS_DENIED</code> - Missing required permission to perform this request.</p> </li> <li> <p> <code>RESOURCE_NOT_FOUND</code> - One or more inputs to this request were not found.</p> </li> <li> <p> <code>THROTTLING</code> - The system temporarily lacks sufficient resources to process the request.</p> </li> <li> <p> <code>INTERNAL_SERVICE_EXCEPTION</code> - An internal service error has occurred.</p> </li> <li> <p> <code>CANCELLED</code> - Cancelled.</p> </li> <li> <p> <code>USER_RECOVERABLE</code> - A user recoverable error has occurred.</p> </li> </ul>"
+          "documentation":"<p>The category of the error.</p> <ul> <li> <p> <code>VALIDATION</code> – The inputs to this request are invalid.</p> </li> <li> <p> <code>SERVICE_QUOTA_EXCEEDED</code> – Service quotas have been exceeded. Please contact AWS support to increase quotas.</p> </li> <li> <p> <code>ACCESS_DENIED</code> – Missing required permission to perform this request.</p> </li> <li> <p> <code>RESOURCE_NOT_FOUND</code> – One or more inputs to this request were not found.</p> </li> <li> <p> <code>THROTTLING</code> – The system temporarily lacks sufficient resources to process the request.</p> </li> <li> <p> <code>INTERNAL_SERVICE_EXCEPTION</code> – An internal service error has occurred.</p> </li> <li> <p> <code>CANCELLED</code> – Cancelled.</p> </li> <li> <p> <code>USER_RECOVERABLE</code> – A user recoverable error has occurred.</p> </li> </ul>"
         }
       },
       "documentation":"<p>The structure with error messages.</p>"
@@ -714,7 +1015,7 @@
         },
         "asOfTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Time range to use for the Dataview. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Time range to use for the Dataview. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "partitionColumns":{
@@ -727,7 +1028,7 @@
         },
         "status":{
           "shape":"DataViewStatus",
-          "documentation":"<p>The status of a Dataview creation.</p> <ul> <li> <p> <code>RUNNING</code> - Dataview creation is running.</p> </li> <li> <p> <code>STARTING</code> - Dataview creation is starting.</p> </li> <li> <p> <code>FAILED</code> - Dataview creation has failed.</p> </li> <li> <p> <code>CANCELLED</code> - Dataview creation has been cancelled.</p> </li> <li> <p> <code>TIMEOUT</code> - Dataview creation has timed out.</p> </li> <li> <p> <code>SUCCESS</code> - Dataview creation has succeeded.</p> </li> <li> <p> <code>PENDING</code> - Dataview creation is pending.</p> </li> <li> <p> <code>FAILED_CLEANUP_FAILED</code> - Dataview creation failed and resource cleanup failed.</p> </li> </ul>"
+          "documentation":"<p>The status of a Dataview creation.</p> <ul> <li> <p> <code>RUNNING</code> – Dataview creation is running.</p> </li> <li> <p> <code>STARTING</code> – Dataview creation is starting.</p> </li> <li> <p> <code>FAILED</code> – Dataview creation has failed.</p> </li> <li> <p> <code>CANCELLED</code> – Dataview creation has been cancelled.</p> </li> <li> <p> <code>TIMEOUT</code> – Dataview creation has timed out.</p> </li> <li> <p> <code>SUCCESS</code> – Dataview creation has succeeded.</p> </li> <li> <p> <code>PENDING</code> – Dataview creation is pending.</p> </li> <li> <p> <code>FAILED_CLEANUP_FAILED</code> – Dataview creation failed and resource cleanup failed.</p> </li> </ul>"
         },
         "errorInfo":{
           "shape":"DataViewErrorInfo",
@@ -743,11 +1044,11 @@
         },
         "createTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The timestamp at which the Dataview was created in FinSpace. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The timestamp at which the Dataview was created in FinSpace. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "lastModifiedTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The last time that a Dataview was modified. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The last time that a Dataview was modified. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         }
       },
       "documentation":"<p>Structure for the summary of a Dataview.</p>"
@@ -769,7 +1070,7 @@
         },
         "kind":{
           "shape":"DatasetKind",
-          "documentation":"<p>The format in which Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> - Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> - Data is structured in a non-tabular format.</p> </li> </ul>"
+          "documentation":"<p>The format in which Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> – Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> – Data is structured in a non-tabular format.</p> </li> </ul>"
         },
         "datasetDescription":{
           "shape":"DatasetDescription",
@@ -781,11 +1082,11 @@
         },
         "createTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The timestamp at which the Dataset was created in FinSpace. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The timestamp at which the Dataset was created in FinSpace. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "lastModifiedTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The last time that the Dataset was modified. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The last time that the Dataset was modified. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "schemaDefinition":{
           "shape":"SchemaUnion",
@@ -833,7 +1134,7 @@
       "members":{
         "name":{
           "shape":"OwnerName",
-          "documentation":"<p>Name of the Dataset owner.</p>"
+          "documentation":"<p>The name of the Dataset owner.</p>"
         },
         "phoneNumber":{
           "shape":"PhoneNumber",
@@ -893,12 +1194,92 @@
       },
       "documentation":"The response from an DeleteDataset operation"
     },
+    "DeletePermissionGroupRequest":{
+      "type":"structure",
+      "required":["permissionGroupId"],
+      "members":{
+        "permissionGroupId":{
+          "shape":"PermissionGroupId",
+          "documentation":"<p>The unique identifier for the permission group that you want to delete.</p>",
+          "location":"uri",
+          "locationName":"permissionGroupId"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true,
+          "location":"querystring",
+          "locationName":"clientToken"
+        }
+      }
+    },
+    "DeletePermissionGroupResponse":{
+      "type":"structure",
+      "members":{
+        "permissionGroupId":{
+          "shape":"PermissionGroupId",
+          "documentation":"<p>The unique identifier for the deleted permission group.</p>"
+        }
+      }
+    },
+    "DisableUserRequest":{
+      "type":"structure",
+      "required":["userId"],
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the user account that you want to disable.</p>",
+          "location":"uri",
+          "locationName":"userId"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "DisableUserResponse":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the disabled user account.</p>"
+        }
+      }
+    },
     "Email":{
       "type":"string",
-      "documentation":"Email of Dataset Owner",
       "max":320,
       "min":4,
-      "pattern":"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
+      "pattern":"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}",
+      "sensitive":true
+    },
+    "EnableUserRequest":{
+      "type":"structure",
+      "required":["userId"],
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the user account that you want to enable.</p>",
+          "location":"uri",
+          "locationName":"userId"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "EnableUserResponse":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the enabled user account.</p>"
+        }
+      }
     },
     "ErrorCategory":{
       "type":"string",
@@ -927,6 +1308,13 @@
         "DELIMITED_TEXT"
       ]
     },
+    "FirstName":{
+      "type":"string",
+      "max":50,
+      "min":1,
+      "pattern":".*\\S.*",
+      "sensitive":true
+    },
     "FormatParams":{
       "type":"map",
       "key":{"shape":"StringMapKey"},
@@ -972,7 +1360,7 @@
         },
         "changeType":{
           "shape":"ChangeType",
-          "documentation":"<p>Type that indicates how a Changeset is applied to a Dataset.</p> <ul> <li> <p> <code>REPLACE</code> - Changeset is considered as a replacement to all prior loaded Changesets.</p> </li> <li> <p> <code>APPEND</code> - Changeset is considered as an addition to the end of all prior loaded Changesets.</p> </li> <li> <p> <code>MODIFY</code> - Changeset is considered as a replacement to a specific prior ingested Changeset.</p> </li> </ul>"
+          "documentation":"<p>Type that indicates how a Changeset is applied to a Dataset.</p> <ul> <li> <p> <code>REPLACE</code> – Changeset is considered as a replacement to all prior loaded Changesets.</p> </li> <li> <p> <code>APPEND</code> – Changeset is considered as an addition to the end of all prior loaded Changesets.</p> </li> <li> <p> <code>MODIFY</code> – Changeset is considered as a replacement to a specific prior ingested Changeset.</p> </li> </ul>"
         },
         "sourceParams":{
           "shape":"SourceParams",
@@ -984,7 +1372,7 @@
         },
         "createTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The timestamp at which the Changeset was created in FinSpace. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The timestamp at which the Changeset was created in FinSpace. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "status":{
           "shape":"IngestionStatus",
@@ -996,12 +1384,12 @@
         },
         "activeUntilTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Time until which the Changeset is active. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Time until which the Changeset is active. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "activeFromTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Beginning time from which the Changeset is active. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Beginning time from which the Changeset is active. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "updatesChangesetId":{
@@ -1054,7 +1442,7 @@
         },
         "asOfTimestamp":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>Time range to use for the Dataview. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
+          "documentation":"<p>Time range to use for the Dataview. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>",
           "box":true
         },
         "errorInfo":{
@@ -1063,11 +1451,11 @@
         },
         "lastModifiedTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The last time that a Dataview was modified. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The last time that a Dataview was modified. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "createTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The timestamp at which the Dataview was created in FinSpace. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The timestamp at which the Dataview was created in FinSpace. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "sortColumns":{
           "shape":"SortColumnList",
@@ -1087,7 +1475,7 @@
         },
         "status":{
           "shape":"DataViewStatus",
-          "documentation":"<p>The status of a Dataview creation.</p> <ul> <li> <p> <code>RUNNING</code> - Dataview creation is running.</p> </li> <li> <p> <code>STARTING</code> - Dataview creation is starting.</p> </li> <li> <p> <code>FAILED</code> - Dataview creation has failed.</p> </li> <li> <p> <code>CANCELLED</code> - Dataview creation has been cancelled.</p> </li> <li> <p> <code>TIMEOUT</code> - Dataview creation has timed out.</p> </li> <li> <p> <code>SUCCESS</code> - Dataview creation has succeeded.</p> </li> <li> <p> <code>PENDING</code> - Dataview creation is pending.</p> </li> <li> <p> <code>FAILED_CLEANUP_FAILED</code> - Dataview creation failed and resource cleanup failed.</p> </li> </ul>"
+          "documentation":"<p>The status of a Dataview creation.</p> <ul> <li> <p> <code>RUNNING</code> – Dataview creation is running.</p> </li> <li> <p> <code>STARTING</code> – Dataview creation is starting.</p> </li> <li> <p> <code>FAILED</code> – Dataview creation has failed.</p> </li> <li> <p> <code>CANCELLED</code> – Dataview creation has been cancelled.</p> </li> <li> <p> <code>TIMEOUT</code> – Dataview creation has timed out.</p> </li> <li> <p> <code>SUCCESS</code> – Dataview creation has succeeded.</p> </li> <li> <p> <code>PENDING</code> – Dataview creation is pending.</p> </li> <li> <p> <code>FAILED_CLEANUP_FAILED</code> – Dataview creation failed and resource cleanup failed.</p> </li> </ul>"
         }
       },
       "documentation":"Response from retrieving a dataview, which includes details on the target database and table name"
@@ -1122,7 +1510,7 @@
         },
         "kind":{
           "shape":"DatasetKind",
-          "documentation":"<p>The format in which Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> - Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> - Data is structured in a non-tabular format.</p> </li> </ul>"
+          "documentation":"<p>The format in which Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> – Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> – Data is structured in a non-tabular format.</p> </li> </ul>"
         },
         "datasetDescription":{
           "shape":"DatasetDescription",
@@ -1130,11 +1518,11 @@
         },
         "createTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The timestamp at which the Dataset was created in FinSpace. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The timestamp at which the Dataset was created in FinSpace. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "lastModifiedTime":{
           "shape":"TimestampEpoch",
-          "documentation":"<p>The last time that the Dataset was modified. The value is determined as Epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
+          "documentation":"<p>The last time that the Dataset was modified. The value is determined as epoch time in milliseconds. For example, the value for Monday, November 1, 2021 12:00:00 PM UTC is specified as 1635768000000.</p>"
         },
         "schemaDefinition":{
           "shape":"SchemaUnion",
@@ -1146,7 +1534,7 @@
         },
         "status":{
           "shape":"DatasetStatus",
-          "documentation":"<p>Status of the Dataset creation.</p> <ul> <li> <p> <code>PENDING</code> - Dataset is pending creation.</p> </li> <li> <p> <code>FAILED</code> - Dataset creation has failed.</p> </li> <li> <p> <code>SUCCESS</code> - Dataset creation has succeeded.</p> </li> <li> <p> <code>RUNNING</code> - Dataset creation is running.</p> </li> </ul>"
+          "documentation":"<p>Status of the Dataset creation.</p> <ul> <li> <p> <code>PENDING</code> – Dataset is pending creation.</p> </li> <li> <p> <code>FAILED</code> – Dataset creation has failed.</p> </li> <li> <p> <code>SUCCESS</code> – Dataset creation has succeeded.</p> </li> <li> <p> <code>RUNNING</code> – Dataset creation is running.</p> </li> </ul>"
         }
       },
       "documentation":"Response for the GetDataset operation"
@@ -1184,12 +1572,81 @@
       },
       "documentation":"Response for GetProgrammaticAccessCredentials operation"
     },
+    "GetUserRequest":{
+      "type":"structure",
+      "required":["userId"],
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier of the user to get data for.</p>",
+          "location":"uri",
+          "locationName":"userId"
+        }
+      }
+    },
+    "GetUserResponse":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the user account that is retrieved.</p>"
+        },
+        "status":{
+          "shape":"UserStatus",
+          "documentation":"<p>The current status of the user account. </p> <ul> <li> <p> <code>CREATING</code> – The user account creation is in progress.</p> </li> <li> <p> <code>ENABLED</code> – The user account is created and is currently active.</p> </li> <li> <p> <code>DISABLED</code> – The user account is currently inactive.</p> </li> </ul>"
+        },
+        "firstName":{
+          "shape":"FirstName",
+          "documentation":"<p>The first name of the user.</p>"
+        },
+        "lastName":{
+          "shape":"LastName",
+          "documentation":"<p>The last name of the user.</p>"
+        },
+        "emailAddress":{
+          "shape":"Email",
+          "documentation":"<p>The email address that is associated with the user.</p>"
+        },
+        "type":{
+          "shape":"UserType",
+          "documentation":"<p>Indicates the type of user. </p> <ul> <li> <p> <code>SUPER_USER</code> – A user with permission to all the functionality and data in FinSpace.</p> </li> </ul> <ul> <li> <p> <code>APP_USER</code> – A user with specific permissions in FinSpace. The users are assigned permissions by adding them to a permissions group.</p> </li> </ul>"
+        },
+        "apiAccess":{
+          "shape":"ApiAccess",
+          "documentation":"<p>Indicates whether the user can use the <code>GetProgrammaticAccessCredentials</code> API to obtain credentials that can then be used to access other FinSpace Data API operations. </p> <ul> <li> <p> <code>ENABLED</code> – The user has permissions to use the APIs.</p> </li> <li> <p> <code>DISABLED</code> – The user does not have permissions to use any APIs.</p> </li> </ul>"
+        },
+        "apiAccessPrincipalArn":{
+          "shape":"RoleArn",
+          "documentation":"<p>The ARN identifier of an AWS user or role that is allowed to call the <code>GetProgrammaticAccessCredentials</code> API to obtain a credentials token for a specific FinSpace user. This must be an IAM role within your FinSpace account.</p>"
+        },
+        "createTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>The timestamp at which the user account was created in FinSpace. The value is determined as epoch time in milliseconds. </p>"
+        },
+        "lastEnabledTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time the user account was enabled. The value is determined as epoch time in milliseconds.</p>"
+        },
+        "lastDisabledTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time the user account was disabled. The value is determined as epoch time in milliseconds.</p>"
+        },
+        "lastModifiedTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time the user account was updated. The value is determined as epoch time in milliseconds.</p>"
+        },
+        "lastLoginTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time that the user logged into their account. The value is determined as epoch time in milliseconds.</p>"
+        }
+      }
+    },
     "GetWorkingLocationRequest":{
       "type":"structure",
       "members":{
         "locationType":{
           "shape":"locationType",
-          "documentation":"<p>Specify the type of the working location.</p> <ul> <li> <p> <code>SAGEMAKER</code> - Use the Amazon S3 location as a temporary location to store data content when working with FinSpace Notebooks that run on SageMaker studio.</p> </li> <li> <p> <code>INGESTION</code> - Use the Amazon S3 location as a staging location to copy your data content and then use the location with the Changeset creation operation.</p> </li> </ul>"
+          "documentation":"<p>Specify the type of the working location.</p> <ul> <li> <p> <code>SAGEMAKER</code> – Use the Amazon S3 location as a temporary location to store data content when working with FinSpace Notebooks that run on SageMaker studio.</p> </li> <li> <p> <code>INGESTION</code> – Use the Amazon S3 location as a staging location to copy your data content and then use the location with the Changeset creation operation.</p> </li> </ul>"
         }
       }
     },
@@ -1235,6 +1692,13 @@
       "error":{"httpStatusCode":500},
       "exception":true
     },
+    "LastName":{
+      "type":"string",
+      "max":50,
+      "min":1,
+      "pattern":".*\\S.*",
+      "sensitive":true
+    },
     "LimitExceededException":{
       "type":"structure",
       "members":{
@@ -1263,7 +1727,7 @@
         },
         "nextToken":{
           "shape":"PaginationToken",
-          "documentation":"<p>A token indicating where a results page should begin.</p>",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>",
           "location":"querystring",
           "locationName":"nextToken"
         }
@@ -1279,7 +1743,7 @@
         },
         "nextToken":{
           "shape":"PaginationToken",
-          "documentation":"<p>A token indicating where a results page should begin.</p>"
+          "documentation":"<p>A token that indicates where a results page should begin.</p>"
         }
       },
       "documentation":"Response to ListChangesetsResponse. This returns a list of dataset changesets that match the query criteria."
@@ -1296,7 +1760,7 @@
         },
         "nextToken":{
           "shape":"PaginationToken",
-          "documentation":"<p>A token indicating where a results page should begin.</p>",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>",
           "location":"querystring",
           "locationName":"nextToken"
         },
@@ -1315,7 +1779,7 @@
       "members":{
         "nextToken":{
           "shape":"PaginationToken",
-          "documentation":"<p>A token indicating where a results page should begin.</p>"
+          "documentation":"<p>A token that indicates where a results page should begin.</p>"
         },
         "dataViews":{
           "shape":"DataViewList",
@@ -1328,7 +1792,7 @@
       "members":{
         "nextToken":{
           "shape":"PaginationToken",
-          "documentation":"<p>A token indicating where a results page should begin.</p>",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>",
           "location":"querystring",
           "locationName":"nextToken"
         },
@@ -1351,11 +1815,73 @@
         },
         "nextToken":{
           "shape":"PaginationToken",
-          "documentation":"<p>A token indicating where a results page should begin.</p>"
+          "documentation":"<p>A token that indicates where a results page should begin.</p>"
         }
       },
       "documentation":"Response for the ListDatasets operation"
     },
+    "ListPermissionGroupsRequest":{
+      "type":"structure",
+      "required":["maxResults"],
+      "members":{
+        "nextToken":{
+          "shape":"PaginationToken",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>",
+          "location":"querystring",
+          "locationName":"nextToken"
+        },
+        "maxResults":{
+          "shape":"ResultLimit",
+          "documentation":"<p>The maximum number of results per page.</p>",
+          "location":"querystring",
+          "locationName":"maxResults"
+        }
+      }
+    },
+    "ListPermissionGroupsResponse":{
+      "type":"structure",
+      "members":{
+        "permissionGroups":{
+          "shape":"PermissionGroupList",
+          "documentation":"<p>A list of all the permission groups.</p>"
+        },
+        "nextToken":{
+          "shape":"PaginationToken",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>"
+        }
+      }
+    },
+    "ListUsersRequest":{
+      "type":"structure",
+      "required":["maxResults"],
+      "members":{
+        "nextToken":{
+          "shape":"PaginationToken",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>",
+          "location":"querystring",
+          "locationName":"nextToken"
+        },
+        "maxResults":{
+          "shape":"ResultLimit",
+          "documentation":"<p>The maximum number of results per page.</p>",
+          "location":"querystring",
+          "locationName":"maxResults"
+        }
+      }
+    },
+    "ListUsersResponse":{
+      "type":"structure",
+      "members":{
+        "users":{
+          "shape":"UserList",
+          "documentation":"<p>A list of all the user accounts.</p>"
+        },
+        "nextToken":{
+          "shape":"PaginationToken",
+          "documentation":"<p>A token that indicates where a results page should begin.</p>"
+        }
+      }
+    },
     "OwnerName":{
       "type":"string",
       "documentation":"1 - 250 character String",
@@ -1372,18 +1898,73 @@
       "member":{"shape":"StringValueLength1to255"},
       "documentation":"DataView Partition Column List"
     },
+    "Password":{
+      "type":"string",
+      "max":20,
+      "min":8,
+      "pattern":".*\\S.*",
+      "sensitive":true
+    },
+    "PermissionGroup":{
+      "type":"structure",
+      "members":{
+        "permissionGroupId":{
+          "shape":"PermissionGroupId",
+          "documentation":"<p> The unique identifier for the permission group.</p>"
+        },
+        "name":{
+          "shape":"PermissionGroupName",
+          "documentation":"<p>The name of the permission group.</p>"
+        },
+        "description":{
+          "shape":"PermissionGroupDescription",
+          "documentation":"<p> A brief description for the permission group.</p>"
+        },
+        "applicationPermissions":{
+          "shape":"ApplicationPermissionList",
+          "documentation":"<p>Indicates the permissions that are granted to a specific group for accessing the FinSpace application.</p> <ul> <li> <p> <code>CreateDataset</code> – Group members can create new datasets.</p> </li> <li> <p> <code>ManageClusters</code> – Group members can manage Apache Spark clusters from FinSpace notebooks.</p> </li> <li> <p> <code>ManageUsersAndGroups</code> – Group members can manage users and permission groups.</p> </li> <li> <p> <code>ManageAttributeSets</code> – Group members can manage attribute sets.</p> </li> <li> <p> <code>ViewAuditData</code> – Group members can view audit data.</p> </li> <li> <p> <code>AccessNotebooks</code> – Group members will have access to FinSpace notebooks.</p> </li> <li> <p> <code>GetTemporaryCredentials</code> – Group members can get temporary API credentials.</p> </li> </ul>"
+        },
+        "createTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>The timestamp at which the group was created in FinSpace. The value is determined as epoch time in milliseconds. </p>"
+        },
+        "lastModifiedTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time the permission group was updated. The value is determined as epoch time in milliseconds. </p>"
+        }
+      },
+      "documentation":"<p>The structure for a permission group.</p>"
+    },
+    "PermissionGroupDescription":{
+      "type":"string",
+      "max":4000,
+      "min":1,
+      "pattern":".*\\S.*",
+      "sensitive":true
+    },
     "PermissionGroupId":{
       "type":"string",
-      "documentation":"Id of the associated PermissionGroup",
       "max":26,
-      "min":1
+      "min":1,
+      "pattern":".*\\S.*"
+    },
+    "PermissionGroupList":{
+      "type":"list",
+      "member":{"shape":"PermissionGroup"}
+    },
+    "PermissionGroupName":{
+      "type":"string",
+      "max":255,
+      "min":1,
+      "pattern":".*\\S.*",
+      "sensitive":true
     },
     "PermissionGroupParams":{
       "type":"structure",
       "members":{
         "permissionGroupId":{
           "shape":"PermissionGroupId",
-          "documentation":"<p>The unique identifier of the PermissionGroup.</p>"
+          "documentation":"<p>The unique identifier for the <code>PermissionGroup</code>.</p>"
         },
         "datasetPermissions":{
           "shape":"ResourcePermissionsList",
@@ -1399,10 +1980,41 @@
       "min":10,
       "pattern":"^[\\+0-9\\#\\,\\(][\\+0-9\\-\\.\\/\\(\\)\\,\\#\\s]+$"
     },
+    "ResetUserPasswordRequest":{
+      "type":"structure",
+      "required":["userId"],
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier of the user that a temporary password is requested for.</p>",
+          "location":"uri",
+          "locationName":"userId"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "ResetUserPasswordResponse":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier of the user that a new password is generated for.</p>"
+        },
+        "temporaryPassword":{
+          "shape":"Password",
+          "documentation":"<p>A randomly generated temporary password for the requested user account. This password expires in 7 days.</p>"
+        }
+      }
+    },
     "ResourceNotFoundException":{
       "type":"structure",
       "members":{
-        "message":{"shape":"errorMessage"}
+        "message":{"shape":"errorMessage"},
+        "reason":{"shape":"errorMessage"}
       },
       "documentation":"<p>One or more resources can't be found.</p>",
       "error":{"httpStatusCode":404},
@@ -1416,7 +2028,7 @@
           "documentation":"<p>Permission for a resource.</p>"
         }
       },
-      "documentation":"<p>Resource permission for a dataset. When you create a dataset, all the other members of the same user group inherit access to the dataset. You can only create a dataset if your user group has application permission for Create Datasets.</p> <p>The following is a list of valid dataset permissions that you can apply: </p> <ul> <li> <p> <code>ViewDatasetDetails</code> </p> </li> <li> <p> <code>ReadDatasetDetails</code> </p> </li> <li> <p> <code>AddDatasetData</code> </p> </li> <li> <p> <code>CreateSnapshot</code> </p> </li> <li> <p> <code>EditDatasetMetadata</code> </p> </li> <li> <p> <code>DeleteDataset</code> </p> </li> </ul> <p>For more information on the ataset permissions, see <a href=\"https://docs.aws.amazon.com/finspace/latest/userguide/managing-user-permissions.html#supported-dataset-permissions\">Supported Dataset Permissions</a> in the FinSpace User Guide.</p>"
+      "documentation":"<p>Resource permission for a dataset. When you create a dataset, all the other members of the same user group inherit access to the dataset. You can only create a dataset if your user group has application permission for Create Datasets.</p> <p>The following is a list of valid dataset permissions that you can apply: </p> <ul> <li> <p> <code>ViewDatasetDetails</code> </p> </li> <li> <p> <code>ReadDatasetDetails</code> </p> </li> <li> <p> <code>AddDatasetData</code> </p> </li> <li> <p> <code>CreateSnapshot</code> </p> </li> <li> <p> <code>EditDatasetMetadata</code> </p> </li> <li> <p> <code>DeleteDataset</code> </p> </li> </ul> <p>For more information on the dataset permissions, see <a href=\"https://docs.aws.amazon.com/finspace/latest/userguide/managing-user-permissions.html#supported-dataset-permissions\">Supported Dataset Permissions</a> in the FinSpace User Guide.</p>"
     },
     "ResourcePermissionsList":{
       "type":"list",
@@ -1429,6 +2041,12 @@
       "max":100,
       "min":1
     },
+    "RoleArn":{
+      "type":"string",
+      "max":2048,
+      "min":20,
+      "pattern":"^arn:aws[a-z\\-]*:iam::\\d{12}:role/?[a-zA-Z_0-9+=,.@\\-_/]+$"
+    },
     "S3DestinationFormatOptions":{
       "type":"map",
       "key":{"shape":"StringMapKey"},
@@ -1542,7 +2160,7 @@
         },
         "formatParams":{
           "shape":"FormatParams",
-          "documentation":"<p>Options that define the structure of the source file(s) including the format type (<code>formatType</code>), header row (<code>withHeader</code>), data separation character (<code>separator</code>) and the type of compression (<code>compression</code>). </p> <p> <code>formatType</code> is a required attribute and can have the following values: </p> <ul> <li> <p> <code>PARQUET</code> - Parquet source file format.</p> </li> <li> <p> <code>CSV</code> - CSV source file format.</p> </li> <li> <p> <code>JSON</code> - JSON source file format.</p> </li> <li> <p> <code>XML</code> - XML source file format.</p> </li> </ul> <p>Here is an example of how you could specify the <code>formatParams</code>:</p> <p> <code> \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } </code> </p> <p>Note that if you only provide <code>formatType</code> as <code>CSV</code>, the rest of the attributes will automatically default to CSV values as following:</p> <p> <code> { \"withHeader\": \"true\", \"separator\": \",\" } </code> </p> <p> For more information about supported file formats, see <a href=\"https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html\">Supported Data Types and File Formats</a> in the FinSpace User Guide.</p>"
+          "documentation":"<p>Options that define the structure of the source file(s) including the format type (<code>formatType</code>), header row (<code>withHeader</code>), data separation character (<code>separator</code>) and the type of compression (<code>compression</code>). </p> <p> <code>formatType</code> is a required attribute and can have the following values: </p> <ul> <li> <p> <code>PARQUET</code> – Parquet source file format.</p> </li> <li> <p> <code>CSV</code> – CSV source file format.</p> </li> <li> <p> <code>JSON</code> – JSON source file format.</p> </li> <li> <p> <code>XML</code> – XML source file format.</p> </li> </ul> <p>Here is an example of how you could specify the <code>formatParams</code>:</p> <p> <code> \"formatParams\": { \"formatType\": \"CSV\", \"withHeader\": \"true\", \"separator\": \",\", \"compression\":\"None\" } </code> </p> <p>Note that if you only provide <code>formatType</code> as <code>CSV</code>, the rest of the attributes will automatically default to CSV values as following:</p> <p> <code> { \"withHeader\": \"true\", \"separator\": \",\" } </code> </p> <p> For more information about supported file formats, see <a href=\"https://docs.aws.amazon.com/finspace/latest/userguide/supported-data-types.html\">Supported Data Types and File Formats</a> in the FinSpace User Guide.</p>"
         }
       },
       "documentation":"Request to update an existing changeset."
@@ -1586,7 +2204,7 @@
         },
         "kind":{
           "shape":"DatasetKind",
-          "documentation":"<p>The format in which the Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> - Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> - Data is structured in a non-tabular format.</p> </li> </ul>"
+          "documentation":"<p>The format in which the Dataset data is structured.</p> <ul> <li> <p> <code>TABULAR</code> – Data is structured in a tabular format.</p> </li> <li> <p> <code>NON_TABULAR</code> – Data is structured in a non-tabular format.</p> </li> </ul>"
         },
         "datasetDescription":{
           "shape":"DatasetDescription",
@@ -1613,10 +2231,178 @@
       },
       "documentation":"The response from an UpdateDataset operation"
     },
+    "UpdatePermissionGroupRequest":{
+      "type":"structure",
+      "required":["permissionGroupId"],
+      "members":{
+        "permissionGroupId":{
+          "shape":"PermissionGroupId",
+          "documentation":"<p>The unique identifier for the permission group to update.</p>",
+          "location":"uri",
+          "locationName":"permissionGroupId"
+        },
+        "name":{
+          "shape":"PermissionGroupName",
+          "documentation":"<p>The name of the permission group.</p>"
+        },
+        "description":{
+          "shape":"PermissionGroupDescription",
+          "documentation":"<p>A brief description for the permission group.</p>"
+        },
+        "applicationPermissions":{
+          "shape":"ApplicationPermissionList",
+          "documentation":"<p>The permissions that are granted to a specific group for accessing the FinSpace application.</p> <ul> <li> <p> <code>CreateDataset</code> – Group members can create new datasets.</p> </li> <li> <p> <code>ManageClusters</code> – Group members can manage Apache Spark clusters from FinSpace notebooks.</p> </li> <li> <p> <code>ManageUsersAndGroups</code> – Group members can manage users and permission groups.</p> </li> <li> <p> <code>ManageAttributeSets</code> – Group members can manage attribute sets.</p> </li> <li> <p> <code>ViewAuditData</code> – Group members can view audit data.</p> </li> <li> <p> <code>AccessNotebooks</code> – Group members will have access to FinSpace notebooks.</p> </li> <li> <p> <code>GetTemporaryCredentials</code> – Group members can get temporary API credentials.</p> </li> </ul>"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "UpdatePermissionGroupResponse":{
+      "type":"structure",
+      "members":{
+        "permissionGroupId":{
+          "shape":"PermissionGroupId",
+          "documentation":"<p>The unique identifier for the updated permission group.</p>"
+        }
+      }
+    },
+    "UpdateUserRequest":{
+      "type":"structure",
+      "required":["userId"],
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the user account to update.</p>",
+          "location":"uri",
+          "locationName":"userId"
+        },
+        "type":{
+          "shape":"UserType",
+          "documentation":"<p>The option to indicate the type of user.</p> <ul> <li> <p> <code>SUPER_USER</code>– A user with permission to all the functionality and data in FinSpace.</p> </li> <li> <p> <code>APP_USER</code> – A user with specific permissions in FinSpace. The users are assigned permissions by adding them to a permissions group.</p> </li> </ul>"
+        },
+        "firstName":{
+          "shape":"FirstName",
+          "documentation":"<p>The first name of the user.</p>"
+        },
+        "lastName":{
+          "shape":"LastName",
+          "documentation":"<p>The last name of the user.</p>"
+        },
+        "apiAccess":{
+          "shape":"ApiAccess",
+          "documentation":"<p>The option to indicate whether the user can use the <code>GetProgrammaticAccessCredentials</code> API to obtain credentials that can then be used to access other FinSpace Data API operations.</p> <ul> <li> <p> <code>ENABLED</code> – The user has permissions to use the APIs.</p> </li> <li> <p> <code>DISABLED</code> – The user does not have permissions to use any APIs.</p> </li> </ul>"
+        },
+        "apiAccessPrincipalArn":{
+          "shape":"RoleArn",
+          "documentation":"<p>The ARN identifier of an AWS user or role that is allowed to call the <code>GetProgrammaticAccessCredentials</code> API to obtain a credentials token for a specific FinSpace user. This must be an IAM role within your FinSpace account.</p>"
+        },
+        "clientToken":{
+          "shape":"ClientToken",
+          "documentation":"<p>A token that ensures idempotency. This token expires in 10 minutes.</p>",
+          "idempotencyToken":true
+        }
+      }
+    },
+    "UpdateUserResponse":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier of the updated user account.</p>"
+        }
+      }
+    },
+    "User":{
+      "type":"structure",
+      "members":{
+        "userId":{
+          "shape":"UserId",
+          "documentation":"<p>The unique identifier for the user.</p>"
+        },
+        "status":{
+          "shape":"UserStatus",
+          "documentation":"<p>The current status of the user account. </p> <ul> <li> <p> <code>CREATING</code> – The user account creation is in progress.</p> </li> <li> <p> <code>ENABLED</code> – The user account is created and is currently active.</p> </li> <li> <p> <code>DISABLED</code> – The user account is currently inactive.</p> </li> </ul>"
+        },
+        "firstName":{
+          "shape":"FirstName",
+          "documentation":"<p>The first name of the user.</p>"
+        },
+        "lastName":{
+          "shape":"LastName",
+          "documentation":"<p> The last name of the user.</p>"
+        },
+        "emailAddress":{
+          "shape":"Email",
+          "documentation":"<p>The email address of the user. The email address serves as a uniquer identifier for each user and cannot be changed after it's created.</p>"
+        },
+        "type":{
+          "shape":"UserType",
+          "documentation":"<p> Indicates the type of user.</p> <ul> <li> <p> <code>SUPER_USER</code> – A user with permission to all the functionality and data in FinSpace.</p> </li> <li> <p> <code>APP_USER</code> – A user with specific permissions in FinSpace. The users are assigned permissions by adding them to a permissions group.</p> </li> </ul>"
+        },
+        "apiAccess":{
+          "shape":"ApiAccess",
+          "documentation":"<p>Indicates whether the user can use the <code>GetProgrammaticAccessCredentials</code> API to obtain credentials that can then be used to access other FinSpace Data API operations.</p> <ul> <li> <p> <code>ENABLED</code> – The user has permissions to use the APIs.</p> </li> <li> <p> <code>DISABLED</code> – The user does not have permissions to use any APIs.</p> </li> </ul>"
+        },
+        "apiAccessPrincipalArn":{
+          "shape":"RoleArn",
+          "documentation":"<p>The ARN identifier of an AWS user or role that is allowed to call the <code>GetProgrammaticAccessCredentials</code> API to obtain a credentials token for a specific FinSpace user. This must be an IAM role within your FinSpace account.</p>"
+        },
+        "createTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>The timestamp at which the user account was created in FinSpace. The value is determined as epoch time in milliseconds. </p>"
+        },
+        "lastEnabledTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p> Describes the last time the user account was enabled. The value is determined as epoch time in milliseconds. </p>"
+        },
+        "lastDisabledTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time the user account was disabled. The value is determined as epoch time in milliseconds.</p>"
+        },
+        "lastModifiedTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time the user account was updated. The value is determined as epoch time in milliseconds. </p>"
+        },
+        "lastLoginTime":{
+          "shape":"TimestampEpoch",
+          "documentation":"<p>Describes the last time that the user logged into their account. The value is determined as epoch time in milliseconds. </p>"
+        }
+      },
+      "documentation":"<p>The details of the user account.</p>"
+    },
+    "UserId":{
+      "type":"string",
+      "max":26,
+      "min":1,
+      "pattern":".*\\S.*"
+    },
+    "UserList":{
+      "type":"list",
+      "member":{"shape":"User"}
+    },
+    "UserStatus":{
+      "type":"string",
+      "enum":[
+        "CREATING",
+        "ENABLED",
+        "DISABLED"
+      ]
+    },
+    "UserType":{
+      "type":"string",
+      "enum":[
+        "SUPER_USER",
+        "APP_USER"
+      ]
+    },
     "ValidationException":{
       "type":"structure",
       "members":{
-        "message":{"shape":"errorMessage"}
+        "message":{"shape":"errorMessage"},
+        "reason":{"shape":"errorMessage"}
       },
       "documentation":"<p>The input fails to satisfy the constraints specified by an AWS service.</p>",
       "error":{"httpStatusCode":400},
diff --git a/botocore/data/fis/2020-12-01/service-2.json b/botocore/data/fis/2020-12-01/service-2.json
index c8d7023bc..7259e7337 100644
--- a/botocore/data/fis/2020-12-01/service-2.json
+++ b/botocore/data/fis/2020-12-01/service-2.json
@@ -363,6 +363,12 @@
       "min":1,
       "pattern":"[\\S]+"
     },
+    "CloudWatchLogGroupArn":{
+      "type":"string",
+      "max":2048,
+      "min":20,
+      "pattern":"[\\S]+"
+    },
     "ConflictException":{
       "type":"structure",
       "members":{
@@ -404,6 +410,25 @@
       "key":{"shape":"ExperimentTemplateActionName"},
       "value":{"shape":"CreateExperimentTemplateActionInput"}
     },
+    "CreateExperimentTemplateLogConfigurationInput":{
+      "type":"structure",
+      "required":["logSchemaVersion"],
+      "members":{
+        "cloudWatchLogsConfiguration":{
+          "shape":"ExperimentTemplateCloudWatchLogsLogConfigurationInput",
+          "documentation":"<p>The configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+        },
+        "s3Configuration":{
+          "shape":"ExperimentTemplateS3LogConfigurationInput",
+          "documentation":"<p>The configuration for experiment logging to Amazon S3.</p>"
+        },
+        "logSchemaVersion":{
+          "shape":"LogSchemaVersion",
+          "documentation":"<p>The schema version.</p>"
+        }
+      },
+      "documentation":"<p>Specifies the configuration for experiment logging.</p>"
+    },
     "CreateExperimentTemplateRequest":{
       "type":"structure",
       "required":[
@@ -442,6 +467,10 @@
         "tags":{
           "shape":"TagMap",
           "documentation":"<p>The tags to apply to the experiment template.</p>"
+        },
+        "logConfiguration":{
+          "shape":"CreateExperimentTemplateLogConfigurationInput",
+          "documentation":"<p>The configuration for experiment logging.</p>"
         }
       }
     },
@@ -585,6 +614,10 @@
         "tags":{
           "shape":"TagMap",
           "documentation":"<p>The tags for the experiment.</p>"
+        },
+        "logConfiguration":{
+          "shape":"ExperimentLogConfiguration",
+          "documentation":"<p>The configuration for experiment logging.</p>"
         }
       },
       "documentation":"<p>Describes an experiment.</p>"
@@ -710,12 +743,54 @@
       "max":64,
       "pattern":"[\\S]+"
     },
+    "ExperimentCloudWatchLogsLogConfiguration":{
+      "type":"structure",
+      "members":{
+        "logGroupArn":{
+          "shape":"CloudWatchLogGroupArn",
+          "documentation":"<p>The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs log group.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+    },
     "ExperimentEndTime":{"type":"timestamp"},
     "ExperimentId":{
       "type":"string",
       "max":64,
       "pattern":"[\\S]+"
     },
+    "ExperimentLogConfiguration":{
+      "type":"structure",
+      "members":{
+        "cloudWatchLogsConfiguration":{
+          "shape":"ExperimentCloudWatchLogsLogConfiguration",
+          "documentation":"<p>The configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+        },
+        "s3Configuration":{
+          "shape":"ExperimentS3LogConfiguration",
+          "documentation":"<p>The configuration for experiment logging to Amazon S3.</p>"
+        },
+        "logSchemaVersion":{
+          "shape":"LogSchemaVersion",
+          "documentation":"<p>The schema version.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration for experiment logging.</p>"
+    },
+    "ExperimentS3LogConfiguration":{
+      "type":"structure",
+      "members":{
+        "bucketName":{
+          "shape":"S3BucketName",
+          "documentation":"<p>The name of the destination bucket.</p>"
+        },
+        "prefix":{
+          "shape":"S3ObjectKey",
+          "documentation":"<p>The bucket prefix.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration for experiment logging to Amazon S3.</p>"
+    },
     "ExperimentStartTime":{"type":"timestamp"},
     "ExperimentState":{
       "type":"structure",
@@ -926,6 +1001,10 @@
         "tags":{
           "shape":"TagMap",
           "documentation":"<p>The tags for the experiment template.</p>"
+        },
+        "logConfiguration":{
+          "shape":"ExperimentTemplateLogConfiguration",
+          "documentation":"<p>The configuration for experiment logging.</p>"
         }
       },
       "documentation":"<p>Describes an experiment template.</p>"
@@ -1005,6 +1084,27 @@
       "max":64,
       "pattern":"[\\S]+"
     },
+    "ExperimentTemplateCloudWatchLogsLogConfiguration":{
+      "type":"structure",
+      "members":{
+        "logGroupArn":{
+          "shape":"CloudWatchLogGroupArn",
+          "documentation":"<p>The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs log group.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+    },
+    "ExperimentTemplateCloudWatchLogsLogConfigurationInput":{
+      "type":"structure",
+      "required":["logGroupArn"],
+      "members":{
+        "logGroupArn":{
+          "shape":"CloudWatchLogGroupArn",
+          "documentation":"<p>The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs log group.</p>"
+        }
+      },
+      "documentation":"<p>Specifies the configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+    },
     "ExperimentTemplateDescription":{
       "type":"string",
       "max":512,
@@ -1015,6 +1115,53 @@
       "max":64,
       "pattern":"[\\S]+"
     },
+    "ExperimentTemplateLogConfiguration":{
+      "type":"structure",
+      "members":{
+        "cloudWatchLogsConfiguration":{
+          "shape":"ExperimentTemplateCloudWatchLogsLogConfiguration",
+          "documentation":"<p>The configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+        },
+        "s3Configuration":{
+          "shape":"ExperimentTemplateS3LogConfiguration",
+          "documentation":"<p>The configuration for experiment logging to Amazon S3.</p>"
+        },
+        "logSchemaVersion":{
+          "shape":"LogSchemaVersion",
+          "documentation":"<p>The schema version.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration for experiment logging.</p>"
+    },
+    "ExperimentTemplateS3LogConfiguration":{
+      "type":"structure",
+      "members":{
+        "bucketName":{
+          "shape":"S3BucketName",
+          "documentation":"<p>The name of the destination bucket.</p>"
+        },
+        "prefix":{
+          "shape":"S3ObjectKey",
+          "documentation":"<p>The bucket prefix.</p>"
+        }
+      },
+      "documentation":"<p>Describes the configuration for experiment logging to Amazon S3.</p>"
+    },
+    "ExperimentTemplateS3LogConfigurationInput":{
+      "type":"structure",
+      "required":["bucketName"],
+      "members":{
+        "bucketName":{
+          "shape":"S3BucketName",
+          "documentation":"<p>The name of the destination bucket.</p>"
+        },
+        "prefix":{
+          "shape":"S3ObjectKey",
+          "documentation":"<p>The bucket prefix.</p>"
+        }
+      },
+      "documentation":"<p>Specifies the configuration for experiment logging to Amazon S3.</p>"
+    },
     "ExperimentTemplateStopCondition":{
       "type":"structure",
       "members":{
@@ -1428,6 +1575,7 @@
         }
       }
     },
+    "LogSchemaVersion":{"type":"integer"},
     "NextToken":{
       "type":"string",
       "max":1024,
@@ -1460,6 +1608,18 @@
       "min":20,
       "pattern":"[\\S]+"
     },
+    "S3BucketName":{
+      "type":"string",
+      "max":63,
+      "min":3,
+      "pattern":"[\\S]+"
+    },
+    "S3ObjectKey":{
+      "type":"string",
+      "max":1024,
+      "min":1,
+      "pattern":"[\\s\\S]+"
+    },
     "ServiceQuotaExceededException":{
       "type":"structure",
       "members":{
@@ -1707,6 +1867,24 @@
       "key":{"shape":"ExperimentTemplateActionName"},
       "value":{"shape":"UpdateExperimentTemplateActionInputItem"}
     },
+    "UpdateExperimentTemplateLogConfigurationInput":{
+      "type":"structure",
+      "members":{
+        "cloudWatchLogsConfiguration":{
+          "shape":"ExperimentTemplateCloudWatchLogsLogConfigurationInput",
+          "documentation":"<p>The configuration for experiment logging to Amazon CloudWatch Logs.</p>"
+        },
+        "s3Configuration":{
+          "shape":"ExperimentTemplateS3LogConfigurationInput",
+          "documentation":"<p>The configuration for experiment logging to Amazon S3.</p>"
+        },
+        "logSchemaVersion":{
+          "shape":"LogSchemaVersion",
+          "documentation":"<p>The schema version.</p>"
+        }
+      },
+      "documentation":"<p>Specifies the configuration for experiment logging.</p>"
+    },
     "UpdateExperimentTemplateRequest":{
       "type":"structure",
       "required":["id"],
@@ -1736,6 +1914,10 @@
         "roleArn":{
           "shape":"RoleArn",
           "documentation":"<p>The Amazon Resource Name (ARN) of an IAM role that grants the FIS service permission to perform service actions on your behalf.</p>"
+        },
+        "logConfiguration":{
+          "shape":"UpdateExperimentTemplateLogConfigurationInput",
+          "documentation":"<p>The configuration for experiment logging.</p>"
         }
       }
     },
diff --git a/botocore/data/fsx/2018-03-01/service-2.json b/botocore/data/fsx/2018-03-01/service-2.json
index 911056387..bcb755f1b 100644
--- a/botocore/data/fsx/2018-03-01/service-2.json
+++ b/botocore/data/fsx/2018-03-01/service-2.json
@@ -171,7 +171,7 @@
         {"shape":"InternalServerError"},
         {"shape":"MissingFileSystemConfiguration"}
       ],
-      "documentation":"<p>Creates a new Amazon FSx for Lustre, Amazon FSx for Windows File Server, or Amazon FSx for OpenZFS file system from an existing Amazon FSx backup.</p> <p>If a file system with the specified client request token exists and the parameters match, this operation returns the description of the file system. If a client request token with the specified by the file system exists and the parameters don't match, this call returns <code>IncompatibleParameterError</code>. If a file system with the specified client request token doesn't exist, this operation does the following:</p> <ul> <li> <p>Creates a new Amazon FSx file system from backup with an assigned ID, and an initial lifecycle state of <code>CREATING</code>.</p> </li> <li> <p>Returns the description of the file system.</p> </li> </ul> <p>Parameters like the Active Directory, default share name, automatic backup, and backup settings default to the parameters of the file system that was backed up, unless overridden. You can explicitly supply other settings.</p> <p>By using the idempotent operation, you can retry a <code>CreateFileSystemFromBackup</code> call without the risk of creating an extra file system. This approach can be useful when an initial call fails in a way that makes it unclear whether a file system was created. Examples are if a transport level timeout occurred, or your connection was reset. If you use the same client request token and the initial call created a file system, the client receives a success message as long as the parameters are the same.</p> <note> <p>The <code>CreateFileSystemFromBackup</code> call returns while the file system's lifecycle state is still <code>CREATING</code>. You can check the file-system creation status by calling the <a href=\"https://docs.aws.amazon.com/fsx/latest/APIReference/API_DescribeFileSystems.html\"> DescribeFileSystems</a> operation, which returns the file system state along with other information.</p> </note>"
+      "documentation":"<p>Creates a new Amazon FSx for Lustre, Amazon FSx for Windows File Server, or Amazon FSx for OpenZFS file system from an existing Amazon FSx backup.</p> <p>If a file system with the specified client request token exists and the parameters match, this operation returns the description of the file system. If a file system with the specified client request token exists but the parameters don't match, this call returns <code>IncompatibleParameterError</code>. If a file system with the specified client request token doesn't exist, this operation does the following:</p> <ul> <li> <p>Creates a new Amazon FSx file system from backup with an assigned ID, and an initial lifecycle state of <code>CREATING</code>.</p> </li> <li> <p>Returns the description of the file system.</p> </li> </ul> <p>Parameters like the Active Directory, default share name, automatic backup, and backup settings default to the parameters of the file system that was backed up, unless overridden. You can explicitly supply other settings.</p> <p>By using the idempotent operation, you can retry a <code>CreateFileSystemFromBackup</code> call without the risk of creating an extra file system. This approach can be useful when an initial call fails in a way that makes it unclear whether a file system was created. Examples are if a transport level timeout occurred, or your connection was reset. If you use the same client request token and the initial call created a file system, the client receives a success message as long as the parameters are the same.</p> <note> <p>The <code>CreateFileSystemFromBackup</code> call returns while the file system's lifecycle state is still <code>CREATING</code>. You can check the file-system creation status by calling the <a href=\"https://docs.aws.amazon.com/fsx/latest/APIReference/API_DescribeFileSystems.html\"> DescribeFileSystems</a> operation, which returns the file system state along with other information.</p> </note>"
     },
     "CreateSnapshot":{
       "name":"CreateSnapshot",
@@ -187,7 +187,7 @@
         {"shape":"ServiceLimitExceeded"},
         {"shape":"InternalServerError"}
       ],
-      "documentation":"<p>Creates a snapshot of an existing Amazon FSx for OpenZFS file system. With snapshots, you can easily undo file changes and compare file versions by restoring the volume to a previous version.</p> <p>If a snapshot with the specified client request token exists, and the parameters match, this operation returns the description of the existing snapshot. If a snapshot with the specified client request token exists, and the parameters don't match, this operation returns <code>IncompatibleParameterError</code>. If a snapshot with the specified client request token doesn't exist, <code>CreateSnapshot</code> does the following: </p> <ul> <li> <p>Creates a new OpenZFS snapshot with an assigned ID, and an initial lifecycle state of <code>CREATING</code>.</p> </li> <li> <p>Returns the description of the snapshot.</p> </li> </ul> <p>By using the idempotent operation, you can retry a <code>CreateSnapshot</code> operation without the risk of creating an extra snapshot. This approach can be useful when an initial call fails in a way that makes it unclear whether a snapshot was created. If you use the same client request token and the initial call created a snapshot, the operation returns a successful result because all the parameters are the same.</p> <p>The <code>CreateSnapshot</code> operation returns while the snapshot's lifecycle state is still <code>CREATING</code>. You can check the snapshot creation status by calling the <a href=\"https://docs.aws.amazon.com/fsx/latest/APIReference/API_DescribeSnapshots.html\">DescribeSnapshots</a> operation, which returns the snapshot state along with other information. </p>",
+      "documentation":"<p>Creates a snapshot of an existing Amazon FSx for OpenZFS volume. With snapshots, you can easily undo file changes and compare file versions by restoring the volume to a previous version.</p> <p>If a snapshot with the specified client request token exists, and the parameters match, this operation returns the description of the existing snapshot. If a snapshot with the specified client request token exists, and the parameters don't match, this operation returns <code>IncompatibleParameterError</code>. If a snapshot with the specified client request token doesn't exist, <code>CreateSnapshot</code> does the following:</p> <ul> <li> <p>Creates a new OpenZFS snapshot with an assigned ID, and an initial lifecycle state of <code>CREATING</code>.</p> </li> <li> <p>Returns the description of the snapshot.</p> </li> </ul> <p>By using the idempotent operation, you can retry a <code>CreateSnapshot</code> operation without the risk of creating an extra snapshot. This approach can be useful when an initial call fails in a way that makes it unclear whether a snapshot was created. If you use the same client request token and the initial call created a snapshot, the operation returns a successful result because all the parameters are the same.</p> <p>The <code>CreateSnapshot</code> operation returns while the snapshot's lifecycle state is still <code>CREATING</code>. You can check the snapshot creation status by calling the <a href=\"https://docs.aws.amazon.com/fsx/latest/APIReference/API_DescribeSnapshots.html\">DescribeSnapshots</a> operation, which returns the snapshot state along with other information.</p>",
       "idempotent":true
     },
     "CreateStorageVirtualMachine":{
@@ -318,7 +318,7 @@
         {"shape":"InternalServerError"},
         {"shape":"SnapshotNotFound"}
       ],
-      "documentation":"<p>Deletes the Amazon FSx snapshot. After deletion, the snapshot no longer exists, and its data is gone. Deleting a snapshot doesn't affect snapshots stored in a file system backup. </p> <p>The <code>DeleteSnapshot</code> operation returns instantly. The snapshot appears with the lifecycle status of <code>DELETING</code> until the deletion is complete.</p>",
+      "documentation":"<p>Deletes an Amazon FSx for OpenZFS snapshot. After deletion, the snapshot no longer exists, and its data is gone. Deleting a snapshot doesn't affect snapshots stored in a file system backup. </p> <p>The <code>DeleteSnapshot</code> operation returns instantly. The snapshot appears with the lifecycle status of <code>DELETING</code> until the deletion is complete.</p>",
       "idempotent":true
     },
     "DeleteStorageVirtualMachine":{
@@ -447,7 +447,7 @@
         {"shape":"InternalServerError"},
         {"shape":"SnapshotNotFound"}
       ],
-      "documentation":"<p>Returns the description of specific Amazon FSx snapshots, if a <code>SnapshotIds</code> value is provided. Otherwise, this operation returns all snapshots owned by your Amazon Web Services account in the Amazon Web Services Region of the endpoint that you're calling.</p> <p>When retrieving all snapshots, you can optionally specify the <code>MaxResults</code> parameter to limit the number of snapshots in a response. If more backups remain, Amazon FSx returns a <code>NextToken</code> value in the response. In this case, send a later request with the <code>NextToken</code> request parameter set to the value of <code>NextToken</code> from the last response. </p> <p>Use this operation in an iterative process to retrieve a list of your snapshots. <code>DescribeSnapshots</code> is called first without a <code>NextToken</code> value. Then the operation continues to be called with the <code>NextToken</code> parameter set to the value of the last <code>NextToken</code> value until a response has no <code>NextToken</code> value.</p> <p>When using this operation, keep the following in mind:</p> <ul> <li> <p>The operation might return fewer than the <code>MaxResults</code> value of snapshot descriptions while still including a <code>NextToken</code> value.</p> </li> <li> <p>The order of snapshots returned in the response of one <code>DescribeSnapshots</code> call and the order of backups returned across the responses of a multi-call iteration is unspecified. </p> </li> </ul>"
+      "documentation":"<p>Returns the description of specific Amazon FSx for OpenZFS snapshots, if a <code>SnapshotIds</code> value is provided. Otherwise, this operation returns all snapshots owned by your Amazon Web Services account in the Amazon Web Services Region of the endpoint that you're calling.</p> <p>When retrieving all snapshots, you can optionally specify the <code>MaxResults</code> parameter to limit the number of snapshots in a response. If more backups remain, Amazon FSx returns a <code>NextToken</code> value in the response. In this case, send a later request with the <code>NextToken</code> request parameter set to the value of <code>NextToken</code> from the last response. </p> <p>Use this operation in an iterative process to retrieve a list of your snapshots. <code>DescribeSnapshots</code> is called first without a <code>NextToken</code> value. Then the operation continues to be called with the <code>NextToken</code> parameter set to the value of the last <code>NextToken</code> value until a response has no <code>NextToken</code> value.</p> <p>When using this operation, keep the following in mind:</p> <ul> <li> <p>The operation might return fewer than the <code>MaxResults</code> value of snapshot descriptions while still including a <code>NextToken</code> value.</p> </li> <li> <p>The order of snapshots returned in the response of one <code>DescribeSnapshots</code> call and the order of backups returned across the responses of a multi-call iteration is unspecified. </p> </li> </ul>"
     },
     "DescribeStorageVirtualMachines":{
       "name":"DescribeStorageVirtualMachines",
@@ -631,7 +631,7 @@
         {"shape":"SnapshotNotFound"},
         {"shape":"InternalServerError"}
       ],
-      "documentation":"<p>Updates the name of a snapshot. </p>",
+      "documentation":"<p>Updates the name of an Amazon FSx for OpenZFS snapshot.</p>",
       "idempotent":true
     },
     "UpdateStorageVirtualMachine":{
@@ -1447,7 +1447,7 @@
           "documentation":"<p>The configuration Amazon FSx uses when creating the root value of the Amazon FSx for OpenZFS file system. All volumes are children of the root volume. </p>"
         }
       },
-      "documentation":"<p>The OpenZFS configuration properties for the file system that you are creating.</p>"
+      "documentation":"<p>The Amazon FSx for OpenZFS configuration properties for the file system that you are creating.</p>"
     },
     "CreateFileSystemRequest":{
       "type":"structure",
@@ -1616,23 +1616,27 @@
       "members":{
         "ParentVolumeId":{
           "shape":"VolumeId",
-          "documentation":"<p>The ID of the volume to use as the parent volume. </p>"
+          "documentation":"<p>The ID of the volume to use as the parent volume.</p>"
         },
         "StorageCapacityReservationGiB":{
-          "shape":"IntegerNoMax",
-          "documentation":"<p>The amount of storage in gibibytes (GiB) to reserve from the parent volume. You can't reserve more storage than the parent volume has reserved.</p>"
+          "shape":"IntegerNoMaxFromNegativeOne",
+          "documentation":"<p>The amount of storage in gibibytes (GiB) to reserve from the parent volume. You can't reserve more storage than the parent volume has reserved. To not specify a storage capacity reservation, set this to <code>-1</code>.</p>"
         },
         "StorageCapacityQuotaGiB":{
-          "shape":"IntegerNoMax",
-          "documentation":"<p>The maximum amount of storage in gibibytes (GiB) that the volume can use from its parent. You can specify a quota larger than the storage on the parent volume.</p>"
+          "shape":"IntegerNoMaxFromNegativeOne",
+          "documentation":"<p>The maximum amount of storage in gibibytes (GiB) that the volume can use from its parent. You can't specify a quota larger than the storage on the parent volume. To not specify a storage capacity quota, set this to <code>-1</code>. </p>"
+        },
+        "RecordSizeKiB":{
+          "shape":"IntegerRecordSizeKiB",
+          "documentation":"<p>Specifies the record size of an OpenZFS volume, in kibibytes (KiB). Valid values are 4, 8, 16, 32, 64, 128, 256, 512, or 1024 KiB. The default is 128 KiB. Most workloads should use the default record size. Database workflows can benefit from a smaller record size, while streaming workflows can benefit from a larger record size. For additional guidance on when to set a custom record size, see <a href=\"https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/performance.html#performance-tips-zfs\"> Tips for maximizing performance</a> in the <i>Amazon FSx for OpenZFS User Guide</i>.</p>"
         },
         "DataCompressionType":{
           "shape":"OpenZFSDataCompressionType",
-          "documentation":"<p>Specifies the method used to compress the data on the volume. Unless the compression type is specified, volumes inherit the <code>DataCompressionType</code> value of their parent volume.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. This algorithm reduces the amount of space used on your volume and has very little impact on compute resources.</p> </li> </ul>"
+          "documentation":"<p>Specifies the method used to compress the data on the volume. The compression type is <code>NONE</code> by default.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume. <code>NONE</code> is the default.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. Compared to LZ4, Z-Standard provides a better compression ratio to minimize on-disk storage utilization.</p> </li> <li> <p> <code>LZ4</code> - Compresses the data in the volume using the LZ4 compression algorithm. Compared to Z-Standard, LZ4 is less compute-intensive and delivers higher write throughput speeds.</p> </li> </ul>"
         },
         "CopyTagsToSnapshots":{
           "shape":"Flag",
-          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code>, and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value. </p>"
+          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code>, and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value.</p>"
         },
         "OriginSnapshot":{
           "shape":"CreateOpenZFSOriginSnapshotConfiguration",
@@ -1640,18 +1644,18 @@
         },
         "ReadOnly":{
           "shape":"ReadOnly",
-          "documentation":"<p>A Boolean value indicating whether the volume is read-only. </p>"
+          "documentation":"<p>A Boolean value indicating whether the volume is read-only.</p>"
         },
         "NfsExports":{
           "shape":"OpenZFSNfsExports",
-          "documentation":"<p>The configuration object for mounting a Network File System (NFS) file system. </p>"
+          "documentation":"<p>The configuration object for mounting a Network File System (NFS) file system.</p>"
         },
         "UserAndGroupQuotas":{
           "shape":"OpenZFSUserAndGroupQuotas",
-          "documentation":"<p>An object specifying how much storage users or groups can use on the volume. </p>"
+          "documentation":"<p>An object specifying how much storage users or groups can use on the volume.</p>"
         }
       },
-      "documentation":"<p>Specifies the configuration of the OpenZFS volume that you are creating.</p>"
+      "documentation":"<p>Specifies the configuration of the Amazon FSx for OpenZFS volume that you are creating.</p>"
     },
     "CreateSnapshotRequest":{
       "type":"structure",
@@ -2217,11 +2221,27 @@
       "members":{
         "SkipFinalBackup":{
           "shape":"Flag",
-          "documentation":"<p>By default, Amazon FSx for OpenZFS takes a final backup on your behalf when the <code>DeleteFileSystem</code> operation is invoked. Doing this helps protect you from data loss, and we highly recommend taking the final backup. If you want to skip this backup, use this value to do so. </p>"
+          "documentation":"<p>By default, Amazon FSx for OpenZFS takes a final backup on your behalf when the <code>DeleteFileSystem</code> operation is invoked. Doing this helps protect you from data loss, and we highly recommend taking the final backup. If you want to skip taking a final backup, set this value to <code>true</code>.</p>"
         },
-        "FinalBackupTags":{"shape":"Tags"}
+        "FinalBackupTags":{
+          "shape":"Tags",
+          "documentation":"<p>A list of tags to apply to the file system's final backup.</p>"
+        },
+        "Options":{
+          "shape":"DeleteFileSystemOpenZFSOptions",
+          "documentation":"<p>To delete a file system if there are child volumes present below the root volume, use the string <code>DELETE_CHILD_VOLUMES_AND_SNAPSHOTS</code>. If your file system has child volumes and you don't use this option, the delete request will fail.</p>"
+        }
       },
-      "documentation":"<p>The configuration object for the OpenZFS file system used in the <code>DeleteFileSystem</code> operation.</p>"
+      "documentation":"<p>The configuration object for the Amazon FSx for OpenZFS file system used in the <code>DeleteFileSystem</code> operation.</p>"
+    },
+    "DeleteFileSystemOpenZFSOption":{
+      "type":"string",
+      "enum":["DELETE_CHILD_VOLUMES_AND_SNAPSHOTS"]
+    },
+    "DeleteFileSystemOpenZFSOptions":{
+      "type":"list",
+      "member":{"shape":"DeleteFileSystemOpenZFSOption"},
+      "max":1
     },
     "DeleteFileSystemOpenZFSResponse":{
       "type":"structure",
@@ -3047,6 +3067,16 @@
       "max":2147483647,
       "min":0
     },
+    "IntegerNoMaxFromNegativeOne":{
+      "type":"integer",
+      "max":2147483647,
+      "min":-1
+    },
+    "IntegerRecordSizeKiB":{
+      "type":"integer",
+      "max":1024,
+      "min":4
+    },
     "InternalServerError":{
       "type":"structure",
       "members":{
@@ -3488,11 +3518,11 @@
       "members":{
         "Clients":{
           "shape":"OpenZFSClients",
-          "documentation":"<p>A value that specifies who can mount the file system. You can provide a wildcard character (<code>*</code>), an IP address (<code>0.0.0.0</code>), or a CIDR address (<code>192.0.2.0/24</code>. By default, Amazon FSx uses the wildcard character when specifying the client. </p>"
+          "documentation":"<p>A value that specifies who can mount the file system. You can provide a wildcard character (<code>*</code>), an IP address (<code>0.0.0.0</code>), or a CIDR address (<code>192.0.2.0/24</code>). By default, Amazon FSx uses the wildcard character when specifying the client. </p>"
         },
         "Options":{
           "shape":"OpenZFSNfsExportOptions",
-          "documentation":"<p>The options to use when mounting the file system. For a list of options that you can use with Network File System (NFS), see the <a href=\"https://linux.die.net/man/5/exports\">exports(5) - Linux man page</a>. When choosing your options, consider the following:</p> <ul> <li> <p> <code>crossmount</code> is used by default. If you don't specify <code>crossmount</code> when changing the client configuration, you won't be able to see or access snapshots in your file system's snapshot directory.</p> </li> <li> <p> <code>sync</code> is used by default. If you instead specify <code>async</code>, the system acknowledges writes before writing to disk. If the system crashes before the writes are finished, you lose the unwritten data. </p> </li> </ul>"
+          "documentation":"<p>The options to use when mounting the file system. For a list of options that you can use with Network File System (NFS), see the <a href=\"https://linux.die.net/man/5/exports\">exports(5) - Linux man page</a>. When choosing your options, consider the following:</p> <ul> <li> <p> <code>crossmnt</code> is used by default. If you don't specify <code>crossmnt</code> when changing the client configuration, you won't be able to see or access snapshots in your file system's snapshot directory.</p> </li> <li> <p> <code>sync</code> is used by default. If you instead specify <code>async</code>, the system acknowledges writes before writing to disk. If the system crashes before the writes are finished, you lose the unwritten data. </p> </li> </ul>"
         }
       },
       "documentation":"<p>Specifies who can mount the file system and the options that can be used while mounting the file system.</p>"
@@ -3518,9 +3548,13 @@
     "OpenZFSCreateRootVolumeConfiguration":{
       "type":"structure",
       "members":{
+        "RecordSizeKiB":{
+          "shape":"IntegerRecordSizeKiB",
+          "documentation":"<p>Specifies the record size of an OpenZFS root volume, in kibibytes (KiB). Valid values are 4, 8, 16, 32, 64, 128, 256, 512, or 1024 KiB. The default is 128 KiB. Most workloads should use the default record size. Database workflows can benefit from a smaller record size, while streaming workflows can benefit from a larger record size. For additional guidance on setting a custom record size, see <a href=\"https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/performance.html#performance-tips-zfs\"> Tips for maximizing performance</a> in the <i>Amazon FSx for OpenZFS User Guide</i>.</p>"
+        },
         "DataCompressionType":{
           "shape":"OpenZFSDataCompressionType",
-          "documentation":"<p>Specifies the method used to compress the data on the volume. Unless the compression type is specified, volumes inherit the <code>DataCompressionType</code> value of their parent volume.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the ZStandard (ZSTD) compression algorithm. This algorithm reduces the amount of space used on your volume and has very little impact on compute resources.</p> </li> </ul>"
+          "documentation":"<p>Specifies the method used to compress the data on the volume. The compression type is <code>NONE</code> by default.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume. <code>NONE</code> is the default.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. Compared to LZ4, Z-Standard provides a better compression ratio to minimize on-disk storage utilization.</p> </li> <li> <p> <code>LZ4</code> - Compresses the data in the volume using the LZ4 compression algorithm. Compared to Z-Standard, LZ4 is less compute-intensive and delivers higher write throughput speeds.</p> </li> </ul>"
         },
         "NfsExports":{
           "shape":"OpenZFSNfsExports",
@@ -3532,7 +3566,7 @@
         },
         "CopyTagsToSnapshots":{
           "shape":"Flag",
-          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value. </p>"
+          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots of the volume. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value. </p>"
         },
         "ReadOnly":{
           "shape":"ReadOnly",
@@ -3545,7 +3579,8 @@
       "type":"string",
       "enum":[
         "NONE",
-        "ZSTD"
+        "ZSTD",
+        "LZ4"
       ]
     },
     "OpenZFSDeploymentType":{
@@ -3571,7 +3606,7 @@
         },
         "ThroughputCapacity":{
           "shape":"MegabytesPerSecond",
-          "documentation":"<p>The throughput of an Amazon FSx file system, measured in megabytes per second (MBps), in 2 to the nth increments, between 2^3 (8) and 2^11 (2048). </p>"
+          "documentation":"<p>The throughput of an Amazon FSx file system, measured in megabytes per second (MBps). Valid values are 64, 128, 256, 512, 1024, 2048, 3072, or 4096 MB/s.</p>"
         },
         "WeeklyMaintenanceStartTime":{"shape":"WeeklyTime"},
         "DiskIopsConfiguration":{"shape":"DiskIopsConfiguration"},
@@ -3675,13 +3710,17 @@
           "shape":"IntegerNoMax",
           "documentation":"<p>The maximum amount of storage in gibibtyes (GiB) that the volume can use from its parent. You can specify a quota larger than the storage on the parent volume.</p>"
         },
+        "RecordSizeKiB":{
+          "shape":"IntegerRecordSizeKiB",
+          "documentation":"<p>The record size of an OpenZFS volume, in kibibytes (KiB). Valid values are 4, 8, 16, 32, 64, 128, 256, 512, or 1024 KiB. The default is 128 KiB. Most workloads should use the default record size. For guidance on when to set a custom record size, see the <i>Amazon FSx for OpenZFS User Guide</i>.</p>"
+        },
         "DataCompressionType":{
           "shape":"OpenZFSDataCompressionType",
-          "documentation":"<p>The method used to compress the data on the volume. Unless a compression type is specified, volumes inherit the <code>DataCompressionType</code> value of their parent volume.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. This algorithm reduces the amount of space used on your volume and has very little impact on compute resources.</p> </li> </ul>"
+          "documentation":"<p>Specifies the method used to compress the data on the volume. The compression type is <code>NONE</code> by default.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume. <code>NONE</code> is the default.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. Compared to LZ4, Z-Standard provides a better compression ratio to minimize on-disk storage utilization.</p> </li> <li> <p> <code>LZ4</code> - Compresses the data in the volume using the LZ4 compression algorithm. Compared to Z-Standard, LZ4 is less compute-intensive and delivers higher write throughput speeds.</p> </li> </ul>"
         },
         "CopyTagsToSnapshots":{
           "shape":"Flag",
-          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value. </p>"
+          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value.</p>"
         },
         "OriginSnapshot":{
           "shape":"OpenZFSOriginSnapshotConfiguration",
@@ -3697,7 +3736,7 @@
         },
         "UserAndGroupQuotas":{
           "shape":"OpenZFSUserAndGroupQuotas",
-          "documentation":"<p>An object specifying how much storage users or groups can use on the volume. </p>"
+          "documentation":"<p>An object specifying how much storage users or groups can use on the volume.</p>"
         }
       },
       "documentation":"<p>The configuration of an Amazon FSx for OpenZFS volume.</p>"
@@ -4022,6 +4061,7 @@
           "shape":"SnapshotLifecycle",
           "documentation":"<p>The lifecycle status of the snapshot.</p> <ul> <li> <p> <code>PENDING</code> - Amazon FSx hasn't started creating the snapshot.</p> </li> <li> <p> <code>CREATING</code> - Amazon FSx is creating the snapshot.</p> </li> <li> <p> <code>DELETING</code> - Amazon FSx is deleting the snapshot.</p> </li> <li> <p> <code>AVAILABLE</code> - The snapshot is fully available.</p> </li> </ul>"
         },
+        "LifecycleTransitionReason":{"shape":"LifecycleTransitionReason"},
         "Tags":{"shape":"Tags"},
         "AdministrativeActions":{
           "shape":"AdministrativeActions",
@@ -4562,16 +4602,16 @@
         "AutomaticBackupRetentionDays":{"shape":"AutomaticBackupRetentionDays"},
         "CopyTagsToBackups":{
           "shape":"Flag",
-          "documentation":"<p>A Boolean value indicating whether tags for the file system should be copied to backups. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the file system are copied to all automatic and user-initiated backups where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to backups. If you specify one or more tags when creating a user-initiated backup, no tags are copied from the file system, regardless of this value. </p>"
+          "documentation":"<p>A Boolean value indicating whether tags for the file system should be copied to backups. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the file system are copied to all automatic and user-initiated backups where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to backups. If you specify one or more tags when creating a user-initiated backup, no tags are copied from the file system, regardless of this value.</p>"
         },
         "CopyTagsToVolumes":{
           "shape":"Flag",
-          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value. </p>"
+          "documentation":"<p>A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to <code>false</code>. If it's set to <code>true</code>, all tags for the volume are copied to snapshots where the user doesn't specify tags. If this value is <code>true</code> and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value.</p>"
         },
         "DailyAutomaticBackupStartTime":{"shape":"DailyTime"},
         "ThroughputCapacity":{
           "shape":"MegabytesPerSecond",
-          "documentation":"<p>The throughput of an Amazon FSx file system, measured in megabytes per second (MBps), in 2 to the nth increments, between 2^3 (8) and 2^12 (4096). </p>"
+          "documentation":"<p>The throughput of an Amazon FSx file system, measured in megabytes per second (MBps). Valid values are 64, 128, 256, 512, 1024, 2048, 3072, or 4096 MB/s.</p>"
         },
         "WeeklyMaintenanceStartTime":{"shape":"WeeklyTime"},
         "DiskIopsConfiguration":{"shape":"DiskIopsConfiguration"}
@@ -4678,16 +4718,20 @@
       "type":"structure",
       "members":{
         "StorageCapacityReservationGiB":{
-          "shape":"IntegerNoMax",
-          "documentation":"<p>The amount of storage in gibibytes (GiB) to reserve from the parent volume. You can't reserve more storage than the parent volume has reserved.</p>"
+          "shape":"IntegerNoMaxFromNegativeOne",
+          "documentation":"<p>The amount of storage in gibibytes (GiB) to reserve from the parent volume. You can't reserve more storage than the parent volume has reserved. You can specify a value of <code>-1</code> to unset a volume's storage capacity reservation.</p>"
         },
         "StorageCapacityQuotaGiB":{
-          "shape":"IntegerNoMax",
-          "documentation":"<p/> <p>The maximum amount of storage in gibibytes (GiB) that the volume can use from its parent. You can specify a quota larger than the storage on the parent volume.</p>"
+          "shape":"IntegerNoMaxFromNegativeOne",
+          "documentation":"<p>The maximum amount of storage in gibibytes (GiB) that the volume can use from its parent. You can specify a quota larger than the storage on the parent volume. You can specify a value of <code>-1</code> to unset a volume's storage capacity quota.</p>"
+        },
+        "RecordSizeKiB":{
+          "shape":"IntegerRecordSizeKiB",
+          "documentation":"<p>Specifies the record size of an OpenZFS volume, in kibibytes (KiB). Valid values are 4, 8, 16, 32, 64, 128, 256, 512, or 1024 KiB. The default is 128 KiB. Most workloads should use the default record size. Database workflows can benefit from a smaller record size, while streaming workflows can benefit from a larger record size. For additional guidance on when to set a custom record size, see <a href=\"https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/performance.html#performance-tips-zfs\"> Tips for maximizing performance</a> in the <i>Amazon FSx for OpenZFS User Guide</i>.</p>"
         },
         "DataCompressionType":{
           "shape":"OpenZFSDataCompressionType",
-          "documentation":"<p/> <p>Specifies the method used to compress the data on the volume. Unless the compression type is specified, volumes inherit the <code>DataCompressionType</code> value of their parent volume.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. This algorithm reduces the amount of space used on your volume and has very little impact on compute resources.</p> </li> </ul>"
+          "documentation":"<p>Specifies the method used to compress the data on the volume. The compression type is <code>NONE</code> by default.</p> <ul> <li> <p> <code>NONE</code> - Doesn't compress the data on the volume. <code>NONE</code> is the default.</p> </li> <li> <p> <code>ZSTD</code> - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. Compared to LZ4, Z-Standard provides a better compression ratio to minimize on-disk storage utilization.</p> </li> <li> <p> <code>LZ4</code> - Compresses the data in the volume using the LZ4 compression algorithm. Compared to Z-Standard, LZ4 is less compute-intensive and delivers higher write throughput speeds.</p> </li> </ul>"
         },
         "NfsExports":{
           "shape":"OpenZFSNfsExports",
@@ -4717,7 +4761,7 @@
         },
         "Name":{
           "shape":"SnapshotName",
-          "documentation":"<p>The name of the snapshot to update. </p>"
+          "documentation":"<p>The name of the snapshot to update.</p>"
         },
         "SnapshotId":{
           "shape":"SnapshotId",
@@ -4919,7 +4963,7 @@
       "members":{
         "Message":{"shape":"ErrorMessage"}
       },
-      "documentation":"<p>No Amazon FSx for NetApp ONTAP volumes were found based upon the supplied parameters.</p>",
+      "documentation":"<p>No Amazon FSx volumes were found based upon the supplied parameters.</p>",
       "exception":true
     },
     "VolumePath":{
diff --git a/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json b/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json
index e57829255..eb0c7bcbb 100644
--- a/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json
+++ b/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json
@@ -29,7 +29,7 @@
         {"shape":"ThrottlingException"},
         {"shape":"EndpointTemporarilyUnavailableException"}
       ],
-      "documentation":"<p>Get the state for a routing control. A routing control is a simple on/off switch that you can use to route traffic to cells. When the state is On, traffic flows to a cell. When it's off, traffic does not flow. </p> <p>Before you can create a routing control, you first must create a cluster to host the control. For more information, see <a href=\"https://docs.aws.amazon.com/recovery-cluster/latest/api/cluster.html\">CreateCluster</a>. Access one of the endpoints for the cluster to get or update the routing control state to redirect traffic.</p> <p>For more information about working with routing controls, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html\">Routing control</a> in the Route 53 Application Recovery Controller Developer Guide.</p>"
+      "documentation":"<p>Get the state for a routing control. A routing control is a simple on/off switch that you can use to route traffic to cells. When the state is On, traffic flows to a cell. When it's Off, traffic does not flow. </p> <p>Before you can create a routing control, you must first create a cluster to host the control in a control panel. For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.create.html\"> Create routing control structures</a> in the Amazon Route 53 Application Recovery Controller Developer Guide. Then you access one of the endpoints for the cluster to get or update the routing control state to redirect traffic. </p> <p> <i>You must specify Regional endpoints when you work with API cluster operations to get or update routing control states in Application Recovery Controller.</i> </p> <p>To see a code example for getting a routing control state, including accessing Regional cluster endpoints in sequence, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples_actions.html\">API examples</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> <p>Learn more about working with routing controls in the following topics in the Amazon Route 53 Application Recovery Controller Developer Guide:</p> <ul> <li> <p> <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html\"> Viewing and updating routing control states</a> </p> </li> <li> <p> <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html\">Working with routing controls overall</a> </p> </li> </ul>"
     },
     "UpdateRoutingControlState":{
       "name":"UpdateRoutingControlState",
@@ -48,7 +48,7 @@
         {"shape":"EndpointTemporarilyUnavailableException"},
         {"shape":"ConflictException"}
       ],
-      "documentation":"<p>Set the state of the routing control to reroute traffic. You can set the value to be On or Off. When the state is On, traffic flows to a cell. When it's off, traffic does not flow.</p> <p>For more information about working with routing controls, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html\">Routing control</a> in the Route 53 Application Recovery Controller Developer Guide.</p>"
+      "documentation":"<p>Set the state of the routing control to reroute traffic. You can set the value to be On or Off. When the state is On, traffic flows to a cell. When it's Off, traffic does not flow.</p> <p>With Application Recovery Controller, you can add safety rules for routing controls, which are safeguards for routing control state updates that help prevent unexpected outcomes, like fail open traffic routing. However, there are scenarios when you might want to bypass the routing control safeguards that are enforced with safety rules that you've configured. For example, you might want to fail over quickly for disaster recovery, and one or more safety rules might be unexpectedly preventing you from updating a routing control state to reroute traffic. In a \"break glass\" scenario like this, you can override one or more safety rules to change a routing control state and fail over your application.</p> <p>The <code>SafetyRulesToOverride</code> property enables you override one or more safety rules and update routing control states. For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.override-safety-rule.html\"> Override safety rules to reroute traffic</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> <p> <i>You must specify Regional endpoints when you work with API cluster operations to get or update routing control states in Application Recovery Controller.</i> </p> <p>To see a code example for getting a routing control state, including accessing Regional cluster endpoints in sequence, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples_actions.html\">API examples</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> <ul> <li> <p> <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html\"> Viewing and updating routing control states</a> </p> </li> <li> <p> <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html\">Working with routing controls overall</a> </p> </li> </ul>"
     },
     "UpdateRoutingControlStates":{
       "name":"UpdateRoutingControlStates",
@@ -67,7 +67,7 @@
         {"shape":"EndpointTemporarilyUnavailableException"},
         {"shape":"ConflictException"}
       ],
-      "documentation":"<p>Set multiple routing control states. You can set the value for each state to be On or Off. When the state is On, traffic flows to a cell. When it's off, traffic does not flow.</p> <p>For more information about working with routing controls, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html\">Routing control</a> in the Route 53 Application Recovery Controller Developer Guide.</p>"
+      "documentation":"<p>Set multiple routing control states. You can set the value for each state to be On or Off. When the state is On, traffic flows to a cell. When it's Off, traffic does not flow.</p> <p>With Application Recovery Controller, you can add safety rules for routing controls, which are safeguards for routing control state updates that help prevent unexpected outcomes, like fail open traffic routing. However, there are scenarios when you might want to bypass the routing control safeguards that are enforced with safety rules that you've configured. For example, you might want to fail over quickly for disaster recovery, and one or more safety rules might be unexpectedly preventing you from updating a routing control state to reroute traffic. In a \"break glass\" scenario like this, you can override one or more safety rules to change a routing control state and fail over your application.</p> <p>The <code>SafetyRulesToOverride</code> property enables you override one or more safety rules and update routing control states. For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.override-safety-rule.html\"> Override safety rules to reroute traffic</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> <p> <i>You must specify Regional endpoints when you work with API cluster operations to get or update routing control states in Application Recovery Controller.</i> </p> <p>To see a code example for getting a routing control state, including accessing Regional cluster endpoints in sequence, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples_actions.html\">API examples</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> <ul> <li> <p> <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html\"> Viewing and updating routing control states</a> </p> </li> <li> <p> <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html\">Working with routing controls overall</a> </p> </li> </ul>"
     }
   },
   "shapes":{
@@ -84,7 +84,11 @@
       "type":"string",
       "max":255,
       "min":1,
-      "pattern":"^[A-Za-z0-9:\\/_-]*$"
+      "pattern":"^[A-Za-z0-9:.\\/_-]*$"
+    },
+    "Arns":{
+      "type":"list",
+      "member":{"shape":"Arn"}
     },
     "ConflictException":{
       "type":"structure",
@@ -213,14 +217,14 @@
       "members":{
         "RoutingControlArn":{
           "shape":"Arn",
-          "documentation":"<p>The Amazon Resource Number (ARN) for the routing control state entry.</p>"
+          "documentation":"<p>The Amazon Resource Number (ARN) for a routing control state entry.</p>"
         },
         "RoutingControlState":{
           "shape":"RoutingControlState",
           "documentation":"<p>The routing control state in a set of routing control state entries.</p>"
         }
       },
-      "documentation":"<p>A routing control state.</p>"
+      "documentation":"<p>A routing control state entry.</p>"
     },
     "UpdateRoutingControlStateRequest":{
       "type":"structure",
@@ -236,6 +240,10 @@
         "RoutingControlState":{
           "shape":"RoutingControlState",
           "documentation":"<p>The state of the routing control. You can set the value to be On or Off.</p>"
+        },
+        "SafetyRulesToOverride":{
+          "shape":"Arns",
+          "documentation":"<p>The Amazon Resource Numbers (ARNs) for the safety rules that you want to override when you're updating the state of a routing control. You can override one safety rule or multiple safety rules by including one or more ARNs, separated by commas.</p> <p>For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.override-safety-rule.html\"> Override safety rules to reroute traffic</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p>"
         }
       }
     },
@@ -251,6 +259,10 @@
         "UpdateRoutingControlStateEntries":{
           "shape":"UpdateRoutingControlStateEntries",
           "documentation":"<p>A set of routing control entries that you want to update.</p>"
+        },
+        "SafetyRulesToOverride":{
+          "shape":"Arns",
+          "documentation":"<p>The Amazon Resource Numbers (ARNs) for the safety rules that you want to override when you're updating routing control states. You can override one safety rule or multiple safety rules by including one or more ARNs, separated by commas.</p> <p>For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.override-safety-rule.html\"> Override safety rules to reroute traffic</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p>"
         }
       }
     },
@@ -304,5 +316,5 @@
       ]
     }
   },
-  "documentation":"<p>Welcome to the Amazon Route 53 Application Recovery Controller API Reference Guide for Recovery Control Data Plane .</p> <p>Recovery control in Route 53 Application Recovery Controller includes extremely reliable routing controls that enable you to recover applications by rerouting traffic, for example, across Availability Zones or AWS Regions. Routing controls are simple on/off switches hosted on a cluster. A cluster is a set of five redundant regional endpoints against which you can execute API calls to update or get the state of routing controls. You use routing controls to failover traffic to recover your application across Availability Zones or Regions.</p> <p>This API guide includes information about how to get and update routing control states in Route 53 Application Recovery Controller.</p> <p>For more information about Route 53 Application Recovery Controller, see the following:</p> <ul> <li> <p>You can create clusters, routing controls, and control panels by using the control plane API for Recovery Control. For more information, see <a href=\"https://docs.aws.amazon.com/recovery-cluster/latest/api/\">Amazon Route 53 Application Recovery Controller Recovery Control API Reference</a>.</p> </li> <li> <p>Route 53 Application Recovery Controller also provides continuous readiness checks to ensure that your applications are scaled to handle failover traffic. For more information about the related API actions, see <a href=\"https://docs.aws.amazon.com/recovery-readiness/latest/api/\">Amazon Route 53 Application Recovery Controller Recovery Readiness API Reference</a>.</p> </li> <li> <p>For more information about creating resilient applications and preparing for recovery readiness with Route 53 Application Recovery Controller, see the <a href=\"r53recovery/latest/dg/\">Amazon Route 53 Application Recovery Controller Developer Guide</a>.</p> </li> </ul>"
+  "documentation":"<p>Welcome to the Routing Control (Recovery Cluster) API Reference Guide for Amazon Route 53 Application Recovery Controller.</p> <p>With Amazon Route 53 Application Recovery Controller, you can use routing control with extreme reliability to recover applications by rerouting traffic across Availability Zones or AWS Regions. Routing controls are simple on/off switches hosted on a highly available cluster in Application Recovery Controller. A cluster provides a set of five redundant Regional endpoints against which you can run API calls to get or update the state of routing controls. To implement failover, you set one routing control on and another one off, to reroute traffic from one Availability Zone or Amazon Web Services Region to another. </p> <p> <i>Be aware that you must specify the Regional endpoints for a cluster when you work with API cluster operations to get or update routing control states in Application Recovery Controller.</i> In addition, you must specify the US West (Oregon) Region for Application Recovery Controller API calls. For example, use the parameter <code>region us-west-2</code> with AWS CLI commands. For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.api.html\"> Get and update routing control states using the API</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> <p>This API guide includes information about the API operations for how to get and update routing control states in Application Recovery Controller. You also must set up the structures to support routing controls: clusters and control panels.</p> <p>For more information about working with routing control in Application Recovery Controller, see the following:</p> <ul> <li> <p>To create clusters, routing controls, and control panels by using the control plane API for routing control, see the <a href=\"https://docs.aws.amazon.com/recovery-cluster/latest/api/\">Recovery Control Configuration API Reference Guide for Amazon Route 53 Application Recovery Controller</a>.</p> </li> <li> <p>Learn about the components in recovery control configuration, including clusters, routing controls, and control panels. For more information, see <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/introduction-components.html#introduction-components-routing\"> Recovery control components</a> in the Amazon Route 53 Application Recovery Controller Developer Guide.</p> </li> <li> <p>Application Recovery Controller also provides readiness checks that run continually to help make sure that your applications are scaled and ready to handle failover traffic. For more information about the related API actions, see the <a href=\"https://docs.aws.amazon.com/recovery-readiness/latest/api/\">Recovery Readiness API Reference Guide for Amazon Route 53 Application Recovery Controller</a>.</p> </li> <li> <p>For more information about creating resilient applications and preparing for recovery readiness with Application Recovery Controller, see the <a href=\"https://docs.aws.amazon.com/r53recovery/latest/dg/\">Amazon Route 53 Application Recovery Controller Developer Guide</a>.</p> </li> </ul>"
 }
diff --git a/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json b/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json
index 5cc5f543e..9dfd7f6a6 100644
--- a/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json
+++ b/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json
@@ -1394,7 +1394,9 @@
         },
         "name":{
           "shape":"Name",
-          "documentation":"<p>The new name of the application. The name must be unique in the region in which you are updating the application.</p>"
+          "documentation":"<p>The new name of the application. The name must be unique in the region in which you are updating the application.</p>",
+          "deprecated":true,
+          "deprecatedMessage":"Name update for application is deprecated."
         },
         "description":{
           "shape":"Description",
@@ -1423,7 +1425,9 @@
         },
         "name":{
           "shape":"Name",
-          "documentation":"<p>The new name of the attribute group. The name must be unique in the region in which you are updating the attribute group.</p>"
+          "documentation":"<p>The new name of the attribute group. The name must be unique in the region in which you are updating the attribute group.</p>",
+          "deprecated":true,
+          "deprecatedMessage":"Name update for attribute group is deprecated."
         },
         "description":{
           "shape":"Description",
diff --git a/botocore/regions.py b/botocore/regions.py
index 59daa5450..53ba2badb 100644
--- a/botocore/regions.py
+++ b/botocore/regions.py
@@ -298,6 +298,7 @@ class EndpointResolver(BaseEndpointResolver):
                     service_name, endpoint_name
                 ))
                 raise EndpointVariantError(tags=tags, error_msg=error_msg)
+            self._merge_keys(endpoint_data, result)
         else:
             result = endpoint_data
 
diff --git a/docs/source/conf.py b/docs/source/conf.py
index fecc5b4ec..01af7b7b9 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -54,7 +54,7 @@ copyright = u'2013, Mitch Garnaat'
 # The short X.Y version.
 version = '1.24'
 # The full version, including alpha/beta/rc tags.
-release = '1.24.8'
+release = '1.24.9'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.


Test patch:
diff --git a/tests/unit/test_regions.py b/tests/unit/test_regions.py
index 9732525af..33a495daa 100644
--- a/tests/unit/test_regions.py
+++ b/tests/unit/test_regions.py
@@ -1172,3 +1172,11 @@ def _verify_expected_endpoint(service, region, fips, dualstack,
             use_fips_endpoint=fips
         )
     assert resolved['hostname'] == endpoint
+
+
+def test_additional_endpoint_data_exists_with_variants():
+    resolver = regions.EndpointResolver(_modeled_variants_template())
+    resolved = resolver.construct_endpoint(
+        'global-service', 'aws-global', use_fips_endpoint=True,
+    )
+    assert resolved['credentialScope'] == {'region': 'us-east-1'}