Index: tools/telemetry/third_party/gsutil/third_party/boto/boto/datapipeline/layer1.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/boto/boto/datapipeline/layer1.py b/tools/telemetry/third_party/gsutil/third_party/boto/boto/datapipeline/layer1.py |
deleted file mode 100644 |
index 028fd9d2e31f3865cdd4049828e4fb7a44cadc88..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/boto/boto/datapipeline/layer1.py |
+++ /dev/null |
@@ -1,639 +0,0 @@ |
-# Copyright (c) 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved |
-# |
-# Permission is hereby granted, free of charge, to any person obtaining a |
-# copy of this software and associated documentation files (the |
-# "Software"), to deal in the Software without restriction, including |
-# without limitation the rights to use, copy, modify, merge, publish, dis- |
-# tribute, sublicense, and/or sell copies of the Software, and to permit |
-# persons to whom the Software is furnished to do so, subject to the fol- |
-# lowing conditions: |
-# |
-# The above copyright notice and this permission notice shall be included |
-# in all copies or substantial portions of the Software. |
-# |
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
-# IN THE SOFTWARE. |
-# |
- |
-import boto |
-from boto.compat import json |
-from boto.connection import AWSQueryConnection |
-from boto.regioninfo import RegionInfo |
-from boto.exception import JSONResponseError |
-from boto.datapipeline import exceptions |
- |
- |
-class DataPipelineConnection(AWSQueryConnection): |
- """ |
- This is the AWS Data Pipeline API Reference . This guide provides |
- descriptions and samples of the AWS Data Pipeline API. |
- |
- AWS Data Pipeline is a web service that configures and manages a |
- data-driven workflow called a pipeline. AWS Data Pipeline handles |
- the details of scheduling and ensuring that data dependencies are |
- met so your application can focus on processing the data. |
- |
- The AWS Data Pipeline API implements two main sets of |
- functionality. The first set of actions configure the pipeline in |
- the web service. You call these actions to create a pipeline and |
- define data sources, schedules, dependencies, and the transforms |
- to be performed on the data. |
- |
- The second set of actions are used by a task runner application |
- that calls the AWS Data Pipeline API to receive the next task |
- ready for processing. The logic for performing the task, such as |
- querying the data, running data analysis, or converting the data |
- from one format to another, is contained within the task runner. |
- The task runner performs the task assigned to it by the web |
- service, reporting progress to the web service as it does so. When |
- the task is done, the task runner reports the final success or |
- failure of the task to the web service. |
- |
- AWS Data Pipeline provides an open-source implementation of a task |
- runner called AWS Data Pipeline Task Runner. AWS Data Pipeline |
- Task Runner provides logic for common data management scenarios, |
- such as performing database queries and running data analysis |
- using Amazon Elastic MapReduce (Amazon EMR). You can use AWS Data |
- Pipeline Task Runner as your task runner, or you can write your |
- own task runner to provide custom data management. |
- |
- The AWS Data Pipeline API uses the Signature Version 4 protocol |
- for signing requests. For more information about how to sign a |
- request with this protocol, see `Signature Version 4 Signing |
- Process`_. In the code examples in this reference, the Signature |
- Version 4 Request parameters are represented as AuthParams. |
- """ |
- APIVersion = "2012-10-29" |
- DefaultRegionName = "us-east-1" |
- DefaultRegionEndpoint = "datapipeline.us-east-1.amazonaws.com" |
- ServiceName = "DataPipeline" |
- TargetPrefix = "DataPipeline" |
- ResponseError = JSONResponseError |
- |
- _faults = { |
- "PipelineDeletedException": exceptions.PipelineDeletedException, |
- "InvalidRequestException": exceptions.InvalidRequestException, |
- "TaskNotFoundException": exceptions.TaskNotFoundException, |
- "PipelineNotFoundException": exceptions.PipelineNotFoundException, |
- "InternalServiceError": exceptions.InternalServiceError, |
- } |
- |
- def __init__(self, **kwargs): |
- region = kwargs.pop('region', None) |
- if not region: |
- region = RegionInfo(self, self.DefaultRegionName, |
- self.DefaultRegionEndpoint) |
- kwargs['host'] = region.endpoint |
- super(DataPipelineConnection, self).__init__(**kwargs) |
- self.region = region |
- |
- def _required_auth_capability(self): |
- return ['hmac-v4'] |
- |
- def activate_pipeline(self, pipeline_id): |
- """ |
- Validates a pipeline and initiates processing. If the pipeline |
- does not pass validation, activation fails. |
- |
- Call this action to start processing pipeline tasks of a |
- pipeline you've created using the CreatePipeline and |
- PutPipelineDefinition actions. A pipeline cannot be modified |
- after it has been successfully activated. |
- |
- :type pipeline_id: string |
- :param pipeline_id: The identifier of the pipeline to activate. |
- |
- """ |
- params = {'pipelineId': pipeline_id, } |
- return self.make_request(action='ActivatePipeline', |
- body=json.dumps(params)) |
- |
- def create_pipeline(self, name, unique_id, description=None): |
- """ |
- Creates a new empty pipeline. When this action succeeds, you |
- can then use the PutPipelineDefinition action to populate the |
- pipeline. |
- |
- :type name: string |
- :param name: The name of the new pipeline. You can use the same name |
- for multiple pipelines associated with your AWS account, because |
- AWS Data Pipeline assigns each new pipeline a unique pipeline |
- identifier. |
- |
- :type unique_id: string |
- :param unique_id: A unique identifier that you specify. This identifier |
- is not the same as the pipeline identifier assigned by AWS Data |
- Pipeline. You are responsible for defining the format and ensuring |
- the uniqueness of this identifier. You use this parameter to ensure |
- idempotency during repeated calls to CreatePipeline. For example, |
- if the first call to CreatePipeline does not return a clear |
- success, you can pass in the same unique identifier and pipeline |
- name combination on a subsequent call to CreatePipeline. |
- CreatePipeline ensures that if a pipeline already exists with the |
- same name and unique identifier, a new pipeline will not be |
- created. Instead, you'll receive the pipeline identifier from the |
- previous attempt. The uniqueness of the name and unique identifier |
- combination is scoped to the AWS account or IAM user credentials. |
- |
- :type description: string |
- :param description: The description of the new pipeline. |
- |
- """ |
- params = {'name': name, 'uniqueId': unique_id, } |
- if description is not None: |
- params['description'] = description |
- return self.make_request(action='CreatePipeline', |
- body=json.dumps(params)) |
- |
- def delete_pipeline(self, pipeline_id): |
- """ |
- Permanently deletes a pipeline, its pipeline definition and |
- its run history. You cannot query or restore a deleted |
- pipeline. AWS Data Pipeline will attempt to cancel instances |
- associated with the pipeline that are currently being |
- processed by task runners. Deleting a pipeline cannot be |
- undone. |
- |
- To temporarily pause a pipeline instead of deleting it, call |
- SetStatus with the status set to Pause on individual |
- components. Components that are paused by SetStatus can be |
- resumed. |
- |
- :type pipeline_id: string |
- :param pipeline_id: The identifier of the pipeline to be deleted. |
- |
- """ |
- params = {'pipelineId': pipeline_id, } |
- return self.make_request(action='DeletePipeline', |
- body=json.dumps(params)) |
- |
- def describe_objects(self, object_ids, pipeline_id, marker=None, |
- evaluate_expressions=None): |
- """ |
- Returns the object definitions for a set of objects associated |
- with the pipeline. Object definitions are composed of a set of |
- fields that define the properties of the object. |
- |
- :type pipeline_id: string |
- :param pipeline_id: Identifier of the pipeline that contains the object |
- definitions. |
- |
- :type object_ids: list |
- :param object_ids: Identifiers of the pipeline objects that contain the |
- definitions to be described. You can pass as many as 25 identifiers |
- in a single call to DescribeObjects. |
- |
- :type evaluate_expressions: boolean |
- :param evaluate_expressions: Indicates whether any expressions in the |
- object should be evaluated when the object descriptions are |
- returned. |
- |
- :type marker: string |
- :param marker: The starting point for the results to be returned. The |
- first time you call DescribeObjects, this value should be empty. As |
- long as the action returns `HasMoreResults` as `True`, you can call |
- DescribeObjects again and pass the marker value from the response |
- to retrieve the next set of results. |
- |
- """ |
- params = { |
- 'pipelineId': pipeline_id, |
- 'objectIds': object_ids, |
- } |
- if evaluate_expressions is not None: |
- params['evaluateExpressions'] = evaluate_expressions |
- if marker is not None: |
- params['marker'] = marker |
- return self.make_request(action='DescribeObjects', |
- body=json.dumps(params)) |
- |
- def describe_pipelines(self, pipeline_ids): |
- """ |
- Retrieve metadata about one or more pipelines. The information |
- retrieved includes the name of the pipeline, the pipeline |
- identifier, its current state, and the user account that owns |
- the pipeline. Using account credentials, you can retrieve |
- metadata about pipelines that you or your IAM users have |
- created. If you are using an IAM user account, you can |
- retrieve metadata about only those pipelines you have read |
- permission for. |
- |
- To retrieve the full pipeline definition instead of metadata |
- about the pipeline, call the GetPipelineDefinition action. |
- |
- :type pipeline_ids: list |
- :param pipeline_ids: Identifiers of the pipelines to describe. You can |
- pass as many as 25 identifiers in a single call to |
- DescribePipelines. You can obtain pipeline identifiers by calling |
- ListPipelines. |
- |
- """ |
- params = {'pipelineIds': pipeline_ids, } |
- return self.make_request(action='DescribePipelines', |
- body=json.dumps(params)) |
- |
- def evaluate_expression(self, pipeline_id, expression, object_id): |
- """ |
- Evaluates a string in the context of a specified object. A |
- task runner can use this action to evaluate SQL queries stored |
- in Amazon S3. |
- |
- :type pipeline_id: string |
- :param pipeline_id: The identifier of the pipeline. |
- |
- :type object_id: string |
- :param object_id: The identifier of the object. |
- |
- :type expression: string |
- :param expression: The expression to evaluate. |
- |
- """ |
- params = { |
- 'pipelineId': pipeline_id, |
- 'objectId': object_id, |
- 'expression': expression, |
- } |
- return self.make_request(action='EvaluateExpression', |
- body=json.dumps(params)) |
- |
- def get_pipeline_definition(self, pipeline_id, version=None): |
- """ |
- Returns the definition of the specified pipeline. You can call |
- GetPipelineDefinition to retrieve the pipeline definition you |
- provided using PutPipelineDefinition. |
- |
- :type pipeline_id: string |
- :param pipeline_id: The identifier of the pipeline. |
- |
- :type version: string |
- :param version: The version of the pipeline definition to retrieve. |
- This parameter accepts the values `latest` (default) and `active`. |
- Where `latest` indicates the last definition saved to the pipeline |
- and `active` indicates the last definition of the pipeline that was |
- activated. |
- |
- """ |
- params = {'pipelineId': pipeline_id, } |
- if version is not None: |
- params['version'] = version |
- return self.make_request(action='GetPipelineDefinition', |
- body=json.dumps(params)) |
- |
- def list_pipelines(self, marker=None): |
- """ |
- Returns a list of pipeline identifiers for all active |
- pipelines. Identifiers are returned only for pipelines you |
- have permission to access. |
- |
- :type marker: string |
- :param marker: The starting point for the results to be returned. The |
- first time you call ListPipelines, this value should be empty. As |
- long as the action returns `HasMoreResults` as `True`, you can call |
- ListPipelines again and pass the marker value from the response to |
- retrieve the next set of results. |
- |
- """ |
- params = {} |
- if marker is not None: |
- params['marker'] = marker |
- return self.make_request(action='ListPipelines', |
- body=json.dumps(params)) |
- |
- def poll_for_task(self, worker_group, hostname=None, |
- instance_identity=None): |
- """ |
- Task runners call this action to receive a task to perform |
- from AWS Data Pipeline. The task runner specifies which tasks |
- it can perform by setting a value for the workerGroup |
- parameter of the PollForTask call. The task returned by |
- PollForTask may come from any of the pipelines that match the |
- workerGroup value passed in by the task runner and that was |
- launched using the IAM user credentials specified by the task |
- runner. |
- |
- If tasks are ready in the work queue, PollForTask returns a |
- response immediately. If no tasks are available in the queue, |
- PollForTask uses long-polling and holds on to a poll |
- connection for up to a 90 seconds during which time the first |
- newly scheduled task is handed to the task runner. To |
- accomodate this, set the socket timeout in your task runner to |
- 90 seconds. The task runner should not call PollForTask again |
- on the same `workerGroup` until it receives a response, and |
- this may take up to 90 seconds. |
- |
- :type worker_group: string |
- :param worker_group: Indicates the type of task the task runner is |
- configured to accept and process. The worker group is set as a |
- field on objects in the pipeline when they are created. You can |
- only specify a single value for `workerGroup` in the call to |
- PollForTask. There are no wildcard values permitted in |
- `workerGroup`, the string must be an exact, case-sensitive, match. |
- |
- :type hostname: string |
- :param hostname: The public DNS name of the calling task runner. |
- |
- :type instance_identity: dict |
- :param instance_identity: Identity information for the Amazon EC2 |
- instance that is hosting the task runner. You can get this value by |
- calling the URI, `http://169.254.169.254/latest/meta-data/instance- |
- id`, from the EC2 instance. For more information, go to `Instance |
- Metadata`_ in the Amazon Elastic Compute Cloud User Guide. Passing |
- in this value proves that your task runner is running on an EC2 |
- instance, and ensures the proper AWS Data Pipeline service charges |
- are applied to your pipeline. |
- |
- """ |
- params = {'workerGroup': worker_group, } |
- if hostname is not None: |
- params['hostname'] = hostname |
- if instance_identity is not None: |
- params['instanceIdentity'] = instance_identity |
- return self.make_request(action='PollForTask', |
- body=json.dumps(params)) |
- |
- def put_pipeline_definition(self, pipeline_objects, pipeline_id): |
- """ |
- Adds tasks, schedules, and preconditions that control the |
- behavior of the pipeline. You can use PutPipelineDefinition to |
- populate a new pipeline or to update an existing pipeline that |
- has not yet been activated. |
- |
- PutPipelineDefinition also validates the configuration as it |
- adds it to the pipeline. Changes to the pipeline are saved |
- unless one of the following three validation errors exists in |
- the pipeline. |
- |
- #. An object is missing a name or identifier field. |
- #. A string or reference field is empty. |
- #. The number of objects in the pipeline exceeds the maximum |
- allowed objects. |
- |
- |
- |
- Pipeline object definitions are passed to the |
- PutPipelineDefinition action and returned by the |
- GetPipelineDefinition action. |
- |
- :type pipeline_id: string |
- :param pipeline_id: The identifier of the pipeline to be configured. |
- |
- :type pipeline_objects: list |
- :param pipeline_objects: The objects that define the pipeline. These |
- will overwrite the existing pipeline definition. |
- |
- """ |
- params = { |
- 'pipelineId': pipeline_id, |
- 'pipelineObjects': pipeline_objects, |
- } |
- return self.make_request(action='PutPipelineDefinition', |
- body=json.dumps(params)) |
- |
- def query_objects(self, pipeline_id, sphere, marker=None, query=None, |
- limit=None): |
- """ |
- Queries a pipeline for the names of objects that match a |
- specified set of conditions. |
- |
- The objects returned by QueryObjects are paginated and then |
- filtered by the value you set for query. This means the action |
- may return an empty result set with a value set for marker. If |
- `HasMoreResults` is set to `True`, you should continue to call |
- QueryObjects, passing in the returned value for marker, until |
- `HasMoreResults` returns `False`. |
- |
- :type pipeline_id: string |
- :param pipeline_id: Identifier of the pipeline to be queried for object |
- names. |
- |
- :type query: dict |
- :param query: Query that defines the objects to be returned. The Query |
- object can contain a maximum of ten selectors. The conditions in |
- the query are limited to top-level String fields in the object. |
- These filters can be applied to components, instances, and |
- attempts. |
- |
- :type sphere: string |
- :param sphere: Specifies whether the query applies to components or |
- instances. Allowable values: `COMPONENT`, `INSTANCE`, `ATTEMPT`. |
- |
- :type marker: string |
- :param marker: The starting point for the results to be returned. The |
- first time you call QueryObjects, this value should be empty. As |
- long as the action returns `HasMoreResults` as `True`, you can call |
- QueryObjects again and pass the marker value from the response to |
- retrieve the next set of results. |
- |
- :type limit: integer |
- :param limit: Specifies the maximum number of object names that |
- QueryObjects will return in a single call. The default value is |
- 100. |
- |
- """ |
- params = {'pipelineId': pipeline_id, 'sphere': sphere, } |
- if query is not None: |
- params['query'] = query |
- if marker is not None: |
- params['marker'] = marker |
- if limit is not None: |
- params['limit'] = limit |
- return self.make_request(action='QueryObjects', |
- body=json.dumps(params)) |
- |
- def report_task_progress(self, task_id): |
- """ |
- Updates the AWS Data Pipeline service on the progress of the |
- calling task runner. When the task runner is assigned a task, |
- it should call ReportTaskProgress to acknowledge that it has |
- the task within 2 minutes. If the web service does not recieve |
- this acknowledgement within the 2 minute window, it will |
- assign the task in a subsequent PollForTask call. After this |
- initial acknowledgement, the task runner only needs to report |
- progress every 15 minutes to maintain its ownership of the |
- task. You can change this reporting time from 15 minutes by |
- specifying a `reportProgressTimeout` field in your pipeline. |
- If a task runner does not report its status after 5 minutes, |
- AWS Data Pipeline will assume that the task runner is unable |
- to process the task and will reassign the task in a subsequent |
- response to PollForTask. task runners should call |
- ReportTaskProgress every 60 seconds. |
- |
- :type task_id: string |
- :param task_id: Identifier of the task assigned to the task runner. |
- This value is provided in the TaskObject that the service returns |
- with the response for the PollForTask action. |
- |
- """ |
- params = {'taskId': task_id, } |
- return self.make_request(action='ReportTaskProgress', |
- body=json.dumps(params)) |
- |
- def report_task_runner_heartbeat(self, taskrunner_id, worker_group=None, |
- hostname=None): |
- """ |
- Task runners call ReportTaskRunnerHeartbeat every 15 minutes |
- to indicate that they are operational. In the case of AWS Data |
- Pipeline Task Runner launched on a resource managed by AWS |
- Data Pipeline, the web service can use this call to detect |
- when the task runner application has failed and restart a new |
- instance. |
- |
- :type taskrunner_id: string |
- :param taskrunner_id: The identifier of the task runner. This value |
- should be unique across your AWS account. In the case of AWS Data |
- Pipeline Task Runner launched on a resource managed by AWS Data |
- Pipeline, the web service provides a unique identifier when it |
- launches the application. If you have written a custom task runner, |
- you should assign a unique identifier for the task runner. |
- |
- :type worker_group: string |
- :param worker_group: Indicates the type of task the task runner is |
- configured to accept and process. The worker group is set as a |
- field on objects in the pipeline when they are created. You can |
- only specify a single value for `workerGroup` in the call to |
- ReportTaskRunnerHeartbeat. There are no wildcard values permitted |
- in `workerGroup`, the string must be an exact, case-sensitive, |
- match. |
- |
- :type hostname: string |
- :param hostname: The public DNS name of the calling task runner. |
- |
- """ |
- params = {'taskrunnerId': taskrunner_id, } |
- if worker_group is not None: |
- params['workerGroup'] = worker_group |
- if hostname is not None: |
- params['hostname'] = hostname |
- return self.make_request(action='ReportTaskRunnerHeartbeat', |
- body=json.dumps(params)) |
- |
- def set_status(self, object_ids, status, pipeline_id): |
- """ |
- Requests that the status of an array of physical or logical |
- pipeline objects be updated in the pipeline. This update may |
- not occur immediately, but is eventually consistent. The |
- status that can be set depends on the type of object. |
- |
- :type pipeline_id: string |
- :param pipeline_id: Identifies the pipeline that contains the objects. |
- |
- :type object_ids: list |
- :param object_ids: Identifies an array of objects. The corresponding |
- objects can be either physical or components, but not a mix of both |
- types. |
- |
- :type status: string |
- :param status: Specifies the status to be set on all the objects in |
- `objectIds`. For components, this can be either `PAUSE` or |
- `RESUME`. For instances, this can be either `CANCEL`, `RERUN`, or |
- `MARK_FINISHED`. |
- |
- """ |
- params = { |
- 'pipelineId': pipeline_id, |
- 'objectIds': object_ids, |
- 'status': status, |
- } |
- return self.make_request(action='SetStatus', |
- body=json.dumps(params)) |
- |
- def set_task_status(self, task_id, task_status, error_id=None, |
- error_message=None, error_stack_trace=None): |
- """ |
- Notifies AWS Data Pipeline that a task is completed and |
- provides information about the final status. The task runner |
- calls this action regardless of whether the task was |
- sucessful. The task runner does not need to call SetTaskStatus |
- for tasks that are canceled by the web service during a call |
- to ReportTaskProgress. |
- |
- :type task_id: string |
- :param task_id: Identifies the task assigned to the task runner. This |
- value is set in the TaskObject that is returned by the PollForTask |
- action. |
- |
- :type task_status: string |
- :param task_status: If `FINISHED`, the task successfully completed. If |
- `FAILED` the task ended unsuccessfully. The `FALSE` value is used |
- by preconditions. |
- |
- :type error_id: string |
- :param error_id: If an error occurred during the task, this value |
- specifies an id value that represents the error. This value is set |
- on the physical attempt object. It is used to display error |
- information to the user. It should not start with string "Service_" |
- which is reserved by the system. |
- |
- :type error_message: string |
- :param error_message: If an error occurred during the task, this value |
- specifies a text description of the error. This value is set on the |
- physical attempt object. It is used to display error information to |
- the user. The web service does not parse this value. |
- |
- :type error_stack_trace: string |
- :param error_stack_trace: If an error occurred during the task, this |
- value specifies the stack trace associated with the error. This |
- value is set on the physical attempt object. It is used to display |
- error information to the user. The web service does not parse this |
- value. |
- |
- """ |
- params = {'taskId': task_id, 'taskStatus': task_status, } |
- if error_id is not None: |
- params['errorId'] = error_id |
- if error_message is not None: |
- params['errorMessage'] = error_message |
- if error_stack_trace is not None: |
- params['errorStackTrace'] = error_stack_trace |
- return self.make_request(action='SetTaskStatus', |
- body=json.dumps(params)) |
- |
- def validate_pipeline_definition(self, pipeline_objects, pipeline_id): |
- """ |
- Tests the pipeline definition with a set of validation checks |
- to ensure that it is well formed and can run without error. |
- |
- :type pipeline_id: string |
- :param pipeline_id: Identifies the pipeline whose definition is to be |
- validated. |
- |
- :type pipeline_objects: list |
- :param pipeline_objects: A list of objects that define the pipeline |
- changes to validate against the pipeline. |
- |
- """ |
- params = { |
- 'pipelineId': pipeline_id, |
- 'pipelineObjects': pipeline_objects, |
- } |
- return self.make_request(action='ValidatePipelineDefinition', |
- body=json.dumps(params)) |
- |
- def make_request(self, action, body): |
- headers = { |
- 'X-Amz-Target': '%s.%s' % (self.TargetPrefix, action), |
- 'Host': self.region.endpoint, |
- 'Content-Type': 'application/x-amz-json-1.1', |
- 'Content-Length': str(len(body)), |
- } |
- http_request = self.build_base_http_request( |
- method='POST', path='/', auth_path='/', params={}, |
- headers=headers, data=body) |
- response = self._mexe(http_request, sender=None, |
- override_num_retries=10) |
- response_body = response.read().decode('utf-8') |
- boto.log.debug(response_body) |
- if response.status == 200: |
- if response_body: |
- return json.loads(response_body) |
- else: |
- json_body = json.loads(response_body) |
- fault_name = json_body.get('__type', None) |
- exception_class = self._faults.get(fault_name, self.ResponseError) |
- raise exception_class(response.status, response.reason, |
- body=json_body) |