Просмотр исходного кода

Remove get_gce_resource_data

There are two methods for getting a resource by its uri:
- get_gce_resource_data, and
- parse_url

This change will remove the first one so that the code is more uniform and also
to save a few API calls in some cases. For example,

gce_zone = self.provider.get_gce_resource_data(operation['zone'])
zone = gce_zone.get('name')

makes an API call while

zone = self.provider.parse_url(operation['zone']).parameters['zone']

does not make any API calls.
Ehsan Chiniforooshan 8 лет назад
Родитель
Сommit
6ee974bf42

+ 0 - 22
cloudbridge/cloud/providers/gce/provider.py

@@ -10,11 +10,8 @@ from string import Template
 
 from cloudbridge.cloud.base import BaseCloudProvider
 
-import googleapiclient.http
 from googleapiclient import discovery
 
-import httplib2
-
 from oauth2client.client import GoogleCredentials
 from oauth2client.service_account import ServiceAccountCredentials
 
@@ -213,25 +210,6 @@ class GCECloudProvider(BaseCloudProvider):
         else:
             return GoogleCredentials.get_application_default()
 
-    def get_gce_resource_data(self, uri):
-        """
-        Retrieves GCE resoure data given its resource URI.
-        """
-        http = httplib2.Http()
-        http = self._credentials.authorize(http)
-
-        def _postproc(*kwargs):
-            if len(kwargs) >= 2:
-                # The first argument is request, and the second is response.
-                resource_dict = json.loads(kwargs[1])
-                return resource_dict
-        request = googleapiclient.http.HttpRequest(http=http,
-                                                   postproc=_postproc,
-                                                   uri=uri)
-        # The response is a dict representing the GCE resource data.
-        response = request.execute()
-        return response
-
     def _connect_gcp_storage(self):
         return discovery.build('storage', 'v1', credentials=self._credentials)
 

+ 20 - 22
cloudbridge/cloud/providers/gce/resources.py

@@ -828,8 +828,8 @@ class GCEInstance(BaseInstance):
         machine_type_uri = self._gce_instance.get('machineType')
         if machine_type_uri is None:
             return None
-        instance_type = self._provider.get_gce_resource_data(machine_type_uri)
-        return instance_type.get('name', None)
+        parsed_uri = self._provider.parse_url(machine_type_uri)
+        return parsed_uri.parameters['machineType']
 
     @property
     def instance_type(self):
@@ -839,8 +839,8 @@ class GCEInstance(BaseInstance):
         machine_type_uri = self._gce_instance.get('machineType')
         if machine_type_uri is None:
             return None
-        instance_type = self._provider.get_gce_resource_data(machine_type_uri)
-        return GCEInstanceType(self._provider, instance_type)
+        parsed_uri = self._provider.parse_url(machine_type_uri)
+        return GCEInstanceType(self._provider, parsed_uri.get())
 
     def reboot(self):
         """
@@ -896,8 +896,8 @@ class GCEInstance(BaseInstance):
             return None
         for disk in self._gce_instance['disks']:
             if 'boot' in disk and disk['boot']:
-                return self._provider.get_gce_resource_data(
-                    disk['source']).get('sourceImage')
+                disk_resource = self._provider.parse_url(disk['source']).get()
+                return disk_resource.get('sourceImage')
         return None
 
     @property
@@ -908,8 +908,7 @@ class GCEInstance(BaseInstance):
         zone_uri = self._gce_instance.get('zone')
         if zone_uri is None:
             return None
-        zone = self._provider.get_gce_resource_data(zone_uri)
-        return zone.get('name', None)
+        return self._provider.parse_url(zone_uri).parameters['zone']
 
     @property
     def security_groups(self):
@@ -958,8 +957,7 @@ class GCEInstance(BaseInstance):
             if 'boot' in disk and disk['boot']:
                 image_body = {
                     'name': name,
-                    'sourceDisk': self._provider.get_gce_resource_data(
-                        disk['source']).get('selfLink')
+                    'sourceDisk': disk['source']
                 }
                 operation = (self._provider
                              .gce_compute
@@ -1183,8 +1181,8 @@ class GCEInstance(BaseInstance):
         Refreshes the state of this instance by re-querying the cloud provider
         for its latest state.
         """
-        self._gce_instance = self._provider.get_gce_resource_data(
-            self._gce_instance.get('selfLink'))
+        self_link = self._gce_instance.get('selfLink')
+        self._gce_instance = self._provider.parse_url(self_link).get()
 
     def add_security_group(self, sg):
         raise NotImplementedError('To be implemented.')
@@ -1512,13 +1510,13 @@ class GCEVolume(BaseVolume):
     @property
     def source(self):
         if 'sourceSnapshot' in self._volume:
+            snapshot_uri = self._volume.get('sourceSnapshot')
             return GCESnapshot(self._provider,
-                               self._provider.get_gce_resource_data(
-                                   self._volume.get('sourceSnapshot')))
+                               self._provider.parse_url(snapshot_uri).get())
         if 'sourceImage' in self._volume:
+            image_uri = self._volume.get('sourceImage')
             return GCEMachineImage(self._provider,
-                                   self._provider.get_gce_resource_data(
-                                       self._volume.get('sourceImage')))
+                                   self._provider.parse_url(image_uri).get())
         return None
 
     @property
@@ -1570,8 +1568,8 @@ class GCEVolume(BaseVolume):
         # Check whether this volume is attached to an instance.
         if not self.attachments:
             return
-        instance_data = self._provider.get_gce_resource_data(
-            self.attachments.instance_id)
+        parsed_uri = self._provider.parse_url(self.attachments.instance_id)
+        instance_data = parsed_uri.get()
         # Check whether the instance has this volume attached.
         if 'disks' not in instance_data:
             return
@@ -1620,8 +1618,8 @@ class GCEVolume(BaseVolume):
         Refreshes the state of this volume by re-querying the cloud provider
         for its latest state.
         """
-        self._volume = self._provider.get_gce_resource_data(
-            self._volume.get('selfLink'))
+        self_link = self._volume.get('selfLink')
+        self._volume = self._provider.parse_url(self_link).get()
 
 
 class GCESnapshot(BaseSnapshot):
@@ -1684,8 +1682,8 @@ class GCESnapshot(BaseSnapshot):
         Refreshes the state of this snapshot by re-querying the cloud provider
         for its latest state.
         """
-        self._snapshot = self._provider.get_gce_resource_data(
-            self._snapshot.get('selfLink'))
+        self_link = self._snapshot.get('selfLink')
+        self._snapshot = self._provider.parse_url(self_link).get()
 
     def delete(self):
         """

+ 12 - 13
cloudbridge/cloud/providers/gce/services.py

@@ -498,9 +498,10 @@ class GCEInstanceService(BaseInstanceService):
                          .execute())
         if 'zone' not in operation:
             return None
-        gce_zone = self.provider.get_gce_resource_data(operation['zone'])
+        zone_url = self.provider.parse_url(operation['zone'])
         instance_id = operation.get('targetLink')
-        self.provider.wait_for_operation(operation, zone=gce_zone.get('name'))
+        self.provider.wait_for_operation(operation,
+                                         zone=zone_url.parameters['zone'])
         return self.get(instance_id)
 
     def get(self, instance_id):
@@ -512,9 +513,8 @@ class GCEInstanceService(BaseInstanceService):
         as its id.
         """
         try:
-            response = self.provider.get_gce_resource_data(instance_id)
-            if response:
-                return GCEInstance(self.provider, response)
+            return GCEInstance(self.provider,
+                               self.provider.parse_url(instance_id).get())
         except googleapiclient.errors.HttpError as http_error:
             # If the instance is not found, the API will raise
             # googleapiclient.errors.HttpError.
@@ -870,9 +870,8 @@ class GCEVolumeService(BaseVolumeService):
         Returns a volume given its id.
         """
         try:
-            response = self.provider.get_gce_resource_data(volume_id)
-            if response:
-                return GCEVolume(self.provider, response)
+            return GCEVolume(self.provider,
+                             self.provider.parse_url(volume_id).get())
         except googleapiclient.errors.HttpError as http_error:
             # If the volume is not found, the API will raise
             # googleapiclient.errors.HttpError.
@@ -978,9 +977,8 @@ class GCESnapshotService(BaseSnapshotService):
         Returns a snapshot given its id.
         """
         try:
-            response = self.provider.get_gce_resource_data(snapshot_id)
-            if response:
-                return GCESnapshot(self.provider, response)
+            return GCESnapshot(self.provider,
+                               self.provider.parse_url(snapshot_id).get())
         except googleapiclient.errors.HttpError as http_error:
             # If the volume is not found, the API will raise
             # googleapiclient.errors.HttpError.
@@ -1055,8 +1053,9 @@ class GCESnapshotService(BaseSnapshotService):
                          .execute())
         if 'zone' not in operation:
             return None
-        gce_zone = self.provider.get_gce_resource_data(operation['zone'])
-        self.provider.wait_for_operation(operation, zone=gce_zone.get('name'))
+        zone_url = self.provider.parse_url(operation['zone'])
+        self.provider.wait_for_operation(operation,
+                                         zone=zone_url.parameters['zone'])
         snapshots = self.provider.block_store.snapshots.find(name=name)
         if snapshots:
             return snapshots[0]