FabioRosado 8 лет назад
Родитель
Сommit
f628711f7d

+ 16 - 12
cloudbridge/cloud/base/provider.py

@@ -1,7 +1,7 @@
 """Base implementation of a provider interface."""
 import functools
-import os
 import logging
+import os
 from os.path import expanduser
 try:
     from configparser import ConfigParser
@@ -39,8 +39,8 @@ class BaseConfiguration(Configuration):
         :rtype: ``int``
         :return: The maximum number of results to return
         """
-        log.debug("Maximum number of results for list methods "
-                  + DEFAULT_RESULT_LIMIT)
+        log.debug("Maximum number of results for list methods %s",
+                  DEFAULT_RESULT_LIMIT)
         return self.get('default_result_limit', DEFAULT_RESULT_LIMIT)
 
     @property
@@ -48,8 +48,8 @@ class BaseConfiguration(Configuration):
         """
         Gets the default wait timeout for LifeCycleObjects.
         """
-        log.debug("Default wait timeout for LifeCycleObjects "
-                  + DEFAULT_WAIT_TIMEOUT)
+        log.debug("Default wait timeout for LifeCycleObjects %s ",
+                  DEFAULT_WAIT_TIMEOUT)
         return self.get('default_wait_timeout', DEFAULT_WAIT_TIMEOUT)
 
     @property
@@ -57,8 +57,8 @@ class BaseConfiguration(Configuration):
         """
         Gets the default wait interval for LifeCycleObjects.
         """
-        log.debug("Default wait interfal for LifeCycleObjects "
-                  + DEFAULT_WAIT_INTERVAL)
+        log.debug("Default wait interfal for LifeCycleObjects  %s",
+                  DEFAULT_WAIT_INTERVAL)
         return self.get('default_wait_interval', DEFAULT_WAIT_INTERVAL)
 
     @property
@@ -98,11 +98,12 @@ class BaseCloudProvider(CloudProvider):
         check whether cloud credentials work. Providers should override with
         more efficient implementations.
         """
+        log.debug("Checking if cloud credential works...")
         try:
             self.security.key_pairs.list()
             return True
         except Exception as e:
-            log.debug("ProviderConnectionException ocurred")
+            log.exception("ProviderConnectionException ocurred", e)
             raise ProviderConnectionException(
                 "Authentication with cloud provider failed: %s" % (e,))
 
@@ -120,17 +121,18 @@ class BaseCloudProvider(CloudProvider):
         :rtype: bool
         :return: ``True`` if the service type is supported.
         """
+        log.info("Checking if provider supports %s", service_type)
         try:
             if self._deepgetattr(self, service_type):
-                log.debug("This provider supports "
-                          + service_type)
+                log.info("This provider supports %s",
+                         service_type)
                 return True
         except AttributeError:
             pass  # Undefined service type
         except NotImplementedError:
             pass  # service not implemented
-        log.debug("This provider doesn't support "
-                  + service_type)
+        log.info("This provider doesn't support %s",
+                 service_type)
         return False
 
     def _get_config_value(self, key, default_value):
@@ -146,6 +148,8 @@ class BaseCloudProvider(CloudProvider):
 
         :return: a configuration value for the supplied ``key``
         """
+        log.info("Extracting a configuration value using the key %s "
+                 "and value %s", key, default_value)
         if isinstance(self.config, dict) and self.config.get(key):
             return self.config.get(key, default_value)
         elif hasattr(self.config, key) and getattr(self.config, key):

+ 13 - 0
cloudbridge/cloud/base/resources.py

@@ -198,6 +198,7 @@ class BaseCloudResource(CloudResource):
     @staticmethod
     def assert_valid_resource_name(name):
         if not BaseCloudResource.is_valid_resource_name(name):
+            log.exception("InvalidNameException raised on %s", name)
             raise InvalidNameException(
                 u"Invalid name: %s. Name must be at most 63 characters "
                 "long and consist of lowercase letters, numbers, "
@@ -442,6 +443,8 @@ class BaseLaunchConfig(LaunchConfig):
         block_device = self._validate_volume_device(
             source=source, is_root=is_root, size=size,
             delete_on_terminate=delete_on_terminate)
+        log.debug("Appending %s to the block_devices list",
+                  block_device)
         self.block_devices.append(block_device)
 
     def _validate_volume_device(self, source=None, is_root=None,
@@ -451,21 +454,29 @@ class BaseLaunchConfig(LaunchConfig):
         InvalidConfigurationException if the configuration is incorrect.
         """
         if source is None and not size:
+            log.exception("Raised InvalidConfigurationException, no"
+                          " size argument specified.")
             raise InvalidConfigurationException(
                 "A size must be specified for a blank new volume")
 
         if source and \
                 not isinstance(source, (Snapshot, Volume, MachineImage)):
+            log.exception("InvalidConfigurationException raised, "
+                          "source argument not specified correctly.")
             raise InvalidConfigurationException(
                 "Source must be a Snapshot, Volume, MachineImage or None")
         if size:
             if not isinstance(size, six.integer_types) or not size > 0:
+                log.exception("InvalidConfigurationException raised, "
+                              " size argument must be greater than 0.")
                 raise InvalidConfigurationException(
                     "The size must be None or a number greater than 0")
 
         if is_root:
             for bd in self.block_devices:
                 if bd.is_root:
+                    log.exception("InvalidConfigurationException raised,"
+                                  "%s has already been marked as root", bd)
                     raise InvalidConfigurationException(
                         "An existing block device: {0} has already been"
                         " marked as root. There can only be one root device.")
@@ -831,6 +842,7 @@ class BaseBucketObject(BaseCloudResource, BucketObject):
     @staticmethod
     def assert_valid_resource_name(name):
         if not BaseBucketObject.is_valid_resource_name(name):
+            log.exception("InvalidNameException raised on %s", name)
             raise InvalidNameException(
                 u"Invalid object name: %s. Name must match criteria defined "
                 "in: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMeta"
@@ -876,6 +888,7 @@ class BaseBucket(BaseCloudResource, Bucket):
     @staticmethod
     def assert_valid_resource_name(name):
         if not BaseBucket.is_valid_resource_name(name):
+            log.exception("InvalidNameException raised on %s", name)
             raise InvalidNameException(
                 u"Invalid bucket name: %s. Name must match criteria defined "
                 "in: http://docs.aws.amazon.com/awscloudtrail/latest/userguide"

+ 19 - 0
cloudbridge/cloud/base/services.py

@@ -1,6 +1,8 @@
 """
 Base implementation for services available through a provider
 """
+import logging
+
 from cloudbridge.cloud.interfaces.resources import Router
 
 from cloudbridge.cloud.interfaces.services import BucketService
@@ -25,6 +27,8 @@ from cloudbridge.cloud.interfaces.services import VolumeService
 
 from .resources import BasePageableObjectMixin
 
+log = logging.getLogger(__name__)
+
 
 class BaseCloudService(CloudService):
 
@@ -100,6 +104,7 @@ class BaseKeyPairService(
                   that the key may not have been deleted by this method but
                   instead has not existed in the first place.
         """
+        log.info("Deleting the existing key pair %s", key_pair_id)
         kp = self.get(key_pair_id)
         if kp:
             kp.delete()
@@ -125,9 +130,12 @@ class BaseVMTypeService(
 
     def find(self, **kwargs):
         name = kwargs.get('name')
+        log.info("Searching for VMTypeService with the: name %s ...", name)
         if name:
             return [itype for itype in self if itype.name == name]
         else:
+            log.exception("TypeError exception raised. Invalid parameters "
+                          "used for search.")
             raise TypeError(
                 "Invalid parameters for search. Supported attributes: {name}")
 
@@ -169,6 +177,7 @@ class BaseNetworkService(
     def delete(self, network_id):
         network = self.get(network_id)
         if network:
+            log.info("Deleting network %s", network_id)
             network.delete()
 
 
@@ -180,9 +189,12 @@ class BaseSubnetService(
 
     def find(self, **kwargs):
         name = kwargs.get('name')
+        log.info("Searching for SubnetService with the name: %s ...", name)
         if name:
             return [subnet for subnet in self if subnet.name == name]
         else:
+            log.exception("TypeError exception raised. Invalid parameters "
+                          "used for search.")
             raise TypeError(
                 "Invalid parameters for search. Supported attributes: {name}")
 
@@ -196,9 +208,13 @@ class BaseFloatingIPService(
     def find(self, **kwargs):
         if 'name' in kwargs:
             name = kwargs.get('name')
+            log.info("Searching for FloatingIPService with the "
+                     "name: %s...", name)
             if name:
                 return [fip for fip in self if fip.name == name]
         else:
+            log.exception("TypeError exception raised. Invalid parameters "
+                          "used for search.")
             raise TypeError(
                 "Invalid parameters for search. Supported attributes: {name}")
 
@@ -216,10 +232,13 @@ class BaseRouterService(
 
     def delete(self, router):
         if isinstance(router, Router):
+            log.info("Router %s successful deleted.", router)
             router.delete()
         else:
+            log.info("Getting router %s", router)
             router = self.get(router)
             if router:
+                log.info("Router %s successful deleted.", router)
                 router.delete()
 
 

+ 18 - 7
cloudbridge/cloud/factory.py

@@ -25,7 +25,7 @@ class CloudProviderFactory(object):
 
     def __init__(self):
         self.provider_list = defaultdict(dict)
-        log.debug("Providers List: " + self.provider_list)
+        log.debug("Providers List: %s", self.provider_list)
 
     def register_provider_class(self, cls):
         """
@@ -77,18 +77,18 @@ class CloudProviderFactory(object):
             log.debug("Importing provider: " + modname)
             self._import_provider(modname)
 
-
     def _import_provider(self, module_name):
         """
         Imports and registers providers from the given module name.
         Raises an ImportError if the import does not succeed.
         """
+        log.info("Importing providers from %s", module_name)
         module = importlib.import_module(
             "{0}.{1}".format(providers.__name__,
                              module_name))
         classes = inspect.getmembers(module, inspect.isclass)
         for _, cls in classes:
-            log.debug("Registering the class: " + cls)
+            log.info("Registering the provider: %s", cls)
             self.register_provider_class(cls)
 
     def list_providers(self):
@@ -109,7 +109,7 @@ class CloudProviderFactory(object):
         """
         if not self.provider_list:
             self.discover_providers()
-        log.debug("List of available providers: " + self.provider_list)
+        log.info("List of available providers: %s", self.provider_list)
         return self.provider_list
 
     def create_provider(self, name, config):
@@ -130,12 +130,17 @@ class CloudProviderFactory(object):
         :return:  a concrete provider instance
         :rtype: ``object`` of :class:`.CloudProvider`
         """
+        log.info("Searching provider with the name %s on %s",
+                 name, config)
         provider_class = self.get_provider_class(name)
         if provider_class is None:
+            log.exception("A provider with the name %s could not "
+                          "be found", name)
             raise NotImplementedError(
                 'A provider with name {0} could not be'
                 ' found'.format(name))
-        log.debug("Provider name: " + name + " config details:" + config)
+        log.debug("Found provider name: %s with these config "
+                  " details: %s", name, config)
         return provider_class(config)
 
     def get_provider_class(self, name, get_mock=False):
@@ -150,14 +155,18 @@ class CloudProviderFactory(object):
         :return: A class corresponding to the requested provider or ``None``
                  if the provider was not found.
         """
+        log.debug("Returning a class for the %s provider", name)
         impl = self.list_providers().get(name)
         if impl:
             if get_mock and impl.get("mock_class"):
+                log.debug("param get_mock set to True, returning "
+                          "a mock version of the provider %s", name)
                 return impl["mock_class"]
             else:
+                log.debug("Returning the real version of %s", name)
                 return impl["class"]
         else:
-            log.debug("Provider with the name: " + name + "not found")
+            log.debug("Provider with the name: %s not found", name)
             return None
 
     def get_all_provider_classes(self, get_mock=False):
@@ -175,8 +184,10 @@ class CloudProviderFactory(object):
         all_providers = []
         for impl in self.list_providers().values():
             if get_mock and impl.get("mock_class"):
+                log.debug("param get_mock set to True, appending "
+                          "a mock version of the provider %s", impl)
                 all_providers.append(impl["mock_class"])
             else:
                 all_providers.append(impl["class"])
-        log.debug("List of provider classes: " + all_providers)        
+        log.info("List of provider classes: %s", all_providers)
         return all_providers

+ 6 - 0
cloudbridge/cloud/providers/aws/helpers.py

@@ -26,6 +26,7 @@ def trim_empty_params(params_dict):
             'VpcId': 'xyz',
         }
     """
+    log.debug("Removing null values from %s", params_dict)
     return {k: v for k, v in params_dict.items() if v is not None}
 
 
@@ -39,8 +40,10 @@ def find_tag_value(tags, key):
     :type key: ``str``
     :param key: Name of the tag to search for
     """
+    log.info("Searching for %s in %s", key, tags)
     for tag in tags or []:
         if tag.get('Key') == key:
+            log.info("Found %s, returning %s", key, tag.get('Value'))
             return tag.get('Value')
     return None
 
@@ -244,6 +247,8 @@ class BotoGenericService(object):
         :type kwargs: ``dict``
         :param kwargs: Arguments to be passed as-is to the service method
         """
+        log.debug("Creating a resource by invoking %s on these arguments",
+                  boto_method, **kwargs)
         trimmed_args = trim_empty_params(kwargs)
         result = getattr(self.boto_conn, boto_method)(**trimmed_args)
         if isinstance(result, list):
@@ -259,6 +264,7 @@ class BotoGenericService(object):
         :type resource_id: ``str``
         :param resource_id: ID of the resource
         """
+        log.info("Delete the resource with the id %s", resource_id)
         res = self.get(resource_id)
         if res:
             res.delete()

+ 70 - 0
cloudbridge/cloud/providers/aws/services.py

@@ -1,4 +1,5 @@
 """Services implemented by the AWS provider."""
+import logging
 import string
 
 from botocore.exceptions import ClientError
@@ -53,6 +54,8 @@ from .resources import AWSVMFirewall
 from .resources import AWSVMType
 from .resources import AWSVolume
 
+log = logging.getLogger(__name__)
+
 
 class AWSSecurityService(BaseSecurityService):
 
@@ -81,16 +84,20 @@ class AWSKeyPairService(BaseKeyPairService):
                                   boto_collection_name='key_pairs')
 
     def get(self, key_pair_id):
+        log.debug("Getting Key Pair Service %s", key_pair_id)
         return self.svc.get(key_pair_id)
 
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for Key Pair %s with the params "
+                  "[Limit: %s Marker: %s]", name, limit, marker)
         return self.svc.find(filter_name='key-name', filter_value=name,
                              limit=limit, marker=marker)
 
     def create(self, name):
+        log.debug("Creating Key Pair Service %s", name)
         AWSKeyPair.assert_valid_resource_name(name)
         return self.svc.create('create_key_pair', KeyName=name)
 
@@ -104,21 +111,28 @@ class AWSVMFirewallService(BaseVMFirewallService):
                                   boto_collection_name='security_groups')
 
     def get(self, firewall_id):
+        log.debug("Getting Firewall Service with the id: %s", firewall_id)
         return self.svc.get(firewall_id)
 
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     def create(self, name, description, network_id):
+        log.debug("Creating Firewall Service with the parameters "
+                  "[name: %s id: %s description: %s]", name, network_id,
+                  description)
         AWSVMFirewall.assert_valid_resource_name(name)
         return self.svc.create('create_security_group', GroupName=name,
                                Description=description, VpcId=network_id)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for Firewall Service %s with the params "
+                  "[Limit: %s Marker: %s]", name, limit, marker)
         return self.svc.find(filter_name='group-name', filter_value=name,
                              limit=limit, marker=marker)
 
     def delete(self, firewall_id):
+        log.info("Deleting Firewall Service with the id %s", firewall_id)
         firewall = self.svc.get(firewall_id)
         if firewall:
             firewall.delete()
@@ -156,9 +170,14 @@ class AWSVolumeService(BaseVolumeService):
                                   boto_collection_name='volumes')
 
     def get(self, volume_id):
+        log.debug("Getting AWS Volume Service with the id: %s",
+                  volume_id)
         return self.svc.get(volume_id)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Volume Service %s with "
+                  "the params  [Limit: %s Marker: %s]", name,
+                  limit, marker)
         return self.svc.find(filter_name='tag:Name', filter_value=name,
                              limit=limit, marker=marker)
 
@@ -166,6 +185,10 @@ class AWSVolumeService(BaseVolumeService):
         return self.svc.list(limit=limit, marker=marker)
 
     def create(self, name, size, zone, snapshot=None, description=None):
+        log.debug("Creating AWS Volume Service with the parameters "
+                  "[name: %s size: %s zone: %s snapshot: %s "
+                  "description: %s]", name, size, zone, snapshot,
+                  description)
         AWSVolume.assert_valid_resource_name(name)
 
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -192,9 +215,14 @@ class AWSSnapshotService(BaseSnapshotService):
                                   boto_collection_name='snapshots')
 
     def get(self, snapshot_id):
+        log.debug("Getting AWS Snapshot Service with the id: %s",
+                  snapshot_id)
         return self.svc.get(snapshot_id)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Snapshot Service %s with "
+                  " the params [Limit: %s Marker: %s]", name,
+                  limit, marker)
         return self.svc.find(filter_name='tag:Name', filter_value=name,
                              limit=limit, marker=marker)
 
@@ -205,6 +233,9 @@ class AWSSnapshotService(BaseSnapshotService):
         """
         Creates a new snapshot of a given volume.
         """
+        log.debug("Creating a new AWS snapshot Service with the "
+                  "parameters [name: %s volume: %s description: %s]",
+                  name, volume, description)
         AWSSnapshot.assert_valid_resource_name(name)
 
         volume_id = volume.id if isinstance(volume, AWSVolume) else volume
@@ -231,6 +262,7 @@ class AWSBucketService(BaseBucketService):
         Returns a bucket given its ID. Returns ``None`` if the bucket
         does not exist.
         """
+        log.debug("Getting AWS Bucket Service with the id: %s", bucket_id)
         try:
             # Make a call to make sure the bucket exists. There's an edge case
             # where a 403 response can occur when the bucket exists but the
@@ -246,6 +278,9 @@ class AWSBucketService(BaseBucketService):
             # http://stackoverflow.com/questions/32331456/using-boto-upload-file-to-s3-
             # sub-folder-when-i-have-no-permissions-on-listing-fo
             if e.response['Error']['Code'] == 403:
+                log.exception("AWS Bucket %s already exists but user doesn't "
+                              "have enough permissions to access the bucket",
+                              bucket_id)
                 bucket = self.provider.s3_conn.get_bucket(bucket_id,
                                                           validate=False)
                 return AWSBucket(self.provider, bucket)
@@ -253,6 +288,8 @@ class AWSBucketService(BaseBucketService):
         return None
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Bucket %s with the params "
+                  "[Limit: %s Marker: %s]", name, limit, marker)
         buckets = [bucket
                    for bucket in self
                    if name == bucket.name]
@@ -263,6 +300,8 @@ class AWSBucketService(BaseBucketService):
         return self.svc.list(limit=limit, marker=marker)
 
     def create(self, name, location=None):
+        log.debug("Creating AWS Bucket with the params "
+                  "[name: %s id: %s description: %s]", name, location)
         AWSBucket.assert_valid_resource_name(name)
         loc_constraint = location or self.provider.region_name
         # Due to an API issue in S3, specifying us-east-1 as a
@@ -287,9 +326,12 @@ class AWSImageService(BaseImageService):
                                   boto_collection_name='images')
 
     def get(self, image_id):
+        log.debug("Getting AWS Image Service with the id: %s", image_id)
         return self.svc.get(image_id)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Image Service %s with the params "
+                  "[Limit: %s Marker: %s]", name, limit, marker)
         return self.svc.find(filter_name='name', filter_value=name,
                              limit=limit, marker=marker)
 
@@ -337,6 +379,11 @@ class AWSInstanceService(BaseInstanceService):
     def create(self, name, image, vm_type, subnet, zone=None,
                key_pair=None, vm_firewalls=None, user_data=None,
                launch_config=None, **kwargs):
+        log.debug("Creating AWS Instance Service with the params "
+                  "[name: %s image: %s type: %s sunbnet: %s zone: %s "
+                  "key pair: %s firewalls: %s user data: %s config %s "
+                  "others: %s]", name, image, vm_type, subnet, zone,
+                  key_pair, vm_firewalls, user_data, launch_config, **kwargs)
         AWSInstance.assert_valid_resource_name(name)
 
         image_id = image.id if isinstance(image, MachineImage) else image
@@ -511,6 +558,8 @@ class AWSRegionService(BaseRegionService):
         super(AWSRegionService, self).__init__(provider)
 
     def get(self, region_id):
+        log.debug("Getting AWS Region Service with the id: %s",
+                  region_id)
         region = [r for r in self if r.id == region_id]
         if region:
             return region[0]
@@ -570,16 +619,22 @@ class AWSNetworkService(BaseNetworkService):
                                   boto_collection_name='vpcs')
 
     def get(self, network_id):
+        log.debug("Getting AWS Network Service with the id: %s",
+                  network_id)
         return self.svc.get(network_id)
 
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Network Service %s with the "
+                  " params [Limit: %s Marker: %s]", name, limit, marker)
         return self.svc.find(filter_name='tag:Name', filter_value=name,
                              limit=limit, marker=marker)
 
     def create(self, name, cidr_block):
+        log.debug("Creating AWS Network Service with the params "
+                  "[name: %s block: %s]", name, cidr_block)
         AWSNetwork.assert_valid_resource_name(name)
 
         cb_net = self.svc.create('create_vpc', CidrBlock=cidr_block)
@@ -599,6 +654,7 @@ class AWSSubnetService(BaseSubnetService):
                                   boto_collection_name='subnets')
 
     def get(self, subnet_id):
+        log.debug("Getting AWS Subnet Service with the id: %s", subnet_id)
         return self.svc.get(subnet_id)
 
     def list(self, network=None, limit=None, marker=None):
@@ -611,10 +667,15 @@ class AWSSubnetService(BaseSubnetService):
             return self.svc.list(limit=limit, marker=marker)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Subnet Service %s with the params "
+                  "[Limit: %s Marker: %s]", name, limit, marker)
         return self.svc.find(filter_name='tag:Name', filter_value=name,
                              limit=limit, marker=marker)
 
     def create(self, name, network, cidr_block, zone=None):
+        log.debug("Creating AWS Subnet Service with the params "
+                  "[name: %s network: %s block: %s zone: %s]",
+                  name, network, cidr_block, zone)
         AWSSubnet.assert_valid_resource_name(name)
 
         network_id = network.id if isinstance(network, AWSNetwork) else network
@@ -660,6 +721,7 @@ class AWSSubnetService(BaseSubnetService):
         return default_sn
 
     def delete(self, subnet):
+        log.debug("Deleting AWS Subnet Service: %s", subnet)
         subnet_id = subnet.id if isinstance(subnet, AWSSubnet) else subnet
         self.svc.delete(subnet_id)
 
@@ -673,6 +735,8 @@ class AWSFloatingIPService(BaseFloatingIPService):
                                   boto_collection_name='vpc_addresses')
 
     def get(self, router_id):
+        log.debug("Getting AWS Floating IP Service with the id: %s",
+                  router_id)
         return self.svc.get(router_id)
 
     def list(self, limit=None, marker=None):
@@ -696,9 +760,12 @@ class AWSRouterService(BaseRouterService):
                                   boto_collection_name='route_tables')
 
     def get(self, router_id):
+        log.debug("Getting AWS Router Service with the id: %s", router_id)
         return self.svc.get(router_id)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for AWS Router Service %s with the params "
+                  "[Limit: %s Marker: %s]", name, limit, marker)
         return self.svc.find(filter_name='tag:Name', filter_value=name,
                              limit=limit, marker=marker)
 
@@ -706,6 +773,8 @@ class AWSRouterService(BaseRouterService):
         return self.svc.list(limit=limit, marker=marker)
 
     def create(self, name, network):
+        log.debug("Creating AWS Router Service with the params "
+                  "[name: %s network: %s]", name, network)
         AWSRouter.assert_valid_resource_name(name)
 
         network_id = network.id if isinstance(network, AWSNetwork) else network
@@ -732,6 +801,7 @@ class AWSGatewayService(BaseGatewayService):
         return cb_gateway
 
     def delete(self, gateway_id):
+        log.debug("Deleting AWS Gateway Service with the id %s", gateway_id)
         gateway = self.svc.get(gateway_id)
         if gateway:
             gateway.delete()

+ 3 - 0
cloudbridge/cloud/providers/openstack/helpers.py

@@ -2,6 +2,7 @@
 Helper functions
 """
 import itertools
+import logging as log
 
 from cloudbridge.cloud.base.resources import ServerPagedResultList
 
@@ -15,6 +16,8 @@ def os_result_limit(provider, requested_limit):
     # i.e. if length(objects) is one more than the limit,
     # we know that the object has another page of results,
     # so we always request one extra record.
+    log.debug("Limit of OpenStack: %s Requested Limit: %s",
+              limit, requested_limit)
     return limit + 1
 
 

+ 12 - 0
cloudbridge/cloud/providers/openstack/resources.py

@@ -4,6 +4,7 @@ DataTypes used by this provider
 import inspect
 import ipaddress
 
+import logging
 import os
 
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo
@@ -55,6 +56,8 @@ from swiftclient.service import SwiftService, SwiftUploadObject
 ONE_GIG = 1048576000  # in bytes
 FIVE_GIG = ONE_GIG * 5  # in bytes
 
+log = logging.getLogger(__name__)
+
 
 class OpenStackMachineImage(BaseMachineImage):
 
@@ -125,6 +128,7 @@ class OpenStackMachineImage(BaseMachineImage):
         Refreshes the state of this instance by re-querying the cloud provider
         for its latest state.
         """
+        log.debug("Refreshing OpenStack Machine Image")
         image = self._provider.compute.images.get(self.id)
         if image:
             self._os_image = image._os_image  # pylint:disable=protected-access
@@ -385,6 +389,7 @@ class OpenStackInstance(BaseInstance):
         """
         Create a new image based on this instance.
         """
+        log.debug("Creating OpenStack Image with the name %s", name)
         self.assert_valid_resource_name(name)
 
         image_id = self._os_instance.create_image(name)
@@ -395,24 +400,28 @@ class OpenStackInstance(BaseInstance):
         """
         Add a floating IP address to this instance.
         """
+        log.debug("Adding floating IP adress: %s", floating_ip)
         self._os_instance.add_floating_ip(floating_ip.public_ip)
 
     def remove_floating_ip(self, floating_ip):
         """
         Remove a floating IP address from this instance.
         """
+        log.debug("Removing floating IP adress: %s", floating_ip)
         self._os_instance.remove_floating_ip(floating_ip.public_ip)
 
     def add_vm_firewall(self, firewall):
         """
         Add a VM firewall to this instance
         """
+        log.debug("Adding firewall: %s", firewall)
         self._os_instance.add_security_group(firewall.id)
 
     def remove_vm_firewall(self, firewall):
         """
         Remove a VM firewall from this instance
         """
+        log.debug("Removing firewall: %s", firewall)
         self._os_instance.remove_security_group(firewall.id)
 
     @property
@@ -557,6 +566,7 @@ class OpenStackVolume(BaseVolume):
         """
         Attach this volume to an instance.
         """
+        log.debug("Attaching %s to %s instance", device, instance)
         instance_id = instance.id if isinstance(
             instance,
             OpenStackInstance) else instance
@@ -572,6 +582,8 @@ class OpenStackVolume(BaseVolume):
         """
         Create a snapshot of this Volume.
         """
+        log.debug("Creating snapchat of volume: %s with the "
+                  "description: %s", name, description)
         return self._provider.storage.snapshots.create(
             name, self, description=description)
 

+ 49 - 2
cloudbridge/cloud/providers/openstack/services.py

@@ -131,10 +131,12 @@ class OpenStackKeyPairService(BaseKeyPairService):
         """
         Returns a KeyPair given its id.
         """
+        log.debug("Returning KeyPair with the id %s", key_pair_id)
         try:
             return OpenStackKeyPair(
                 self.provider, self.provider.nova.keypairs.get(key_pair_id))
         except NovaNotFound:
+            log.exception("NovaNotFound exception raised")
             return None
 
     def list(self, limit=None, marker=None):
@@ -144,10 +146,11 @@ class OpenStackKeyPairService(BaseKeyPairService):
         :rtype: ``list`` of :class:`.KeyPair`
         :return:  list of KeyPair objects
         """
-
         keypairs = self.provider.nova.keypairs.list()
         results = [OpenStackKeyPair(self.provider, kp)
                    for kp in keypairs]
+        log.debug("Listing all key pairs associated with OpenStack "
+                  "Account: %s", results)
         return ClientPagedResultList(self.provider, results,
                                      limit=limit, marker=marker)
 
@@ -158,6 +161,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
         keypairs = self.provider.nova.keypairs.findall(name=name)
         results = [OpenStackKeyPair(self.provider, kp)
                    for kp in keypairs]
+        log.debug("Searching for %s in: %s", name, keypairs)
         return ClientPagedResultList(self.provider, results,
                                      limit=limit, marker=marker)
 
@@ -171,11 +175,13 @@ class OpenStackKeyPairService(BaseKeyPairService):
         :rtype: ``object`` of :class:`.KeyPair`
         :return:  A key pair instance or ``None`` if one was not be created.
         """
+        log.debug("Creating a new key pair with the name: %s", name)
         OpenStackKeyPair.assert_valid_resource_name(name)
 
         kp = self.provider.nova.keypairs.create(name)
         if kp:
             return OpenStackKeyPair(self.provider, kp)
+        log.exception("Key Pair with the name %s already exists", name)
         return None
 
 
@@ -185,11 +191,13 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
         super(OpenStackVMFirewallService, self).__init__(provider)
 
     def get(self, firewall_id):
+        log.debug("Getting OpenStack VM Firewall with the id: %s", firewall_id)
         try:
             return OpenStackVMFirewall(
                 self.provider,
                 self.provider.os_conn.network.get_security_group(firewall_id))
         except ResourceNotFound:
+            log.exception("Firewall %s not found.", firewall_id)
             return None
 
     def list(self, limit=None, marker=None):
@@ -202,7 +210,9 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
 
     def create(self, name, description, network_id):
         OpenStackVMFirewall.assert_valid_resource_name(name)
-
+        log.debug("Creating OpenStack VM Firewall with the params: "
+                  "[name: %s network id: %s description: %s]", name,
+                  network_id, description)
         sg = self.provider.os_conn.network.create_security_group(
             name=name, description=description)
         if sg:
@@ -210,6 +220,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
         return None
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for %s", name)
         sgs = [self.provider.os_conn.network.find_security_group(name)]
         results = [OpenStackVMFirewall(self.provider, sg)
                    for sg in sgs if sg]
@@ -217,6 +228,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
                                      limit=limit, marker=marker)
 
     def delete(self, group_id):
+        log.debug("Deleting OpenStack Firewall with the id: %s", group_id)
         firewall = self.get(group_id)
         if firewall:
             firewall.delete()
@@ -232,16 +244,20 @@ class OpenStackImageService(BaseImageService):
         """
         Returns an Image given its id
         """
+        log.debug("Getting OpenStack Image with the id: %s", image_id)
         try:
             return OpenStackMachineImage(
                 self.provider, self.provider.os_conn.image.get_image(image_id))
         except ResourceNotFound:
+            log.exception("ResourceNotFound exception raised, %s not found",
+                          image_id)
             return None
 
     def find(self, name, limit=None, marker=None):
         """
         Searches for an image by a given list of attributes
         """
+        log.debug("Searching for the OpenStack image with the name: %s", name)
         regex = fnmatch.translate(name)
         cb_images = [
             img
@@ -311,16 +327,19 @@ class OpenStackVolumeService(BaseVolumeService):
         """
         Returns a volume given its id.
         """
+        log.debug("Getting OpenStack Volume with the id: %s", volume_id)
         try:
             return OpenStackVolume(
                 self.provider, self.provider.cinder.volumes.get(volume_id))
         except CinderNotFound:
+            log.exception("CinderNotFound exception raised.")
             return None
 
     def find(self, name, limit=None, marker=None):
         """
         Searches for a volume by a given list of attributes.
         """
+        log.debug("Searching for an OpenStack Volume with the name %s", name)
         search_opts = {'name': name}
         cb_vols = [
             OpenStackVolume(self.provider, vol)
@@ -347,6 +366,9 @@ class OpenStackVolumeService(BaseVolumeService):
         """
         Creates a new volume.
         """
+        log.debug("Creating a new volume with the params: "
+                  "[name: %s size: %s zone: %s snapshot: %s description: %s]",
+                  name, size, zone, snapshot, description)
         OpenStackVolume.assert_valid_resource_name(name)
 
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -368,11 +390,13 @@ class OpenStackSnapshotService(BaseSnapshotService):
         """
         Returns a snapshot given its id.
         """
+        log.debug("Getting OpenStack snapshot with the id: %s", snapshot_id)
         try:
             return OpenStackSnapshot(
                 self.provider,
                 self.provider.cinder.volume_snapshots.get(snapshot_id))
         except CinderNotFound:
+            log.exception("CinderNotFound exception raised.")
             return None
 
     def find(self, name, limit=None, marker=None):
@@ -383,6 +407,8 @@ class OpenStackSnapshotService(BaseSnapshotService):
                        'limit': oshelpers.os_result_limit(self.provider,
                                                           limit),
                        'marker': marker}
+        log.debug("Searching for an OpenStack volume with the following "
+                  "params: %s", search_opts)
         cb_snaps = [
             OpenStackSnapshot(self.provider, snap) for
             snap in self.provider.cinder.volume_snapshots.list(search_opts)
@@ -406,6 +432,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
         """
         Creates a new snapshot of a given volume.
         """
+        log.debug("Creating a new snapshot of the %s volume.", name)
         OpenStackSnapshot.assert_valid_resource_name(name)
 
         volume_id = (volume.id if isinstance(volume, OpenStackVolume)
@@ -427,6 +454,7 @@ class OpenStackBucketService(BaseBucketService):
         Returns a bucket given its ID. Returns ``None`` if the bucket
         does not exist.
         """
+        log.debug("Getting OpenStack bucket with the id: %s", bucket_id)
         _, container_list = self.provider.swift.get_account(
             prefix=bucket_id)
         if container_list:
@@ -434,12 +462,14 @@ class OpenStackBucketService(BaseBucketService):
                                    next((c for c in container_list
                                          if c['name'] == bucket_id), None))
         else:
+            log.exception("OpenStack Bucket does not exist.")
             return None
 
     def find(self, name, limit=None, marker=None):
         """
         Searches for a bucket by a given list of attributes.
         """
+        log.debug("Searching for the OpenStack Bucket with the name: %s", name)
         _, container_list = self.provider.swift.get_account(
             limit=oshelpers.os_result_limit(self.provider, limit),
             marker=marker)
@@ -463,6 +493,7 @@ class OpenStackBucketService(BaseBucketService):
         """
         Create a new bucket.
         """
+        log.debug("Creating a new OpenStack Bucket with the name: %s", name)
         OpenStackBucket.assert_valid_resource_name(name)
 
         self.provider.swift.put_container(name)
@@ -475,6 +506,7 @@ class OpenStackRegionService(BaseRegionService):
         super(OpenStackRegionService, self).__init__(provider)
 
     def get(self, region_id):
+        log.debug("Getting OpenStack Region with the id: %s", region_id)
         region = (r for r in self.list() if r.id == region_id)
         return next(region, None)
 
@@ -743,6 +775,7 @@ class OpenStackNetworkService(BaseNetworkService):
         super(OpenStackNetworkService, self).__init__(provider)
 
     def get(self, network_id):
+        log.debug("Getting OpenStack Network with the id: %s", network_id)
         network = (n for n in self if n.id == network_id)
         return next(network, None)
 
@@ -754,6 +787,8 @@ class OpenStackNetworkService(BaseNetworkService):
                                      limit=limit, marker=marker)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for the OpenStack Network with the "
+                  "name: %s", name)
         networks = [OpenStackNetwork(self.provider, network)
                     for network in self.provider.neutron.list_networks(
                         name=name)
@@ -762,6 +797,8 @@ class OpenStackNetworkService(BaseNetworkService):
                                      limit=limit, marker=marker)
 
     def create(self, name, cidr_block):
+        log.debug("Creating OpenStack Network with the params: "
+                  "[name: %s Cinder Block: %s]", name, cidr_block)
         OpenStackNetwork.assert_valid_resource_name(name)
 
         net_info = {'name': name}
@@ -775,6 +812,7 @@ class OpenStackSubnetService(BaseSubnetService):
         super(OpenStackSubnetService, self).__init__(provider)
 
     def get(self, subnet_id):
+        log.debug("Getting OpenStack Subnet with the id: %s", subnet_id)
         subnet = (s for s in self if s.id == subnet_id)
         return next(subnet, None)
 
@@ -792,6 +830,9 @@ class OpenStackSubnetService(BaseSubnetService):
 
     def create(self, name, network, cidr_block, zone=None):
         """zone param is ignored."""
+        log.debug("Creating OpenStack Subnet with the params: "
+                  "[Name: %s Network: %s Cinder Block: %s Zone: -ignored-]",
+                  name, network, cidr_block)
         OpenStackSubnet.assert_valid_resource_name(name)
 
         network_id = (network.id if isinstance(network, OpenStackNetwork)
@@ -829,6 +870,7 @@ class OpenStackSubnetService(BaseSubnetService):
             return None
 
     def delete(self, subnet):
+        log.debug("Deleting subnet: %s", subnet)
         subnet_id = (subnet.id if isinstance(subnet, OpenStackSubnet)
                      else subnet)
         self.provider.neutron.delete_subnet(subnet_id)
@@ -874,6 +916,7 @@ class OpenStackRouterService(BaseRouterService):
         super(OpenStackRouterService, self).__init__(provider)
 
     def get(self, router_id):
+        log.debug("Getting OpenStack Router with the id: %s", router_id)
         router = (r for r in self if r.id == router_id)
         return next(router, None)
 
@@ -884,6 +927,8 @@ class OpenStackRouterService(BaseRouterService):
                                      marker=marker)
 
     def find(self, name, limit=None, marker=None):
+        log.debug("Searching for OpenStack Router with the params: "
+                  "[name: %s, limit: %s, marker: %s]", name, limit, marker)
         aws_routers = [r for r in self if r.name == name]
         return ClientPagedResultList(self.provider, aws_routers, limit=limit,
                                      marker=marker)
@@ -896,6 +941,7 @@ class OpenStackRouterService(BaseRouterService):
         https://developer.openstack.org/api-ref/networking/v2/
             ?expanded=delete-router-detail,create-router-detail#create-router
         """
+        log.debug("Creating OpenStack Router with the name: %s", name)
         OpenStackRouter.assert_valid_resource_name(name)
 
         body = {'router': {'name': name}} if name else None
@@ -917,4 +963,5 @@ class OpenStackGatewayService(BaseGatewayService):
         return None
 
     def delete(self, gateway):
+        log.debug("Deleting OpenStack Gateway: %s", gateway)
         gateway.delete()