Ver Fonte

New GCP profiling

almahmoud há 7 anos atrás
pai
commit
8bf7c54c39

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

@@ -80,6 +80,7 @@ class BaseVMFirewallService(
 
     @dispatch(event="provider.security.vm_firewalls.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -109,6 +110,7 @@ class BaseVMFirewallRuleService(BasePageableObjectMixin,
 
     @dispatch(event="provider.security.vm_firewall_rules.get",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, firewall, rule_id):
         matches = [rule for rule in firewall.rules if rule.id == rule_id]
         if matches:
@@ -118,6 +120,7 @@ class BaseVMFirewallRuleService(BasePageableObjectMixin,
 
     @dispatch(event="provider.security.vm_firewall_rules.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, firewall, **kwargs):
         obj_list = firewall.rules
         filters = ['name', 'direction', 'protocol', 'from_port', 'to_port',
@@ -159,6 +162,7 @@ class BaseBucketService(
     # provider-specific querying for find method
     @dispatch(event="provider.storage.buckets.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['name']
@@ -213,12 +217,14 @@ class BaseVMTypeService(
 
     @dispatch(event="provider.compute.vm_types.get",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, vm_type_id):
         vm_type = (t for t in self if t.id == vm_type_id)
         return next(vm_type, None)
 
     @dispatch(event="provider.compute.vm_types.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['name']
@@ -235,6 +241,7 @@ class BaseRegionService(
 
     @dispatch(event="provider.compute.regions.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['name']
@@ -260,6 +267,7 @@ class BaseNetworkService(
         return [subnet for subnet in self.provider.subnets
                 if subnet.network_id == self.id]
 
+    @profile
     def get_or_create_default(self):
         networks = self.provider.networking.networks.find(
             label=BaseNetwork.CB_DEFAULT_NETWORK_LABEL)
@@ -274,6 +282,7 @@ class BaseNetworkService(
 
     @dispatch(event="provider.networking.networks.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -298,6 +307,7 @@ class BaseSubnetService(
 
     @dispatch(event="provider.networking.subnets.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, network=None, **kwargs):
         if not network:
             obj_list = self
@@ -307,6 +317,7 @@ class BaseSubnetService(
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self._provider, list(matches))
 
+    @profile
     def get_or_create_default(self, zone):
         # Look for a CB-default subnet
         matches = self.find(label=BaseSubnet.CB_DEFAULT_SUBNET_LABEL)
@@ -327,6 +338,7 @@ class BaseRouterService(
         super(BaseRouterService, self).__init__(provider)
         self._service_event_pattern += ".networking.routers"
 
+    @profile
     def get_or_create_default(self, network):
         net_id = network.id if isinstance(network, Network) else network
         routers = self.provider.networking.routers.find(
@@ -362,6 +374,7 @@ class BaseFloatingIPService(FloatingIPService, BaseCloudService):
 
     @dispatch(event="provider.networking.floating_ips.find",
               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, gateway, **kwargs):
         obj_list = gateway.floating_ips
         filters = ['name', 'public_ip']

+ 22 - 0
cloudbridge/cloud/providers/aws/resources.py

@@ -87,6 +87,7 @@ class AWSMachineImage(BaseMachineImage):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._ec2_image.create_tags(Tags=[{'Key': 'Name',
@@ -130,6 +131,7 @@ class AWSMachineImage(BaseMachineImage):
             # Ignore all exceptions when querying state
             return MachineImageState.UNKNOWN
 
+    @profile
     def refresh(self):
         self._ec2_image.reload()
 
@@ -251,6 +253,7 @@ class AWSInstance(BaseInstance):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._ec2_instance.create_tags(Tags=[{'Key': 'Name',
@@ -370,6 +373,7 @@ class AWSInstance(BaseInstance):
             # Ignore all exceptions when querying state
             return InstanceState.UNKNOWN
 
+    @profile
     def refresh(self):
         try:
             self._ec2_instance.reload()
@@ -421,6 +425,7 @@ class AWSVolume(BaseVolume):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._volume.create_tags(Tags=[{'Key': 'Name', 'Value': value or ""}])
@@ -430,6 +435,7 @@ class AWSVolume(BaseVolume):
         return find_tag_value(self._volume.tags, 'Description')
 
     @description.setter
+    @profile
     def description(self, value):
         self._volume.create_tags(Tags=[{'Key': 'Description',
                                         'Value': value or ""}])
@@ -500,6 +506,7 @@ class AWSVolume(BaseVolume):
             # Ignore all exceptions when querying state
             return VolumeState.UNKNOWN
 
+    @profile
     def refresh(self):
         try:
             self._volume.reload()
@@ -544,6 +551,7 @@ class AWSSnapshot(BaseSnapshot):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._snapshot.create_tags(Tags=[{'Key': 'Name',
@@ -554,6 +562,7 @@ class AWSSnapshot(BaseSnapshot):
         return find_tag_value(self._snapshot.tags, 'Description')
 
     @description.setter
+    @profile
     def description(self, value):
         self._snapshot.create_tags(Tags=[{
             'Key': 'Description', 'Value': value or ""}])
@@ -581,6 +590,7 @@ class AWSSnapshot(BaseSnapshot):
             # Ignore all exceptions when querying state
             return SnapshotState.UNKNOWN
 
+    @profile
     def refresh(self):
         try:
             self._snapshot.reload()
@@ -629,6 +639,7 @@ class AWSVMFirewall(BaseVMFirewall):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._vm_firewall.create_tags(Tags=[{'Key': 'Name',
@@ -643,6 +654,7 @@ class AWSVMFirewall(BaseVMFirewall):
 
     @description.setter
     # pylint:disable=arguments-differ
+    @profile
     def description(self, value):
         self._vm_firewall.create_tags(Tags=[{'Key': 'Description',
                                              'Value': value or ""}])
@@ -655,6 +667,7 @@ class AWSVMFirewall(BaseVMFirewall):
     def rules(self):
         return self._rule_container
 
+    @profile
     def refresh(self):
         self._vm_firewall.reload()
 
@@ -798,6 +811,7 @@ class AWSBucketObject(BaseBucketObject):
             Params={'Bucket': self._obj.bucket_name, 'Key': self.id},
             ExpiresIn=expires_in)
 
+    @profile
     def refresh(self):
         self._obj.load()
 
@@ -881,6 +895,7 @@ class AWSNetwork(BaseNetwork):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._vpc.create_tags(Tags=[{'Key': 'Name', 'Value': value or ""}])
@@ -912,6 +927,7 @@ class AWSNetwork(BaseNetwork):
     def subnets(self):
         return self._subnet_svc
 
+    @profile
     def refresh(self):
         try:
             self._vpc.reload()
@@ -958,6 +974,7 @@ class AWSSubnet(BaseSubnet):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._subnet.create_tags(Tags=[{'Key': 'Name', 'Value': value or ""}])
@@ -986,6 +1003,7 @@ class AWSSubnet(BaseSubnet):
             # Ignore all exceptions when querying state
             return SubnetState.UNKNOWN
 
+    @profile
     def refresh(self):
         try:
             self._subnet.reload()
@@ -1017,6 +1035,7 @@ class AWSFloatingIP(BaseFloatingIP):
     def in_use(self):
         return True if self._ip.association_id else False
 
+    @profile
     def refresh(self):
         self._ip.reload()
 
@@ -1041,11 +1060,13 @@ class AWSRouter(BaseRouter):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._route_table.create_tags(Tags=[{'Key': 'Name',
                                              'Value': value or ""}])
 
+    @profile
     def refresh(self):
         try:
             self._route_table.reload()
@@ -1111,6 +1132,7 @@ class AWSInternetGateway(BaseInternetGateway):
     def name(self):
         return find_tag_value(self._gateway.tags, 'Name')
 
+    @profile
     def refresh(self):
         try:
             self._gateway.reload()

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

@@ -105,17 +105,20 @@ class AWSKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.get",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, key_pair_id):
         log.debug("Getting Key Pair Service %s", key_pair_id)
         return self.svc.get(key_pair_id)
 
     @dispatch(event="provider.security.key_pairs.list",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @dispatch(event="provider.security.key_pairs.find",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         name = kwargs.pop('name', None)
 
@@ -130,6 +133,7 @@ class AWSKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.create",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, public_key_material=None):
         AWSKeyPair.assert_valid_resource_name(name)
         private_key = None
@@ -149,6 +153,7 @@ class AWSKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.delete",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, key_pair):
         key_pair = (key_pair if isinstance(key_pair, AWSKeyPair) else
                     self.get(key_pair))
@@ -167,18 +172,21 @@ class AWSVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.get",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, vm_firewall_id):
         log.debug("Getting Firewall Service with the id: %s", vm_firewall_id)
         return self.svc.get(vm_firewall_id)
 
     @dispatch(event="provider.security.vm_firewalls.list",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @cb_helpers.deprecated_alias(network_id='network')
     @dispatch(event="provider.security.vm_firewalls.create",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, description=None):
         AWSVMFirewall.assert_valid_resource_label(label)
         name = AWSVMFirewall._generate_name_from_label(label, 'cb-fw')
@@ -192,6 +200,7 @@ class AWSVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.find",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         # Filter by name or label
         label = kwargs.pop('label', None)
@@ -206,6 +215,7 @@ class AWSVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.delete",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, vm_firewall):
         firewall = (vm_firewall if isinstance(vm_firewall, AWSVMFirewall)
                     else self.get(vm_firewall))
@@ -221,6 +231,7 @@ class AWSVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.list",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, firewall, limit=None, marker=None):
         # pylint:disable=protected-access
         rules = [AWSVMFirewallRule(firewall,
@@ -236,6 +247,7 @@ class AWSVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.create",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, firewall,  direction, protocol=None, from_port=None,
                to_port=None, cidr=None, src_dest_fw=None):
         src_dest_fw_id = (
@@ -270,6 +282,7 @@ class AWSVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.delete",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, firewall, rule):
         # pylint:disable=protected-access
         ip_perm_entry = rule._construct_ip_perms(
@@ -328,11 +341,13 @@ class AWSVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.get",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, volume_id):
         return self.svc.get(volume_id)
 
     @dispatch(event="provider.storage.volumes.find",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -347,11 +362,13 @@ class AWSVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @dispatch(event="provider.storage.volumes.create",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, size, zone, snapshot=None, description=None):
         AWSVolume.assert_valid_resource_label(label)
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -370,6 +387,7 @@ class AWSVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.delete",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, vol):
         volume = vol if isinstance(vol, AWSVolume) else self.get(vol)
         if volume:
@@ -387,11 +405,13 @@ class AWSSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.get",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, snapshot_id):
         return self.svc.get(snapshot_id)
 
     @dispatch(event="provider.storage.snapshots.find",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         # Filter by description or label
         label = kwargs.get('label', None)
@@ -409,12 +429,14 @@ class AWSSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.list",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker,
                              OwnerIds=['self'])
 
     @dispatch(event="provider.storage.snapshots.create",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, volume, description=None):
         AWSSnapshot.assert_valid_resource_label(label)
         volume_id = volume.id if isinstance(volume, AWSVolume) else volume
@@ -429,6 +451,7 @@ class AWSSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.delete",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, snapshot):
         snapshot = (snapshot if isinstance(snapshot, AWSSnapshot) else
                     self.get(snapshot))
@@ -447,6 +470,7 @@ class AWSBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.get",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, bucket_id):
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -477,11 +501,13 @@ class AWSBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.list",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @dispatch(event="provider.storage.buckets.create",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, location=None):
         AWSBucket.assert_valid_resource_name(name)
         location = location or self.provider.region_name
@@ -517,6 +543,7 @@ class AWSBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.delete",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, bucket):
         b = bucket if isinstance(bucket, AWSBucket) else self.get(bucket)
         if b:
@@ -529,6 +556,7 @@ class AWSBucketObjectService(BaseBucketObjectService):
     def __init__(self, provider):
         super(AWSBucketObjectService, self).__init__(provider)
 
+    @profile
     def get(self, bucket, object_id):
         try:
             # pylint:disable=protected-access
@@ -539,6 +567,7 @@ class AWSBucketObjectService(BaseBucketObjectService):
         except ClientError:
             return None
 
+    @profile
     def list(self, bucket, limit=None, marker=None, prefix=None):
         if prefix:
             # pylint:disable=protected-access
@@ -550,6 +579,7 @@ class AWSBucketObjectService(BaseBucketObjectService):
         return ClientPagedResultList(self.provider, objects,
                                      limit=limit, marker=marker)
 
+    @profile
     def find(self, bucket, **kwargs):
         # pylint:disable=protected-access
         obj_list = [AWSBucketObject(self.provider, o)
@@ -559,6 +589,7 @@ class AWSBucketObjectService(BaseBucketObjectService):
         return ClientPagedResultList(self.provider, list(matches),
                                      limit=None, marker=None)
 
+    @profile
     def create(self, bucket, name):
         # pylint:disable=protected-access
         obj = bucket._bucket.Object(name)
@@ -599,10 +630,12 @@ class AWSImageService(BaseImageService):
                                   cb_resource=AWSMachineImage,
                                   boto_collection_name='images')
 
+    @profile
     def get(self, image_id):
         log.debug("Getting AWS Image Service with the id: %s", image_id)
         return self.svc.get(image_id)
 
+    @profile
     def find(self, **kwargs):
         # Filter by name or label
         label = kwargs.pop('label', None)
@@ -632,6 +665,7 @@ class AWSImageService(BaseImageService):
         else:
             return []
 
+    @profile
     def list(self, filter_by_owner=True, limit=None, marker=None):
         return self.svc.list(Owners=['self'] if filter_by_owner else
                              ['amazon', 'self'],
@@ -728,11 +762,13 @@ class AWSInstanceService(BaseInstanceService):
 
         return bdml
 
+    @profile
     def create_launch_config(self):
         return AWSLaunchConfig(self.provider)
 
     @dispatch(event="provider.compute.instances.create",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, image, vm_type, subnet, zone,
                key_pair=None, vm_firewalls=None, user_data=None,
                launch_config=None, **kwargs):
@@ -779,11 +815,13 @@ class AWSInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.get",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, instance_id):
         return self.svc.get(instance_id)
 
     @dispatch(event="provider.compute.instances.find",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -797,11 +835,13 @@ class AWSInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.list",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, instance):
         aws_inst = (instance if isinstance(instance, AWSInstance) else
                     self.get(instance))
@@ -840,6 +880,7 @@ class AWSVMTypeService(BaseVMTypeService):
 
     @dispatch(event="provider.compute.vm_types.list",
               priority=BaseVMTypeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         vm_types = [AWSVMType(self.provider, vm_type)
                     for vm_type in self.instance_data]
@@ -854,6 +895,7 @@ class AWSRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.get",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, region_id):
         log.debug("Getting AWS Region Service with the id: %s",
                   region_id)
@@ -865,6 +907,7 @@ class AWSRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.list",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         regions = [
             AWSRegion(self.provider, region) for region in
@@ -919,16 +962,19 @@ class AWSNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.get",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, network_id):
         return self.svc.get(network_id)
 
     @dispatch(event="provider.networking.networks.list",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @dispatch(event="provider.networking.networks.find",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -943,6 +989,7 @@ class AWSNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.create",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, cidr_block):
         AWSNetwork.assert_valid_resource_label(label)
 
@@ -955,6 +1002,7 @@ class AWSNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.delete",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network):
         network = (network if isinstance(network, AWSNetwork)
                    else self.get(network))
@@ -962,6 +1010,7 @@ class AWSNetworkService(BaseNetworkService):
             # pylint:disable=protected-access
             network._vpc.delete()
 
+    @profile
     def get_or_create_default(self):
         # # Look for provided default network
         # for net in self.provider.networking.networks:
@@ -993,11 +1042,13 @@ class AWSSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.get",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, subnet_id):
         return self.svc.get(subnet_id)
 
     @dispatch(event="provider.networking.subnets.list",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network=None, limit=None, marker=None):
         network_id = network.id if isinstance(network, AWSNetwork) else network
         if network_id:
@@ -1009,6 +1060,7 @@ class AWSSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.find",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, network=None, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -1023,6 +1075,7 @@ class AWSSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.create",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, cidr_block, zone):
         AWSSubnet.assert_valid_resource_label(label)
         zone_name = zone.name if isinstance(
@@ -1040,12 +1093,14 @@ class AWSSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.delete",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, subnet):
         sn = subnet if isinstance(subnet, AWSSubnet) else self.get(subnet)
         if sn:
             # pylint:disable=protected-access
             sn._subnet.delete()
 
+    @profile
     def get_or_create_default(self, zone):
         zone_name = zone.name if isinstance(zone, AWSPlacementZone) else zone
 
@@ -1161,11 +1216,13 @@ class AWSRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.get",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, router_id):
         return self.svc.get(router_id)
 
     @dispatch(event="provider.networking.routers.find",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -1180,11 +1237,13 @@ class AWSRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.list",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
     @dispatch(event="provider.networking.routers.create",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network):
         network_id = network.id if isinstance(network, AWSNetwork) else network
 
@@ -1195,6 +1254,7 @@ class AWSRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.delete",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, router):
         r = router if isinstance(router, AWSRouter) else self.get(router)
         if r:
@@ -1212,6 +1272,7 @@ class AWSGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.get_or_create",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get_or_create(self, network):
         network_id = network.id if isinstance(
             network, AWSNetwork) else network
@@ -1233,6 +1294,7 @@ class AWSGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.delete",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network, gateway):
         gw = (gateway if isinstance(gateway, AWSInternetGateway)
               else self.svc.get(gateway))
@@ -1247,6 +1309,7 @@ class AWSGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.list",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network, limit=None, marker=None):
         log.debug("Listing current AWS internet gateways for net %s.",
                   network.id)
@@ -1264,17 +1327,20 @@ class AWSFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.get",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, gateway, fip_id):
         log.debug("Getting AWS Floating IP Service with the id: %s", fip_id)
         return self.svc.get(fip_id)
 
     @dispatch(event="provider.networking.floating_ips.list",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, gateway, limit=None, marker=None):
         return self.svc.list(limit, marker)
 
     @dispatch(event="provider.networking.floating_ips.create",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, gateway):
         log.debug("Creating a floating IP under gateway %s", gateway)
         ip = self.provider.ec2_conn.meta.client.allocate_address(
@@ -1285,6 +1351,7 @@ class AWSFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.delete",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, gateway, fip):
         if isinstance(fip, AWSFloatingIP):
             # pylint:disable=protected-access

+ 0 - 97
cloudbridge/cloud/providers/azure/azure_client.py

@@ -158,7 +158,6 @@ class AzureClient(object):
     """
     Azure client is the wrapper on top of azure python sdk
     """
-    @profile
     def __init__(self, config):
         self._config = config
         self.subscription_id = str(config.get('azure_subscription_id'))
@@ -183,7 +182,6 @@ class AzureClient(object):
 
     @property
     @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
-    @profile
     def access_key_result(self):
         if not self._access_key_result:
             storage_account = self.storage_account
@@ -205,27 +203,22 @@ class AzureClient(object):
         return self._access_key_result
 
     @property
-    @profile
     def resource_group(self):
         return self._config.get('azure_resource_group')
 
     @property
-    @profile
     def storage_account(self):
         return self._config.get('azure_storage_account')
 
     @property
-    @profile
     def region_name(self):
         return self._config.get('azure_region_name')
 
     @property
-    @profile
     def public_key_storage_table_name(self):
         return self._config.get('azure_public_key_storage_table_name')
 
     @property
-    @profile
     def storage_client(self):
         if not self._storage_client:
             self._storage_client = \
@@ -234,14 +227,12 @@ class AzureClient(object):
         return self._storage_client
 
     @property
-    @profile
     def subscription_client(self):
         if not self._subscription_client:
             self._subscription_client = SubscriptionClient(self._credentials)
         return self._subscription_client
 
     @property
-    @profile
     def resource_client(self):
         if not self._resource_client:
             self._resource_client = \
@@ -250,7 +241,6 @@ class AzureClient(object):
         return self._resource_client
 
     @property
-    @profile
     def compute_client(self):
         if not self._compute_client:
             self._compute_client = \
@@ -259,7 +249,6 @@ class AzureClient(object):
         return self._compute_client
 
     @property
-    @profile
     def network_management_client(self):
         if not self._network_management_client:
             self._network_management_client = NetworkManagementClient(
@@ -267,7 +256,6 @@ class AzureClient(object):
         return self._network_management_client
 
     @property
-    @profile
     def blob_service(self):
         self._get_or_create_storage_account()
         if not self._block_blob_service:
@@ -283,7 +271,6 @@ class AzureClient(object):
         return self._block_blob_service
 
     @property
-    @profile
     def table_service(self):
         self._get_or_create_storage_account()
         if not self._table_service:
@@ -296,21 +283,17 @@ class AzureClient(object):
                 self.public_key_storage_table_name)
         return self._table_service
 
-    @profile
     def get_resource_group(self, name):
         return self.resource_client.resource_groups.get(name)
 
-    @profile
     def create_resource_group(self, name, parameters):
         return self.resource_client.resource_groups. \
             create_or_update(name, parameters)
 
-    @profile
     def get_storage_account(self, storage_account):
         return self.storage_client.storage_accounts. \
             get_properties(self.resource_group, storage_account)
 
-    @profile
     def create_storage_account(self, name, params):
         return self.storage_client.storage_accounts. \
             create(self.resource_group, name.lower(), params).result()
@@ -320,7 +303,6 @@ class AzureClient(object):
     @tenacity.retry(stop=tenacity.stop_after_attempt(2),
                     retry=tenacity.retry_if_exception_type(CloudError),
                     reraise=True)
-    @profile
     def _get_or_create_storage_account(self):
         if self._storage_account:
             return self._storage_account
@@ -375,23 +357,19 @@ class AzureClient(object):
                 else:
                     raise cloud_error
 
-    @profile
     def list_locations(self):
         return self.subscription_client.subscriptions. \
             list_locations(self.subscription_id)
 
-    @profile
     def list_vm_firewall(self):
         return self.network_management_client.network_security_groups. \
             list(self.resource_group)
 
-    @profile
     def create_vm_firewall(self, name, parameters):
         return self.network_management_client.network_security_groups. \
             create_or_update(self.resource_group, name,
                              parameters).result()
 
-    @profile
     def update_vm_firewall_tags(self, fw_id, tags):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
@@ -401,7 +379,6 @@ class AzureClient(object):
                              {'tags': tags,
                               'location': self.region_name}).result()
 
-    @profile
     def get_vm_firewall(self, fw_id):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
@@ -409,7 +386,6 @@ class AzureClient(object):
         return self.network_management_client.network_security_groups. \
             get(self.resource_group, fw_name)
 
-    @profile
     def delete_vm_firewall(self, fw_id):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
@@ -417,7 +393,6 @@ class AzureClient(object):
         self.network_management_client \
             .network_security_groups.delete(self.resource_group, name).wait()
 
-    @profile
     def create_vm_firewall_rule(self, fw_id,
                                 rule_name, parameters):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
@@ -427,7 +402,6 @@ class AzureClient(object):
             create_or_update(self.resource_group, vm_firewall_name,
                              rule_name, parameters).result()
 
-    @profile
     def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
                                              fw_rule_id)
@@ -435,14 +409,12 @@ class AzureClient(object):
         return self.network_management_client.security_rules. \
             delete(self.resource_group, vm_firewall, name).result()
 
-    @profile
     def list_containers(self, prefix=None, limit=None, marker=None):
         results = self.blob_service.list_containers(prefix=prefix,
                                                     num_results=limit,
                                                     marker=marker)
         return (results.items, results.next_marker)
 
-    @profile
     def create_container(self, container_name):
         try:
             self.blob_service.create_container(container_name,
@@ -458,37 +430,29 @@ class AzureClient(object):
 
         return self.blob_service.get_container_properties(container_name)
 
-    @profile
     def get_container(self, container_name):
         return self.blob_service.get_container_properties(container_name)
 
-    @profile
     def delete_container(self, container_name):
         self.blob_service.delete_container(container_name)
 
-    @profile
     def list_blobs(self, container_name, prefix=None):
         return self.blob_service.list_blobs(container_name, prefix=prefix)
 
-    @profile
     def get_blob(self, container_name, blob_name):
         return self.blob_service.get_blob_properties(container_name, blob_name)
 
-    @profile
     def create_blob_from_text(self, container_name, blob_name, text):
         self.blob_service.create_blob_from_text(container_name,
                                                 blob_name, text)
 
-    @profile
     def create_blob_from_file(self, container_name, blob_name, file_path):
         self.blob_service.create_blob_from_path(container_name,
                                                 blob_name, file_path)
 
-    @profile
     def delete_blob(self, container_name, blob_name):
         self.blob_service.delete_blob(container_name, blob_name)
 
-    @profile
     def get_blob_url(self, container_name, blob_name, expiry_time):
         expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
             seconds=expiry_time)
@@ -498,14 +462,12 @@ class AzureClient(object):
         return self.blob_service.make_blob_url(container_name, blob_name,
                                                sas_token=sas)
 
-    @profile
     def get_blob_content(self, container_name, blob_name):
         out_stream = BytesIO()
         self.blob_service.get_blob_to_stream(container_name,
                                              blob_name, out_stream)
         return out_stream
 
-    @profile
     def create_empty_disk(self, disk_name, params):
         return self.compute_client.disks.create_or_update(
             self.resource_group,
@@ -513,7 +475,6 @@ class AzureClient(object):
             params
         ).result()
 
-    @profile
     def create_snapshot_disk(self, disk_name, params):
         return self.compute_client.disks.create_or_update(
             self.resource_group,
@@ -521,26 +482,22 @@ class AzureClient(object):
             params
         ).result()
 
-    @profile
     def get_disk(self, disk_id):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
         disk_name = url_params.get(VOLUME_NAME)
         return self.compute_client.disks.get(self.resource_group, disk_name)
 
-    @profile
     def list_disks(self):
         return self.compute_client.disks. \
             list_by_resource_group(self.resource_group)
 
-    @profile
     def delete_disk(self, disk_id):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
         disk_name = url_params.get(VOLUME_NAME)
         self.compute_client.disks.delete(self.resource_group, disk_name).wait()
 
-    @profile
     def update_disk_tags(self, disk_id, tags):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
@@ -552,12 +509,10 @@ class AzureClient(object):
             raw=True
         )
 
-    @profile
     def list_snapshots(self):
         return self.compute_client.snapshots. \
             list_by_resource_group(self.resource_group)
 
-    @profile
     def get_snapshot(self, snapshot_id):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
@@ -565,7 +520,6 @@ class AzureClient(object):
         return self.compute_client.snapshots.get(self.resource_group,
                                                  snapshot_name)
 
-    @profile
     def create_snapshot(self, snapshot_name, params):
         return self.compute_client.snapshots.create_or_update(
             self.resource_group,
@@ -573,7 +527,6 @@ class AzureClient(object):
             params
         ).result()
 
-    @profile
     def delete_snapshot(self, snapshot_id):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
@@ -581,7 +534,6 @@ class AzureClient(object):
         self.compute_client.snapshots.delete(self.resource_group,
                                              snapshot_name).wait()
 
-    @profile
     def update_snapshot_tags(self, snapshot_id, tags):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
@@ -593,20 +545,17 @@ class AzureClient(object):
             raw=True
         )
 
-    @profile
     def is_gallery_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
         # If it is a gallery image, it will always have an offer
         return 'offer' in url_params
 
-    @profile
     def create_image(self, name, params):
         return self.compute_client.images. \
             create_or_update(self.resource_group, name,
                              params).result()
 
-    @profile
     def delete_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
@@ -614,17 +563,14 @@ class AzureClient(object):
             name = url_params.get(IMAGE_NAME)
             self.compute_client.images.delete(self.resource_group, name).wait()
 
-    @profile
     def list_images(self):
         azure_images = list(self.compute_client.images.
                             list_by_resource_group(self.resource_group))
         return azure_images
 
-    @profile
     def list_gallery_refs(self):
         return gallery_image_references
 
-    @profile
     def get_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
@@ -637,7 +583,6 @@ class AzureClient(object):
             name = url_params.get(IMAGE_NAME)
             return self.compute_client.images.get(self.resource_group, name)
 
-    @profile
     def update_image_tags(self, image_id, tags):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
@@ -652,17 +597,14 @@ class AzureClient(object):
                                      'location': self.region_name
                                  }).result()
 
-    @profile
     def list_vm_types(self):
         return self.compute_client.virtual_machine_sizes. \
             list(self.region_name)
 
-    @profile
     def list_networks(self):
         return self.network_management_client.virtual_networks.list(
             self.resource_group)
 
-    @profile
     def get_network(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
                                              network_id)
@@ -670,21 +612,18 @@ class AzureClient(object):
         return self.network_management_client.virtual_networks.get(
             self.resource_group, network_name)
 
-    @profile
     def create_network(self, name, params):
         return self.network_management_client.virtual_networks. \
             create_or_update(self.resource_group,
                              name,
                              parameters=params).result()
 
-    @profile
     def delete_network(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
         return self.network_management_client.virtual_networks. \
             delete(self.resource_group, network_name).wait()
 
-    @profile
     def update_network_tags(self, network_id, tags):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
@@ -692,7 +631,6 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              network_name, tags).result()
 
-    @profile
     def get_network_id_for_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
         network_id = NETWORK_RESOURCE_ID[0]
@@ -700,14 +638,12 @@ class AzureClient(object):
             network_id = network_id.replace("{" + key + "}", val)
         return network_id
 
-    @profile
     def list_subnets(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
         return self.network_management_client.subnets. \
             list(self.resource_group, network_name)
 
-    @profile
     def get_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -716,7 +652,6 @@ class AzureClient(object):
         return self.network_management_client.subnets. \
             get(self.resource_group, network_name, subnet_name)
 
-    @profile
     def create_subnet(self, network_id, subnet_name, params):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
@@ -731,7 +666,6 @@ class AzureClient(object):
 
         return subnet_info
 
-    @profile
     def __if_subnet_in_use(e):
         # return True if the CloudError exception is due to subnet being in use
         if isinstance(e, CloudError):
@@ -743,7 +677,6 @@ class AzureClient(object):
                     retry=tenacity.retry_if_exception(__if_subnet_in_use),
                     wait=tenacity.wait_fixed(5),
                     reraise=True)
-    @profile
     def delete_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -762,14 +695,12 @@ class AzureClient(object):
             log.exception(cloud_error.message)
             raise cloud_error
 
-    @profile
     def create_floating_ip(self, public_ip_name, public_ip_parameters):
         return self.network_management_client.public_ip_addresses. \
             create_or_update(self.resource_group,
                              public_ip_name,
                              public_ip_parameters).result()
 
-    @profile
     def get_floating_ip(self, public_ip_id):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              public_ip_id)
@@ -777,7 +708,6 @@ class AzureClient(object):
         return self.network_management_client. \
             public_ip_addresses.get(self.resource_group, public_ip_name)
 
-    @profile
     def delete_floating_ip(self, public_ip_id):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              public_ip_id)
@@ -786,7 +716,6 @@ class AzureClient(object):
             public_ip_addresses.delete(self.resource_group,
                                        public_ip_name).wait()
 
-    @profile
     def update_fip_tags(self, fip_id, tags):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              fip_id)
@@ -795,18 +724,15 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              fip_name, tags).result()
 
-    @profile
     def list_floating_ips(self):
         return self.network_management_client.public_ip_addresses.list(
             self.resource_group)
 
-    @profile
     def list_vm(self):
         return self.compute_client.virtual_machines.list(
             self.resource_group
         )
 
-    @profile
     def restart_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -814,7 +740,6 @@ class AzureClient(object):
         return self.compute_client.virtual_machines.restart(
             self.resource_group, vm_name).wait()
 
-    @profile
     def delete_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -822,7 +747,6 @@ class AzureClient(object):
         return self.compute_client.virtual_machines.delete(
             self.resource_group, vm_name).wait()
 
-    @profile
     def get_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -833,13 +757,11 @@ class AzureClient(object):
             expand='instanceView'
         )
 
-    @profile
     def create_vm(self, vm_name, params):
         return self.compute_client.virtual_machines. \
             create_or_update(self.resource_group,
                              vm_name, params).result()
 
-    @profile
     def update_vm(self, vm_id, params):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -848,7 +770,6 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              vm_name, params, raw=True)
 
-    @profile
     def deallocate_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -857,7 +778,6 @@ class AzureClient(object):
             virtual_machines.deallocate(self.resource_group,
                                         vm_name).wait()
 
-    @profile
     def generalize_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -865,7 +785,6 @@ class AzureClient(object):
         self.compute_client.virtual_machines. \
             generalize(self.resource_group, vm_name)
 
-    @profile
     def start_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -874,7 +793,6 @@ class AzureClient(object):
             start(self.resource_group,
                   vm_name).wait()
 
-    @profile
     def update_vm_tags(self, vm_id, tags):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -883,7 +801,6 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              vm_name, tags).result()
 
-    @profile
     def delete_nic(self, nic_id):
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
@@ -892,7 +809,6 @@ class AzureClient(object):
             network_interfaces.delete(self.resource_group,
                                       nic_name).wait()
 
-    @profile
     def get_nic(self, nic_id):
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
@@ -900,7 +816,6 @@ class AzureClient(object):
         return self.network_management_client. \
             network_interfaces.get(self.resource_group, nic_name)
 
-    @profile
     def update_nic(self, nic_id, params):
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
@@ -914,7 +829,6 @@ class AzureClient(object):
         nic_info = async_nic_creation.result()
         return nic_info
 
-    @profile
     def create_nic(self, nic_name, params):
         return self.network_management_client. \
             network_interfaces.create_or_update(
@@ -923,13 +837,11 @@ class AzureClient(object):
                 params
             ).result()
 
-    @profile
     def create_public_key(self, entity):
         return self.table_service. \
             insert_or_replace_entity(self.public_key_storage_table_name,
                                      entity)
 
-    @profile
     def get_public_key(self, name):
         entities = self.table_service. \
             query_entities(self.public_key_storage_table_name,
@@ -937,12 +849,10 @@ class AzureClient(object):
 
         return entities.items[0] if len(entities.items) > 0 else None
 
-    @profile
     def delete_public_key(self, entity):
         self.table_service.delete_entity(self.public_key_storage_table_name,
                                          entity.PartitionKey, entity.RowKey)
 
-    @profile
     def list_public_keys(self, partition_key, limit=None, marker=None):
         entities = self.table_service. \
             query_entities(self.public_key_storage_table_name,
@@ -950,13 +860,11 @@ class AzureClient(object):
                            marker=marker, num_results=limit)
         return (entities.items, entities.next_marker)
 
-    @profile
     def delete_route_table(self, route_table_name):
         self.network_management_client. \
             route_tables.delete(self.resource_group, route_table_name
                                 ).wait()
 
-    @profile
     def attach_subnet_to_route_table(self, subnet_id, route_table_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -983,7 +891,6 @@ class AzureClient(object):
 
         return subnet_info
 
-    @profile
     def detach_subnet_to_route_table(self, subnet_id, route_table_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -1009,12 +916,10 @@ class AzureClient(object):
 
         return subnet_info
 
-    @profile
     def list_route_tables(self):
         return self.network_management_client. \
             route_tables.list(self.resource_group)
 
-    @profile
     def get_route_table(self, router_id):
         url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
                                              router_id)
@@ -1022,14 +927,12 @@ class AzureClient(object):
         return self.network_management_client. \
             route_tables.get(self.resource_group, router_name)
 
-    @profile
     def create_route_table(self, route_table_name, params):
         return self.network_management_client. \
             route_tables.create_or_update(
              self.resource_group,
              route_table_name, params).result()
 
-    @profile
     def update_route_table_tags(self, route_table_name, tags):
         self.network_management_client.route_tables. \
             create_or_update(self.resource_group,

+ 23 - 0
cloudbridge/cloud/providers/azure/resources.py

@@ -79,6 +79,7 @@ class AzureVMFirewall(BaseVMFirewall):
         return self._vm_firewall.tags.get('Label', None)
 
     @label.setter
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._vm_firewall.tags.update(Label=value or "")
@@ -90,6 +91,7 @@ class AzureVMFirewall(BaseVMFirewall):
         return self._vm_firewall.tags.get('Description')
 
     @description.setter
+    @profile
     def description(self, value):
         self._vm_firewall.tags.update(Description=value or "")
         self._provider.azure_client.\
@@ -100,6 +102,7 @@ class AzureVMFirewall(BaseVMFirewall):
     def rules(self):
         return self._rule_container
 
+    @profile
     def refresh(self):
         """
         Refreshes the security group with tags if required.
@@ -259,6 +262,7 @@ class AzureBucketObject(BaseBucketObject):
         return self._provider.azure_client.get_blob_url(
             self._container.id, self.id, expires_in)
 
+    @profile
     def refresh(self):
         self._key = self._provider.azure_client.get_blob(
             self._container.id, self._key.id)
@@ -349,6 +353,7 @@ class AzureVolume(BaseVolume):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the volume label.
@@ -364,6 +369,7 @@ class AzureVolume(BaseVolume):
         return self._volume.tags.get('Description', None)
 
     @description.setter
+    @profile
     def description(self, value):
         self._volume.tags.update(Description=value or "")
         self._provider.azure_client. \
@@ -443,6 +449,7 @@ class AzureVolume(BaseVolume):
         return AzureVolume.VOLUME_STATE_MAP.get(
             self._state, VolumeState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this volume by re-querying the cloud provider
@@ -501,6 +508,7 @@ class AzureSnapshot(BaseSnapshot):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the snapshot label.
@@ -516,6 +524,7 @@ class AzureSnapshot(BaseSnapshot):
         return self._snapshot.tags.get('Description', None)
 
     @description.setter
+    @profile
     def description(self, value):
         self._snapshot.tags.update(Description=value or "")
         self._provider.azure_client. \
@@ -539,6 +548,7 @@ class AzureSnapshot(BaseSnapshot):
         return AzureSnapshot.SNAPSHOT_STATE_MAP.get(
             self._state, SnapshotState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this snapshot by re-querying the cloud provider
@@ -617,6 +627,7 @@ class AzureMachineImage(BaseMachineImage):
             return self._image.tags.get('Label', None)
 
     @label.setter
+    @profile
     def label(self, value):
         """
         Set the image label when it is a private image.
@@ -642,6 +653,7 @@ class AzureMachineImage(BaseMachineImage):
             return self._image.tags.get('Description', None)
 
     @description.setter
+    @profile
     def description(self, value):
         """
         Set the image description.
@@ -690,6 +702,7 @@ class AzureMachineImage(BaseMachineImage):
         """
         return isinstance(self._image, GalleryImageReference)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this instance by re-querying the cloud provider
@@ -743,6 +756,7 @@ class AzureNetwork(BaseNetwork):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the network label.
@@ -765,6 +779,7 @@ class AzureNetwork(BaseNetwork):
         return AzureNetwork.NETWORK_STATE_MAP.get(
             self._state, NetworkState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this network by re-querying the cloud provider
@@ -834,6 +849,7 @@ class AzureFloatingIP(BaseFloatingIP):
     def in_use(self):
         return True if self._ip.ip_configuration else False
 
+    @profile
     def refresh(self):
         # Gateway is not needed as it doesn't exist in Azure, so just
         # getting the Floating IP again from the client
@@ -940,6 +956,7 @@ class AzureSubnet(BaseSubnet):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         network = self.network
@@ -979,6 +996,7 @@ class AzureSubnet(BaseSubnet):
     def state(self):
         return self._SUBNET_STATE_MAP.get(self._state, NetworkState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this network by re-querying the cloud provider
@@ -1067,6 +1085,7 @@ class AzureInstance(BaseInstance):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the instance label.
@@ -1318,6 +1337,7 @@ class AzureInstance(BaseInstance):
         return AzureInstance.INSTANCE_STATE_MAP.get(
             self._state, InstanceState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this instance by re-querying the cloud provider
@@ -1440,6 +1460,7 @@ class AzureRouter(BaseRouter):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the router label.
@@ -1450,6 +1471,7 @@ class AzureRouter(BaseRouter):
             update_route_table_tags(self._route_table.name,
                                     self._route_table)
 
+    @profile
     def refresh(self):
         self._route_table = self._provider.azure_client. \
             get_route_table(self._route_table.name)
@@ -1508,6 +1530,7 @@ class AzureInternetGateway(BaseInternetGateway):
     def name(self):
         return "cb-gateway-wrapper"
 
+    @profile
     def refresh(self):
         pass
 

+ 63 - 0
cloudbridge/cloud/providers/azure/services.py

@@ -92,6 +92,7 @@ class AzureVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.get",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, vm_firewall_id):
         try:
             fws = self.provider.azure_client.get_vm_firewall(vm_firewall_id)
@@ -103,6 +104,7 @@ class AzureVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.list",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         fws = [AzureVMFirewall(self.provider, fw)
                for fw in self.provider.azure_client.list_vm_firewall()]
@@ -111,6 +113,7 @@ class AzureVMFirewallService(BaseVMFirewallService):
     @cb_helpers.deprecated_alias(network_id='network')
     @dispatch(event="provider.security.vm_firewalls.create",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, description=None):
         AzureVMFirewall.assert_valid_resource_label(label)
         name = AzureVMFirewall._generate_name_from_label(label, "cb-fw")
@@ -155,6 +158,7 @@ class AzureVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.delete",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, vm_firewall):
         fw_id = (vm_firewall.id if isinstance(vm_firewall, AzureVMFirewall)
                  else vm_firewall)
@@ -168,6 +172,7 @@ class AzureVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.list",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, firewall, limit=None, marker=None):
         # Filter out firewall rules with priority < 3500 because values
         # between 3500 and 4096 are assumed to be owned by cloudbridge
@@ -181,6 +186,7 @@ class AzureVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.create",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, firewall, direction, protocol=None, from_port=None,
                to_port=None, cidr=None, src_dest_fw=None):
         if protocol and from_port and to_port:
@@ -231,6 +237,7 @@ class AzureVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.delete",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, firewall, rule):
         rule_id = rule.id if isinstance(rule, AzureVMFirewallRule) else rule
         fw_name = firewall.name
@@ -251,6 +258,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.get",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, key_pair_id):
         try:
             key_pair = self.provider.azure_client.\
@@ -266,6 +274,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.list",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         key_pairs, resume_marker = self.provider.azure_client.list_public_keys(
             AzureKeyPairService.PARTITION_KEY, marker=marker,
@@ -279,6 +288,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.find",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['name']
@@ -295,6 +305,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.create",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, public_key_material=None):
         AzureKeyPair.assert_valid_resource_name(name)
         key_pair = self.get(name)
@@ -321,6 +332,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.delete",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, key_pair):
         key_pair = (key_pair if isinstance(key_pair, AzureKeyPair) else
                     self.get(key_pair))
@@ -362,6 +374,7 @@ class AzureVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.get",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, volume_id):
         try:
             volume = self.provider.azure_client.get_disk(volume_id)
@@ -373,6 +386,7 @@ class AzureVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.find",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -389,6 +403,7 @@ class AzureVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         azure_vols = self.provider.azure_client.list_disks()
         cb_vols = [AzureVolume(self.provider, vol) for vol in azure_vols]
@@ -397,6 +412,7 @@ class AzureVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.create",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, size, zone, snapshot=None, description=None):
         AzureVolume.assert_valid_resource_label(label)
         disk_name = AzureVolume._generate_name_from_label(label, "cb-vol")
@@ -444,6 +460,7 @@ class AzureVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.delete",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, volume_id):
         vol_id = (volume_id.id if isinstance(volume_id, AzureVolume)
                   else volume_id)
@@ -456,6 +473,7 @@ class AzureSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.get",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, snapshot_id):
         try:
             snapshot = self.provider.azure_client.get_snapshot(snapshot_id)
@@ -467,6 +485,7 @@ class AzureSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.find",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -483,6 +502,7 @@ class AzureSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.list",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         snaps = [AzureSnapshot(self.provider, obj)
                  for obj in
@@ -491,6 +511,7 @@ class AzureSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.create",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, volume, description=None):
         AzureSnapshot.assert_valid_resource_label(label)
         snapshot_name = AzureSnapshot._generate_name_from_label(label,
@@ -518,6 +539,7 @@ class AzureSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.delete",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, snapshot_id):
         snap_id = (snapshot_id.id if isinstance(snapshot_id, AzureSnapshot)
                    else snapshot_id)
@@ -530,6 +552,7 @@ class AzureBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.get",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, bucket_id):
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -544,6 +567,7 @@ class AzureBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.list",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         buckets = [AzureBucket(self.provider, bucket)
                    for bucket
@@ -553,6 +577,7 @@ class AzureBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.create",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, location=None):
         """
         Create a new bucket.
@@ -563,6 +588,7 @@ class AzureBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.delete",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, bucket):
         """
         Delete this bucket.
@@ -575,6 +601,7 @@ class AzureBucketObjectService(BaseBucketObjectService):
     def __init__(self, provider):
         super(AzureBucketObjectService, self).__init__(provider)
 
+    @profile
     def get(self, bucket, object_id):
         """
         Retrieve a given object from this bucket.
@@ -587,6 +614,7 @@ class AzureBucketObjectService(BaseBucketObjectService):
             log.exception(azureEx)
             return None
 
+    @profile
     def list(self, bucket, limit=None, marker=None, prefix=None):
         """
         List all objects within this bucket.
@@ -601,6 +629,7 @@ class AzureBucketObjectService(BaseBucketObjectService):
         return ClientPagedResultList(self.provider, objects,
                                      limit=limit, marker=marker)
 
+    @profile
     def find(self, bucket, **kwargs):
         obj_list = [AzureBucketObject(self.provider, bucket, obj)
                     for obj in
@@ -609,6 +638,7 @@ class AzureBucketObjectService(BaseBucketObjectService):
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self.provider, list(matches))
 
+    @profile
     def create(self, bucket, name):
         self.provider.azure_client.create_blob_from_text(
             bucket.name, name, '')
@@ -644,6 +674,7 @@ class AzureImageService(BaseImageService):
     def __init__(self, provider):
         super(AzureImageService, self).__init__(provider)
 
+    @profile
     def get(self, image_id):
         """
         Returns an Image given its id
@@ -656,6 +687,7 @@ class AzureImageService(BaseImageService):
             log.exception(cloud_error)
             return None
 
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -670,6 +702,7 @@ class AzureImageService(BaseImageService):
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
 
+    @profile
     def list(self, filter_by_owner=True, limit=None, marker=None):
         """
         List all images.
@@ -823,11 +856,13 @@ class AzureInstanceService(BaseInstanceService):
 
         return data_disks, root_disk_size
 
+    @profile
     def create_launch_config(self):
         return AzureLaunchConfig(self.provider)
 
     @dispatch(event="provider.compute.instances.create",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, image, vm_type, subnet, zone,
                key_pair=None, vm_firewalls=None, user_data=None,
                launch_config=None, **kwargs):
@@ -963,6 +998,7 @@ class AzureInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.list",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all instances.
@@ -974,6 +1010,7 @@ class AzureInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.get",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, instance_id):
         """
         Returns an instance given its id. Returns None
@@ -989,6 +1026,7 @@ class AzureInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.find",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -1005,6 +1043,7 @@ class AzureInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, instance):
         """
         Permanently terminate this instance.
@@ -1055,6 +1094,7 @@ class AzureVMTypeService(BaseVMTypeService):
 
     @dispatch(event="provider.compute.vm_types.list",
               priority=BaseVMTypeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         vm_types = [AzureVMType(self.provider, vm_type)
                     for vm_type in self.instance_data]
@@ -1068,6 +1108,7 @@ class AzureRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.get",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, region_id):
         region = None
         for azureRegion in self.provider.azure_client.list_locations():
@@ -1078,6 +1119,7 @@ class AzureRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.list",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         regions = [AzureRegion(self.provider, region)
                    for region in self.provider.azure_client.list_locations()]
@@ -1125,6 +1167,7 @@ class AzureNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.get",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, network_id):
         try:
             network = self.provider.azure_client.get_network(network_id)
@@ -1136,6 +1179,7 @@ class AzureNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.list",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         networks = [AzureNetwork(self.provider, network)
                     for network in self.provider.azure_client.list_networks()]
@@ -1144,6 +1188,7 @@ class AzureNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.create",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, cidr_block):
         AzureNetwork.assert_valid_resource_label(label)
         params = {
@@ -1163,6 +1208,7 @@ class AzureNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.delete",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network):
         net_id = network.id if isinstance(network, AzureNetwork) else network
         if net_id:
@@ -1198,6 +1244,7 @@ class AzureSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.get",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, subnet_id):
         """
          Azure does not provide an api to get the subnet directly by id.
@@ -1216,6 +1263,7 @@ class AzureSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.list",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network=None, limit=None, marker=None):
         return ClientPagedResultList(self.provider,
                                      self._list_subnets(network),
@@ -1223,6 +1271,7 @@ class AzureSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.find",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, network=None, **kwargs):
         obj_list = self._list_subnets(network)
         filters = ['label']
@@ -1233,6 +1282,7 @@ class AzureSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.create",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, cidr_block, zone):
         AzureSubnet.assert_valid_resource_label(label)
         # Although Subnet doesn't support tags in Azure, we use the parent
@@ -1257,6 +1307,7 @@ class AzureSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.delete",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, subnet):
         sn = subnet if isinstance(subnet, AzureSubnet) else self.get(subnet)
         if sn:
@@ -1277,6 +1328,7 @@ class AzureRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.get",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, router_id):
         try:
             route = self.provider.azure_client.get_route_table(router_id)
@@ -1288,6 +1340,7 @@ class AzureRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.find",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -1304,6 +1357,7 @@ class AzureRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.list",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         routes = [AzureRouter(self.provider, route)
                   for route in
@@ -1314,6 +1368,7 @@ class AzureRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.create",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network):
         router_name = AzureRouter._generate_name_from_label(label, "cb-router")
 
@@ -1326,6 +1381,7 @@ class AzureRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.delete",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, router):
         r = router if isinstance(router, AzureRouter) else self.get(router)
         if r:
@@ -1346,11 +1402,13 @@ class AzureGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.get_or_create",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get_or_create(self, network):
         return self._gateway_singleton(network)
 
     @dispatch(event="provider.networking.gateways.list",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network, limit=None, marker=None):
         gws = [self._gateway_singleton(network)]
         return ClientPagedResultList(self.provider,
@@ -1359,6 +1417,7 @@ class AzureGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.delete",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network, gateway):
         pass
 
@@ -1370,6 +1429,7 @@ class AzureFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.get",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, gateway, fip_id):
         try:
             az_ip = self.provider.azure_client.get_floating_ip(fip_id)
@@ -1381,6 +1441,7 @@ class AzureFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.list",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, gateway, limit=None, marker=None):
         floating_ips = [AzureFloatingIP(self.provider, floating_ip)
                         for floating_ip in self.provider.azure_client.
@@ -1390,6 +1451,7 @@ class AzureFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.create",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, gateway):
         public_ip_parameters = {
             'location': self.provider.azure_client.region_name,
@@ -1405,6 +1467,7 @@ class AzureFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.delete",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, gateway, fip):
         fip_id = fip.id if isinstance(fip, AzureFloatingIP) else fip
         self.provider.azure_client.delete_floating_ip(fip_id)

+ 22 - 0
cloudbridge/cloud/providers/gcp/resources.py

@@ -480,6 +480,7 @@ class GCPVMFirewall(BaseVMFirewall):
         return helpers.get_metadata_item_value(self._provider, tag_name)
 
     @label.setter
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         tag_name = "_".join(["firewall", self.name, "label"])
@@ -505,6 +506,7 @@ class GCPVMFirewall(BaseVMFirewall):
         return self._description
 
     @description.setter
+    @profile
     def description(self, value):
         # Change the description on all rules
         for fw in self._delegate.iter_firewalls(self._vm_firewall,
@@ -537,6 +539,7 @@ class GCPVMFirewall(BaseVMFirewall):
         js['rules'] = json_rules
         return js
 
+    @profile
     def refresh(self):
         fw = self._provider.security.vm_firewalls.get(self.id)
         # restore all internal state
@@ -709,6 +712,7 @@ class GCPMachineImage(BaseMachineImage):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         req = (self._provider
                    .gcp_compute
@@ -754,6 +758,7 @@ class GCPMachineImage(BaseMachineImage):
         return GCPMachineImage.IMAGE_STATE_MAP.get(
             self._gcp_image['status'], MachineImageState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this instance by re-querying the cloud provider
@@ -816,6 +821,7 @@ class GCPInstance(BaseInstance):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         req = (self._provider
                    .gcp_compute
@@ -1228,6 +1234,7 @@ class GCPInstance(BaseInstance):
         return GCPInstance.INSTANCE_STATE_MAP.get(
             self._gcp_instance['status'], InstanceState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this instance by re-querying the cloud provider
@@ -1296,6 +1303,7 @@ class GCPNetwork(BaseNetwork):
         return helpers.get_metadata_item_value(self._provider, tag_name)
 
     @label.setter
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         tag_name = "_".join(["network", self.name, "label"])
@@ -1329,6 +1337,7 @@ class GCPNetwork(BaseNetwork):
     def subnets(self):
         return self._subnet_svc
 
+    @profile
     def refresh(self):
         net = self._provider.networking.networks.get(self.id)
         if net:
@@ -1378,6 +1387,7 @@ class GCPFloatingIP(BaseFloatingIP):
     def in_use(self):
         return True if self._target_instance else False
 
+    @profile
     def refresh(self):
         # pylint:disable=protected-access
         fip = self._provider.networking._floating_ips.get(None, self.id)
@@ -1433,6 +1443,7 @@ class GCPRouter(BaseRouter):
         return helpers.get_metadata_item_value(self._provider, tag_name)
 
     @label.setter
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         tag_name = "_".join(["router", self.name, "label"])
@@ -1443,6 +1454,7 @@ class GCPRouter(BaseRouter):
         parsed_url = self._provider.parse_url(self.id)
         return parsed_url.parameters['region']
 
+    @profile
     def refresh(self):
         router = self._provider.networking.routers.get(self.id)
         if router:
@@ -1508,6 +1520,7 @@ class GCPInternetGateway(BaseInternetGateway):
     def name(self):
         return self._gateway['name']
 
+    @profile
     def refresh(self):
         pass
 
@@ -1550,6 +1563,7 @@ class GCPSubnet(BaseSubnet):
         return helpers.get_metadata_item_value(self._provider, tag_name)
 
     @label.setter
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         tag_name = "_".join(["subnet", self.name, "label"])
@@ -1586,6 +1600,7 @@ class GCPSubnet(BaseSubnet):
             return SubnetState.UNKNOWN
         return SubnetState.AVAILABLE
 
+    @profile
     def refresh(self):
         subnet = self._provider.networking.subnets.get(self.id)
         if subnet:
@@ -1626,6 +1641,7 @@ class GCPVolume(BaseVolume):
         return labels.get('cblabel', '') if labels else ''
 
     @label.setter
+    @profile
     def label(self, value):
         req = (self._provider
                    .gcp_compute
@@ -1645,6 +1661,7 @@ class GCPVolume(BaseVolume):
         return self._volume.get('description', '')
 
     @description.setter
+    @profile
     def description(self, value):
         req = (self._provider
                .gcp_compute
@@ -1769,6 +1786,7 @@ class GCPVolume(BaseVolume):
         return GCPVolume.VOLUME_STATE_MAP.get(
             self._volume.get('status'), VolumeState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this volume by re-querying the cloud provider
@@ -1812,6 +1830,7 @@ class GCPSnapshot(BaseSnapshot):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         req = (self._provider
                    .gcp_compute
@@ -1830,6 +1849,7 @@ class GCPSnapshot(BaseSnapshot):
         return self._snapshot.get('description', '')
 
     @description.setter
+    @profile
     def description(self, value):
         req = (self._provider
                .gcp_compute
@@ -1857,6 +1877,7 @@ class GCPSnapshot(BaseSnapshot):
         return GCPSnapshot.SNAPSHOT_STATE_MAP.get(
             self._snapshot.get('status'), SnapshotState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this snapshot by re-querying the cloud provider
@@ -1994,6 +2015,7 @@ class GCPBucketObject(BaseBucketObject):
                                               expiration,
                                               url_encoded_signature))
 
+    @profile
     def refresh(self):
         # pylint:disable=protected-access
         self._obj = self.bucket.objects.get(self.id)._obj

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

@@ -90,6 +90,7 @@ class GCPKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.get",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, key_pair_id):
         """
         Returns a KeyPair given its ID.
@@ -102,6 +103,7 @@ class GCPKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.list",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         key_pairs = []
         for item in helpers.find_matching_metadata_items(
@@ -114,6 +116,7 @@ class GCPKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.find",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         """
         Searches for a key pair by a given list of attributes.
@@ -133,6 +136,7 @@ class GCPKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.create",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, public_key_material=None):
         GCPKeyPair.assert_valid_resource_name(name)
         private_key = None
@@ -159,6 +163,7 @@ class GCPKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.delete",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, key_pair):
         key_pair = (key_pair if isinstance(key_pair, GCPKeyPair) else
                     self.get(key_pair))
@@ -175,6 +180,7 @@ class GCPVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.get",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, vm_firewall_id):
         tag, network_name = \
             self._delegate.get_tag_network_from_id(vm_firewall_id)
@@ -185,6 +191,7 @@ class GCPVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.list",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         vm_firewalls = []
         for tag, network_name in self._delegate.tag_networks:
@@ -197,6 +204,7 @@ class GCPVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.create",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, description=None):
         GCPVMFirewall.assert_valid_resource_label(label)
         network = (network if isinstance(network, GCPNetwork)
@@ -213,11 +221,13 @@ class GCPVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.delete",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, vm_firewall):
         fw_id = (vm_firewall.id if isinstance(vm_firewall, GCPVMFirewall)
                  else vm_firewall)
         return self._delegate.delete_tag_network_with_id(fw_id)
 
+    @profile
     def find_by_network_and_tags(self, network_name, tags):
         """
         Finds non-empty VM firewalls by network name and VM firewall names
@@ -243,6 +253,7 @@ class GCPVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.list",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, firewall, limit=None, marker=None):
         rules = []
         for fw in firewall.delegate.iter_firewalls(
@@ -270,6 +281,7 @@ class GCPVMFirewallRuleService(BaseVMFirewallRuleService):
         else:
             return to_port
 
+    @profile
     def create_with_priority(self, firewall, direction, protocol, priority,
                              from_port=None, to_port=None, cidr=None,
                              src_dest_fw=None):
@@ -293,6 +305,7 @@ class GCPVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.create",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, firewall, direction, protocol, from_port=None,
                to_port=None, cidr=None, src_dest_fw=None):
         return self.create_with_priority(firewall, direction, protocol,
@@ -301,6 +314,7 @@ class GCPVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.delete",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, firewall, rule):
         rule = (rule if isinstance(rule, GCPVMFirewallRule)
                 else self.get(firewall, rule))
@@ -326,12 +340,14 @@ class GCPVMTypeService(BaseVMTypeService):
 
     @dispatch(event="provider.compute.vm_types.get",
               priority=BaseVMTypeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, vm_type_id):
         vm_type = self.provider.get_resource('machineTypes', vm_type_id)
         return GCPVMType(self.provider, vm_type) if vm_type else None
 
     @dispatch(event="provider.compute.vm_types.find",
               priority=BaseVMTypeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         matched_inst_types = []
         for inst_type in self.instance_data:
@@ -350,6 +366,7 @@ class GCPVMTypeService(BaseVMTypeService):
 
     @dispatch(event="provider.compute.vm_types.list",
               priority=BaseVMTypeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         inst_types = [GCPVMType(self.provider, inst_type)
                       for inst_type in self.instance_data]
@@ -364,6 +381,7 @@ class GCPRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.get",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, region_id):
         region = self.provider.get_resource('regions', region_id,
                                             region=region_id)
@@ -371,6 +389,7 @@ class GCPRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.list",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         max_result = limit if limit is not None and limit < 500 else 500
         regions_response = (self.provider
@@ -413,6 +432,7 @@ class GCPImageService(BaseImageService):
                 self._public_images.append(
                     GCPMachineImage(self.provider, image))
 
+    @profile
     def get(self, image_id):
         """
         Returns an Image given its id
@@ -426,6 +446,7 @@ class GCPImageService(BaseImageService):
                 return public_image
         return None
 
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         """
         Searches for an image by a given list of attributes
@@ -443,6 +464,7 @@ class GCPImageService(BaseImageService):
         return ClientPagedResultList(self.provider, images,
                                      limit=limit, marker=marker)
 
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all images.
@@ -467,6 +489,7 @@ class GCPInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.create",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, image, vm_type, subnet, zone=None,
                key_pair=None, vm_firewalls=None, user_data=None,
                launch_config=None, **kwargs):
@@ -618,6 +641,7 @@ class GCPInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.get",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, instance_id):
         """
         Returns an instance given its name. Returns None
@@ -631,6 +655,7 @@ class GCPInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.find",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         """
         Searches for instances by instance label.
@@ -651,6 +676,7 @@ class GCPInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.list",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all instances.
@@ -677,6 +703,7 @@ class GCPInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, instance):
         instance = (instance if isinstance(instance, GCPInstance) else
                     self.get(instance))
@@ -689,6 +716,7 @@ class GCPInstanceService(BaseInstanceService):
                      instance=instance.name)
              .execute())
 
+    @profile
     def create_launch_config(self):
         return GCPLaunchConfig(self.provider)
 
@@ -757,12 +785,14 @@ class GCPNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.get",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, network_id):
         network = self.provider.get_resource('networks', network_id)
         return GCPNetwork(self.provider, network) if network else None
 
     @dispatch(event="provider.networking.networks.find",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         """
         GCP networks are global. There is at most one network with a given
@@ -776,6 +806,7 @@ class GCPNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.list",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None, filter=None):
         # TODO: Decide whether we keep filter in 'list'
         networks = []
@@ -792,6 +823,7 @@ class GCPNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.create",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, cidr_block):
         """
         Creates an auto mode VPC network with default subnets. It is possible
@@ -813,6 +845,7 @@ class GCPNetworkService(BaseNetworkService):
         cb_net.label = label
         return cb_net
 
+    @profile
     def get_or_create_default(self):
         default_nets = self.provider.networking.networks.find(
             label=GCPNetwork.CB_DEFAULT_NETWORK_LABEL)
@@ -827,6 +860,7 @@ class GCPNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.delete",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network):
         # Accepts network object
         if isinstance(network, GCPNetwork):
@@ -858,6 +892,7 @@ class GCPRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.get",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, router_id):
         router = self.provider.get_resource(
             'routers', router_id, region=self.provider.region_name)
@@ -865,6 +900,7 @@ class GCPRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.find",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         obj_list = self
         filters = ['name', 'label']
@@ -874,6 +910,7 @@ class GCPRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.list",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         region = self.provider.region_name
         max_result = limit if limit is not None and limit < 500 else 500
@@ -897,6 +934,7 @@ class GCPRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.create",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network):
         log.debug("Creating GCP Router Service with params "
                   "[label: %s network: %s]", label, network)
@@ -922,6 +960,7 @@ class GCPRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.delete",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, router):
         r = router if isinstance(router, GCPRouter) else self.get(router)
         if r:
@@ -956,12 +995,14 @@ class GCPSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.get",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, subnet_id):
         subnet = self.provider.get_resource('subnetworks', subnet_id)
         return GCPSubnet(self.provider, subnet) if subnet else None
 
     @dispatch(event="provider.networking.subnets.list",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network=None, zone=None, limit=None, marker=None):
         """
         If the zone is not given, we list all subnets in the default region.
@@ -990,6 +1031,7 @@ class GCPSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.create",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, cidr_block, zone):
         """
         GCP subnets are regional. The region is inferred from the zone;
@@ -1034,6 +1076,7 @@ class GCPSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.delete",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, subnet):
         sn = subnet if isinstance(subnet, GCPSubnet) else self.get(subnet)
         if not sn:
@@ -1052,6 +1095,7 @@ class GCPSubnetService(BaseSubnetService):
             log.warning('No label was found associated with this subnet '
                         '"{}" when deleted.'.format(sn.name))
 
+    @profile
     def get_or_create_default(self, zone):
         """
         Return an existing or create a new subnet for the supplied zone.
@@ -1151,12 +1195,14 @@ class GCPVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.get",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, volume_id):
         vol = self.provider.get_resource('disks', volume_id)
         return GCPVolume(self.provider, vol) if vol else None
 
     @dispatch(event="provider.storage.volumes.find",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         """
         Searches for a volume by a given list of attributes.
@@ -1191,6 +1237,7 @@ class GCPVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all volumes.
@@ -1221,6 +1268,7 @@ class GCPVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.create",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, size, zone, snapshot=None, description=None):
         GCPVolume.assert_valid_resource_label(label)
         name = GCPVolume._generate_name_from_label(label, 'cb-vol')
@@ -1254,6 +1302,7 @@ class GCPVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.delete",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, volume):
         volume = volume if isinstance(volume, GCPVolume) else self.get(volume)
         if volume:
@@ -1272,12 +1321,14 @@ class GCPSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.get",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, snapshot_id):
         snapshot = self.provider.get_resource('snapshots', snapshot_id)
         return GCPSnapshot(self.provider, snapshot) if snapshot else None
 
     @dispatch(event="provider.storage.snapshots.find",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -1308,6 +1359,7 @@ class GCPSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.list",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         max_result = limit if limit is not None and limit < 500 else 500
         response = (self.provider
@@ -1328,6 +1380,7 @@ class GCPSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.create",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, volume, description=None):
         GCPSnapshot.assert_valid_resource_label(label)
         name = GCPSnapshot._generate_name_from_label(label, 'cbsnap')
@@ -1356,6 +1409,7 @@ class GCPSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.delete",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, snapshot):
         snapshot = (snapshot if isinstance(snapshot, GCPSnapshot)
                     else self.get(snapshot))
@@ -1375,6 +1429,7 @@ class GCPBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.get",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, bucket_id):
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -1386,6 +1441,7 @@ class GCPBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.find",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, limit=None, marker=None, **kwargs):
         name = kwargs.pop('name', None)
 
@@ -1401,6 +1457,7 @@ class GCPBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.list",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all containers.
@@ -1425,6 +1482,7 @@ class GCPBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.create",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, location=None):
         GCPBucket.assert_valid_resource_name(name)
         body = {'name': name}
@@ -1452,6 +1510,7 @@ class GCPBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.delete",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, bucket):
         """
         Delete this bucket.
@@ -1474,6 +1533,7 @@ class GCPBucketObjectService(BaseBucketObjectService):
     def __init__(self, provider):
         super(GCPBucketObjectService, self).__init__(provider)
 
+    @profile
     def get(self, bucket, name):
         """
         Retrieve a given object from this bucket.
@@ -1482,6 +1542,7 @@ class GCPBucketObjectService(BaseBucketObjectService):
                                          bucket=bucket.name)
         return GCPBucketObject(self.provider, bucket, obj) if obj else None
 
+    @profile
     def list(self, bucket, limit=None, marker=None, prefix=None):
         """
         List all objects within this bucket.
@@ -1505,6 +1566,7 @@ class GCPBucketObjectService(BaseBucketObjectService):
                                      response.get('nextPageToken'),
                                      False, data=objects)
 
+    @profile
     def find(self, bucket, limit=None, marker=None, **kwargs):
         filters = ['name']
         matches = cb_helpers.generic_find(filters, kwargs, bucket.objects)
@@ -1521,6 +1583,7 @@ class GCPBucketObjectService(BaseBucketObjectService):
                     .execute())
         return response
 
+    @profile
     def create(self, bucket, name):
         response = self._create_object_with_media_body(
                             bucket,
@@ -1546,16 +1609,19 @@ class GCPGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.get_or_create",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get_or_create(self, network):
         return self._default_internet_gateway
 
     @dispatch(event="provider.networking.gateways.delete",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network, gateway):
         pass
 
     @dispatch(event="provider.networking.gateways.list",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network, limit=None, marker=None):
         gws = [self._default_internet_gateway]
         return ClientPagedResultList(self._provider,
@@ -1570,6 +1636,7 @@ class GCPFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.get",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, gateway, floating_ip_id):
         fip = self.provider.get_resource('addresses', floating_ip_id)
         return (GCPFloatingIP(self.provider, fip)
@@ -1577,6 +1644,7 @@ class GCPFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.list",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, gateway, limit=None, marker=None):
         max_result = limit if limit is not None and limit < 500 else 500
         response = (self.provider
@@ -1598,6 +1666,7 @@ class GCPFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.create",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, gateway):
         region_name = self.provider.region_name
         ip_name = 'ip-{0}'.format(uuid.uuid4())
@@ -1613,6 +1682,7 @@ class GCPFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.delete",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, gateway, fip):
         fip = (fip if isinstance(fip, GCPFloatingIP)
                else self.get(gateway, fip))

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

@@ -107,6 +107,7 @@ class OpenStackMachineImage(BaseMachineImage):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the image label.
@@ -144,6 +145,7 @@ class OpenStackMachineImage(BaseMachineImage):
         return OpenStackMachineImage.IMAGE_STATE_MAP.get(
             self._os_image.status, MachineImageState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this instance by re-querying the cloud provider
@@ -309,6 +311,7 @@ class OpenStackInstance(BaseInstance):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the instance label.
@@ -487,6 +490,7 @@ class OpenStackInstance(BaseInstance):
         return OpenStackInstance.INSTANCE_STATE_MAP.get(
             self._os_instance.status, InstanceState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this instance by re-querying the cloud provider
@@ -577,6 +581,7 @@ class OpenStackVolume(BaseVolume):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the volume label.
@@ -590,6 +595,7 @@ class OpenStackVolume(BaseVolume):
         return self._volume.description
 
     @description.setter
+    @profile
     def description(self, value):
         self._volume.description = value
         self._volume.update(description=value)
@@ -653,6 +659,7 @@ class OpenStackVolume(BaseVolume):
         return OpenStackVolume.VOLUME_STATE_MAP.get(
             self._volume.status, VolumeState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this volume by re-querying the cloud provider
@@ -702,6 +709,7 @@ class OpenStackSnapshot(BaseSnapshot):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         """
         Set the snapshot label.
@@ -715,6 +723,7 @@ class OpenStackSnapshot(BaseSnapshot):
         return self._snapshot.description
 
     @description.setter
+    @profile
     def description(self, value):
         self._snapshot.description = value
         self._snapshot.update(description=value)
@@ -736,6 +745,7 @@ class OpenStackSnapshot(BaseSnapshot):
         return OpenStackSnapshot.SNAPSHOT_STATE_MAP.get(
             self._snapshot.status, SnapshotState.UNKNOWN)
 
+    @profile
     def refresh(self):
         """
         Refreshes the state of this snapshot by re-querying the cloud provider
@@ -799,6 +809,7 @@ class OpenStackNetwork(BaseNetwork):
         return self._network.get('name', None)
 
     @label.setter
+    @profile
     def label(self, value):
         """
         Set the network label.
@@ -828,6 +839,7 @@ class OpenStackNetwork(BaseNetwork):
     def subnets(self):
         return self._subnet_svc
 
+    @profile
     def refresh(self):
         """Refresh the state of this network by re-querying the provider."""
         network = self._provider.networking.networks.get(self.id)
@@ -863,6 +875,7 @@ class OpenStackSubnet(BaseSubnet):
         return self._subnet.get('name', None)
 
     @label.setter
+    @profile
     def label(self, value):  # pylint:disable=arguments-differ
         """
         Set the subnet label.
@@ -894,6 +907,7 @@ class OpenStackSubnet(BaseSubnet):
         return SubnetState.UNKNOWN if self._state == SubnetState.UNKNOWN \
              else SubnetState.AVAILABLE
 
+    @profile
     def refresh(self):
         subnet = self._provider.networking.subnets.get(self.id)
         if subnet:
@@ -927,6 +941,7 @@ class OpenStackFloatingIP(BaseFloatingIP):
     def in_use(self):
         return bool(self._ip.port_id)
 
+    @profile
     def refresh(self):
         net = self._provider.networking.networks.get(
             self._ip.floating_network_id)
@@ -959,6 +974,7 @@ class OpenStackRouter(BaseRouter):
         return self._router.name
 
     @label.setter
+    @profile
     def label(self, value):  # pylint:disable=arguments-differ
         """
         Set the router label.
@@ -966,6 +982,7 @@ class OpenStackRouter(BaseRouter):
         self.assert_valid_resource_label(value)
         self._router = self._provider.os_conn.update_router(self.id, value)
 
+    @profile
     def refresh(self):
         self._router = self._provider.os_conn.get_router(self.id)
 
@@ -1050,6 +1067,7 @@ class OpenStackInternetGateway(BaseInternetGateway):
     def network_id(self):
         return self._gateway_net.get('id')
 
+    @profile
     def refresh(self):
         """Refresh the state of this network by re-querying the provider."""
         network = self._provider.networking.networks.get(self.id)
@@ -1117,6 +1135,7 @@ class OpenStackVMFirewall(BaseVMFirewall):
             return None
 
     @description.setter
+    @profile
     def description(self, value):
         if not value:
             value = ""
@@ -1139,6 +1158,7 @@ class OpenStackVMFirewall(BaseVMFirewall):
 
     @label.setter
     # pylint:disable=arguments-differ
+    @profile
     def label(self, value):
         self.assert_valid_resource_label(value)
         self._provider.os_conn.network.update_security_group(
@@ -1149,6 +1169,7 @@ class OpenStackVMFirewall(BaseVMFirewall):
     def rules(self):
         return self._rule_svc
 
+    @profile
     def refresh(self):
         self._vm_firewall = self._provider.os_conn.network.get_security_group(
             self.id)
@@ -1321,6 +1342,7 @@ class OpenStackBucketObject(BaseBucketObject):
         return urljoin(access_point, generate_temp_url(url_path, expires_in,
                                                        temp_url_key, 'GET'))
 
+    @profile
     def refresh(self):
         self._obj = self.cbcontainer.objects.get(self.id)._obj
 

+ 67 - 0
cloudbridge/cloud/providers/openstack/services.py

@@ -98,6 +98,7 @@ class OpenStackSecurityService(BaseSecurityService):
     def _vm_firewall_rules(self):
         return self._vm_firewall_rule_svc
 
+    @profile
     def get_or_create_ec2_credentials(self):
         """
         A provider specific method than returns the ec2 credentials for the
@@ -116,6 +117,7 @@ class OpenStackSecurityService(BaseSecurityService):
 
         return None
 
+    @profile
     def get_ec2_endpoints(self):
         """
         A provider specific method than returns the ec2 endpoints if
@@ -136,6 +138,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.get",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, key_pair_id):
         """
         Returns a KeyPair given its id.
@@ -150,6 +153,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.list",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all key pairs associated with this account.
@@ -167,6 +171,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.find",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         name = kwargs.pop('name', None)
 
@@ -184,6 +189,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.create",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, public_key_material=None):
         OpenStackKeyPair.assert_valid_resource_name(name)
         existing_kp = self.find(name=name)
@@ -203,6 +209,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
 
     @dispatch(event="provider.security.key_pairs.delete",
               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, key_pair):
         keypair = (key_pair if isinstance(key_pair, OpenStackKeyPair)
                    else self.get(key_pair))
@@ -218,6 +225,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.get",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, vm_firewall_id):
         try:
             return OpenStackVMFirewall(
@@ -230,6 +238,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.list",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         firewalls = [
             OpenStackVMFirewall(self.provider, fw)
@@ -241,6 +250,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
     @cb_helpers.deprecated_alias(network_id='network')
     @dispatch(event="provider.security.vm_firewalls.create",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, description=None):
         OpenStackVMFirewall.assert_valid_resource_label(label)
         net_id = network.id if isinstance(network, Network) else network
@@ -262,6 +272,7 @@ class OpenStackVMFirewallService(BaseVMFirewallService):
 
     @dispatch(event="provider.security.vm_firewalls.delete",
               priority=BaseVMFirewallService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, vm_firewall):
         fw = (vm_firewall if isinstance(vm_firewall, OpenStackVMFirewall)
               else self.get(vm_firewall))
@@ -277,6 +288,7 @@ class OpenStackVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.list",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, firewall, limit=None, marker=None):
         # pylint:disable=protected-access
         rules = [OpenStackVMFirewallRule(firewall, r)
@@ -286,6 +298,7 @@ class OpenStackVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.create",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, firewall, direction, protocol=None, from_port=None,
                to_port=None, cidr=None, src_dest_fw=None):
         src_dest_fw_id = (src_dest_fw.id if isinstance(src_dest_fw,
@@ -324,6 +337,7 @@ class OpenStackVMFirewallRuleService(BaseVMFirewallRuleService):
 
     @dispatch(event="provider.security.vm_firewall_rules.delete",
               priority=BaseVMFirewallRuleService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, firewall, rule):
         rule_id = (rule.id if isinstance(rule, OpenStackVMFirewallRule)
                    else rule)
@@ -366,6 +380,7 @@ class OpenStackVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.get",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, volume_id):
         try:
             return OpenStackVolume(
@@ -376,6 +391,7 @@ class OpenStackVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.find",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -398,6 +414,7 @@ class OpenStackVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         cb_vols = [
             OpenStackVolume(self.provider, vol)
@@ -409,6 +426,7 @@ class OpenStackVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.create",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, size, zone, snapshot=None, description=None):
         OpenStackVolume.assert_valid_resource_label(label)
         zone_id = zone.id if isinstance(zone, PlacementZone) else zone
@@ -422,6 +440,7 @@ class OpenStackVolumeService(BaseVolumeService):
 
     @dispatch(event="provider.storage.volumes.delete",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, volume):
         volume = (volume if isinstance(volume, OpenStackVolume)
                   else self.get(volume))
@@ -437,6 +456,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.get",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, snapshot_id):
         try:
             return OpenStackSnapshot(
@@ -448,6 +468,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.find",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -471,6 +492,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.list",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         cb_snaps = [
             OpenStackSnapshot(self.provider, snap) for
@@ -482,6 +504,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.create",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, volume, description=None):
         OpenStackSnapshot.assert_valid_resource_label(label)
         volume_id = (volume.id if isinstance(volume, OpenStackVolume)
@@ -494,6 +517,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
     @dispatch(event="provider.storage.snapshots.delete",
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, snapshot):
         s = (snapshot if isinstance(snapshot, OpenStackSnapshot) else
              self.get(snapshot))
@@ -509,6 +533,7 @@ class OpenStackBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.get",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, bucket_id):
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -526,6 +551,7 @@ class OpenStackBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.find",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         name = kwargs.pop('name', None)
 
@@ -542,6 +568,7 @@ class OpenStackBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.list",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         _, container_list = self.provider.swift.get_account(
             limit=oshelpers.os_result_limit(self.provider, limit),
@@ -552,6 +579,7 @@ class OpenStackBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.create",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, name, location=None):
         OpenStackBucket.assert_valid_resource_name(name)
         location = location or self.provider.region_name
@@ -565,6 +593,7 @@ class OpenStackBucketService(BaseBucketService):
 
     @dispatch(event="provider.storage.buckets.delete",
               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, bucket):
         b_id = bucket.id if isinstance(bucket, OpenStackBucket) else bucket
         self.provider.swift.delete_container(b_id)
@@ -575,6 +604,7 @@ class OpenStackBucketObjectService(BaseBucketObjectService):
     def __init__(self, provider):
         super(OpenStackBucketObjectService, self).__init__(provider)
 
+    @profile
     def get(self, bucket, name):
         """
         Retrieve a given object from this bucket.
@@ -591,6 +621,7 @@ class OpenStackBucketObjectService(BaseBucketObjectService):
                                              obj)
         return None
 
+    @profile
     def list(self, bucket, limit=None, marker=None, prefix=None):
         """
         List all objects within this bucket.
@@ -610,6 +641,7 @@ class OpenStackBucketObjectService(BaseBucketObjectService):
             cb_objects,
             limit)
 
+    @profile
     def find(self, bucket, **kwargs):
         _, obj_list = self.provider.swift.get_container(bucket.name)
         cb_objs = [OpenStackBucketObject(self.provider, bucket, obj)
@@ -618,6 +650,7 @@ class OpenStackBucketObjectService(BaseBucketObjectService):
         matches = cb_helpers.generic_find(filters, kwargs, cb_objs)
         return ClientPagedResultList(self.provider, list(matches))
 
+    @profile
     def create(self, bucket, object_name):
         self.provider.swift.put_object(bucket.name, object_name, None)
         return self.get(bucket, object_name)
@@ -654,6 +687,7 @@ class OpenStackImageService(BaseImageService):
     def __init__(self, provider):
         super(OpenStackImageService, self).__init__(provider)
 
+    @profile
     def get(self, image_id):
         """
         Returns an Image given its id
@@ -666,11 +700,13 @@ class OpenStackImageService(BaseImageService):
             log.debug("Image %s not found", image_id)
             return None
 
+    @profile
     def find(self, **kwargs):
         filters = ['label']
         obj_list = self
         return cb_helpers.generic_find(filters, kwargs, obj_list)
 
+    @profile
     def list(self, filter_by_owner=True, limit=None, marker=None):
         """
         List all images.
@@ -744,11 +780,13 @@ class OpenStackInstanceService(BaseInstanceService):
                 return True
         return False
 
+    @profile
     def create_launch_config(self):
         return BaseLaunchConfig(self.provider)
 
     @dispatch(event="provider.compute.instances.create",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, image, vm_type, subnet, zone,
                key_pair=None, vm_firewalls=None, user_data=None,
                launch_config=None, **kwargs):
@@ -832,6 +870,7 @@ class OpenStackInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.find",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -852,6 +891,7 @@ class OpenStackInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.list",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         """
         List all instances.
@@ -865,6 +905,7 @@ class OpenStackInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.get",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, instance_id):
         """
         Returns an instance given its id.
@@ -878,6 +919,7 @@ class OpenStackInstanceService(BaseInstanceService):
 
     @dispatch(event="provider.compute.instances.delete",
               priority=BaseInstanceService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, instance):
         ins = (instance if isinstance(instance, OpenStackInstance) else
                self.get(instance))
@@ -899,6 +941,7 @@ class OpenStackVMTypeService(BaseVMTypeService):
 
     @dispatch(event="provider.compute.vm_types.list",
               priority=BaseVMTypeService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         cb_itypes = [
             OpenStackVMType(self.provider, obj)
@@ -916,6 +959,7 @@ class OpenStackRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.get",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, region_id):
         log.debug("Getting OpenStack Region with the id: %s", region_id)
         region = (r for r in self if r.id == region_id)
@@ -923,6 +967,7 @@ class OpenStackRegionService(BaseRegionService):
 
     @dispatch(event="provider.compute.regions.list",
               priority=BaseRegionService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         # pylint:disable=protected-access
         if self.provider._keystone_version == 3:
@@ -989,12 +1034,14 @@ class OpenStackNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.get",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, network_id):
         network = (n for n in self if n.id == network_id)
         return next(network, None)
 
     @dispatch(event="provider.networking.networks.list",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         networks = [OpenStackNetwork(self.provider, network)
                     for network in self.provider.neutron.list_networks()
@@ -1004,6 +1051,7 @@ class OpenStackNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.find",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         label = kwargs.pop('label', None)
 
@@ -1022,6 +1070,7 @@ class OpenStackNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.create",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, cidr_block):
         OpenStackNetwork.assert_valid_resource_label(label)
         net_info = {'name': label or ""}
@@ -1033,6 +1082,7 @@ class OpenStackNetworkService(BaseNetworkService):
 
     @dispatch(event="provider.networking.networks.delete",
               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network):
         network = (network if isinstance(network, OpenStackNetwork) else
                    self.get(network))
@@ -1060,12 +1110,14 @@ class OpenStackSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.get",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, subnet_id):
         subnet = (s for s in self if s.id == subnet_id)
         return next(subnet, None)
 
     @dispatch(event="provider.networking.subnets.list",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network=None, limit=None, marker=None):
         if network:
             network_id = (network.id if isinstance(network, OpenStackNetwork)
@@ -1080,6 +1132,7 @@ class OpenStackSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.create",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network, cidr_block, zone):
         """zone param is ignored."""
         OpenStackSubnet.assert_valid_resource_label(label)
@@ -1094,10 +1147,12 @@ class OpenStackSubnetService(BaseSubnetService):
 
     @dispatch(event="provider.networking.subnets.delete",
               priority=BaseSubnetService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, subnet):
         sn_id = subnet.id if isinstance(subnet, OpenStackSubnet) else subnet
         self.provider.neutron.delete_subnet(sn_id)
 
+    @profile
     def get_or_create_default(self, zone):
         """
         Subnet zone is not supported by OpenStack and is thus ignored.
@@ -1129,6 +1184,7 @@ class OpenStackRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.get",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, router_id):
         log.debug("Getting OpenStack Router with the id: %s", router_id)
         router = self.provider.os_conn.get_router(router_id)
@@ -1136,6 +1192,7 @@ class OpenStackRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.list",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, limit=None, marker=None):
         routers = self.provider.os_conn.list_routers()
         os_routers = [OpenStackRouter(self.provider, r) for r in routers]
@@ -1144,6 +1201,7 @@ class OpenStackRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.find",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def find(self, **kwargs):
         obj_list = self
         filters = ['label']
@@ -1152,6 +1210,7 @@ class OpenStackRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.create",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, label, network):
         """Parameter ``network`` is not used by OpenStack."""
         router = self.provider.os_conn.create_router(name=label)
@@ -1159,6 +1218,7 @@ class OpenStackRouterService(BaseRouterService):
 
     @dispatch(event="provider.networking.routers.delete",
               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, router):
         r_id = router.id if isinstance(router, OpenStackRouter) else router
         self.provider.os_conn.delete_router(r_id)
@@ -1188,6 +1248,7 @@ class OpenStackGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.get_or_create",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get_or_create(self, network):
         """For OS, inet gtw is any net that has `external` property set."""
         external_nets = (n for n in self._provider.networking.networks
@@ -1199,11 +1260,13 @@ class OpenStackGatewayService(BaseGatewayService):
 
     @dispatch(event="provider.networking.gateways.delete",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, network, gateway):
         pass
 
     @dispatch(event="provider.networking.gateways.list",
               priority=BaseGatewayService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, network, limit=None, marker=None):
         log.debug("OpenStack listing of all current internet gateways")
         igl = [OpenStackInternetGateway(self._provider, n)
@@ -1220,6 +1283,7 @@ class OpenStackFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.get",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def get(self, gateway, fip_id):
         try:
             return OpenStackFloatingIP(
@@ -1231,6 +1295,7 @@ class OpenStackFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.list",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def list(self, gateway, limit=None, marker=None):
         fips = [OpenStackFloatingIP(self.provider, fip)
                 for fip in self.provider.os_conn.network.ips(
@@ -1241,6 +1306,7 @@ class OpenStackFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.create",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def create(self, gateway):
         return OpenStackFloatingIP(
             self.provider, self.provider.os_conn.network.create_ip(
@@ -1248,6 +1314,7 @@ class OpenStackFloatingIPService(BaseFloatingIPService):
 
     @dispatch(event="provider.networking.floating_ips.delete",
               priority=BaseFloatingIPService.STANDARD_EVENT_PRIORITY)
+    @profile
     def delete(self, gateway, fip):
         if isinstance(fip, OpenStackFloatingIP):
             # pylint:disable=protected-access

+ 1 - 1
cloudbridge/test/test_middleware_system.py

@@ -10,7 +10,7 @@ from cloudbridge.cloud.interfaces.exceptions import CloudBridgeBaseException
 from cloudbridge.cloud.interfaces.exceptions import \
     InvalidConfigurationException
 
-from .helpers import skipIfPython
+from cloudbridge.test.helpers import skipIfPython
 
 
 class ExceptionWrappingMiddlewareTestCase(unittest.TestCase):

+ 70 - 53
profiling-scripts/filter-summarize.py

@@ -8,76 +8,93 @@
 from re import search
 from os import path, walk
 
-time_cutoff = 5 # seconds
-perc_cutoff = 33 # % of total functino time spent on this line
+time_cutoff = 0 # seconds
+perc_cutoff = 33 # % of total function time spent on this line
 
 
 results = '../results/'
 metaresults = '../metaresults/'
 print("Results directory used: {}".format(results))
 
-files = []
+files_dict = {}
 for (dirpath, dirnames, filenames) in walk(results):
     for each_file in filenames:
         if ".res" in each_file:
-            files.append(path.join(dirpath, each_file))
+            provider = each_file.split('-')[0]
+            curr_list = files_dict.get(provider, [])
+            curr_list.append(path.join(dirpath, each_file))
+            files_dict[provider] = curr_list
 
-print("Collected list: {}".format(files))
+print("Collected files:\n{}".format(files_dict))
 
-summary = "{},{},{},{},{}\n".format("Test File", "CB functon", "Total Time (in s)", "Azure Operation", "Time per hit")
+for key in files_dict.keys():
+    provider = key
+    files = files_dict[provider]
 
-inside = False
-capturing = False
-purge_line = True
 
-for each_file in files:
-    print("Processing: {}\n".format(each_file))
-    with open(metaresults + "filtered-" + each_file.split('/')[-1], 'w+') as \
-            fil_file:
-        with open(each_file, 'r') as current:
-            filtered = ""
-            for line in current:
-                match = search(r'^Total time: ([\.e\-0-9]+) s', line)
-                if match:
-                    inside = False
-                    capturing = False
-                    total_time = float(match.group(1))
-                    if total_time > time_cutoff:
-                        inside = True
-                        filtered += "Test suite: {}\n".format(each_file)
-                        filtered += line
-                elif inside:
-                    match = search(r'^Function: (.+) at line ([0-9]+)', line)
+    summary = "{},{},{},{},{}\n".format("Test File", "CB functon", "Total Time (in s)", "Azure Operation", "Time per hit")
+
+    for each_file in files:
+        inside = True
+        capturing = True
+        purge_line = True
+        print("Processing: {}\n".format(each_file))
+        with open(metaresults + "filtered-" + each_file.split('/')[-1], 'w+') as \
+                fil_file:
+            with open(each_file, 'r') as current:
+                filtered = ""
+                last_time = 1000000000
+                all_text = []
+                for line in current:
+                    match = search(r'^Total time: ([\.e\-0-9]+) s', line)
                     if match:
-                        func_name = match.group(1)
-                        line_num = int(match.group(2))
-                        capturing = True
-                        filtered += line
-                    elif capturing:
-                        if purge_line:
-                            complete_contents = ""
-                            paran_num = 0
-                        filtered += line
-                        match = search(r'^\s+([0-9]+)\s+[0-9]+\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([^\n]+)', line)
+                        if filtered:
+                            all_text.append((last_time, filtered))
+                        filtered = ""
+                        inside = False
+                        capturing = False
+                        last_time = float(match.group(1))
+                        if last_time > time_cutoff:
+                            inside = True
+                            filtered += line
+                    elif inside:
+                        match = search(r'^Function: (.+) at line ([0-9]+)', line)
                         if match:
-                            percentage = float(match.group(4))
-                            line_contents = match.group(5)
-                            complete_contents += line_contents.replace(" \\", "")
-                            paran_num += line_contents.count("(") - line_contents.count(")")
-                            purge_line = " \\" not in line_contents and paran_num == 0
-                            if percentage > perc_cutoff:
-                                line_num = int(match.group(1))
-                                line_time = float(match.group(2))/1000000
-                                hit_time = float(match.group(3))/1000000
-                                summary += "{},\"{}\",{},\"{}\",{}\n".format(each_file.split('/')[-1].replace(".res", ""), func_name, total_time, complete_contents, hit_time)
-                        else:
-                            match = search(r'^\s+([0-9]+)\s+([^\n]+)', line)
+                            func_name = match.group(1)
+                            line_num = int(match.group(2))
+                            capturing = True
+                            filtered += line
+                        elif capturing:
+                            if purge_line:
+                                complete_contents = ""
+                                paran_num = 0
+                            filtered += line
+                            match = search(r'^\s+([0-9]+)\s+[0-9]+\s+([\.0-9]+)\s+([\.0-9]+)\s+([\.0-9]+)\s+([^\n]+)', line)
                             if match:
-                                line_contents = match.group(2)
+                                percentage = float(match.group(4))
+                                line_contents = match.group(5)
                                 complete_contents += line_contents.replace(" \\", "")
                                 paran_num += line_contents.count("(") - line_contents.count(")")
                                 purge_line = " \\" not in line_contents and paran_num == 0
-        fil_file.write(filtered)
+                                if percentage > perc_cutoff:
+                                    line_num = int(match.group(1))
+                                    line_time = float(match.group(2))/1000000
+                                    hit_time = float(match.group(3))/1000000
+                                    summary += "{},\"{}\",{},\"{}\"," \
+                                               "{}\n".format(
+                                        each_file.split('/')[-1].replace(
+                                            ".res", ""), func_name, last_time,
+                                        complete_contents, hit_time)
+                            else:
+                                match = search(r'^\s+([0-9]+)\s+([^\n]+)', line)
+                                if match:
+                                    line_contents = match.group(2)
+                                    complete_contents += line_contents.replace(" \\", "")
+                                    paran_num += line_contents.count("(") - line_contents.count(")")
+                                    purge_line = " \\" not in line_contents and paran_num == 0
+            all_text.sort(key=lambda x: x[0], reverse=True)
+            for text in all_text:
+                fil_file.write(text[1])
 
-with open(metaresults+"summary.csv", 'w+') as sum_file:
-    sum_file.write(summary)
+    with open(metaresults+provider+"-summary.csv", 'w+') as sum_file:
+        sum_file.write(summary)

+ 8 - 0
profiling-scripts/run-all.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+sh run-provider.sh aws
+sh run-provider.sh azure
+sh run-provider.sh gcp
+sh run-provider.sh openstack
+
+python filter-summarize.py

+ 1 - 1
profiling-scripts/run-provider.sh

@@ -10,7 +10,7 @@
 ###############
 # Usage:
 ###############
-# sh run-all.sh
+# sh run-provider.sh [aws|azure|openstack|gcp|mock]
 ###############
 # Behavior:
 ###############

+ 1 - 1
profiling-scripts/run_single.py

@@ -18,7 +18,7 @@ else:
                                                          args.suite.split('_')]))
     case_name = case_name.replace("VmType", "VMType").replace("CloudCloud",
                                                               "Cloud")
-    if "interface" in mod_name or "cycle" in mod_name or "cloud" in mod_name:
+    if "interface" in mod_name or "cycle" in mod_name or "_cloud" in mod_name:
         mod_name = mod_name.replace("_service", "")
         case_name = case_name.replace("Service", "")
     print("{}.{}\n\n".format(mod_name, case_name))

BIN
profiling-scripts/run_single.py.lprof