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

Add image_id and create_image methods to GCEInstance.

baizhang 8 лет назад
Родитель
Сommit
d230bb9ae9
2 измененных файлов с 57 добавлено и 7 удалено
  1. 5 2
      cloudbridge/cloud/providers/gce/provider.py
  2. 52 5
      cloudbridge/cloud/providers/gce/resources.py

+ 5 - 2
cloudbridge/cloud/providers/gce/provider.py

@@ -142,7 +142,7 @@ class GCECloudProvider(BaseCloudProvider):
             'gce_service_creds_file', os.environ.get('GCE_SERVICE_CREDS_FILE'))
             'gce_service_creds_file', os.environ.get('GCE_SERVICE_CREDS_FILE'))
         self.credentials_dict = self._get_config_value(
         self.credentials_dict = self._get_config_value(
             'gce_service_creds_dict',
             'gce_service_creds_dict',
-            json.loads(os.environ.get('GCE_SERVICE_CREDS_DICT') or {}))
+            json.loads(os.environ.get('GCE_SERVICE_CREDS_DICT') or '{}'))
         # If 'gce_service_creds_dict' is not passed in from config and
         # If 'gce_service_creds_dict' is not passed in from config and
         # self.credentials_file is available, read and parse the json file to
         # self.credentials_file is available, read and parse the json file to
         # self.credentials_dict.
         # self.credentials_dict.
@@ -154,7 +154,10 @@ class GCECloudProvider(BaseCloudProvider):
         self.region_name = self._get_config_value(
         self.region_name = self._get_config_value(
             'gce_region_name', 'us-central1')
             'gce_region_name', 'us-central1')
 
 
-        self.project_name = self.credentials_dict['project_id']
+        if self.credentials_dict and 'project_id' in self.credentials_dict:
+            self.project_name = self.credentials_dict['project_id']
+        else:
+            self.project_name = os.environ.get('GCE_PROJECT_NAME')
 
 
         # service connections, lazily initialized
         # service connections, lazily initialized
         self._gce_compute = None
         self._gce_compute = None

+ 52 - 5
cloudbridge/cloud/providers/gce/resources.py

@@ -5,6 +5,7 @@ import hashlib
 import inspect
 import inspect
 import io
 import io
 import json
 import json
+import math
 import re
 import re
 import uuid
 import uuid
 
 
@@ -675,6 +676,16 @@ class GCEMachineImage(BaseMachineImage):
         """
         """
         return self._gce_image.get('description', '')
         return self._gce_image.get('description', '')
 
 
+    @property
+    def min_disk(self):
+        """
+        Returns the minimum size of the disk that's required to
+        boot this image (in GB)
+        :rtype: ``int``
+        :return: The minimum disk size needed by this image
+        """
+        return int(math.ceil(float(self._gce_image.get('diskSizeGb'))))
+
     def delete(self):
     def delete(self):
         """
         """
         Delete this image
         Delete this image
@@ -881,8 +892,14 @@ class GCEInstance(BaseInstance):
         """
         """
         Get the image ID for this insance.
         Get the image ID for this insance.
         """
         """
-        raise NotImplementedError(
-            'To be implemented after GCEVolumeService.')
+        if 'disks' not in self._gce_instance:
+            return None
+        for disk in self._gce_instance['disks']:
+            if 'boot' in disk and disk['boot']:
+                boot_disk = GCEVolume(
+                    self._provider,
+                    self._provider.get_gce_resource_data(disk['source']))
+                return boot_disk.source_image
         return None
         return None
 
 
     @property
     @property
@@ -936,8 +953,27 @@ class GCEInstance(BaseInstance):
         """
         """
         Create a new image based on this instance.
         Create a new image based on this instance.
         """
         """
-        raise NotImplementedError(
-            'To be implemented after GCEVolumeService.')
+        if 'disks' not in self._gce_instance:
+            cb.log.error('Failed to create image: no disks found.')
+            return
+        for disk in self._gce_instance['disks']:
+            if 'boot' in disk and disk['boot']:
+                boot_disk = GCEVolume(
+                    self._provider,
+                    self._provider.get_gce_resource_data(disk['source']))
+                image_body = {
+                    'name': name,
+                    'sourceDisk': boot_disk.id
+                }
+                operation = (self._provider
+                             .gce_compute
+                             .images()
+                             .insert(project=self._provider.project_name,
+                                     body=image_body)
+                             .execute())
+                self._provider.wait_for_operation(operation)
+                return
+        cb.log.error('Failed to create image: no boot disk found.')
 
 
     def _get_existing_target_instance(self):
     def _get_existing_target_instance(self):
         """
         """
@@ -1154,6 +1190,12 @@ class GCEInstance(BaseInstance):
         self._gce_instance = self._provider.get_gce_resource_data(
         self._gce_instance = self._provider.get_gce_resource_data(
             self._gce_instance.get('selfLink'))
             self._gce_instance.get('selfLink'))
 
 
+    def add_security_group(self, sg):
+        raise NotImplementedError('To be implemented.')
+
+    def remove_security_group(self, sg):
+        raise NotImplementedError('To be implemented.')
+
 
 
 class GCENetwork(BaseNetwork):
 class GCENetwork(BaseNetwork):
 
 
@@ -1466,7 +1508,12 @@ class GCEVolume(BaseVolume):
 
 
     @property
     @property
     def source(self):
     def source(self):
-        return self._volume.get('sourceSnapshot')
+        return (self._volume.get('sourceSnapshot') or
+                self._volume.get('sourceImage'))
+
+    @property
+    def source_image(self):
+        return self._volume.get('sourceImage')
 
 
     @property
     @property
     def attachments(self):
     def attachments(self):