# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.## Licensed under the Apache License, Version 2.0 (the "License"). You# may not use this file except in compliance with the License. A copy of# the License is located at## https://aws.amazon.com/apache2.0/## or in the "license" file accompanying this file. This file is# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF# ANY KIND, either express or implied. See the License for the specific# language governing permissions and limitations under the License.importloggingfrombotocoreimportxform_namefromboto3.docs.docstringimportActionDocstringfromboto3.utilsimportinject_attributefrom.modelimportActionfrom.paramsimportcreate_request_parametersfrom.responseimportRawHandler,ResourceHandlerlogger=logging.getLogger(__name__)
[docs]classServiceAction:""" A class representing a callable action on a resource, for example ``sqs.get_queue_by_name(...)`` or ``s3.Bucket('foo').delete()``. The action may construct parameters from existing resource identifiers and may return either a raw response or a new resource instance. :type action_model: :py:class`~boto3.resources.model.Action` :param action_model: The action model. :type factory: ResourceFactory :param factory: The factory that created the resource class to which this action is attached. :type service_context: :py:class:`~boto3.utils.ServiceContext` :param service_context: Context about the AWS service """def__init__(self,action_model,factory=None,service_context=None):self._action_model=action_model# In the simplest case we just return the response, but if a# resource is defined, then we must create these before returning.resource_response_model=action_model.resourceifresource_response_model:self._response_handler=ResourceHandler(search_path=resource_response_model.path,factory=factory,resource_model=resource_response_model,service_context=service_context,operation_name=action_model.request.operation,)else:self._response_handler=RawHandler(action_model.path)def__call__(self,parent,*args,**kwargs):""" Perform the action's request operation after building operation parameters and build any defined resources from the response. :type parent: :py:class:`~boto3.resources.base.ServiceResource` :param parent: The resource instance to which this action is attached. :rtype: dict or ServiceResource or list(ServiceResource) :return: The response, either as a raw dict or resource instance(s). """operation_name=xform_name(self._action_model.request.operation)# First, build predefined params and then update with the# user-supplied kwargs, which allows overriding the pre-built# params if needed.params=create_request_parameters(parent,self._action_model.request)params.update(kwargs)logger.debug('Calling %s:%s with %r',parent.meta.service_name,operation_name,params,)response=getattr(parent.meta.client,operation_name)(*args,**params)logger.debug('Response: %r',response)returnself._response_handler(parent,params,response)
[docs]classBatchAction(ServiceAction):""" An action which operates on a batch of items in a collection, typically a single page of results from the collection's underlying service operation call. For example, this allows you to delete up to 999 S3 objects in a single operation rather than calling ``.delete()`` on each one individually. :type action_model: :py:class`~boto3.resources.model.Action` :param action_model: The action model. :type factory: ResourceFactory :param factory: The factory that created the resource class to which this action is attached. :type service_context: :py:class:`~boto3.utils.ServiceContext` :param service_context: Context about the AWS service """def__call__(self,parent,*args,**kwargs):""" Perform the batch action's operation on every page of results from the collection. :type parent: :py:class:`~boto3.resources.collection.ResourceCollection` :param parent: The collection iterator to which this action is attached. :rtype: list(dict) :return: A list of low-level response dicts from each call. """service_name=Noneclient=Noneresponses=[]operation_name=xform_name(self._action_model.request.operation)# Unlike the simple action above, a batch action must operate# on batches (or pages) of items. So we get each page, construct# the necessary parameters and call the batch operation.forpageinparent.pages():params={}forindex,resourceinenumerate(page):# There is no public interface to get a service name# or low-level client from a collection, so we get# these from the first resource in the collection.ifservice_nameisNone:service_name=resource.meta.service_nameifclientisNone:client=resource.meta.clientcreate_request_parameters(resource,self._action_model.request,params=params,index=index,)ifnotparams:# There are no items, no need to make a call.breakparams.update(kwargs)logger.debug('Calling %s:%s with %r',service_name,operation_name,params)response=getattr(client,operation_name)(*args,**params)logger.debug('Response: %r',response)responses.append(self._response_handler(parent,params,response))returnresponses
[docs]classWaiterAction:""" A class representing a callable waiter action on a resource, for example ``s3.Bucket('foo').wait_until_bucket_exists()``. The waiter action may construct parameters from existing resource identifiers. :type waiter_model: :py:class`~boto3.resources.model.Waiter` :param waiter_model: The action waiter. :type waiter_resource_name: string :param waiter_resource_name: The name of the waiter action for the resource. It usually begins with a ``wait_until_`` """def__init__(self,waiter_model,waiter_resource_name):self._waiter_model=waiter_modelself._waiter_resource_name=waiter_resource_namedef__call__(self,parent,*args,**kwargs):""" Perform the wait operation after building operation parameters. :type parent: :py:class:`~boto3.resources.base.ServiceResource` :param parent: The resource instance to which this action is attached. """client_waiter_name=xform_name(self._waiter_model.waiter_name)# First, build predefined params and then update with the# user-supplied kwargs, which allows overriding the pre-built# params if needed.params=create_request_parameters(parent,self._waiter_model)params.update(kwargs)logger.debug('Calling %s:%s with %r',parent.meta.service_name,self._waiter_resource_name,params,)client=parent.meta.clientwaiter=client.get_waiter(client_waiter_name)response=waiter.wait(**params)logger.debug('Response: %r',response)
[docs]classCustomModeledAction:"""A custom, modeled action to inject into a resource."""def__init__(self,action_name,action_model,function,event_emitter):""" :type action_name: str :param action_name: The name of the action to inject, e.g. 'delete_tags' :type action_model: dict :param action_model: A JSON definition of the action, as if it were part of the resource model. :type function: function :param function: The function to perform when the action is called. The first argument should be 'self', which will be the resource the function is to be called on. :type event_emitter: :py:class:`botocore.hooks.BaseEventHooks` :param event_emitter: The session event emitter. """self.name=action_nameself.model=action_modelself.function=functionself.emitter=event_emitter