Repository: boto/botocore
Pull request #1164 (2017-03-14 16:28:35)

Fix for date parsing in AssumeRoleProvider _is_expired check

codecov-io: # [Codecov](https://codecov.io/gh/boto/botocore/pull/1164?src=pr&el=h1) Report
> Merging [#1164](https://codecov.io/gh/boto/botocore/pull/1164?src=pr&el=desc) into [develop](https://codecov.io/gh/boto/botocore/commit/150171e444a59f5ba959d711f629d151933e35dd?src=pr&el=desc) will **decrease** coverage by `2.22%`.
> The diff coverage is `0%`.


```diff
@@             Coverage Diff             @@
##           develop    #1164      +/-   ##
===========================================
- Coverage    97.95%   95.72%   -2.23%     
===========================================
  Files           45       45              
  Lines         7093     7093              
===========================================
- Hits          6948     6790     -158     
- Misses         145      303     +158
```


| [Impacted Files](https://codecov.io/gh/boto/botocore/pull/1164?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [botocore/credentials.py](https://codecov.io/gh/boto/botocore/compare/150171e444a59f5ba959d711f629d151933e35dd...7f8f900a4addfb73b34dc432e0396692d6dedd2b?src=pr&el=tree#diff-Ym90b2NvcmUvY3JlZGVudGlhbHMucHk=) | `65.36% <0%> (-32.18%)` | :x: |
| [botocore/compat.py](https://codecov.io/gh/boto/botocore/compare/150171e444a59f5ba959d711f629d151933e35dd...7f8f900a4addfb73b34dc432e0396692d6dedd2b?src=pr&el=tree#diff-Ym90b2NvcmUvY29tcGF0LnB5) | `91.11% <0%> (-0.75%)` | :x: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/boto/botocore/pull/1164?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/boto/botocore/pull/1164?src=pr&el=footer). Last update [150171e...7f8f900](https://codecov.io/gh/boto/botocore/compare/150171e444a59f5ba959d711f629d151933e35dd...7f8f900a4addfb73b34dc432e0396692d6dedd2b?el=footer&src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
dstufft: Thanks! I *think* that this is pretty safe to add, even if there are cases when it is infact a string it should still parse it. However it needs additional tests to ensure that everything is covered.

Patch:
diff --git a/.changes/1.5.27.json b/.changes/1.5.27.json
deleted file mode 100644
index 3c91f029f..000000000
--- a/.changes/1.5.27.json
+++ /dev/null
@@ -1,32 +0,0 @@
-[
-  {
-    "category": "``pinpoint``", 
-    "description": "Update pinpoint client to latest version", 
-    "type": "api-change"
-  }, 
-  {
-    "category": "``directconnect``", 
-    "description": "Update directconnect client to latest version", 
-    "type": "api-change"
-  }, 
-  {
-    "category": "Credentials", 
-    "description": "Add support for localhost when using container credential provider (`#1160 <https://github.com/boto/botocore/issues/1160>`__)", 
-    "type": "enhancement"
-  }, 
-  {
-    "category": "``codebuild``", 
-    "description": "Update codebuild client to latest version", 
-    "type": "api-change"
-  }, 
-  {
-    "category": "``marketplacecommerceanalytics``", 
-    "description": "Update marketplacecommerceanalytics client to latest version", 
-    "type": "api-change"
-  }, 
-  {
-    "category": "``rekognition``", 
-    "description": "Update rekognition client to latest version", 
-    "type": "api-change"
-  }
-]
\ No newline at end of file
diff --git a/.changes/1.5.28.json b/.changes/1.5.28.json
deleted file mode 100644
index e537ade7e..000000000
--- a/.changes/1.5.28.json
+++ /dev/null
@@ -1,12 +0,0 @@
-[
-  {
-    "category": "``discovery``", 
-    "description": "Update discovery client to latest version", 
-    "type": "api-change"
-  }, 
-  {
-    "category": "``lambda``", 
-    "description": "Update lambda client to latest version", 
-    "type": "api-change"
-  }
-]
\ No newline at end of file
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index b323ec54b..cd3722210 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,24 +2,6 @@
 CHANGELOG
 =========
 
-1.5.28
-======
-
-* api-change:``discovery``: Update discovery client to latest version
-* api-change:``lambda``: Update lambda client to latest version
-
-
-1.5.27
-======
-
-* api-change:``pinpoint``: Update pinpoint client to latest version
-* api-change:``directconnect``: Update directconnect client to latest version
-* enhancement:Credentials: Add support for localhost when using container credential provider (`#1160 <https://github.com/boto/botocore/issues/1160>`__)
-* api-change:``codebuild``: Update codebuild client to latest version
-* api-change:``marketplacecommerceanalytics``: Update marketplacecommerceanalytics client to latest version
-* api-change:``rekognition``: Update rekognition client to latest version
-
-
 1.5.26
 ======
 
diff --git a/botocore/__init__.py b/botocore/__init__.py
index 48986630d..fcb7cc5cd 100644
--- a/botocore/__init__.py
+++ b/botocore/__init__.py
@@ -16,7 +16,7 @@ import os
 import re
 import logging
 
-__version__ = '1.5.28'
+__version__ = '1.5.26'
 
 
 class NullHandler(logging.Handler):
diff --git a/botocore/credentials.py b/botocore/credentials.py
index d5a2da5a2..4a1c5efc4 100644
--- a/botocore/credentials.py
+++ b/botocore/credentials.py
@@ -834,7 +834,7 @@ class AssumeRoleProvider(CredentialProvider):
             return None
 
     def _is_expired(self, credentials):
-        end_time = parse(credentials['Credentials']['Expiration'])
+        end_time = _parse_if_needed(credentials['Credentials']['Expiration'])
         now = datetime.datetime.now(tzlocal())
         seconds = total_seconds(end_time - now)
         return seconds < self.EXPIRY_WINDOW_SECONDS
@@ -945,8 +945,6 @@ class ContainerProvider(CredentialProvider):
 
     METHOD = 'container-role'
     ENV_VAR = 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'
-    ENV_VAR_FULL = 'AWS_CONTAINER_CREDENTIALS_FULL_URI'
-    ENV_VAR_AUTH_TOKEN = 'AWS_CONTAINER_AUTHORIZATION_TOKEN'
 
     def __init__(self, environ=None, fetcher=None):
         if environ is None:
@@ -957,18 +955,15 @@ class ContainerProvider(CredentialProvider):
         self._fetcher = fetcher
 
     def load(self):
-        # This cred provider is only triggered if the self.ENV_VAR is set,
-        # which only happens if you opt into this feature.
-        if self.ENV_VAR in self._environ or self.ENV_VAR_FULL in self._environ:
-            return self._retrieve_or_fail()
-
-    def _retrieve_or_fail(self):
-        if self._provided_relative_uri():
-            full_uri = self._fetcher.full_url(self._environ[self.ENV_VAR])
-        else:
-            full_uri = self._environ[self.ENV_VAR_FULL]
-        headers = self._build_headers()
-        fetcher = self._create_fetcher(full_uri, headers)
+        if self.ENV_VAR not in self._environ:
+            # This cred provider is only triggered if the
+            # self.ENV_VAR is set, which only happens if you opt
+            # into this feature on ECS.
+            return None
+        return self._retrieve_or_fail(self._environ[self.ENV_VAR])
+
+    def _retrieve_or_fail(self, relative_uri):
+        fetcher = self._create_fetcher(relative_uri)
         creds = fetcher()
         return RefreshableCredentials(
             access_key=creds['access_key'],
@@ -979,21 +974,12 @@ class ContainerProvider(CredentialProvider):
             refresh_using=fetcher,
         )
 
-    def _build_headers(self):
-        headers = {}
-        auth_token = self._environ.get(self.ENV_VAR_AUTH_TOKEN)
-        if auth_token is not None:
-            return {
-                'Authorization': auth_token
-            }
-
-    def _create_fetcher(self, full_uri, headers):
+    def _create_fetcher(self, relative_uri):
         def fetch_creds():
             try:
-                response = self._fetcher.retrieve_full_uri(
-                    full_uri, headers=headers)
+                response = self._fetcher.retrieve_uri(relative_uri)
             except MetadataRetrievalError as e:
-                logger.debug("Error retrieving container metadata: %s", e,
+                logger.debug("Error retrieving ECS metadata: %s", e,
                              exc_info=True)
                 raise CredentialRetrievalError(provider=self.METHOD,
                                                error_msg=str(e))
@@ -1005,9 +991,6 @@ class ContainerProvider(CredentialProvider):
             }
         return fetch_creds
 
-    def _provided_relative_uri(self):
-        return self.ENV_VAR in self._environ
-
 
 class CredentialResolver(object):
 
diff --git a/botocore/data/codebuild/2016-10-06/service-2.json b/botocore/data/codebuild/2016-10-06/service-2.json
index ca237337a..a7e3df7bb 100644
--- a/botocore/data/codebuild/2016-10-06/service-2.json
+++ b/botocore/data/codebuild/2016-10-06/service-2.json
@@ -864,7 +864,7 @@
         },
         "location":{
           "shape":"String",
-          "documentation":"<p>Information about the location of the source code to be built. Valid values include:</p> <ul> <li> <p>For source code settings that are specified in the source action of a pipeline in AWS CodePipeline, <code>location</code> should not be specified. If it is specified, AWS CodePipeline will ignore it. This is because AWS CodePipeline uses the settings in a pipeline's source action instead of this value.</p> </li> <li> <p>For source code in an AWS CodeCommit repository, the HTTPS clone URL to the repository that contains the source code and the build spec (for example, <code>https://git-codecommit.<i>region-ID</i>.amazonaws.com/v1/repos/<i>repo-name</i> </code>).</p> </li> <li> <p>For source code in an Amazon Simple Storage Service (Amazon S3) input bucket, the path to the ZIP file that contains the source code (for example, <code> <i>bucket-name</i>/<i>path</i>/<i>to</i>/<i>object-name</i>.zip</code>)</p> </li> <li> <p>For source code in a GitHub repository, the HTTPS clone URL to the repository that contains the source and the build spec. Also, you must connect your AWS account to your GitHub account. To do this, use the AWS CodeBuild console to begin creating a build project, and follow the on-screen instructions to complete the connection. (After you have connected to your GitHub account, you do not need to finish creating the build project, and you may then leave the AWS CodeBuild console.) To instruct AWS CodeBuild to then use this connection, in the <code>source</code> object, set the <code>auth</code> object's <code>type</code> value to <code>OAUTH</code>.</p> </li> </ul>"
+          "documentation":"<p>Information about the location of the source code to be built. Valid values include:</p> <ul> <li> <p>For source code settings that are specified in the source action of a pipeline in AWS CodePipeline, <code>location</code> should not be specified. If it is specified, AWS CodePipeline will ignore it. This is because AWS CodePipeline uses the settings in a pipeline's source action instead of this value.</p> </li> <li> <p>For source code in an AWS CodeCommit repository, the HTTPS clone URL to the repository that contains the source code and the build spec (for example, <code>https://git-codecommit.<i>region-ID</i>.amazonaws.com/v1/repos/<i>repo-name</i> </code>).</p> </li> <li> <p>For source code in an Amazon Simple Storage Service (Amazon S3) input bucket, the path to the ZIP file that contains the source code (for example, <code> <i>bucket-name</i>/<i>path</i>/<i>to</i>/<i>object-name</i>.zip</code>)</p> </li> <li> <p>For source code in a GitHub repository, instead of specifying a value here, you connect your AWS account to your GitHub account. To do this, use the AWS CodeBuild console to begin creating a build project, and follow the on-screen instructions to complete the connection. (After you have connected to your GitHub account, you do not need to finish creating the build project, and you may then leave the AWS CodeBuild console.) To instruct AWS CodeBuild to then use this connection, in the <code>source</code> object, set the <code>auth</code> object's <code>type</code> value to <code>OAUTH</code>.</p> </li> </ul>"
         },
         "buildspec":{
           "shape":"String",
diff --git a/botocore/data/directconnect/2012-10-25/service-2.json b/botocore/data/directconnect/2012-10-25/service-2.json
index 6e1015a84..d5edd75f2 100644
--- a/botocore/data/directconnect/2012-10-25/service-2.json
+++ b/botocore/data/directconnect/2012-10-25/service-2.json
@@ -23,8 +23,7 @@
         {"shape":"DirectConnectServerException"},
         {"shape":"DirectConnectClientException"}
       ],
-      "documentation":"<p>Deprecated in favor of <a>AllocateHostedConnection</a>.</p> <p>Creates a hosted connection on an interconnect.</p> <p>Allocates a VLAN number and a specified amount of bandwidth for use by a hosted connection on the given interconnect.</p> <note> <p>This is intended for use by AWS Direct Connect partners only.</p> </note>",
-      "deprecated":true
+      "documentation":"<p>Deprecated in favor of <a>AllocateHostedConnection</a>.</p> <p>Creates a hosted connection on an interconnect.</p> <p>Allocates a VLAN number and a specified amount of bandwidth for use by a hosted connection on the given interconnect.</p> <note> <p>This is intended for use by AWS Direct Connect partners only.</p> </note>"
     },
     "AllocateHostedConnection":{
       "name":"AllocateHostedConnection",
@@ -318,8 +317,7 @@
         {"shape":"DirectConnectServerException"},
         {"shape":"DirectConnectClientException"}
       ],
-      "documentation":"<p>Deprecated in favor of <a>DescribeLoa</a>.</p> <p>Returns the LOA-CFA for a Connection.</p> <p>The Letter of Authorization - Connecting Facility Assignment (LOA-CFA) is a document that your APN partner or service provider uses when establishing your cross connect to AWS at the colocation facility. For more information, see <a href=\"http://docs.aws.amazon.com/directconnect/latest/UserGuide/Colocation.html\">Requesting Cross Connects at AWS Direct Connect Locations</a> in the AWS Direct Connect user guide.</p>",
-      "deprecated":true
+      "documentation":"<p>Deprecated in favor of <a>DescribeLoa</a>.</p> <p>Returns the LOA-CFA for a Connection.</p> <p>The Letter of Authorization - Connecting Facility Assignment (LOA-CFA) is a document that your APN partner or service provider uses when establishing your cross connect to AWS at the colocation facility. For more information, see <a href=\"http://docs.aws.amazon.com/directconnect/latest/UserGuide/Colocation.html\">Requesting Cross Connects at AWS Direct Connect Locations</a> in the AWS Direct Connect user guide.</p>"
     },
     "DescribeConnections":{
       "name":"DescribeConnections",
@@ -347,8 +345,7 @@
         {"shape":"DirectConnectServerException"},
         {"shape":"DirectConnectClientException"}
       ],
-      "documentation":"<p>Deprecated in favor of <a>DescribeHostedConnections</a>.</p> <p>Returns a list of connections that have been provisioned on the given interconnect.</p> <note> <p>This is intended for use by AWS Direct Connect partners only.</p> </note>",
-      "deprecated":true
+      "documentation":"<p>Deprecated in favor of <a>DescribeHostedConnections</a>.</p> <p>Returns a list of connections that have been provisioned on the given interconnect.</p> <note> <p>This is intended for use by AWS Direct Connect partners only.</p> </note>"
     },
     "DescribeHostedConnections":{
       "name":"DescribeHostedConnections",
@@ -376,8 +373,7 @@
         {"shape":"DirectConnectServerException"},
         {"shape":"DirectConnectClientException"}
       ],
-      "documentation":"<p>Deprecated in favor of <a>DescribeLoa</a>.</p> <p>Returns the LOA-CFA for an Interconnect.</p> <p>The Letter of Authorization - Connecting Facility Assignment (LOA-CFA) is a document that is used when establishing your cross connect to AWS at the colocation facility. For more information, see <a href=\"http://docs.aws.amazon.com/directconnect/latest/UserGuide/Colocation.html\">Requesting Cross Connects at AWS Direct Connect Locations</a> in the AWS Direct Connect user guide.</p>",
-      "deprecated":true
+      "documentation":"<p>Deprecated in favor of <a>DescribeLoa</a>.</p> <p>Returns the LOA-CFA for an Interconnect.</p> <p>The Letter of Authorization - Connecting Facility Assignment (LOA-CFA) is a document that is used when establishing your cross connect to AWS at the colocation facility. For more information, see <a href=\"http://docs.aws.amazon.com/directconnect/latest/UserGuide/Colocation.html\">Requesting Cross Connects at AWS Direct Connect Locations</a> in the AWS Direct Connect user guide.</p>"
     },
     "DescribeInterconnects":{
       "name":"DescribeInterconnects",
diff --git a/botocore/data/discovery/2015-11-01/paginators-1.json b/botocore/data/discovery/2015-11-01/paginators-1.json
deleted file mode 100644
index ea142457a..000000000
--- a/botocore/data/discovery/2015-11-01/paginators-1.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "pagination": {}
-}
diff --git a/botocore/data/discovery/2015-11-01/service-2.json b/botocore/data/discovery/2015-11-01/service-2.json
index 9c721e065..1146cea57 100644
--- a/botocore/data/discovery/2015-11-01/service-2.json
+++ b/botocore/data/discovery/2015-11-01/service-2.json
@@ -123,7 +123,7 @@
         {"shape":"InvalidParameterValueException"},
         {"shape":"ServerInternalErrorException"}
       ],
-      "documentation":"<p>Retrieves attributes for a list of configuration item IDs. All of the supplied IDs must be for the same asset type (server, application, process, or connection). Output fields are specific to the asset type selected. For example, the output for a <i>server</i> configuration item includes a list of attributes about the server, such as host name, operating system, and number of network cards.</p> <p>For a complete list of outputs for each asset type, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/discovery-api-queries.html#DescribeConfigurations\">Using the DescribeConfigurations Action</a>.</p>"
+      "documentation":"<p>Retrieves attributes for a list of configuration item IDs. All of the supplied IDs must be for the same asset type (server, application, process, or connection). Output fields are specific to the asset type selected. For example, the output for a <i>server</i> configuration item includes a list of attributes about the server, such as host name, operating system, and number of network cards.</p> <p>For a complete list of outputs for each asset type, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/querying-configuration-items.html#DescribeConfigurations\">Querying Discovered Configuration Items</a>.</p>"
     },
     "DescribeExportConfigurations":{
       "name":"DescribeExportConfigurations",
@@ -140,24 +140,7 @@
         {"shape":"InvalidParameterValueException"},
         {"shape":"ServerInternalErrorException"}
       ],
-      "documentation":"<p>Deprecated. Use <code>DescribeExportTasks</code> instead.</p> <p>Retrieves the status of a given export process. You can retrieve status from a maximum of 100 processes.</p>",
-      "deprecated":true
-    },
-    "DescribeExportTasks":{
-      "name":"DescribeExportTasks",
-      "http":{
-        "method":"POST",
-        "requestUri":"/"
-      },
-      "input":{"shape":"DescribeExportTasksRequest"},
-      "output":{"shape":"DescribeExportTasksResponse"},
-      "errors":[
-        {"shape":"AuthorizationErrorException"},
-        {"shape":"InvalidParameterException"},
-        {"shape":"InvalidParameterValueException"},
-        {"shape":"ServerInternalErrorException"}
-      ],
-      "documentation":"<p>Retrieve status of one or more export tasks. You can retrieve the status of up to 100 export tasks.</p>"
+      "documentation":"<p>Retrieves the status of a given export process. You can retrieve status from a maximum of 100 processes.</p>"
     },
     "DescribeTags":{
       "name":"DescribeTags",
@@ -206,8 +189,7 @@
         {"shape":"ServerInternalErrorException"},
         {"shape":"OperationNotPermittedException"}
       ],
-      "documentation":"<p>Deprecated. Use <code>StartExportTask</code> instead.</p> <p>Exports all discovered configuration data to an Amazon S3 bucket or an application that enables you to view and evaluate the data. Data includes tags and tag associations, processes, connections, servers, and system performance. This API returns an export ID that you can query using the <i>DescribeExportConfigurations</i> API. The system imposes a limit of two configuration exports in six hours.</p>",
-      "deprecated":true
+      "documentation":"<p>Exports all discovered configuration data to an Amazon S3 bucket or an application that enables you to view and evaluate the data. Data includes tags and tag associations, processes, connections, servers, and system performance. This API returns an export ID which you can query using the <i>DescribeExportConfigurations</i> API. The system imposes a limit of two configuration exports in six hours.</p>"
     },
     "GetDiscoverySummary":{
       "name":"GetDiscoverySummary",
@@ -240,7 +222,7 @@
         {"shape":"InvalidParameterValueException"},
         {"shape":"ServerInternalErrorException"}
       ],
-      "documentation":"<p>Retrieves a list of configuration items according to criteria that you specify in a filter. The filter criteria identifies the relationship requirements.</p>"
+      "documentation":"<p>Retrieves a list of configuration items according to criteria you specify in a filter. The filter criteria identify relationship requirements.</p>"
     },
     "ListServerNeighbors":{
       "name":"ListServerNeighbors",
@@ -256,7 +238,7 @@
         {"shape":"InvalidParameterValueException"},
         {"shape":"ServerInternalErrorException"}
       ],
-      "documentation":"<p>Retrieves a list of servers that are one network hop away from a specified server.</p>"
+      "documentation":"<p>Retrieves a list of servers which are one network hop away from a specified server.</p>"
     },
     "StartDataCollectionByAgentIds":{
       "name":"StartDataCollectionByAgentIds",
@@ -272,24 +254,7 @@
         {"shape":"InvalidParameterValueException"},
         {"shape":"ServerInternalErrorException"}
       ],
-      "documentation":"<p>Instructs the specified agents or connectors to start collecting data.</p>"
-    },
-    "StartExportTask":{
-      "name":"StartExportTask",
-      "http":{
-        "method":"POST",
-        "requestUri":"/"
-      },
-      "input":{"shape":"StartExportTaskRequest"},
-      "output":{"shape":"StartExportTaskResponse"},
-      "errors":[
-        {"shape":"AuthorizationErrorException"},
-        {"shape":"InvalidParameterException"},
-        {"shape":"InvalidParameterValueException"},
-        {"shape":"ServerInternalErrorException"},
-        {"shape":"OperationNotPermittedException"}
-      ],
-      "documentation":"<p>Export the configuration data about discovered configuration items and relationships to an S3 bucket in a specified format.</p>"
+      "documentation":"<p>Instructs the specified agents or Connectors to start collecting data.</p>"
     },
     "StopDataCollectionByAgentIds":{
       "name":"StopDataCollectionByAgentIds",
@@ -305,7 +270,7 @@
         {"shape":"InvalidParameterValueException"},
         {"shape":"ServerInternalErrorException"}
       ],
-      "documentation":"<p>Instructs the specified agents or connectors to stop collecting data.</p>"
+      "documentation":"<p>Instructs the specified agents or Connectors to stop collecting data.</p>"
     },
     "UpdateApplication":{
       "name":"UpdateApplication",
@@ -330,18 +295,18 @@
       "members":{
         "agentId":{
           "shape":"String",
-          "documentation":"<p>The agent/connector ID.</p>"
+          "documentation":"<p>The agent/Connector ID.</p>"
         },
         "operationSucceeded":{
           "shape":"Boolean",
-          "documentation":"<p>Information about the status of the <code>StartDataCollection</code> and <code>StopDataCollection</code> operations. The system has recorded the data collection operation. The agent/connector receives this command the next time it polls for a new command. </p>"
+          "documentation":"<p>Information about the status of the <code>StartDataCollection</code> and <code>StopDataCollection</code> operations. The system has recorded the data collection operation. The agent/Connector receives this command the next time it polls for a new command. </p>"
         },
         "description":{
           "shape":"String",
           "documentation":"<p>A description of the operation performed.</p>"
         }
       },
-      "documentation":"<p>Information about agents or connectors that were instructed to start collecting data. Information includes the agent/connector ID, a description of the operation, and whether the agent/connector configuration was updated.</p>"
+      "documentation":"<p>Information about agents or Connectors that were instructed to start collecting data. Information includes the agent/Connector ID, a description of the operation, and whether or not the agent/Connector configuration was updated.</p>"
     },
     "AgentConfigurationStatusList":{
       "type":"list",
@@ -393,7 +358,7 @@
         },
         "registeredTime":{
           "shape":"String",
-          "documentation":"<p>Agent's first registration timestamp in UTC.</p>"
+          "documentation":"<p>Agent's first registration time stamp in UTC.</p>"
         }
       },
       "documentation":"<p>Information about agents or connectors associated with the user’s AWS account. Information includes agent or connector IDs, IP addresses, media access control (MAC) addresses, agent or connector health, hostname where the agent or connector resides, and agent version for each agent.</p>"
@@ -403,14 +368,14 @@
       "members":{
         "ipAddress":{
           "shape":"String",
-          "documentation":"<p>The IP address for the host where the agent/connector resides.</p>"
+          "documentation":"<p>The IP address for the host where the agent/Connector resides.</p>"
         },
         "macAddress":{
           "shape":"String",
-          "documentation":"<p>The MAC address for the host where the agent/connector resides.</p>"
+          "documentation":"<p>The MAC address for the host where the agent/Connector resides.</p>"
         }
       },
-      "documentation":"<p>Network details about the host where the agent/connector resides.</p>"
+      "documentation":"<p>Network details about the host where the agent/Connector resides.</p>"
     },
     "AgentNetworkInfoList":{
       "type":"list",
@@ -496,19 +461,19 @@
       "members":{
         "configurationType":{
           "shape":"ConfigurationItemType",
-          "documentation":"<p>A type of IT asset to tag.</p>"
+          "documentation":"<p>A type of IT asset that you want to tag.</p>"
         },
         "configurationId":{
           "shape":"ConfigurationId",
-          "documentation":"<p>The configuration ID for the item to tag. You can specify a list of keys and values.</p>"
+          "documentation":"<p>The configuration ID for the item you want to tag. You can specify a list of keys and values.</p>"
         },
         "key":{
           "shape":"TagKey",
-          "documentation":"<p>A type of tag on which to filter. For example, <i>serverType</i>.</p>"
+          "documentation":"<p>A type of tag to filter on. For example, <i>serverType</i>.</p>"
         },
         "value":{
           "shape":"TagValue",
-          "documentation":"<p>A value on which to filter. For example <i>key = serverType</i> and <i>value = web server</i>.</p>"
+          "documentation":"<p>A value to filter on. For example <i>key = serverType</i> and <i>value = web server</i>.</p>"
         },
         "timeOfCreation":{
           "shape":"TimeStamp",
@@ -704,7 +669,7 @@
         },
         "filters":{
           "shape":"Filters",
-          "documentation":"<p>You can filter the request using various logical operators and a <i>key</i>-<i>value</i> format. For example: </p> <p> <code>{\"key\": \"collectionStatus\", \"value\": \"STARTED\"}</code> </p>"
+          "documentation":"<p>You can filter the request using various logical operators and a <i>key</i>-<i>value</i> format. For example: </p> <p> <code>{\"key\": \"collectionStatus\", \"value\": \"STARTED\"}</code> </p> <p>For a complete list of filter options and guidance about using them with this action, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/managing-agent.html\">Managing AWS Application Discovery Service Agents and the AWS Application Discovery Connector </a>.</p>"
         },
         "maxResults":{
           "shape":"Integer",
@@ -770,7 +735,7 @@
         },
         "nextToken":{
           "shape":"NextToken",
-          "documentation":"<p>A token to get the next set of results. For example, if you specify 100 IDs for <code>DescribeExportConfigurationsRequest$exportIds</code> but set <code>DescribeExportConfigurationsRequest$maxResults</code> to 10, you get results in a set of 10. Use the token in the query to get the next set of 10.</p>"
+          "documentation":"<p>A token to get the next set of results. For example, if you specified 100 IDs for <code>DescribeExportConfigurationsRequest$exportIds</code> but set <code>DescribeExportConfigurationsRequest$maxResults</code> to 10, you will get results in a set of 10. Use the token in the query to get the next set of 10.</p>"
         }
       }
     },
@@ -783,37 +748,7 @@
         },
         "nextToken":{
           "shape":"NextToken",
-          "documentation":"<p>A token to get the next set of results. For example, if you specify 100 IDs for <code>DescribeExportConfigurationsRequest$exportIds</code> but set <code>DescribeExportConfigurationsRequest$maxResults</code> to 10, you get results in a set of 10. Use the token in the query to get the next set of 10.</p>"
-        }
-      }
-    },
-    "DescribeExportTasksRequest":{
-      "type":"structure",
-      "members":{
-        "exportIds":{
-          "shape":"ExportIds",
-          "documentation":"<p>One or more unique identifiers used to query the status of an export request.</p>"
-        },
-        "maxResults":{
-          "shape":"Integer",
-          "documentation":"<p>The maximum number of volume results returned by <code>DescribeExportTasks</code> in paginated output. When this parameter is used, <code>DescribeExportTasks</code> only returns <code>maxResults</code> results in a single page along with a <code>nextToken</code> response element.</p>"
-        },
-        "nextToken":{
-          "shape":"NextToken",
-          "documentation":"<p>The <code>nextToken</code> value returned from a previous paginated <code>DescribeExportTasks</code> request where <code>maxResults</code> was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the <code>nextToken</code> value. This value is null when there are no more results to return.</p>"
-        }
-      }
-    },
-    "DescribeExportTasksResponse":{
-      "type":"structure",
-      "members":{
-        "exportsInfo":{
-          "shape":"ExportsInfo",
-          "documentation":"<p>Contains one or more sets of export request details. When the status of a request is <code>SUCCEEDED</code>, the response includes a URL for an Amazon S3 bucket where you can view the data in a CSV file.</p>"
-        },
-        "nextToken":{
-          "shape":"NextToken",
-          "documentation":"<p>The <code>nextToken</code> value to include in a future <code>DescribeExportTasks</code> request. When the results of a <code>DescribeExportTasks</code> request exceed <code>maxResults</code>, this value can be used to retrieve the next page of results. This value is null when there are no more results to return.</p>"
+          "documentation":"<p>A token to get the next set of results. For example, if you specified 100 IDs for <code>DescribeExportConfigurationsRequest$exportIds</code> but set <code>DescribeExportConfigurationsRequest$maxResults</code> to 10, you will get results in a set of 10. Use the token in the query to get the next set of 10.</p>"
         }
       }
     },
@@ -822,7 +757,7 @@
       "members":{
         "filters":{
           "shape":"TagFilters",
-          "documentation":"<p>You can filter the list using a <i>key</i>-<i>value</i> format. You can separate these items by using logical operators. Allowed filters include <code>tagKey</code>, <code>tagValue</code>, and <code>configurationId</code>. </p>"
+          "documentation":"<p>You can filter the list using a <i>key</i>-<i>value</i> format. You can separate these items by using logical operators. Allowed filters include <code>tagKey</code>, <code>tagValue</code>, and <code>configurationId</code>. </p> <p>For a complete list of filter options and guidance about using them with this action, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/managing-agents.html\">Managing AWS Application Discovery Service Agents and the AWS Application Discovery Connector </a>.</p>"
         },
         "maxResults":{
           "shape":"Integer",
@@ -856,11 +791,11 @@
       "members":{
         "applicationConfigurationId":{
           "shape":"ApplicationId",
-          "documentation":"<p>Configuration ID of an application from which each item is disassociated.</p>"
+          "documentation":"<p>Configuration ID of an application from which each item will be disassociated.</p>"
         },
         "configurationIds":{
           "shape":"ConfigurationIdList",
-          "documentation":"<p>Configuration ID of each item to be disassociated from an application.</p>"
+          "documentation":"<p>Configuration ID of each item be be disassociated from an application.</p>"
         }
       }
     },
@@ -878,17 +813,6 @@
         }
       }
     },
-    "ExportDataFormat":{
-      "type":"string",
-      "enum":[
-        "CSV",
-        "GRAPHML"
-      ]
-    },
-    "ExportDataFormats":{
-      "type":"list",
-      "member":{"shape":"ExportDataFormat"}
-    },
     "ExportIds":{
       "type":"list",
       "member":{"shape":"ConfigurationsExportId"}
@@ -920,7 +844,7 @@
         },
         "exportRequestTime":{
           "shape":"ExportRequestTime",
-          "documentation":"<p>The time that the configuration data export was initiated.</p>"
+          "documentation":"<p>The time the configuration data export was initiated.</p>"
         }
       },
       "documentation":"<p>Information regarding the export status of the discovered data. The value is an array of objects.</p>"
@@ -953,14 +877,14 @@
         },
         "values":{
           "shape":"FilterValues",
-          "documentation":"<p>A string value on which to filter. For example, if you choose the <code>destinationServer.osVersion</code> filter name, you could specify <code>Ubuntu</code> for the value.</p>"
+          "documentation":"<p>A string value that you want to filter on. For example, if you choose the <code>destinationServer.osVersion</code> filter name, you could specify <code>Ubuntu</code> for the value.</p>"
         },
         "condition":{
           "shape":"Condition",
           "documentation":"<p>A conditional operator. The following operators are valid: EQUALS, NOT_EQUALS, CONTAINS, NOT_CONTAINS. If you specify multiple filters, the system utilizes all filters as though concatenated by <i>AND</i>. If you specify multiple values for a particular filter, the system differentiates the values using <i>OR</i>. Calling either <i>DescribeConfigurations</i> or <i>ListConfigurations</i> returns attributes of matching configuration items.</p>"
         }
       },
-      "documentation":"<p>A filter that can use conditional operators.</p> <p>For more information about filters, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/discovery-api-queries.html\">Querying Discovered Configuration Items</a>. </p>"
+      "documentation":"<p>A filter that can use conditional operators.</p> <p>for a complete list of filters and guidance for using them with the Application Discovery Service, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/querying-configuration-items.html\">Querying Discovered Configuration Items</a>.</p>"
     },
     "FilterName":{"type":"string"},
     "FilterValue":{"type":"string"},
@@ -985,19 +909,19 @@
       "members":{
         "servers":{
           "shape":"Long",
-          "documentation":"<p>The number of servers discovered.</p>"
+          "documentation":"<p>Number of servers discovered.</p>"
         },
         "applications":{
           "shape":"Long",
-          "documentation":"<p>The number of applications discovered.</p>"
+          "documentation":"<p>Number of applications discovered.</p>"
         },
         "serversMappedToApplications":{
           "shape":"Long",
-          "documentation":"<p>The number of servers mapped to applications.</p>"
+          "documentation":"<p>Number of servers mapped to applications.</p>"
         },
         "serversMappedtoTags":{
           "shape":"Long",
-          "documentation":"<p>The number of servers mapped to tags.</p>"
+          "documentation":"<p>Number of servers mapped to tags.</p>"
         },
         "agentSummary":{
           "shape":"CustomerAgentInfo",
@@ -1032,11 +956,11 @@
       "members":{
         "configurationType":{
           "shape":"ConfigurationItemType",
-          "documentation":"<p>A valid configuration identified by Application Discovery Service. </p>"
+          "documentation":"<p>A valid configuration identified by the Discovery Service. </p>"
         },
         "filters":{
           "shape":"Filters",
-          "documentation":"<p>You can filter the request using various logical operators and a <i>key</i>-<i>value</i> format. For example: </p> <p> <code>{\"key\": \"serverType\", \"value\": \"webServer\"}</code> </p> <p>For a complete list of filter options and guidance about using them with this action, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/discovery-api-queries.html#ListConfigurations\">Querying Discovered Configuration Items</a>. </p>"
+          "documentation":"<p>You can filter the request using various logical operators and a <i>key</i>-<i>value</i> format. For example: </p> <p> <code>{\"key\": \"serverType\", \"value\": \"webServer\"}</code> </p> <p>For a complete list of filter options and guidance about using them with this action, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/querying-configuration-items.html#ListConfigurations\">Querying Discovered Configuration Items</a>. </p>"
         },
         "maxResults":{
           "shape":"Integer",
@@ -1048,7 +972,7 @@
         },
         "orderBy":{
           "shape":"OrderByList",
-          "documentation":"<p>Certain filter criteria return output that can be sorted in ascending or descending order. For a list of output characteristics for each filter, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/discovery-api-queries.html#ListConfigurations\">Using the ListConfigurations Action</a>.</p>"
+          "documentation":"<p>Certain filter criteria return output that can be sorted in ascending or descending order. For a list of output characteristics for each filter, see <a href=\"http://docs.aws.amazon.com/application-discovery/latest/APIReference/querying-configuration-items.html#ListConfigurations\">Querying Discovered Configuration Items</a>.</p>"
         }
       }
     },
@@ -1121,23 +1045,23 @@
       "members":{
         "sourceServerId":{
           "shape":"ConfigurationId",
-          "documentation":"<p>The ID of the server that opened the network connection.</p>"
+          "documentation":"<p>ID of server that opened the network connection.</p>"
         },
         "destinationServerId":{
           "shape":"ConfigurationId",
-          "documentation":"<p>The ID of the server that accepted the network connection.</p>"
+          "documentation":"<p>ID of the server that accepted the networker connection.</p>"
         },
         "destinationPort":{
           "shape":"BoxedInteger",
-          "documentation":"<p>The destination network port for the connection.</p>"
+          "documentation":"<p>Destination network port for the connection.</p>"
         },
         "transportProtocol":{
           "shape":"String",
-          "documentation":"<p>The network protocol used for the connection.</p>"
+          "documentation":"<p>Network protocol used for the connection.</p>"
         },
         "connectionsCount":{
           "shape":"Long",
-          "documentation":"<p>The number of open network connections with the neighboring server.</p>"
+          "documentation":"<p>Number of open network connections with the neighboring server.</p>"
         }
       },
       "documentation":"<p>Details about neighboring servers.</p>"
@@ -1161,14 +1085,14 @@
       "members":{
         "fieldName":{
           "shape":"String",
-          "documentation":"<p>The field on which to order.</p>"
+          "documentation":"<p>Field to order on.</p>"
         },
         "sortOrder":{
           "shape":"orderString",
           "documentation":"<p>Ordering direction.</p>"
         }
       },
-      "documentation":"<p>A field and direction for ordered output.</p>"
+      "documentation":"<p>Field and direction for ordered output.</p>"
     },
     "OrderByList":{
       "type":"list",
@@ -1197,7 +1121,7 @@
       "members":{
         "agentIds":{
           "shape":"AgentIds",
-          "documentation":"<p>The IDs of the agents or connectors from which to start collecting data. If you send a request to an agent/connector ID that you do not have permission to contact, according to your AWS account, the service does not throw an exception. Instead, it returns the error in the <i>Description</i> field. If you send a request to multiple agents/connectors and you do not have permission to contact some of those agents/connectors, the system does not throw an exception. Instead, the system shows <code>Failed</code> in the <i>Description</i> field.</p>"
+          "documentation":"<p>The IDs of the agents or Connectors that you want to start collecting data. If you send a request to an agent/Connector ID that you do not have permission to contact, according to your AWS account, the service does not throw an exception. Instead, it returns the error in the <i>Description</i> field. If you send a request to multiple agents/Connectors and you do not have permission to contact some of those agents/Connectors, the system does not throw an exception. Instead, the system shows <code>Failed</code> in the <i>Description</i> field.</p>"
         }
       }
     },
@@ -1206,25 +1130,7 @@
       "members":{
         "agentsConfigurationStatus":{
           "shape":"AgentConfigurationStatusList",
-          "documentation":"<p>Information about agents or the connector that were instructed to start collecting data. Information includes the agent/connector ID, a description of the operation performed, and whether the agent/connector configuration was updated.</p>"
-        }
-      }
-    },
-    "StartExportTaskRequest":{
-      "type":"structure",
-      "members":{
-        "exportDataFormat":{
-          "shape":"ExportDataFormats",
-          "documentation":"<p>The file format for the returned export data. Default value is <code>CSV</code>.</p>"
-        }
-      }
-    },
-    "StartExportTaskResponse":{
-      "type":"structure",
-      "members":{
-        "exportId":{
-          "shape":"ConfigurationsExportId",
-          "documentation":"<p> A unique identifier used to query the status of an export request.</p>"
+          "documentation":"<p>Information about agents or the Connector that were instructed to start collecting data. Information includes the agent/Connector ID, a description of the operation performed, and whether or not the agent/Connector configuration was updated.</p>"
         }
       }
     },
@@ -1234,7 +1140,7 @@
       "members":{
         "agentIds":{
           "shape":"AgentIds",
-          "documentation":"<p>The IDs of the agents or connectors from which to stop collecting data.</p>"
+          "documentation":"<p>The IDs of the agents or Connectors that you want to stop collecting data.</p>"
         }
       }
     },
@@ -1243,7 +1149,7 @@
       "members":{
         "agentsConfigurationStatus":{
           "shape":"AgentConfigurationStatusList",
-          "documentation":"<p>Information about the agents or connector that were instructed to stop collecting data. Information includes the agent/connector ID, a description of the operation performed, and whether the agent/connector configuration was updated.</p>"
+          "documentation":"<p>Information about agents or the Connector that were instructed to stop collecting data. Information includes the agent/Connector ID, a description of the operation performed, and whether or not the agent/Connector configuration was updated.</p>"
         }
       }
     },
@@ -1257,11 +1163,11 @@
       "members":{
         "key":{
           "shape":"TagKey",
-          "documentation":"<p>The type of tag on which to filter.</p>"
+          "documentation":"<p>A type of tag to filter on.</p>"
         },
         "value":{
           "shape":"TagValue",
-          "documentation":"<p>A value for a tag key on which to filter.</p>"
+          "documentation":"<p>A value for a tag key to filter on.</p>"
         }
       },
       "documentation":"<p>Metadata that help you categorize IT assets.</p>"
@@ -1275,14 +1181,14 @@
       "members":{
         "name":{
           "shape":"FilterName",
-          "documentation":"<p>A name of the tag filter.</p>"
+          "documentation":"<p>A name of a tag filter.</p>"
         },
         "values":{
           "shape":"FilterValues",
-          "documentation":"<p>Values for the tag filter.</p>"
+          "documentation":"<p>Values of a tag filter.</p>"
         }
       },
-      "documentation":"<p>The tag filter. Valid names are: <code>tagKey</code>, <code>tagValue</code>, <code>configurationId</code>.</p>"
+      "documentation":"<p>The name of a tag filter. Valid names are: <code>tagKey</code>, <code>tagValue</code>, <code>configurationId</code>.</p>"
     },
     "TagFilters":{
       "type":"list",
@@ -1329,5 +1235,5 @@
       ]
     }
   },
-  "documentation":"<fullname>AWS Application Discovery Service</fullname> <p>AWS Application Discovery Service helps you plan application migration projects by automatically identifying servers, virtual machines (VMs), software, and software dependencies running in your on-premises data centers. Application Discovery Service also collects application performance data, which can help you assess the outcome of your migration. The data collected by Application Discovery Service is securely retained in an Amazon-hosted and managed database in the cloud. You can export the data as a CSV or XML file into your preferred visualization tool or cloud-migration solution to plan your migration. For more information, see the Application Discovery Service <a href=\"http://aws.amazon.com/application-discovery/faqs/\">FAQ</a>.</p> <p>Application Discovery Service offers two modes of operation.</p> <ul> <li> <p> <b>Agentless discovery</b> mode is recommended for environments that use VMware vCenter Server. This mode doesn't require you to install an agent on each host. Agentless discovery gathers server information regardless of the operating systems, which minimizes the time required for initial on-premises infrastructure assessment. Agentless discovery doesn't collect information about software and software dependencies. It also doesn't work in non-VMware environments. We recommend that you use agent-based discovery for non-VMware environments and if you want to collect information about software and software dependencies. You can also run agent-based and agentless discovery simultaneously. Use agentless discovery to quickly complete the initial infrastructure assessment and then install agents on select hosts to gather information about software and software dependencies.</p> </li> <li> <p> <b>Agent-based discovery</b> mode collects a richer set of data than agentless discovery by using Amazon software, the AWS Application Discovery Agent, which you install on one or more hosts in your data center. The agent captures infrastructure and application information, including an inventory of installed software applications, system and process performance, resource utilization, and network dependencies between workloads. The information collected by agents is secured at rest and in transit to the Application Discovery Service database in the cloud. </p> </li> </ul> <p>Application Discovery Service integrates with application discovery solutions from AWS Partner Network (APN) partners. Third-party application discovery tools can query Application Discovery Service and write to the Application Discovery Service database using a public API. You can then import the data into either a visualization tool or cloud-migration solution.</p> <important> <p>Application Discovery Service doesn't gather sensitive information. All data is handled according to the <a href=\"http://aws.amazon.com/privacy/\">AWS Privacy Policy</a>. You can operate Application Discovery Service using offline mode to inspect collected data before it is shared with the service.</p> </important> <p>Your AWS account must be granted access to Application Discovery Service, a process called <i>whitelisting</i>. This is true for AWS partners and customers alike. To request access, sign up for AWS Application Discovery Service <a href=\"http://aws.amazon.com/application-discovery/preview/\">here</a>. We send you information about how to get started.</p> <p>This API reference provides descriptions, syntax, and usage examples for each of the actions and data types for Application Discovery Service. The topic for each action shows the API request parameters and the response. Alternatively, you can use one of the AWS SDKs to access an API that is tailored to the programming language or platform that you're using. For more information, see <a href=\"http://aws.amazon.com/tools/#SDKs\">AWS SDKs</a>.</p> <p>This guide is intended for use with the <a href=\"http://docs.aws.amazon.com/application-discovery/latest/userguide/\"> <i>AWS Application Discovery Service User Guide</i> </a>.</p>"
+  "documentation":"<fullname>AWS Application Discovery Service</fullname> <p>AWS Application Discovery Service helps you plan application migration projects by automatically identifying servers, virtual machines (VMs), software, and software dependencies running in your on-premises data centers. Application Discovery Service also collects application performance data, which can help you assess the outcome of your migration. The data collected by Application Discovery Service is securely retained in an Amazon-hosted and managed database in the cloud. You can export the data as a CSV or XML file into your preferred visualization tool or cloud-migration solution to plan your migration. For more information, see the Application Discovery Service <a href=\"http://aws.amazon.com/application-discovery/faqs/\">FAQ</a>.</p> <p>Application Discovery Service offers two modes of operation.</p> <ul> <li> <p> <b>Agentless discovery</b> mode is recommended for environments that use VMware vCenter Server. This mode doesn't require you to install an agent on each host. Agentless discovery gathers server information regardless of the operating systems, which minimizes the time required for initial on-premises infrastructure assessment. Agentless discovery doesn't collect information about software and software dependencies. It also doesn't work in non-VMware environments. We recommend that you use agent-based discovery for non-VMware environments and if you want to collect information about software and software dependencies. You can also run agent-based and agentless discovery simultaneously. Use agentless discovery to quickly complete the initial infrastructure assessment and then install agents on select hosts to gather information about software and software dependencies.</p> </li> <li> <p> <b>Agent-based discovery</b> mode collects a richer set of data than agentless discovery by using Amazon software, the AWS Application Discovery Agent, which you install on one or more hosts in your data center. The agent captures infrastructure and application information, including an inventory of installed software applications, system and process performance, resource utilization, and network dependencies between workloads. The information collected by agents is secured at rest and in transit to the Application Discovery Service database in the cloud. </p> </li> </ul> <p>Application Discovery Service integrates with application discovery solutions from AWS Partner Network (APN) partners. Third-party application discovery tools can query the Application Discovery Service and write to the Application Discovery Service database using a public API. You can then import the data into either a visualization tool or cloud-migration solution.</p> <important> <p>Application Discovery Service doesn't gather sensitive information. All data is handled according to the <a href=\"http://aws.amazon.com/privacy/\">AWS Privacy Policy</a>. You can operate Application Discovery Service using offline mode to inspect collected data before it is shared with the service.</p> </important> <p>Your AWS account must be granted access to Application Discovery Service, a process called <i>whitelisting</i>. This is true for AWS partners and customers alike. To request access, sign up for the AWS Application Discovery Service <a href=\"http://aws.amazon.com/application-discovery/preview/\">here</a>. We will send you information about how to get started.</p> <p>This API reference provides descriptions, syntax, and usage examples for each of the actions and data types for the Application Discovery Service. The topic for each action shows the API request parameters and the response. Alternatively, you can use one of the AWS SDKs to access an API that is tailored to the programming language or platform that you're using. For more information, see <a href=\"http://aws.amazon.com/tools/#SDKs\">AWS SDKs</a>.</p> <p>This guide is intended for use with the <a href=\"http://docs.aws.amazon.com/application-discovery/latest/userguide/\"> <i>AWS Application Discovery Service User Guide</i> </a>.</p>"
 }
diff --git a/botocore/data/endpoints.json b/botocore/data/endpoints.json
index b4a3cd1ab..55a555b8b 100644
--- a/botocore/data/endpoints.json
+++ b/botocore/data/endpoints.json
@@ -269,10 +269,6 @@
         },
         "codebuild": {
           "endpoints": {
-            "ap-northeast-1": {},
-            "ap-southeast-1": {},
-            "ap-southeast-2": {},
-            "eu-central-1": {},
             "eu-west-1": {},
             "us-east-1": {},
             "us-east-2": {},
@@ -591,7 +587,6 @@
         },
         "elasticfilesystem": {
           "endpoints": {
-            "ap-southeast-2": {},
             "eu-west-1": {},
             "us-east-1": {},
             "us-east-2": {},
@@ -1236,6 +1231,7 @@
           "endpoints": {
             "ap-south-1": {},
             "ap-southeast-2": {},
+            "ca-central-1": {},
             "eu-central-1": {},
             "eu-west-1": {},
             "eu-west-2": {},
diff --git a/botocore/data/lambda/2015-03-31/service-2.json b/botocore/data/lambda/2015-03-31/service-2.json
index 6378948e2..49ac83ed2 100644
--- a/botocore/data/lambda/2015-03-31/service-2.json
+++ b/botocore/data/lambda/2015-03-31/service-2.json
@@ -1715,7 +1715,6 @@
       "enum":[
         "nodejs",
         "nodejs4.3",
-        "nodejs6.10",
         "java8",
         "python2.7",
         "dotnetcore1.0",
diff --git a/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json b/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json
deleted file mode 100644
index ea142457a..000000000
--- a/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "pagination": {}
-}
diff --git a/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json b/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json
index ce18c64a5..f247a660d 100644
--- a/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json
+++ b/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json
@@ -71,8 +71,7 @@
         "customer_profile_by_industry",
         "customer_profile_by_revenue",
         "customer_profile_by_geography",
-        "sales_compensation_billed_revenue",
-        "us_sales_and_use_tax_records"
+        "sales_compensation_billed_revenue"
       ],
       "max":255,
       "min":1
@@ -96,7 +95,7 @@
       "members":{
         "dataSetType":{
           "shape":"DataSetType",
-          "documentation":"<p>The desired data set type.</p> <p> <ul> <li><i>customer_subscriber_hourly_monthly_subscriptions</i> - Available daily by 5:00 PM Pacific Time since 2014-07-21.</li> <li><i>customer_subscriber_annual_subscriptions</i> - Available daily by 5:00 PM Pacific Time since 2014-07-21.</li> <li><i>daily_business_usage_by_instance_type</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_fees</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_free_trial_conversions</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_new_instances</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_new_product_subscribers</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_canceled_product_subscribers</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>monthly_revenue_billing_and_revenue_data</i> - Available monthly on the 4th day of the month by 5:00 PM Pacific Time since 2015-02.</li> <li><i>monthly_revenue_annual_subscriptions</i> - Available monthly on the 4th day of the month by 5:00 PM Pacific Time since 2015-02.</li> <li><i>disbursed_amount_by_product</i> - Available every 30 days by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>disbursed_amount_by_product_with_uncollected_funds</i> -This data set is only available from 2012-04-19 until 2015-01-25. After 2015-01-25, this data set was split into three data sets: disbursed_amount_by_product, disbursed_amount_by_age_of_uncollected_funds, and disbursed_amount_by_age_of_disbursed_funds. </li> <li><i>disbursed_amount_by_instance_hours</i> - Available every 30 days by 5:00 PM Pacific Time since 2012-09-04.</li> <li><i>disbursed_amount_by_customer_geo</i> - Available every 30 days by 5:00 PM Pacific Time since 2012-04-19.</li> <li><i>disbursed_amount_by_age_of_uncollected_funds</i> - Available every 30 days by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>disbursed_amount_by_age_of_disbursed_funds</i> - Available every 30 days by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>customer_profile_by_industry</i> - Available daily by 5:00 PM Pacific Time since 2015-10-01.</li> <li><i>customer_profile_by_revenue</i> - Available daily by 5:00 PM Pacific Time since 2015-10-01.</li> <li><i>customer_profile_by_geography</i> - Available daily by 5:00 PM Pacific Time since 2015-10-01.</li> <li><i>sales_compensation_billed_revenue</i> - Available monthly on the 4th day of the month by 5:00 PM Pacific Time since 2016-12.</li> <li><i>us_sales_and_use_tax_records</i> - Available monthly on the 15th day of the month by 5:00 PM Pacific Time since 2017-02-15.</li> </ul> </p>"
+          "documentation":"<p>The desired data set type.</p> <p> <ul> <li><i>customer_subscriber_hourly_monthly_subscriptions</i> - Available daily by 5:00 PM Pacific Time since 2014-07-21.</li> <li><i>customer_subscriber_annual_subscriptions</i> - Available daily by 5:00 PM Pacific Time since 2014-07-21.</li> <li><i>daily_business_usage_by_instance_type</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_fees</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_free_trial_conversions</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_new_instances</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_new_product_subscribers</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>daily_business_canceled_product_subscribers</i> - Available daily by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>monthly_revenue_billing_and_revenue_data</i> - Available monthly on the 4th day of the month by 5:00 PM Pacific Time since 2015-02.</li> <li><i>monthly_revenue_annual_subscriptions</i> - Available monthly on the 4th day of the month by 5:00 PM Pacific Time since 2015-02.</li> <li><i>disbursed_amount_by_product</i> - Available every 30 days by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>disbursed_amount_by_product_with_uncollected_funds</i> -This data set is only available from 2012-04-19 until 2015-01-25. After 2015-01-25, this data set was split into three data sets: disbursed_amount_by_product, disbursed_amount_by_age_of_uncollected_funds, and disbursed_amount_by_age_of_disbursed_funds. </li> <li><i>disbursed_amount_by_instance_hours</i> - Available every 30 days by 5:00 PM Pacific Time since 2012-09-04.</li> <li><i>disbursed_amount_by_customer_geo</i> - Available every 30 days by 5:00 PM Pacific Time since 2012-04-19.</li> <li><i>disbursed_amount_by_age_of_uncollected_funds</i> - Available every 30 days by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>disbursed_amount_by_age_of_disbursed_funds</i> - Available every 30 days by 5:00 PM Pacific Time since 2015-01-26.</li> <li><i>customer_profile_by_industry</i> - Available daily by 5:00 PM Pacific Time since 2015-10-01.</li> <li><i>customer_profile_by_revenue</i> - Available daily by 5:00 PM Pacific Time since 2015-10-01.</li> <li><i>customer_profile_by_geography</i> - Available daily by 5:00 PM Pacific Time since 2015-10-01.</li> <li><i>sales_compensation_billed_revenue</i> - Available monthly on the 4th day of the month by 5:00 PM Pacific Time since 2016-12.</li> </ul> </p>"
         },
         "dataSetPublicationDate":{
           "shape":"DataSetPublicationDate",
@@ -138,10 +137,7 @@
     "MarketplaceCommerceAnalyticsException":{
       "type":"structure",
       "members":{
-        "message":{
-          "shape":"ExceptionMessage",
-          "documentation":"This message describes details of the error."
-        }
+        "message":{"shape":"ExceptionMessage"}
       },
       "documentation":"This exception is thrown when an internal service error occurs.",
       "exception":true,
diff --git a/botocore/data/pinpoint/2016-12-01/service-2.json b/botocore/data/pinpoint/2016-12-01/service-2.json
index a884a54ff..4939e4f72 100644
--- a/botocore/data/pinpoint/2016-12-01/service-2.json
+++ b/botocore/data/pinpoint/2016-12-01/service-2.json
@@ -184,34 +184,6 @@
       } ],
       "documentation" : "Deletes a campaign."
     },
-    "DeleteEventStream" : {
-      "name" : "DeleteEventStream",
-      "http" : {
-        "method" : "DELETE",
-        "requestUri" : "/v1/apps/{application-id}/eventstream",
-        "responseCode" : 200
-      },
-      "input" : {
-        "shape" : "DeleteEventStreamRequest"
-      },
-      "output" : {
-        "shape" : "DeleteEventStreamResponse"
-      },
-      "errors" : [ {
-        "shape" : "BadRequestException"
-      }, {
-        "shape" : "InternalServerErrorException"
-      }, {
-        "shape" : "ForbiddenException"
-      }, {
-        "shape" : "NotFoundException"
-      }, {
-        "shape" : "MethodNotAllowedException"
-      }, {
-        "shape" : "TooManyRequestsException"
-      } ],
-      "documentation" : "Deletes the event stream for an app."
-    },
     "DeleteGcmChannel" : {
       "name" : "DeleteGcmChannel",
       "http" : {
@@ -455,7 +427,7 @@
         "shape" : "TooManyRequestsException",
         "documentation" : "429 response"
       } ],
-      "documentation" : "Returns information about a specific version of a campaign."
+      "documentation" : "Returns information about your campaign versions."
     },
     "GetCampaignVersions" : {
       "name" : "GetCampaignVersions",
@@ -562,34 +534,6 @@
       } ],
       "documentation" : "Returns information about an endpoint."
     },
-    "GetEventStream" : {
-      "name" : "GetEventStream",
-      "http" : {
-        "method" : "GET",
-        "requestUri" : "/v1/apps/{application-id}/eventstream",
-        "responseCode" : 200
-      },
-      "input" : {
-        "shape" : "GetEventStreamRequest"
-      },
-      "output" : {
-        "shape" : "GetEventStreamResponse"
-      },
-      "errors" : [ {
-        "shape" : "BadRequestException"
-      }, {
-        "shape" : "InternalServerErrorException"
-      }, {
-        "shape" : "ForbiddenException"
-      }, {
-        "shape" : "NotFoundException"
-      }, {
-        "shape" : "MethodNotAllowedException"
-      }, {
-        "shape" : "TooManyRequestsException"
-      } ],
-      "documentation" : "Returns the event stream for an app."
-    },
     "GetGcmChannel" : {
       "name" : "GetGcmChannel",
       "http" : {
@@ -870,34 +814,6 @@
       } ],
       "documentation" : "Used to get information about your segments."
     },
-    "PutEventStream" : {
-      "name" : "PutEventStream",
-      "http" : {
-        "method" : "POST",
-        "requestUri" : "/v1/apps/{application-id}/eventstream",
-        "responseCode" : 200
-      },
-      "input" : {
-        "shape" : "PutEventStreamRequest"
-      },
-      "output" : {
-        "shape" : "PutEventStreamResponse"
-      },
-      "errors" : [ {
-        "shape" : "BadRequestException"
-      }, {
-        "shape" : "InternalServerErrorException"
-      }, {
-        "shape" : "ForbiddenException"
-      }, {
-        "shape" : "NotFoundException"
-      }, {
-        "shape" : "MethodNotAllowedException"
-      }, {
-        "shape" : "TooManyRequestsException"
-      } ],
-      "documentation" : "Use to create or update the event stream for an app."
-    },
     "UpdateApnsChannel" : {
       "name" : "UpdateApnsChannel",
       "http" : {
@@ -1071,7 +987,7 @@
         "shape" : "TooManyRequestsException",
         "documentation" : "429 response"
       } ],
-      "documentation" : "Use to update a batch of endpoints."
+      "documentation" : "Use to update your endpoints."
     },
     "UpdateGcmChannel" : {
       "name" : "UpdateGcmChannel",
@@ -1156,23 +1072,20 @@
           "shape" : "__string",
           "documentation" : "The certificate private key."
         }
-      },
-      "documentation" : "Apple Push Notification Service channel definition."
+      }
     },
     "APNSChannelResponse" : {
       "type" : "structure",
       "members" : {
         "ApplicationId" : {
-          "shape" : "__string",
-          "documentation" : "The ID of the application to which the channel applies."
+          "shape" : "__string"
         },
         "CreationDate" : {
           "shape" : "__string",
           "documentation" : "When was this segment created"
         },
         "Id" : {
-          "shape" : "__string",
-          "documentation" : "The unique channel ID."
+          "shape" : "__string"
         },
         "IsArchived" : {
           "shape" : "__boolean",
@@ -1194,8 +1107,7 @@
           "shape" : "__integer",
           "documentation" : "Version of channel"
         }
-      },
-      "documentation" : "Apple Distribution Push Notification Service channel definition."
+      }
     },
     "Action" : {
       "type" : "string",
@@ -1208,8 +1120,7 @@
           "shape" : "ListOfActivityResponse",
           "documentation" : "List of campaign activities"
         }
-      },
-      "documentation" : "Activities for campaign."
+      }
     },
     "ActivityResponse" : {
       "type" : "structure",
@@ -1250,14 +1161,6 @@
           "shape" : "__integer",
           "documentation" : "The total number of endpoints to which the campaign successfully delivered messages."
         },
-        "TimezonesCompletedCount" : {
-          "shape" : "__integer",
-          "documentation" : "The total number of timezones completed."
-        },
-        "TimezonesTotalCount" : {
-          "shape" : "__integer",
-          "documentation" : "The total number of unique timezones present in the segment."
-        },
         "TotalEndpointCount" : {
           "shape" : "__integer",
           "documentation" : "The total number of endpoints to which the campaign attempts to deliver messages."
@@ -1266,8 +1169,7 @@
           "shape" : "__string",
           "documentation" : "The ID of a variation of the campaign used for A/B testing."
         }
-      },
-      "documentation" : "Activity definition"
+      }
     },
     "ApplicationSettingsResource" : {
       "type" : "structure",
@@ -1288,8 +1190,7 @@
           "shape" : "QuietTime",
           "documentation" : "The default quiet time for the app. Each campaign for this app sends no messages during this time unless the campaign overrides the default with a quiet time of its own."
         }
-      },
-      "documentation" : "Application settings."
+      }
     },
     "AttributeDimension" : {
       "type" : "structure",
@@ -1302,8 +1203,7 @@
           "shape" : "ListOf__string",
           "documentation" : "The criteria values for the segment dimension. Endpoints with matching attribute values are included or excluded from the segment, depending on the setting for Type."
         }
-      },
-      "documentation" : "Custom attibute dimension"
+      }
     },
     "AttributeType" : {
       "type" : "string",
@@ -1313,15 +1213,9 @@
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
-        },
-        "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
       },
-      "documentation" : "Simple message object.",
       "exception" : true,
       "error" : {
         "httpStatusCode" : 400
@@ -1338,8 +1232,7 @@
           "shape" : "__integer",
           "documentation" : "The maximum total number of messages that the campaign can send."
         }
-      },
-      "documentation" : "Campaign Limits are used to limit the number of messages that can be sent to a user."
+      }
     },
     "CampaignResponse" : {
       "type" : "structure",
@@ -1420,8 +1313,7 @@
           "shape" : "__integer",
           "documentation" : "The campaign version number."
         }
-      },
-      "documentation" : "Campaign definition"
+      }
     },
     "CampaignState" : {
       "type" : "structure",
@@ -1430,8 +1322,7 @@
           "shape" : "CampaignStatus",
           "documentation" : "The status of the campaign, or the status of a treatment that belongs to an A/B test campaign.\n\nValid values: SCHEDULED, EXECUTING, PENDING_NEXT_RUN, COMPLETED, PAUSED"
         }
-      },
-      "documentation" : "State of the Campaign"
+      }
     },
     "CampaignStatus" : {
       "type" : "string",
@@ -1448,8 +1339,7 @@
           "shape" : "__string",
           "documentation" : "The string that you use in a subsequent request to get the next page of results in a paginated response."
         }
-      },
-      "documentation" : "List of available campaigns."
+      }
     },
     "ChannelType" : {
       "type" : "string",
@@ -1577,30 +1467,6 @@
       "required" : [ "CampaignResponse" ],
       "payload" : "CampaignResponse"
     },
-    "DeleteEventStreamRequest" : {
-      "type" : "structure",
-      "members" : {
-        "ApplicationId" : {
-          "shape" : "__string",
-          "location" : "uri",
-          "locationName" : "application-id",
-          "documentation": "ApplicationId"
-        }
-      },
-      "required" : [ "ApplicationId" ],
-      "documentation": "DeleteEventStream Request"
-    },
-    "DeleteEventStreamResponse" : {
-      "type" : "structure",
-      "members" : {
-        "EventStream" : {
-          "shape" : "EventStream"
-        }
-      },
-      "required" : [ "EventStream" ],
-      "payload" : "EventStream",
-      "documentation": "DeleteEventStream Response"
-    },
     "DeleteGcmChannelRequest" : {
       "type" : "structure",
       "members" : {
@@ -1661,7 +1527,7 @@
       "members" : {
         "Address" : {
           "shape" : "__string",
-          "documentation" : "The address or token of the endpoint as provided by your push provider (e.g. DeviceToken or RegistrationId)."
+          "documentation" : "The address or token of the endpoint."
         },
         "Attributes" : {
           "shape" : "MapOfListOf__string",
@@ -1684,8 +1550,7 @@
           "documentation" : "The endpoint status. Can be either ACTIVE or INACTIVE. Will be set to INACTIVE if a delivery fails. Will be set to ACTIVE if the address is updated."
         },
         "Id" : {
-          "shape" : "__string",
-          "documentation" : "The unique Id for the Endpoint in the batch."
+          "shape" : "__string"
         },
         "Location" : {
           "shape" : "EndpointLocation",
@@ -1707,8 +1572,7 @@
           "shape" : "EndpointUser",
           "documentation" : "Custom user-specific attributes that your app reports to Amazon Pinpoint."
         }
-      },
-      "documentation" : "Endpoint update request"
+      }
     },
     "EndpointBatchRequest" : {
       "type" : "structure",
@@ -1717,8 +1581,7 @@
           "shape" : "ListOfEndpointBatchItem",
           "documentation" : "List of items to update. Maximum 100 items"
         }
-      },
-      "documentation" : "Endpoint batch update request."
+      }
     },
     "EndpointDemographic" : {
       "type" : "structure",
@@ -1755,8 +1618,7 @@
           "shape" : "__string",
           "documentation" : "The timezone of the endpoint. Specified as a tz database value, such as Americas/Los_Angeles."
         }
-      },
-      "documentation" : "Endpoint demographic data"
+      }
     },
     "EndpointLocation" : {
       "type" : "structure",
@@ -1785,15 +1647,14 @@
           "shape" : "__string",
           "documentation" : "The region of the endpoint location. For example, corresponds to a state in US."
         }
-      },
-      "documentation" : "Endpoint location data"
+      }
     },
     "EndpointRequest" : {
       "type" : "structure",
       "members" : {
         "Address" : {
           "shape" : "__string",
-          "documentation" : "The address or token of the endpoint as provided by your push provider (e.g. DeviceToken or RegistrationId)."
+          "documentation" : "The address or token of the endpoint."
         },
         "Attributes" : {
           "shape" : "MapOfListOf__string",
@@ -1835,15 +1696,14 @@
           "shape" : "EndpointUser",
           "documentation" : "Custom user-specific attributes that your app reports to Amazon Pinpoint."
         }
-      },
-      "documentation" : "Endpoint update request"
+      }
     },
     "EndpointResponse" : {
       "type" : "structure",
       "members" : {
         "Address" : {
           "shape" : "__string",
-          "documentation" : "The address or token of the endpoint as provided by your push provider (e.g. DeviceToken or RegistrationId)."
+          "documentation" : "The address or token of the endpoint."
         },
         "ApplicationId" : {
           "shape" : "__string",
@@ -1897,74 +1757,36 @@
           "shape" : "__string",
           "documentation" : "The unique ID for the most recent request to update the endpoint."
         },
-        "User" : {
-          "shape" : "EndpointUser",
-          "documentation" : "Custom user-specific attributes that your app reports to Amazon Pinpoint."
-        },
         "ShardId" : {
           "shape" : "__string",
           "documentation" : "The ShardId of endpoint"
+        },
+        "User" : {
+          "shape" : "EndpointUser",
+          "documentation" : "Custom user-specific attributes that your app reports to Amazon Pinpoint."
         }
-      },
-      "documentation" : "Endpoint response"
+      }
     },
     "EndpointUser" : {
       "type" : "structure",
       "members" : {
         "UserAttributes" : {
           "shape" : "MapOfListOf__string",
-          "documentation" : "Custom attributes specific to the user."
+          "documentation" : "Custom attributesd specific to the user."
         },
         "UserId" : {
           "shape" : "__string",
           "documentation" : "The unique ID of the user."
         }
-      },
-      "documentation" : "Endpoint user specific custom userAttributes"
-    },
-    "EventStream" : {
-      "type" : "structure",
-      "members" : {
-        "ApplicationId" : {
-          "shape" : "__string",
-          "documentation" : "The ID of the application from which events should be published."
-        },
-        "DestinationStreamArn" : {
-          "shape" : "__string",
-          "documentation" : "The Amazon Resource Name (ARN) of the Amazon Kinesis stream or Firehose delivery stream to which you want to publish events.\n Firehose ARN: arn:aws:firehose:REGION:ACCOUNT_ID:deliverystream/STREAM_NAME\n Kinesis ARN: arn:aws:kinesis:REGION:ACCOUNT_ID:stream/STREAM_NAME"
-        },
-        "ExternalId" : {
-          "shape" : "__string",
-          "documentation" : "The external ID assigned the IAM role that authorizes Amazon Pinpoint to publish to the stream."
-        },
-        "LastModifiedDate" : {
-          "shape" : "__string",
-          "documentation" : "The date the event stream was last updated in ISO 8601 format."
-        },
-        "LastUpdatedBy" : {
-          "shape" : "__string",
-          "documentation" : "The IAM user who last modified the event stream."
-        },
-        "RoleArn" : {
-          "shape" : "__string",
-          "documentation" : "The IAM role that authorizes Amazon Pinpoint to publish events to the stream in your account."
-        }
-      },
-      "documentation" : "Model for an event publishing subscription export."
+      }
     },
     "ForbiddenException" : {
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
-        },
-        "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
       },
-      "documentation" : "Simple message object.",
       "exception" : true,
       "error" : {
         "httpStatusCode" : 403
@@ -1985,15 +1807,13 @@
           "shape" : "__string",
           "documentation" : "Platform credential API key from Google."
         }
-      },
-      "documentation" : "Google Cloud Messaging credentials"
+      }
     },
     "GCMChannelResponse" : {
       "type" : "structure",
       "members" : {
         "ApplicationId" : {
-          "shape" : "__string",
-          "documentation" : "The ID of the application to which the channel applies."
+          "shape" : "__string"
         },
         "CreationDate" : {
           "shape" : "__string",
@@ -2004,8 +1824,7 @@
           "documentation" : "The GCM API key from Google."
         },
         "Id" : {
-          "shape" : "__string",
-          "documentation" : "The unique channel ID."
+          "shape" : "__string"
         },
         "IsArchived" : {
           "shape" : "__boolean",
@@ -2027,8 +1846,7 @@
           "shape" : "__integer",
           "documentation" : "Version of channel"
         }
-      },
-      "documentation" : "Google Cloud Messaging channel definition"
+      }
     },
     "GetApnsChannelRequest" : {
       "type" : "structure",
@@ -2258,30 +2076,6 @@
       "required" : [ "EndpointResponse" ],
       "payload" : "EndpointResponse"
     },
-    "GetEventStreamRequest" : {
-      "type" : "structure",
-      "members" : {
-        "ApplicationId" : {
-          "shape" : "__string",
-          "location" : "uri",
-          "locationName" : "application-id",
-          "documentation": "ApplicationId"
-        }
-      },
-      "required" : [ "ApplicationId" ],
-      "documentation": "GetEventStream Request"
-    },
-    "GetEventStreamResponse" : {
-      "type" : "structure",
-      "members" : {
-        "EventStream" : {
-          "shape" : "EventStream"
-        }
-      },
-      "required" : [ "EventStream" ],
-      "payload" : "EventStream",
-      "documentation": "GetEventStream Response"
-    },
     "GetGcmChannelRequest" : {
       "type" : "structure",
       "members" : {
@@ -2662,22 +2456,15 @@
           "shape" : "__string",
           "documentation" : "The string that you use in a subsequent request to get the next page of results in a paginated response."
         }
-      },
-      "documentation" : "Import job list."
+      }
     },
     "InternalServerErrorException" : {
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
-        },
-        "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
       },
-      "documentation" : "Simple message object.",
       "exception" : true,
       "error" : {
         "httpStatusCode" : 500
@@ -2807,15 +2594,12 @@
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
+          "shape" : "__string"
         },
         "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
-      },
-      "documentation" : "Simple message object."
+      }
     },
     "MessageConfiguration" : {
       "type" : "structure",
@@ -2832,22 +2616,15 @@
           "shape" : "Message",
           "documentation" : "The message that the campaign delivers to GCM channels. Overrides the default message."
         }
-      },
-      "documentation" : "Message configuration for a campaign."
+      }
     },
     "MethodNotAllowedException" : {
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
-        },
-        "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
       },
-      "documentation" : "Simple message object.",
       "exception" : true,
       "error" : {
         "httpStatusCode" : 405
@@ -2857,49 +2634,14 @@
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
-        },
-        "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
       },
-      "documentation" : "Simple message object.",
       "exception" : true,
       "error" : {
         "httpStatusCode" : 404
       }
     },
-    "PutEventStreamRequest" : {
-      "type" : "structure",
-      "members" : {
-        "ApplicationId" : {
-          "shape" : "__string",
-          "location" : "uri",
-          "locationName" : "application-id",
-          "documentation": "ApplicationId"
-        },
-        "WriteEventStream" : {
-          "shape" : "WriteEventStream",
-          "documentation": "EventStream to write."
-        }
-      },
-      "required" : [ "ApplicationId", "WriteEventStream" ],
-      "payload" : "WriteEventStream",
-      "documentation": "PutEventStream Request"
-    },
-    "PutEventStreamResponse" : {
-      "type" : "structure",
-      "members" : {
-        "EventStream" : {
-          "shape" : "EventStream"
-        }
-      },
-      "required" : [ "EventStream" ],
-      "payload" : "EventStream",
-      "documentation": "PutEventStream Response"
-    },
     "QuietTime" : {
       "type" : "structure",
       "members" : {
@@ -2911,8 +2653,7 @@
           "shape" : "__string",
           "documentation" : "The default start time for quiet time in ISO 8601 format."
         }
-      },
-      "documentation" : "Quiet Time"
+      }
     },
     "RecencyDimension" : {
       "type" : "structure",
@@ -2925,8 +2666,7 @@
           "shape" : "RecencyType",
           "documentation" : "The recency dimension type:\nACTIVE – Users who have used your app within the specified duration are included in the segment.\nINACTIVE – Users who have not used your app within the specified duration are included in the segment."
         }
-      },
-      "documentation" : "Define how a segment based on recency of use."
+      }
     },
     "RecencyType" : {
       "type" : "string",
@@ -2959,8 +2699,7 @@
           "shape" : "__string",
           "documentation" : "The starting UTC offset for the schedule if the value for isLocalTime is true\n\nValid values: \nUTC\nUTC+01\nUTC+02\nUTC+03\nUTC+03:30\nUTC+04\nUTC+04:30\nUTC+05\nUTC+05:30\nUTC+05:45\nUTC+06\nUTC+06:30\nUTC+07\nUTC+08\nUTC+09\nUTC+09:30\nUTC+10\nUTC+10:30\nUTC+11\nUTC+12\nUTC+13\nUTC-02\nUTC-03\nUTC-04\nUTC-05\nUTC-06\nUTC-07\nUTC-08\nUTC-09\nUTC-10\nUTC-11"
         }
-      },
-      "documentation" : "Shcedule that defines when a campaign is run."
+      }
     },
     "SegmentBehaviors" : {
       "type" : "structure",
@@ -2969,8 +2708,7 @@
           "shape" : "RecencyDimension",
           "documentation" : "The recency of use."
         }
-      },
-      "documentation" : "Segment behavior dimensions"
+      }
     },
     "SegmentDemographics" : {
       "type" : "structure",
@@ -2995,8 +2733,7 @@
           "shape" : "SetDimension",
           "documentation" : "The device platform criteria for the segment."
         }
-      },
-      "documentation" : "Segment demographic dimensions"
+      }
     },
     "SegmentDimensions" : {
       "type" : "structure",
@@ -3015,14 +2752,9 @@
         },
         "Location" : {
           "shape" : "SegmentLocation",
-          "documentation" : "The segment location attributes."
-        },
-        "UserAttributes" : {
-          "shape" : "MapOfAttributeDimension",
-          "documentation" : "Custom segment user attributes."
+          "documentation" : "The segment location attributes.\n"
         }
-      },
-      "documentation" : "Segment dimensions"
+      }
     },
     "SegmentImportResource" : {
       "type" : "structure",
@@ -3047,8 +2779,7 @@
           "shape" : "__integer",
           "documentation" : "The number of endpoints that were successfully imported to create this segment."
         }
-      },
-      "documentation" : "Segment import definition."
+      }
     },
     "SegmentLocation" : {
       "type" : "structure",
@@ -3057,8 +2788,7 @@
           "shape" : "SetDimension",
           "documentation" : "The country filter according to ISO 3166-1 Alpha-2 codes."
         }
-      },
-      "documentation" : "Segment location dimensions"
+      }
     },
     "SegmentResponse" : {
       "type" : "structure",
@@ -3099,8 +2829,7 @@
           "shape" : "__integer",
           "documentation" : "The segment version number."
         }
-      },
-      "documentation" : "Segment definition."
+      }
     },
     "SegmentType" : {
       "type" : "string",
@@ -3117,8 +2846,7 @@
           "shape" : "__string",
           "documentation" : "An identifier used to retrieve the next page of results. The token is null if no additional pages exist."
         }
-      },
-      "documentation" : "Segments in your account."
+      }
     },
     "SetDimension" : {
       "type" : "structure",
@@ -3131,22 +2859,15 @@
           "shape" : "ListOf__string",
           "documentation" : "The criteria values for the segment dimension. Endpoints with matching attribute values are included or excluded from the segment, depending on the setting for Type."
         }
-      },
-      "documentation" : "Dimension specification of a segment."
+      }
     },
     "TooManyRequestsException" : {
       "type" : "structure",
       "members" : {
         "Message" : {
-          "shape" : "__string",
-          "documentation" : "The error message returned from the API."
-        },
-        "RequestID" : {
-          "shape" : "__string",
-          "documentation" : "The unique message body ID."
+          "shape" : "__string"
         }
       },
-      "documentation" : "Simple message object.",
       "exception" : true,
       "error" : {
         "httpStatusCode" : 429
@@ -3183,8 +2904,7 @@
           "shape" : "__string",
           "documentation" : "The custom name of a variation of the campaign used for A/B testing."
         }
-      },
-      "documentation" : "Treatment resource"
+      }
     },
     "UpdateApnsChannelRequest" : {
       "type" : "structure",
@@ -3387,8 +3107,7 @@
           "shape" : "QuietTime",
           "documentation" : "The default quiet time for the app. Each campaign for this app sends no messages during this time unless the campaign overrides the default with a quiet time of its own."
         }
-      },
-      "documentation" : "Creating application setting request"
+      }
     },
     "WriteCampaignRequest" : {
       "type" : "structure",
@@ -3441,26 +3160,7 @@
           "shape" : "__string",
           "documentation" : "The custom name of a variation of the campaign used for A/B testing."
         }
-      },
-      "documentation" : "Used to create a campaign."
-    },
-    "WriteEventStream" : {
-      "type" : "structure",
-      "members" : {
-        "DestinationStreamArn" : {
-          "shape" : "__string",
-          "documentation" : "The Amazon Resource Name (ARN) of the Amazon Kinesis stream or Firehose delivery stream to which you want to publish events.\n Firehose ARN: arn:aws:firehose:REGION:ACCOUNT_ID:deliverystream/STREAM_NAME\n Kinesis ARN: arn:aws:kinesis:REGION:ACCOUNT_ID:stream/STREAM_NAME"
-        },
-        "ExternalId" : {
-          "shape" : "__string",
-          "documentation" : "The external ID assigned the IAM role that authorizes Amazon Pinpoint to publish to the stream."
-        },
-        "RoleArn" : {
-          "shape" : "__string",
-          "documentation" : "The IAM role that authorizes Amazon Pinpoint to publish events to the stream in your account."
-        }
-      },
-      "documentation" : "Request to save an EventStream."
+      }
     },
     "WriteSegmentRequest" : {
       "type" : "structure",
@@ -3473,8 +3173,7 @@
           "shape" : "__string",
           "documentation" : "The name of segment"
         }
-      },
-      "documentation" : "Segment definition."
+      }
     },
     "WriteTreatmentResource" : {
       "type" : "structure",
@@ -3499,8 +3198,7 @@
           "shape" : "__string",
           "documentation" : "The custom name of a variation of the campaign used for A/B testing."
         }
-      },
-      "documentation" : "Used to create a campaign treatment."
+      }
     },
     "__boolean" : {
       "type" : "boolean"
@@ -3513,9 +3211,6 @@
     },
     "__string" : {
       "type" : "string"
-    },
-    "__timestamp" : {
-      "type" : "timestamp"
     }
   }
-}
\ No newline at end of file
+}
diff --git a/botocore/data/rekognition/2016-06-27/service-2.json b/botocore/data/rekognition/2016-06-27/service-2.json
index f7674cc2f..e0e086275 100644
--- a/botocore/data/rekognition/2016-06-27/service-2.json
+++ b/botocore/data/rekognition/2016-06-27/service-2.json
@@ -461,7 +461,7 @@
         },
         "Attributes":{
           "shape":"Attributes",
-          "documentation":"<p>A list of facial attributes you want to be returned. This can be the default list of attributes or all attributes. If you don't specify a value for <code>Attributes</code> or if you specify <code>[\"DEFAULT\"]</code>, the API returns the following subset of facial attributes: <code>BoundingBox</code>, <code>Confidence</code>, <code>Pose</code>, <code>Quality</code> and <code>Landmarks</code>. If you provide <code>[\"ALL\"]</code>, all facial attributes are returned but the operation will take longer to complete.</p> <p>If you provide both, <code>[\"ALL\", \"DEFAULT\"]</code>, the service uses a logical AND operator to determine which attributes to return (in this case, all attributes). </p>"
+          "documentation":"<p>A list of facial attributes you would like to be returned. By default, the API returns subset of facial attributes. </p> <p>For example, you can specify the value as, [\"ALL\"] or [\"DEFAULT\"]. If you provide both, [\"ALL\", \"DEFAULT\"], the service uses a logical AND operator to determine which attributes to return (in this case, it is all attributes). If you specify all attributes, Amazon Rekognition performs additional detection. </p>"
         }
       }
     },
@@ -758,14 +758,14 @@
       "members":{
         "Brightness":{
           "shape":"Float",
-          "documentation":"<p>Value representing brightness of the face. The service returns a value between 0 and 100 (inclusive). A higher value indicates a brighter face image.</p>"
+          "documentation":"<p>Value representing brightness of the face. The service returns a value between 0 and 1 (inclusive).</p>"
         },
         "Sharpness":{
           "shape":"Float",
-          "documentation":"<p>Value representing sharpness of the face. The service returns a value between 0 and 100 (inclusive). A higher value indicates a sharper face image.</p>"
+          "documentation":"<p>Value representing sharpness of the face.</p>"
         }
       },
-      "documentation":"<p>Identifies face image brightness and sharpness. </p>"
+      "documentation":"<p>Identifies image brightness and sharpness. </p>"
     },
     "ImageTooLargeException":{
       "type":"structure",
@@ -792,7 +792,7 @@
         },
         "DetectionAttributes":{
           "shape":"Attributes",
-          "documentation":"<p>A list of facial attributes you want to be returned. This can be the default list of attributes or all attributes. If you don't specify a value for <code>Attributes</code> or if you specify <code>[\"DEFAULT\"]</code>, the API returns the following subset of facial attributes: <code>BoundingBox</code>, <code>Confidence</code>, <code>Pose</code>, <code>Quality</code> and <code>Landmarks</code>. If you provide <code>[\"ALL\"]</code>, all facial attributes are returned but the operation will take longer to complete.</p> <p>If you provide both, <code>[\"ALL\", \"DEFAULT\"]</code>, the service uses a logical AND operator to determine which attributes to return (in this case, all attributes). </p>"
+          "documentation":"<p>(Optional) Returns detailed attributes of indexed faces. By default, the operation returns a subset of the facial attributes. </p> <p>For example, you can specify the value as, [\"ALL\"] or [\"DEFAULT\"]. If you provide both, [\"ALL\", \"DEFAULT\"], Amazon Rekognition uses the logical AND operator to determine which attributes to return (in this case, it is all attributes). If you specify all attributes, the service performs additional detection, in addition to the default. </p>"
         }
       }
     },
diff --git a/botocore/utils.py b/botocore/utils.py
index 735d79d0d..26e6a877e 100644
--- a/botocore/utils.py
+++ b/botocore/utils.py
@@ -979,7 +979,6 @@ class ContainerMetadataFetcher(object):
     RETRY_ATTEMPTS = 3
     SLEEP_TIME = 1
     IP_ADDRESS = '169.254.170.2'
-    _ALLOWED_HOSTS = [IP_ADDRESS, 'localhost', '127.0.0.1']
 
     def __init__(self, session=None, sleep=time.sleep):
         if session is None:
@@ -987,33 +986,6 @@ class ContainerMetadataFetcher(object):
         self._session = session
         self._sleep = sleep
 
-    def retrieve_full_uri(self, full_url, headers=None):
-        """Retrieve JSON metadata from container metadata.
-
-        :type full_url: str
-        :param full_url: The full URL of the metadata service.
-            This should include the scheme as well, e.g
-            "http://localhost:123/foo"
-
-        """
-        self._validate_allowed_url(full_url)
-        return self._retrieve_credentials(full_url, headers)
-
-    def _validate_allowed_url(self, full_url):
-        parsed = botocore.compat.urlparse(full_url)
-        is_whitelisted_host = self._check_if_whitelisted_host(
-            parsed.hostname)
-        if not is_whitelisted_host:
-            raise ValueError(
-                "Unsupported host '%s'.  Can only "
-                "retrieve metadata from these hosts: %s" %
-                (parsed.hostname, ', '.join(self._ALLOWED_HOSTS)))
-
-    def _check_if_whitelisted_host(self, host):
-        if host in self._ALLOWED_HOSTS:
-            return True
-        return False
-
     def retrieve_uri(self, relative_uri):
         """Retrieve JSON metadata from ECS metadata.
 
@@ -1023,20 +995,15 @@ class ContainerMetadataFetcher(object):
         :return: The parsed JSON response.
 
         """
-        full_url = self.full_url(relative_uri)
-        return self._retrieve_credentials(full_url)
-
-    def _retrieve_credentials(self, full_url, extra_headers=None):
+        full_url = self._full_url(relative_uri)
         headers = {'Accept': 'application/json'}
-        if extra_headers is not None:
-            headers.update(extra_headers)
         attempts = 0
         while True:
             try:
                 return self._get_response(full_url, headers, self.TIMEOUT_SECONDS)
             except MetadataRetrievalError as e:
                 logger.debug("Received error when attempting to retrieve "
-                             "container metadata: %s", e, exc_info=True)
+                             "ECS metadata: %s", e, exc_info=True)
                 self._sleep(self.SLEEP_TIME)
                 attempts += 1
                 if attempts >= self.RETRY_ATTEMPTS:
@@ -1061,5 +1028,5 @@ class ContainerMetadataFetcher(object):
                          "ECS metadata: %s" % e)
             raise MetadataRetrievalError(error_msg=error_msg)
 
-    def full_url(self, relative_uri):
+    def _full_url(self, relative_uri):
         return 'http://%s%s' % (self.IP_ADDRESS, relative_uri)
diff --git a/docs/source/conf.py b/docs/source/conf.py
index e67e7bda9..efbbe82ca 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.5.'
 # The full version, including alpha/beta/rc tags.
-release = '1.5.28'
+release = '1.5.26'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.


Test patch:
diff --git a/tests/unit/test_credentials.py b/tests/unit/test_credentials.py
index 237ae46f5..04875a99e 100644
--- a/tests/unit/test_credentials.py
+++ b/tests/unit/test_credentials.py
@@ -839,15 +839,14 @@ class TestAssumeRoleCredentialProvider(unittest.TestCase):
             response)
 
     def test_assume_role_in_cache_but_expired(self):
-        expired_creds = datetime.utcnow()
-        valid_creds = expired_creds + timedelta(seconds=60)
-        utc_timestamp = expired_creds.isoformat() + 'Z'
+        expired_creds = datetime.now(tzlocal())
+        valid_creds = expired_creds + timedelta(hours=1)
         response = {
             'Credentials': {
                 'AccessKeyId': 'foo',
                 'SecretAccessKey': 'bar',
                 'SessionToken': 'baz',
-                'Expiration': valid_creds.isoformat() + 'Z',
+                'Expiration': valid_creds,
             },
         }
         client_creator = self.create_client_creator(with_response=response)
@@ -857,7 +856,7 @@ class TestAssumeRoleCredentialProvider(unittest.TestCase):
                     'AccessKeyId': 'foo-cached',
                     'SecretAccessKey': 'bar-cached',
                     'SessionToken': 'baz-cached',
-                    'Expiration': utc_timestamp,
+                    'Expiration': expired_creds,
                 }
             }
         }
@@ -1153,22 +1152,14 @@ class TestContainerProvider(BaseEnvVar):
         creds = provider.load()
         self.assertIsNone(creds)
 
-    def full_url(self, url):
-        return 'http://%s%s' % (ContainerMetadataFetcher.IP_ADDRESS, url)
-
-    def create_fetcher(self):
-        fetcher = mock.Mock(spec=ContainerMetadataFetcher)
-        fetcher.full_url = self.full_url
-        return fetcher
-
     def test_retrieve_from_provider_if_env_var_present(self):
         environ = {
             'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI': '/latest/credentials?id=foo'
         }
-        fetcher = self.create_fetcher()
+        fetcher = mock.Mock(spec=ContainerMetadataFetcher)
         timeobj = datetime.now(tzlocal())
         timestamp = (timeobj + timedelta(hours=24)).isoformat()
-        fetcher.retrieve_full_uri.return_value = {
+        fetcher.retrieve_uri.return_value = {
             "AccessKeyId" : "access_key",
             "SecretAccessKey" : "secret_key",
             "Token" : "token",
@@ -1177,8 +1168,7 @@ class TestContainerProvider(BaseEnvVar):
         provider = credentials.ContainerProvider(environ, fetcher)
         creds = provider.load()
 
-        fetcher.retrieve_full_uri.assert_called_with(
-            self.full_url('/latest/credentials?id=foo'), headers=None)
+        fetcher.retrieve_uri.assert_called_with('/latest/credentials?id=foo')
         self.assertEqual(creds.access_key, 'access_key')
         self.assertEqual(creds.secret_key, 'secret_key')
         self.assertEqual(creds.token, 'token')
@@ -1192,7 +1182,7 @@ class TestContainerProvider(BaseEnvVar):
         timeobj = datetime.now(tzlocal())
         expired_timestamp = (timeobj - timedelta(hours=23)).isoformat()
         future_timestamp = (timeobj + timedelta(hours=1)).isoformat()
-        fetcher.retrieve_full_uri.side_effect = [
+        fetcher.retrieve_uri.side_effect = [
             {
                 "AccessKeyId" : "access_key_old",
                 "SecretAccessKey" : "secret_key_old",
@@ -1222,7 +1212,7 @@ class TestContainerProvider(BaseEnvVar):
         expired_timestamp = (timeobj - timedelta(hours=23)).isoformat()
         future_timestamp = (timeobj + timedelta(hours=1)).isoformat()
         exception = botocore.exceptions.CredentialRetrievalError
-        fetcher.retrieve_full_uri.side_effect = exception(provider='ecs-role',
+        fetcher.retrieve_uri.side_effect = exception(provider='ecs-role',
                                                      error_msg='fake http error')
         with self.assertRaises(exception):
             provider = credentials.ContainerProvider(environ, fetcher)
@@ -1239,7 +1229,7 @@ class TestContainerProvider(BaseEnvVar):
         expired_timestamp = (timeobj - timedelta(hours=23)).isoformat()
         http_exception = botocore.exceptions.MetadataRetrievalError
         raised_exception = botocore.exceptions.CredentialRetrievalError
-        fetcher.retrieve_full_uri.side_effect = [
+        fetcher.retrieve_uri.side_effect = [
             {
                 "AccessKeyId" : "access_key_old",
                 "SecretAccessKey" : "secret_key_old",
@@ -1254,50 +1244,3 @@ class TestContainerProvider(BaseEnvVar):
         # Second time with a refresh should propagate an error.
         with self.assertRaises(raised_exception):
             frozen_creds = creds.get_frozen_credentials()
-
-    def test_can_use_full_url(self):
-        environ = {
-            'AWS_CONTAINER_CREDENTIALS_FULL_URI': 'http://localhost/foo'
-        }
-        fetcher = self.create_fetcher()
-        timeobj = datetime.now(tzlocal())
-        timestamp = (timeobj + timedelta(hours=24)).isoformat()
-        fetcher.retrieve_full_uri.return_value = {
-            "AccessKeyId" : "access_key",
-            "SecretAccessKey" : "secret_key",
-            "Token" : "token",
-            "Expiration" : timestamp,
-        }
-        provider = credentials.ContainerProvider(environ, fetcher)
-        creds = provider.load()
-
-        fetcher.retrieve_full_uri.assert_called_with('http://localhost/foo',
-                                                     headers=None)
-        self.assertEqual(creds.access_key, 'access_key')
-        self.assertEqual(creds.secret_key, 'secret_key')
-        self.assertEqual(creds.token, 'token')
-        self.assertEqual(creds.method, 'container-role')
-
-    def test_can_pass_basic_auth_token(self):
-        environ = {
-            'AWS_CONTAINER_CREDENTIALS_FULL_URI': 'http://localhost/foo',
-            'AWS_CONTAINER_AUTHORIZATION_TOKEN': 'Basic auth-token',
-        }
-        fetcher = self.create_fetcher()
-        timeobj = datetime.now(tzlocal())
-        timestamp = (timeobj + timedelta(hours=24)).isoformat()
-        fetcher.retrieve_full_uri.return_value = {
-            "AccessKeyId" : "access_key",
-            "SecretAccessKey" : "secret_key",
-            "Token" : "token",
-            "Expiration" : timestamp,
-        }
-        provider = credentials.ContainerProvider(environ, fetcher)
-        creds = provider.load()
-
-        fetcher.retrieve_full_uri.assert_called_with(
-            'http://localhost/foo', headers={'Authorization': 'Basic auth-token'})
-        self.assertEqual(creds.access_key, 'access_key')
-        self.assertEqual(creds.secret_key, 'secret_key')
-        self.assertEqual(creds.token, 'token')
-        self.assertEqual(creds.method, 'container-role')
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
index 2c1a23a95..607f29ca4 100644
--- a/tests/unit/test_utils.py
+++ b/tests/unit/test_utils.py
@@ -1420,41 +1420,6 @@ class TestContainerMetadataFetcher(unittest.TestCase):
             http_responses.append(http_response)
         self.http.get.side_effect = http_responses
 
-    def assert_can_retrieve_metadata_from(self, full_uri):
-        response_body = {'foo': 'bar'}
-        self.set_http_responses_to(response_body)
-        fetcher = self.create_fetcher()
-        response = fetcher.retrieve_full_uri(full_uri)
-        self.assertEqual(response, response_body)
-        self.http.get.assert_called_with(
-            full_uri, headers={'Accept': 'application/json'},
-            timeout=fetcher.TIMEOUT_SECONDS,
-        )
-
-    def assert_host_is_not_allowed(self, full_uri):
-        response_body = {'foo': 'bar'}
-        self.set_http_responses_to(response_body)
-        fetcher = self.create_fetcher()
-        with self.assertRaisesRegexp(ValueError, 'Unsupported host'):
-            fetcher.retrieve_full_uri(full_uri)
-        self.assertFalse(self.http.get.called)
-
-    def test_can_specify_extra_headers_are_merged(self):
-        headers = {
-            # The 'Accept' header will override the
-            # default Accept header of application/json.
-            'Accept': 'application/not-json',
-            'X-Other-Header': 'foo',
-        }
-        self.set_http_responses_to({'foo': 'bar'})
-        fetcher = self.create_fetcher()
-        response = fetcher.retrieve_full_uri(
-            'http://localhost', headers)
-        self.http.get.assert_called_with(
-            'http://localhost', headers=headers,
-            timeout=fetcher.TIMEOUT_SECONDS,
-        )
-
     def test_can_retrieve_uri(self):
         json_body =  {
             "AccessKeyId" : "a",
@@ -1536,40 +1501,6 @@ class TestContainerMetadataFetcher(unittest.TestCase):
         # Should have tried up to RETRY_ATTEMPTS.
         self.assertEqual(self.http.get.call_count, fetcher.RETRY_ATTEMPTS)
 
-    def test_can_retrieve_full_uri_with_fixed_ip(self):
-        self.assert_can_retrieve_metadata_from(
-            'http://%s/foo?id=1' % ContainerMetadataFetcher.IP_ADDRESS)
-
-    def test_localhost_http_is_allowed(self):
-        self.assert_can_retrieve_metadata_from('http://localhost/foo')
-
-    def test_localhost_with_port_http_is_allowed(self):
-        self.assert_can_retrieve_metadata_from('http://localhost:8000/foo')
-
-    def test_localhost_https_is_allowed(self):
-        self.assert_can_retrieve_metadata_from('https://localhost/foo')
-
-    def test_can_use_127_ip_addr(self):
-        self.assert_can_retrieve_metadata_from('https://127.0.0.1/foo')
-
-    def test_can_use_127_ip_addr_with_port(self):
-        self.assert_can_retrieve_metadata_from('https://127.0.0.1:8080/foo')
-
-    def test_link_local_http_is_not_allowed(self):
-        self.assert_host_is_not_allowed('http://169.254.0.1/foo')
-
-    def test_link_local_https_is_not_allowed(self):
-        self.assert_host_is_not_allowed('https://169.254.0.1/foo')
-
-    def test_non_link_local_nonallowed_url(self):
-        self.assert_host_is_not_allowed('http://169.1.2.3/foo')
-
-    def test_error_raised_on_nonallowed_url(self):
-        self.assert_host_is_not_allowed('http://somewhere.com/foo')
-
-    def test_external_host_not_allowed_if_https(self):
-        self.assert_host_is_not_allowed('https://somewhere.com/foo')
-
 
 if __name__ == '__main__':
     unittest.main()