浏览代码

Added glance client for better filtering options.

Nuwan Goonasekera 10 年之前
父节点
当前提交
e52765ab79

+ 19 - 0
cloudbridge/cloud/providers/openstack/impl.py

@@ -6,6 +6,7 @@ compatible clouds.
 import os
 
 from cinderclient import client as cinder_client
+from glanceclient import client as glance_client
 from keystoneclient import client as keystone_client
 from keystoneclient import session
 from keystoneclient.auth.identity import Password
@@ -41,6 +42,7 @@ class OpenStackCloudProvider(BaseCloudProvider):
         # service connections, lazily initialized
         self._nova = None
         self._keystone = None
+        self._glance = None
         self._cinder = None
         self._swift = None
         self._neutron = None
@@ -63,6 +65,12 @@ class OpenStackCloudProvider(BaseCloudProvider):
             self._keystone = self._connect_keystone()
         return self._keystone
 
+    @property
+    def glance(self):
+        if not self._glance:
+            self._glance = self._connect_glance()
+        return self._glance
+
     @property
     def cinder(self):
         if not self._cinder:
@@ -145,6 +153,17 @@ class OpenStackCloudProvider(BaseCloudProvider):
             api_version, username=self.username, api_key=self.password,
             project_id=self.tenant_name, auth_url=self.auth_url)
 
+    def _connect_glance(self):
+        """
+        Get an openstack glance client object for the given cloud.
+        """
+        api_version = self._get_config_value(
+            'os_image_api_version',
+            os.environ.get('OS_IMAGE_API_VERSION', 1))
+
+        return glance_client.Client(version=api_version,
+                                    session=self.keystone.session)
+
     def _connect_swift(self):
         """
         Get an openstack swift client object for the given cloud.

+ 6 - 6
cloudbridge/cloud/providers/openstack/resources.py

@@ -29,12 +29,12 @@ class OpenStackMachineImage(BaseMachineImage):
 
     # ref: http://docs.openstack.org/developer/glance/statuses.html
     IMAGE_STATE_MAP = {
-        'QUEUED': MachineImageState.PENDING,
-        'SAVING': MachineImageState.PENDING,
-        'ACTIVE': MachineImageState.AVAILABLE,
-        'KILLED': MachineImageState.ERROR,
-        'DELETED': MachineImageState.ERROR,
-        'PENDING_DELETE': MachineImageState.ERROR
+        'queued': MachineImageState.PENDING,
+        'saving': MachineImageState.PENDING,
+        'active': MachineImageState.AVAILABLE,
+        'killed': MachineImageState.ERROR,
+        'deleted': MachineImageState.ERROR,
+        'pending_delete': MachineImageState.ERROR
     }
 
     def __init__(self, provider, os_image):

+ 13 - 6
cloudbridge/cloud/providers/openstack/services.py

@@ -3,7 +3,9 @@ Services implemented by the OpenStack provider.
 """
 import fnmatch
 import re
+
 from cinderclient.exceptions import NotFound as CinderNotFound
+from glanceclient.exc import HTTPNotFound
 from novaclient.exceptions import NotFound as NovaNotFound
 
 from cloudbridge.cloud.base import BaseBlockStoreService
@@ -217,8 +219,8 @@ class OpenStackImageService(BaseImageService):
         """
         try:
             return OpenStackMachineImage(
-                self.provider, self.provider.nova.images.get(image_id))
-        except NovaNotFound:
+                self.provider, self.provider.glance.images.get(image_id))
+        except HTTPNotFound:
             return None
 
     def find(self, name, limit=None, marker=None):
@@ -237,12 +239,17 @@ class OpenStackImageService(BaseImageService):
         """
         List all images.
         """
-        cb_images = [
-            OpenStackMachineImage(self.provider, img)
-            for img in self.provider.nova.images.list(
+        if marker is None:
+            os_images = self.provider.glance.images.list(
+                limit=oshelpers.os_result_limit(self.provider, limit))
+        else:
+            os_images = self.provider.glance.images.list(
                 limit=oshelpers.os_result_limit(self.provider, limit),
-                marker=marker)]
+                marker=marker)
 
+        cb_images = [
+            OpenStackMachineImage(self.provider, img)
+            for img in os_images]
         return oshelpers.to_server_paged_list(self.provider, cb_images, limit)
 
 

+ 3 - 2
setup.py

@@ -1,8 +1,9 @@
 from setuptools import setup, find_packages
 
 base_reqs = ['bunch>=1.00', 'six>=1.9.0', 'retrying']
-openstack_reqs = ['python-novaclient', 'python-cinderclient',
-                  'python-swiftclient', 'python-neutronclient']
+openstack_reqs = ['python-novaclient', 'python-glanceclient',
+                  'python-cinderclient', 'python-swiftclient',
+                  'python-neutronclient']
 aws_reqs = ['boto']
 full_reqs = base_reqs + aws_reqs + openstack_reqs
 dev_reqs = ['tox', 'moto>=0.4.18', 'sphinx'] + full_reqs