Source code for cloudbridge.interfaces.provider

"""
Specification for a provider interface
"""
from abc import ABCMeta
from abc import abstractmethod
from abc import abstractproperty


[docs]class CloudProvider(object): """ Base interface for a cloud provider """ __metaclass__ = ABCMeta
[docs] @abstractmethod def __init__(self, config): """ Create a new provider instance given a dictionary of configuration attributes. :type config: :class:`dict` :param config: A dictionary object containing provider initialization values. Alternatively, this can be an iterable of key/value pairs (as tuples or other iterables of length two). See specific provider implementation for the required fields. :rtype: :class:`.CloudProvider` :return: a concrete provider instance """ pass
@abstractproperty def config(self): """ Returns the config object associated with this provider. This object is a subclass of :class:`dict` and will contain the properties provided at initialization time, grouped under `cloud_properties` and `credentials` keys. In addition, it also contains extra provider-wide properties such as the default result limit for `list()` queries. Example: .. code-block:: python config = { 'aws_access_key' : '<my_key>' } provider = factory.create_provider(ProviderList.AWS, config) print(provider.config['credentials'].get('aws_access_key')) print(provider.config.default_result_limit)) # change provider result limit provider.config.default_result_limit = 100 :rtype: :class:`.Configuration` :return: An object of class Configuration, which contains the values used to initialize the provider, as well as other global configuration properties. """ pass @abstractproperty def middleware(self): """ Returns the middleware manager associated with this provider. The middleware manager can be used to add or remove middleware from cloudbridge. Refer to pyeventsystem documentation for more information on how the middleware manager works. :rtype: :class:`.MiddlewareManager` :return: An object of class MiddlewareManager, which can be used to add or remove middleware from cloudbridge. """ pass
[docs] @abstractmethod def clone(self, zone=None): """ Create a clone of this provider. An optional `zone` parameter can be used to clone the provider to use a different zone. As each cloudbridge provider is restricted to a particular zone, this is useful when performing cross-zonal operations. Example: .. code-block:: python # list instances in all availability zones all_instances = [] for zone in provider.compute.regions.current.zones: new_provider = provider.clone(zone=zone) all_instances.append(list(new_provider.compute.instances)) print(all_instances) :param zone: Changes the provider's zone to the requested AvailabilityZone :type zone: :class:`.PlacementZone` object :rtype: :class:`.CloudProvider` :return: A clone of the CloudProvider, with zone changed to the requested zone. """ pass
[docs] @abstractmethod def authenticate(self): """ Checks whether a provider can be successfully authenticated with the configured settings. Clients are *not* required to call this method prior to accessing provider services, as most cloud connections are initialized lazily. The authenticate() method will return True if cloudbridge can establish a successful connection to the provider. It will raise an exception with the appropriate error details otherwise. Example: .. code-block:: python try: if provider.authenticate(): print("Provider connection successful") except ProviderConnectionException as e: print("Could not authenticate with provider: %s" % (e, )) :rtype: :class:`bool` :return: ``True`` if authentication is successful. """ pass
[docs] @abstractmethod def has_service(self, service_type): """ Checks whether this provider supports a given service. Example: .. code-block:: python if provider.has_service(CloudServiceType.BUCKET): print("Provider supports object store services") provider.storage.buckets.list() :type service_type: :class:`.CloudServiceType` :param service_type: Type of service to check support for. :rtype: :class:`bool` :return: ``True`` if the service type is supported. """ pass
@abstractproperty def region_name(self): """ Returns the region that this provider is connected to. All provider operations will take place within this region. :rtype: ``str`` :return: a zone id """ pass @abstractproperty def zone_name(self): """ Returns the placement zone that this provider is connected to. All provider operations will take place within this zone. Placement zone must be within the provider default region. :rtype: ``str`` :return: a zone id """ pass # @abstractproperty # def account(self): # """ # Provides access to all user account related services in this # provider. This includes listing available tenancies. # # :rtype: ``object`` of :class:`.ComputeService` # :return: a ComputeService object # """ # pass @abstractproperty def compute(self): """ Provides access to all compute related services in this provider. Example: .. code-block:: python regions = provider.compute.regions.list() vm_types = provider.compute.vm_types.list() instances = provider.compute.instances.list() images = provider.compute.images.list() # Alternatively for instance in provider.compute.instances: print(instance.name) :rtype: :class:`.ComputeService` :return: a ComputeService object """ pass @abstractproperty def networking(self): """ Provide access to all network related services in this provider. Example: .. code-block:: python networks = provider.networking.networks.list() subnets = provider.networking.subnets.list() routers = provider.networking.routers.list() :rtype: :class:`.NetworkingService` :return: a NetworkingService object """ @abstractproperty def security(self): """ Provides access to key pair management and firewall control Example: .. code-block:: python keypairs = provider.security.keypairs.list() vm_firewalls = provider.security.vm_firewalls.list() :rtype: ``object`` of :class:`.SecurityService` :return: a SecurityService object """ pass @abstractproperty def storage(self): """ Provides access to storage related services in this provider. This includes the volume, snapshot and bucket services, Example: .. code-block:: python volumes = provider.storage.volumes.list() snapshots = provider.storage.snapshots.list() if provider.has_service(CloudServiceType.BUCKET): print("Provider supports object store services") print(provider.storage.buckets.list()) :rtype: :class:`.StorageService` :return: a StorageService object """ pass @abstractproperty def dns(self): """ Provides access to all DNS related services. Example: .. code-block:: python if provider.has_service(CloudServiceType.DNS): print("Provider supports DNS services") dns_zones = provider.dns.host_zones.list() print(dns_zones) :rtype: :class:`.DnsService` :return: a DNS service object """ pass
class TestMockHelperMixin(object): """ A helper class that providers mock drivers can use to be notified when a test setup/teardown occurs. This is useful when activating libraries like HTTPretty which take over socket communications. """ def setUpMock(self): """ Called before a test is started. """ raise NotImplementedError( 'TestMockHelperMixin.setUpMock not implemented') def tearDownMock(self): """ Called before test teardown. """ raise NotImplementedError( 'TestMockHelperMixin.tearDownMock not implemented by this' ' provider') class ContainerProvider(object): """ Represents a container instance, such as Docker or LXC """ __metaclass__ = ABCMeta @abstractmethod def create_container(self): pass @abstractmethod def delete_container(self): pass class DeploymentProvider(object): """ Represents a deployment provider, such as Ansible or Shell script provider """ __metaclass__ = ABCMeta @abstractmethod def deploy(self, target): """ Deploys on given target, where target is an Instance or Container """ pass