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

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

@@ -1,7 +1,7 @@
 """Base implementation of a provider interface."""
 """Base implementation of a provider interface."""
 import functools
 import functools
-import os
 import logging
 import logging
+import os
 from os.path import expanduser
 from os.path import expanduser
 try:
 try:
     from configparser import ConfigParser
     from configparser import ConfigParser
@@ -39,8 +39,8 @@ class BaseConfiguration(Configuration):
         :rtype: ``int``
         :rtype: ``int``
         :return: The maximum number of results to return
         :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)
         return self.get('default_result_limit', DEFAULT_RESULT_LIMIT)
 
 
     @property
     @property
@@ -48,8 +48,8 @@ class BaseConfiguration(Configuration):
         """
         """
         Gets the default wait timeout for LifeCycleObjects.
         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)
         return self.get('default_wait_timeout', DEFAULT_WAIT_TIMEOUT)
 
 
     @property
     @property
@@ -57,8 +57,8 @@ class BaseConfiguration(Configuration):
         """
         """
         Gets the default wait interval for LifeCycleObjects.
         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)
         return self.get('default_wait_interval', DEFAULT_WAIT_INTERVAL)
 
 
     @property
     @property
@@ -98,11 +98,12 @@ class BaseCloudProvider(CloudProvider):
         check whether cloud credentials work. Providers should override with
         check whether cloud credentials work. Providers should override with
         more efficient implementations.
         more efficient implementations.
         """
         """
+        log.debug("Checking if cloud credential works...")
         try:
         try:
             self.security.key_pairs.list()
             self.security.key_pairs.list()
             return True
             return True
         except Exception as e:
         except Exception as e:
-            log.debug("ProviderConnectionException ocurred")
+            log.exception("ProviderConnectionException ocurred", e)
             raise ProviderConnectionException(
             raise ProviderConnectionException(
                 "Authentication with cloud provider failed: %s" % (e,))
                 "Authentication with cloud provider failed: %s" % (e,))
 
 
@@ -120,17 +121,18 @@ class BaseCloudProvider(CloudProvider):
         :rtype: bool
         :rtype: bool
         :return: ``True`` if the service type is supported.
         :return: ``True`` if the service type is supported.
         """
         """
+        log.info("Checking if provider supports %s", service_type)
         try:
         try:
             if self._deepgetattr(self, service_type):
             if self._deepgetattr(self, service_type):
-                log.debug("This provider supports "
-                          + service_type)
+                log.info("This provider supports %s",
+                         service_type)
                 return True
                 return True
         except AttributeError:
         except AttributeError:
             pass  # Undefined service type
             pass  # Undefined service type
         except NotImplementedError:
         except NotImplementedError:
             pass  # service not implemented
             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
         return False
 
 
     def _get_config_value(self, key, default_value):
     def _get_config_value(self, key, default_value):
@@ -146,6 +148,8 @@ class BaseCloudProvider(CloudProvider):
 
 
         :return: a configuration value for the supplied ``key``
         :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):
         if isinstance(self.config, dict) and self.config.get(key):
             return self.config.get(key, default_value)
             return self.config.get(key, default_value)
         elif hasattr(self.config, key) and getattr(self.config, key):
         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
     @staticmethod
     def assert_valid_resource_name(name):
     def assert_valid_resource_name(name):
         if not BaseCloudResource.is_valid_resource_name(name):
         if not BaseCloudResource.is_valid_resource_name(name):
+            log.exception("InvalidNameException raised on %s", name)
             raise InvalidNameException(
             raise InvalidNameException(
                 u"Invalid name: %s. Name must be at most 63 characters "
                 u"Invalid name: %s. Name must be at most 63 characters "
                 "long and consist of lowercase letters, numbers, "
                 "long and consist of lowercase letters, numbers, "
@@ -442,6 +443,8 @@ class BaseLaunchConfig(LaunchConfig):
         block_device = self._validate_volume_device(
         block_device = self._validate_volume_device(
             source=source, is_root=is_root, size=size,
             source=source, is_root=is_root, size=size,
             delete_on_terminate=delete_on_terminate)
             delete_on_terminate=delete_on_terminate)
+        log.debug("Appending %s to the block_devices list",
+                  block_device)
         self.block_devices.append(block_device)
         self.block_devices.append(block_device)
 
 
     def _validate_volume_device(self, source=None, is_root=None,
     def _validate_volume_device(self, source=None, is_root=None,
@@ -451,21 +454,29 @@ class BaseLaunchConfig(LaunchConfig):
         InvalidConfigurationException if the configuration is incorrect.
         InvalidConfigurationException if the configuration is incorrect.
         """
         """
         if source is None and not size:
         if source is None and not size:
+            log.exception("Raised InvalidConfigurationException, no"
+                          " size argument specified.")
             raise InvalidConfigurationException(
             raise InvalidConfigurationException(
                 "A size must be specified for a blank new volume")
                 "A size must be specified for a blank new volume")
 
 
         if source and \
         if source and \
                 not isinstance(source, (Snapshot, Volume, MachineImage)):
                 not isinstance(source, (Snapshot, Volume, MachineImage)):
+            log.exception("InvalidConfigurationException raised, "
+                          "source argument not specified correctly.")
             raise InvalidConfigurationException(
             raise InvalidConfigurationException(
                 "Source must be a Snapshot, Volume, MachineImage or None")
                 "Source must be a Snapshot, Volume, MachineImage or None")
         if size:
         if size:
             if not isinstance(size, six.integer_types) or not size > 0:
             if not isinstance(size, six.integer_types) or not size > 0:
+                log.exception("InvalidConfigurationException raised, "
+                              " size argument must be greater than 0.")
                 raise InvalidConfigurationException(
                 raise InvalidConfigurationException(
                     "The size must be None or a number greater than 0")
                     "The size must be None or a number greater than 0")
 
 
         if is_root:
         if is_root:
             for bd in self.block_devices:
             for bd in self.block_devices:
                 if bd.is_root:
                 if bd.is_root:
+                    log.exception("InvalidConfigurationException raised,"
+                                  "%s has already been marked as root", bd)
                     raise InvalidConfigurationException(
                     raise InvalidConfigurationException(
                         "An existing block device: {0} has already been"
                         "An existing block device: {0} has already been"
                         " marked as root. There can only be one root device.")
                         " marked as root. There can only be one root device.")
@@ -831,6 +842,7 @@ class BaseBucketObject(BaseCloudResource, BucketObject):
     @staticmethod
     @staticmethod
     def assert_valid_resource_name(name):
     def assert_valid_resource_name(name):
         if not BaseBucketObject.is_valid_resource_name(name):
         if not BaseBucketObject.is_valid_resource_name(name):
+            log.exception("InvalidNameException raised on %s", name)
             raise InvalidNameException(
             raise InvalidNameException(
                 u"Invalid object name: %s. Name must match criteria defined "
                 u"Invalid object name: %s. Name must match criteria defined "
                 "in: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMeta"
                 "in: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMeta"
@@ -876,6 +888,7 @@ class BaseBucket(BaseCloudResource, Bucket):
     @staticmethod
     @staticmethod
     def assert_valid_resource_name(name):
     def assert_valid_resource_name(name):
         if not BaseBucket.is_valid_resource_name(name):
         if not BaseBucket.is_valid_resource_name(name):
+            log.exception("InvalidNameException raised on %s", name)
             raise InvalidNameException(
             raise InvalidNameException(
                 u"Invalid bucket name: %s. Name must match criteria defined "
                 u"Invalid bucket name: %s. Name must match criteria defined "
                 "in: http://docs.aws.amazon.com/awscloudtrail/latest/userguide"
                 "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
 Base implementation for services available through a provider
 """
 """
+import logging
+
 from cloudbridge.cloud.interfaces.resources import Router
 from cloudbridge.cloud.interfaces.resources import Router
 
 
 from cloudbridge.cloud.interfaces.services import BucketService
 from cloudbridge.cloud.interfaces.services import BucketService
@@ -25,6 +27,8 @@ from cloudbridge.cloud.interfaces.services import VolumeService
 
 
 from .resources import BasePageableObjectMixin
 from .resources import BasePageableObjectMixin
 
 
+log = logging.getLogger(__name__)
+
 
 
 class BaseCloudService(CloudService):
 class BaseCloudService(CloudService):
 
 
@@ -100,6 +104,7 @@ class BaseKeyPairService(
                   that the key may not have been deleted by this method but
                   that the key may not have been deleted by this method but
                   instead has not existed in the first place.
                   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)
         kp = self.get(key_pair_id)
         if kp:
         if kp:
             kp.delete()
             kp.delete()
@@ -125,9 +130,12 @@ class BaseVMTypeService(
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         name = kwargs.get('name')
         name = kwargs.get('name')
+        log.info("Searching for VMTypeService with the: name %s ...", name)
         if name:
         if name:
             return [itype for itype in self if itype.name == name]
             return [itype for itype in self if itype.name == name]
         else:
         else:
+            log.exception("TypeError exception raised. Invalid parameters "
+                          "used for search.")
             raise TypeError(
             raise TypeError(
                 "Invalid parameters for search. Supported attributes: {name}")
                 "Invalid parameters for search. Supported attributes: {name}")
 
 
@@ -169,6 +177,7 @@ class BaseNetworkService(
     def delete(self, network_id):
     def delete(self, network_id):
         network = self.get(network_id)
         network = self.get(network_id)
         if network:
         if network:
+            log.info("Deleting network %s", network_id)
             network.delete()
             network.delete()
 
 
 
 
@@ -180,9 +189,12 @@ class BaseSubnetService(
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         name = kwargs.get('name')
         name = kwargs.get('name')
+        log.info("Searching for SubnetService with the name: %s ...", name)
         if name:
         if name:
             return [subnet for subnet in self if subnet.name == name]
             return [subnet for subnet in self if subnet.name == name]
         else:
         else:
+            log.exception("TypeError exception raised. Invalid parameters "
+                          "used for search.")
             raise TypeError(
             raise TypeError(
                 "Invalid parameters for search. Supported attributes: {name}")
                 "Invalid parameters for search. Supported attributes: {name}")
 
 
@@ -196,9 +208,13 @@ class BaseFloatingIPService(
     def find(self, **kwargs):
     def find(self, **kwargs):
         if 'name' in kwargs:
         if 'name' in kwargs:
             name = kwargs.get('name')
             name = kwargs.get('name')
+            log.info("Searching for FloatingIPService with the "
+                     "name: %s...", name)
             if name:
             if name:
                 return [fip for fip in self if fip.name == name]
                 return [fip for fip in self if fip.name == name]
         else:
         else:
+            log.exception("TypeError exception raised. Invalid parameters "
+                          "used for search.")
             raise TypeError(
             raise TypeError(
                 "Invalid parameters for search. Supported attributes: {name}")
                 "Invalid parameters for search. Supported attributes: {name}")
 
 
@@ -216,10 +232,13 @@ class BaseRouterService(
 
 
     def delete(self, router):
     def delete(self, router):
         if isinstance(router, Router):
         if isinstance(router, Router):
+            log.info("Router %s successful deleted.", router)
             router.delete()
             router.delete()
         else:
         else:
+            log.info("Getting router %s", router)
             router = self.get(router)
             router = self.get(router)
             if router:
             if router:
+                log.info("Router %s successful deleted.", router)
                 router.delete()
                 router.delete()
 
 
 
 

+ 18 - 7
cloudbridge/cloud/factory.py

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

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

@@ -26,6 +26,7 @@ def trim_empty_params(params_dict):
             'VpcId': 'xyz',
             '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}
     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``
     :type key: ``str``
     :param key: Name of the tag to search for
     :param key: Name of the tag to search for
     """
     """
+    log.info("Searching for %s in %s", key, tags)
     for tag in tags or []:
     for tag in tags or []:
         if tag.get('Key') == key:
         if tag.get('Key') == key:
+            log.info("Found %s, returning %s", key, tag.get('Value'))
             return tag.get('Value')
             return tag.get('Value')
     return None
     return None
 
 
@@ -244,6 +247,8 @@ class BotoGenericService(object):
         :type kwargs: ``dict``
         :type kwargs: ``dict``
         :param kwargs: Arguments to be passed as-is to the service method
         :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)
         trimmed_args = trim_empty_params(kwargs)
         result = getattr(self.boto_conn, boto_method)(**trimmed_args)
         result = getattr(self.boto_conn, boto_method)(**trimmed_args)
         if isinstance(result, list):
         if isinstance(result, list):
@@ -259,6 +264,7 @@ class BotoGenericService(object):
         :type resource_id: ``str``
         :type resource_id: ``str``
         :param resource_id: ID of the resource
         :param resource_id: ID of the resource
         """
         """
+        log.info("Delete the resource with the id %s", resource_id)
         res = self.get(resource_id)
         res = self.get(resource_id)
         if res:
         if res:
             res.delete()
             res.delete()

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

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

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

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

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

@@ -4,6 +4,7 @@ DataTypes used by this provider
 import inspect
 import inspect
 import ipaddress
 import ipaddress
 
 
+import logging
 import os
 import os
 
 
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo
@@ -55,6 +56,8 @@ from swiftclient.service import SwiftService, SwiftUploadObject
 ONE_GIG = 1048576000  # in bytes
 ONE_GIG = 1048576000  # in bytes
 FIVE_GIG = ONE_GIG * 5  # in bytes
 FIVE_GIG = ONE_GIG * 5  # in bytes
 
 
+log = logging.getLogger(__name__)
+
 
 
 class OpenStackMachineImage(BaseMachineImage):
 class OpenStackMachineImage(BaseMachineImage):
 
 
@@ -125,6 +128,7 @@ class OpenStackMachineImage(BaseMachineImage):
         Refreshes the state of this instance by re-querying the cloud provider
         Refreshes the state of this instance by re-querying the cloud provider
         for its latest state.
         for its latest state.
         """
         """
+        log.debug("Refreshing OpenStack Machine Image")
         image = self._provider.compute.images.get(self.id)
         image = self._provider.compute.images.get(self.id)
         if image:
         if image:
             self._os_image = image._os_image  # pylint:disable=protected-access
             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.
         Create a new image based on this instance.
         """
         """
+        log.debug("Creating OpenStack Image with the name %s", name)
         self.assert_valid_resource_name(name)
         self.assert_valid_resource_name(name)
 
 
         image_id = self._os_instance.create_image(name)
         image_id = self._os_instance.create_image(name)
@@ -395,24 +400,28 @@ class OpenStackInstance(BaseInstance):
         """
         """
         Add a floating IP address to this instance.
         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)
         self._os_instance.add_floating_ip(floating_ip.public_ip)
 
 
     def remove_floating_ip(self, floating_ip):
     def remove_floating_ip(self, floating_ip):
         """
         """
         Remove a floating IP address from this instance.
         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)
         self._os_instance.remove_floating_ip(floating_ip.public_ip)
 
 
     def add_vm_firewall(self, firewall):
     def add_vm_firewall(self, firewall):
         """
         """
         Add a VM firewall to this instance
         Add a VM firewall to this instance
         """
         """
+        log.debug("Adding firewall: %s", firewall)
         self._os_instance.add_security_group(firewall.id)
         self._os_instance.add_security_group(firewall.id)
 
 
     def remove_vm_firewall(self, firewall):
     def remove_vm_firewall(self, firewall):
         """
         """
         Remove a VM firewall from this instance
         Remove a VM firewall from this instance
         """
         """
+        log.debug("Removing firewall: %s", firewall)
         self._os_instance.remove_security_group(firewall.id)
         self._os_instance.remove_security_group(firewall.id)
 
 
     @property
     @property
@@ -557,6 +566,7 @@ class OpenStackVolume(BaseVolume):
         """
         """
         Attach this volume to an instance.
         Attach this volume to an instance.
         """
         """
+        log.debug("Attaching %s to %s instance", device, instance)
         instance_id = instance.id if isinstance(
         instance_id = instance.id if isinstance(
             instance,
             instance,
             OpenStackInstance) else instance
             OpenStackInstance) else instance
@@ -572,6 +582,8 @@ class OpenStackVolume(BaseVolume):
         """
         """
         Create a snapshot of this Volume.
         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(
         return self._provider.storage.snapshots.create(
             name, self, description=description)
             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.
         Returns a KeyPair given its id.
         """
         """
+        log.debug("Returning KeyPair with the id %s", key_pair_id)
         try:
         try:
             return OpenStackKeyPair(
             return OpenStackKeyPair(
                 self.provider, self.provider.nova.keypairs.get(key_pair_id))
                 self.provider, self.provider.nova.keypairs.get(key_pair_id))
         except NovaNotFound:
         except NovaNotFound:
+            log.exception("NovaNotFound exception raised")
             return None
             return None
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
@@ -144,10 +146,11 @@ class OpenStackKeyPairService(BaseKeyPairService):
         :rtype: ``list`` of :class:`.KeyPair`
         :rtype: ``list`` of :class:`.KeyPair`
         :return:  list of KeyPair objects
         :return:  list of KeyPair objects
         """
         """
-
         keypairs = self.provider.nova.keypairs.list()
         keypairs = self.provider.nova.keypairs.list()
         results = [OpenStackKeyPair(self.provider, kp)
         results = [OpenStackKeyPair(self.provider, kp)
                    for kp in keypairs]
                    for kp in keypairs]
+        log.debug("Listing all key pairs associated with OpenStack "
+                  "Account: %s", results)
         return ClientPagedResultList(self.provider, results,
         return ClientPagedResultList(self.provider, results,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
@@ -158,6 +161,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
         keypairs = self.provider.nova.keypairs.findall(name=name)
         keypairs = self.provider.nova.keypairs.findall(name=name)
         results = [OpenStackKeyPair(self.provider, kp)
         results = [OpenStackKeyPair(self.provider, kp)
                    for kp in keypairs]
                    for kp in keypairs]
+        log.debug("Searching for %s in: %s", name, keypairs)
         return ClientPagedResultList(self.provider, results,
         return ClientPagedResultList(self.provider, results,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
@@ -171,11 +175,13 @@ class OpenStackKeyPairService(BaseKeyPairService):
         :rtype: ``object`` of :class:`.KeyPair`
         :rtype: ``object`` of :class:`.KeyPair`
         :return:  A key pair instance or ``None`` if one was not be created.
         :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)
         OpenStackKeyPair.assert_valid_resource_name(name)
 
 
         kp = self.provider.nova.keypairs.create(name)
         kp = self.provider.nova.keypairs.create(name)
         if kp:
         if kp:
             return OpenStackKeyPair(self.provider, kp)
             return OpenStackKeyPair(self.provider, kp)
+        log.exception("Key Pair with the name %s already exists", name)
         return None
         return None
 
 
 
 
@@ -185,11 +191,13 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
         super(OpenStackVMFirewallService, self).__init__(provider)
         super(OpenStackVMFirewallService, self).__init__(provider)
 
 
     def get(self, firewall_id):
     def get(self, firewall_id):
+        log.debug("Getting OpenStack VM Firewall with the id: %s", firewall_id)
         try:
         try:
             return OpenStackVMFirewall(
             return OpenStackVMFirewall(
                 self.provider,
                 self.provider,
                 self.provider.os_conn.network.get_security_group(firewall_id))
                 self.provider.os_conn.network.get_security_group(firewall_id))
         except ResourceNotFound:
         except ResourceNotFound:
+            log.exception("Firewall %s not found.", firewall_id)
             return None
             return None
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
@@ -202,7 +210,9 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
 
 
     def create(self, name, description, network_id):
     def create(self, name, description, network_id):
         OpenStackVMFirewall.assert_valid_resource_name(name)
         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(
         sg = self.provider.os_conn.network.create_security_group(
             name=name, description=description)
             name=name, description=description)
         if sg:
         if sg:
@@ -210,6 +220,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
         return None
         return None
 
 
     def find(self, name, limit=None, marker=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)]
         sgs = [self.provider.os_conn.network.find_security_group(name)]
         results = [OpenStackVMFirewall(self.provider, sg)
         results = [OpenStackVMFirewall(self.provider, sg)
                    for sg in sgs if sg]
                    for sg in sgs if sg]
@@ -217,6 +228,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
     def delete(self, group_id):
     def delete(self, group_id):
+        log.debug("Deleting OpenStack Firewall with the id: %s", group_id)
         firewall = self.get(group_id)
         firewall = self.get(group_id)
         if firewall:
         if firewall:
             firewall.delete()
             firewall.delete()
@@ -232,16 +244,20 @@ class OpenStackImageService(BaseImageService):
         """
         """
         Returns an Image given its id
         Returns an Image given its id
         """
         """
+        log.debug("Getting OpenStack Image with the id: %s", image_id)
         try:
         try:
             return OpenStackMachineImage(
             return OpenStackMachineImage(
                 self.provider, self.provider.os_conn.image.get_image(image_id))
                 self.provider, self.provider.os_conn.image.get_image(image_id))
         except ResourceNotFound:
         except ResourceNotFound:
+            log.exception("ResourceNotFound exception raised, %s not found",
+                          image_id)
             return None
             return None
 
 
     def find(self, name, limit=None, marker=None):
     def find(self, name, limit=None, marker=None):
         """
         """
         Searches for an image by a given list of attributes
         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)
         regex = fnmatch.translate(name)
         cb_images = [
         cb_images = [
             img
             img
@@ -311,16 +327,19 @@ class OpenStackVolumeService(BaseVolumeService):
         """
         """
         Returns a volume given its id.
         Returns a volume given its id.
         """
         """
+        log.debug("Getting OpenStack Volume with the id: %s", volume_id)
         try:
         try:
             return OpenStackVolume(
             return OpenStackVolume(
                 self.provider, self.provider.cinder.volumes.get(volume_id))
                 self.provider, self.provider.cinder.volumes.get(volume_id))
         except CinderNotFound:
         except CinderNotFound:
+            log.exception("CinderNotFound exception raised.")
             return None
             return None
 
 
     def find(self, name, limit=None, marker=None):
     def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a volume by a given list of attributes.
         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}
         search_opts = {'name': name}
         cb_vols = [
         cb_vols = [
             OpenStackVolume(self.provider, vol)
             OpenStackVolume(self.provider, vol)
@@ -347,6 +366,9 @@ class OpenStackVolumeService(BaseVolumeService):
         """
         """
         Creates a new volume.
         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)
         OpenStackVolume.assert_valid_resource_name(name)
 
 
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -368,11 +390,13 @@ class OpenStackSnapshotService(BaseSnapshotService):
         """
         """
         Returns a snapshot given its id.
         Returns a snapshot given its id.
         """
         """
+        log.debug("Getting OpenStack snapshot with the id: %s", snapshot_id)
         try:
         try:
             return OpenStackSnapshot(
             return OpenStackSnapshot(
                 self.provider,
                 self.provider,
                 self.provider.cinder.volume_snapshots.get(snapshot_id))
                 self.provider.cinder.volume_snapshots.get(snapshot_id))
         except CinderNotFound:
         except CinderNotFound:
+            log.exception("CinderNotFound exception raised.")
             return None
             return None
 
 
     def find(self, name, limit=None, marker=None):
     def find(self, name, limit=None, marker=None):
@@ -383,6 +407,8 @@ class OpenStackSnapshotService(BaseSnapshotService):
                        'limit': oshelpers.os_result_limit(self.provider,
                        'limit': oshelpers.os_result_limit(self.provider,
                                                           limit),
                                                           limit),
                        'marker': marker}
                        'marker': marker}
+        log.debug("Searching for an OpenStack volume with the following "
+                  "params: %s", search_opts)
         cb_snaps = [
         cb_snaps = [
             OpenStackSnapshot(self.provider, snap) for
             OpenStackSnapshot(self.provider, snap) for
             snap in self.provider.cinder.volume_snapshots.list(search_opts)
             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.
         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)
         OpenStackSnapshot.assert_valid_resource_name(name)
 
 
         volume_id = (volume.id if isinstance(volume, OpenStackVolume)
         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
         Returns a bucket given its ID. Returns ``None`` if the bucket
         does not exist.
         does not exist.
         """
         """
+        log.debug("Getting OpenStack bucket with the id: %s", bucket_id)
         _, container_list = self.provider.swift.get_account(
         _, container_list = self.provider.swift.get_account(
             prefix=bucket_id)
             prefix=bucket_id)
         if container_list:
         if container_list:
@@ -434,12 +462,14 @@ class OpenStackBucketService(BaseBucketService):
                                    next((c for c in container_list
                                    next((c for c in container_list
                                          if c['name'] == bucket_id), None))
                                          if c['name'] == bucket_id), None))
         else:
         else:
+            log.exception("OpenStack Bucket does not exist.")
             return None
             return None
 
 
     def find(self, name, limit=None, marker=None):
     def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a bucket by a given list of attributes.
         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(
         _, container_list = self.provider.swift.get_account(
             limit=oshelpers.os_result_limit(self.provider, limit),
             limit=oshelpers.os_result_limit(self.provider, limit),
             marker=marker)
             marker=marker)
@@ -463,6 +493,7 @@ class OpenStackBucketService(BaseBucketService):
         """
         """
         Create a new bucket.
         Create a new bucket.
         """
         """
+        log.debug("Creating a new OpenStack Bucket with the name: %s", name)
         OpenStackBucket.assert_valid_resource_name(name)
         OpenStackBucket.assert_valid_resource_name(name)
 
 
         self.provider.swift.put_container(name)
         self.provider.swift.put_container(name)
@@ -475,6 +506,7 @@ class OpenStackRegionService(BaseRegionService):
         super(OpenStackRegionService, self).__init__(provider)
         super(OpenStackRegionService, self).__init__(provider)
 
 
     def get(self, region_id):
     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)
         region = (r for r in self.list() if r.id == region_id)
         return next(region, None)
         return next(region, None)
 
 
@@ -743,6 +775,7 @@ class OpenStackNetworkService(BaseNetworkService):
         super(OpenStackNetworkService, self).__init__(provider)
         super(OpenStackNetworkService, self).__init__(provider)
 
 
     def get(self, network_id):
     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)
         network = (n for n in self if n.id == network_id)
         return next(network, None)
         return next(network, None)
 
 
@@ -754,6 +787,8 @@ class OpenStackNetworkService(BaseNetworkService):
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
     def find(self, name, limit=None, marker=None):
     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)
         networks = [OpenStackNetwork(self.provider, network)
                     for network in self.provider.neutron.list_networks(
                     for network in self.provider.neutron.list_networks(
                         name=name)
                         name=name)
@@ -762,6 +797,8 @@ class OpenStackNetworkService(BaseNetworkService):
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
     def create(self, name, cidr_block):
     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)
         OpenStackNetwork.assert_valid_resource_name(name)
 
 
         net_info = {'name': name}
         net_info = {'name': name}
@@ -775,6 +812,7 @@ class OpenStackSubnetService(BaseSubnetService):
         super(OpenStackSubnetService, self).__init__(provider)
         super(OpenStackSubnetService, self).__init__(provider)
 
 
     def get(self, subnet_id):
     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)
         subnet = (s for s in self if s.id == subnet_id)
         return next(subnet, None)
         return next(subnet, None)
 
 
@@ -792,6 +830,9 @@ class OpenStackSubnetService(BaseSubnetService):
 
 
     def create(self, name, network, cidr_block, zone=None):
     def create(self, name, network, cidr_block, zone=None):
         """zone param is ignored."""
         """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)
         OpenStackSubnet.assert_valid_resource_name(name)
 
 
         network_id = (network.id if isinstance(network, OpenStackNetwork)
         network_id = (network.id if isinstance(network, OpenStackNetwork)
@@ -829,6 +870,7 @@ class OpenStackSubnetService(BaseSubnetService):
             return None
             return None
 
 
     def delete(self, subnet):
     def delete(self, subnet):
+        log.debug("Deleting subnet: %s", subnet)
         subnet_id = (subnet.id if isinstance(subnet, OpenStackSubnet)
         subnet_id = (subnet.id if isinstance(subnet, OpenStackSubnet)
                      else subnet)
                      else subnet)
         self.provider.neutron.delete_subnet(subnet_id)
         self.provider.neutron.delete_subnet(subnet_id)
@@ -874,6 +916,7 @@ class OpenStackRouterService(BaseRouterService):
         super(OpenStackRouterService, self).__init__(provider)
         super(OpenStackRouterService, self).__init__(provider)
 
 
     def get(self, router_id):
     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)
         router = (r for r in self if r.id == router_id)
         return next(router, None)
         return next(router, None)
 
 
@@ -884,6 +927,8 @@ class OpenStackRouterService(BaseRouterService):
                                      marker=marker)
                                      marker=marker)
 
 
     def find(self, name, limit=None, marker=None):
     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]
         aws_routers = [r for r in self if r.name == name]
         return ClientPagedResultList(self.provider, aws_routers, limit=limit,
         return ClientPagedResultList(self.provider, aws_routers, limit=limit,
                                      marker=marker)
                                      marker=marker)
@@ -896,6 +941,7 @@ class OpenStackRouterService(BaseRouterService):
         https://developer.openstack.org/api-ref/networking/v2/
         https://developer.openstack.org/api-ref/networking/v2/
             ?expanded=delete-router-detail,create-router-detail#create-router
             ?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)
         OpenStackRouter.assert_valid_resource_name(name)
 
 
         body = {'router': {'name': name}} if name else None
         body = {'router': {'name': name}} if name else None
@@ -917,4 +963,5 @@ class OpenStackGatewayService(BaseGatewayService):
         return None
         return None
 
 
     def delete(self, gateway):
     def delete(self, gateway):
+        log.debug("Deleting OpenStack Gateway: %s", gateway)
         gateway.delete()
         gateway.delete()