فهرست منبع

Renamed inst.key_pair_name to id and fixed up openstack

Nuwan Goonasekera 7 سال پیش
والد
کامیت
922bad6f1d

+ 2 - 2
cloudbridge/cloud/interfaces/resources.py

@@ -624,7 +624,7 @@ class Instance(ObjectLifeCycleMixin, LabeledCloudResource):
         pass
 
     @abstractproperty
-    def key_pair_name(self):
+    def key_pair_id(self):
         """
         Get the id of the key pair associated with this instance.
 
@@ -820,7 +820,7 @@ class LaunchConfig(object):
         pass
 
 
-class MachineImage(ObjectLifeCycleMixin, CloudResource):
+class MachineImage(ObjectLifeCycleMixin, LabeledCloudResource):
 
     __metaclass__ = ABCMeta
 

+ 15 - 1
cloudbridge/cloud/providers/aws/resources.py

@@ -81,6 +81,20 @@ class AWSMachineImage(BaseMachineImage):
         except (AttributeError, ClientError) as e:
             log.warn("Cannot get name for image {0}: {1}".format(self.id, e))
 
+    @property
+    # pylint:disable=arguments-differ
+    def label(self):
+        """
+        .. note:: an instance must have a (case sensitive) tag ``Name``
+        """
+        return find_tag_value(self._ec2_image.tags, 'Name')
+
+    @label.setter
+    # pylint:disable=arguments-differ
+    def label(self, value):
+        self.assert_valid_resource_label(value)
+        self._ec2_image.create_tags(Tags=[{'Key': 'Name', 'Value': value}])
+
     @property
     def description(self):
         try:
@@ -291,7 +305,7 @@ class AWSInstance(BaseInstance):
         ]))
 
     @property
-    def key_pair_name(self):
+    def key_pair_id(self):
         return self._ec2_instance.key_name
 
     def create_image(self, label=None):

+ 1 - 1
cloudbridge/cloud/providers/aws/services.py

@@ -365,7 +365,7 @@ class AWSImageService(BaseImageService):
             log.debug("Searching for AWS Image Service %s", name)
             obj_list = self.svc.find(filter_name='name', filter_value=name)
         else:
-            obj_list = self.svc
+            obj_list = self
         filters = ['label']
         return cb_helpers.generic_find(filters, kwargs, obj_list)
 

+ 1 - 1
cloudbridge/cloud/providers/azure/resources.py

@@ -1397,7 +1397,7 @@ class AzureInstance(BaseInstance):
                 if nic.network_security_group]
 
     @property
-    def key_pair_name(self):
+    def key_pair_id(self):
         """
         Get the name of the key pair associated with this instance.
         """

+ 3 - 3
cloudbridge/cloud/providers/azure/services.py

@@ -543,8 +543,8 @@ class AzureInstanceService(BaseInstanceService):
         # Key_pair is mandatory in azure and it should not be None.
         temp_key_pair = None
         if key_pair:
-            key_pair = (self.provider.security.key_pairs.get(key_pair)
-                        if isinstance(key_pair, str) else key_pair)
+            key_pair = (key_pair if isinstance(key_pair, AzureKeyPair)
+                        else self.provider.security.key_pairs.get(key_pair))
         else:
             # Create a temporary keypair if none is provided to keep Azure
             # happy, but the private key will be discarded, so it'll be all
@@ -598,7 +598,7 @@ class AzureInstanceService(BaseInstanceService):
             params['os_profile']['custom_data'] = str(custom_data, 'utf-8')
 
         if not temp_key_pair:
-            params['tags'].update(Key_Pair=key_pair.name)
+            params['tags'].update(Key_Pair=key_pair.id)
 
         try:
             vm = self.provider.azure_client.create_vm(instance_name, params)

+ 2 - 4
cloudbridge/cloud/providers/openstack/resources.py

@@ -117,8 +117,7 @@ class OpenStackMachineImage(BaseMachineImage):
         Set the image label.
         """
         self.assert_valid_resource_label(value)
-        self._os_image.name = value
-        self._os_image.update(name=value)
+        self._provider.os_conn.image.update_image(self._os_image, name=value)
 
     @property
     def description(self):
@@ -664,9 +663,8 @@ class OpenStackVolume(BaseVolume):
         """
         log.debug("Creating snapchat of volume: %s with the "
                   "description: %s", label, description)
-        name = self._generate_name_from_label(label)
         return self._provider.storage.snapshots.create(
-            name, self, description=description)
+            self, label=label, description=description)
 
     def delete(self):
         """

+ 12 - 17
cloudbridge/cloud/providers/openstack/services.py

@@ -1,9 +1,7 @@
 """
 Services implemented by the OpenStack provider.
 """
-import fnmatch
 import logging
-import re
 
 from cinderclient.exceptions import NotFound as CinderNotFound
 
@@ -261,16 +259,9 @@ class OpenStackImageService(BaseImageService):
             return None
 
     def find(self, **kwargs):
-        name = kwargs.pop('name', None)
-        label = kwargs.pop('label', None)
-        log.debug("Searching for OpenStack image with label: %s", label)
-        regex = fnmatch.translate(label)
-        cb_images = [
-            img
-            for img in self
-            if ((img.label and re.search(regex, img.label))
-                or img.name == name)]
-        return oshelpers.to_server_paged_list(self.provider, cb_images)
+        filters = ['name', 'label']
+        obj_list = self
+        return cb_helpers.generic_find(filters, kwargs, obj_list)
 
     def list(self, filter_by_owner=True, limit=None, marker=None):
         """
@@ -424,11 +415,12 @@ class OpenStackSnapshotService(BaseSnapshotService):
         search_opts = {'name': label,  # TODO: Cinder is ignoring name
                        'limit': oshelpers.os_result_limit(self.provider),
                        'marker': None}
-        log.debug("Searching for an OpenStack volume with the following "
+        log.debug("Searching for an OpenStack snapshot with the following "
                   "params: %s", search_opts)
         cb_snaps = [
             OpenStackSnapshot(self.provider, snap) for
-            snap in self.provider.cinder.volume_snapshots.list(search_opts)]
+            snap in self.provider.cinder.volume_snapshots.list(search_opts)
+            if snap.name == label]
 
         return oshelpers.to_server_paged_list(self.provider, cb_snaps)
 
@@ -450,12 +442,13 @@ class OpenStackSnapshotService(BaseSnapshotService):
         """
         log.debug("Creating a new snapshot of the %s volume.", label)
         OpenStackSnapshot.assert_valid_resource_label(label)
+        name = OpenStackSnapshot._generate_name_from_label(label)
 
         volume_id = (volume.id if isinstance(volume, OpenStackVolume)
                      else volume)
 
         os_snap = self.provider.cinder.volume_snapshots.create(
-            volume_id, name=label,
+            volume_id, name=name,
             description=description)
         return OpenStackSnapshot(self.provider, os_snap)
 
@@ -651,9 +644,11 @@ class OpenStackInstanceService(BaseInstanceService):
             if vm_firewalls:
                 if isinstance(vm_firewalls, list) and \
                         isinstance(vm_firewalls[0], VMFirewall):
-                    sg_name_list = [sg.label for sg in vm_firewalls]
+                    sg_name_list = [sg.name for sg in vm_firewalls]
                 else:
-                    sg_name_list = vm_firewalls
+                    sg_list = (self.provider.security.vm_firewalls.get(sg)
+                               for sg in vm_firewalls)
+                    sg_name_list = (sg[0].name for sg in sg_list if sg)
 
         log.debug("Launching in subnet %s", subnet_id)
         os_instance = self.provider.nova.servers.create(

+ 2 - 2
test/test_compute_service.py

@@ -107,8 +107,8 @@ class CloudComputeServiceTestCase(ProviderTestBase):
             self.assertTrue(test_instance.private_ips[0], "private ip should"
                             " contain a valid value")
             self.assertEqual(
-                test_instance.key_pair_name,
-                kp.name)
+                test_instance.key_pair_id,
+                kp.id)
             self.assertIsInstance(test_instance.vm_firewalls, list)
             self.assertEqual(
                 test_instance.vm_firewalls[0],