RIFT OSM R1 Initial Submission
[osm/SO.git] / rwlaunchpad / plugins / rwlaunchpadtasklet / rift / tasklets / rwlaunchpad / image.py
diff --git a/rwlaunchpad/plugins/rwlaunchpadtasklet/rift/tasklets/rwlaunchpad/image.py b/rwlaunchpad/plugins/rwlaunchpadtasklet/rift/tasklets/rwlaunchpad/image.py
new file mode 100644 (file)
index 0000000..ce30981
--- /dev/null
@@ -0,0 +1,74 @@
+
+# 
+#   Copyright 2016 RIFT.IO Inc
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+
+import asyncio
+import itertools
+import glanceclient
+
+import gi
+gi.require_version('RwcalYang', '1.0')
+
+from rift.imagemgr import client
+
+
+class ImageUploadError(Exception):
+    pass
+
+
+class ImageUploader(object):
+    """ This class is responsible for uploading package images to cloud accounts """
+    def __init__(self, log, loop, dts):
+        """ Create an instance of ImageUploader
+
+        Arguments:
+            log - A logger
+        """
+        self._log = log
+        self._loop = loop
+        self._dts = dts
+
+        self._client = client.UploadJobClient(self._log, self._loop, self._dts)
+
+    def upload_image(self, image_name, image_checksum, image_hdl):
+        endpoint = "http://127.0.0.1:9999"
+        glance_client = glanceclient.Client('1', endpoint, token="asdf")
+
+        try:
+            for image in itertools.chain(
+                    glance_client.images.list(is_public=False),
+                    glance_client.images.list(is_public=True),
+                    ):
+                if image.name == image_name and image_checksum == image_checksum:
+                    self._log.debug("Found existing image in catalog, not re-uploading")
+                    return
+
+            self._log.debug('Uploading image to catalog: {}'.format(image_name))
+
+            image = glance_client.images.create(name=image_name, data=image_hdl, is_public="False",
+                                                disk_format="qcow2", container_format="bare",
+                                                checksum=image_checksum)
+            self._log.debug('Image upload complete: %s', image)
+        except Exception as e:
+            raise ImageUploadError("Failed to upload image to catalog: %s" % str(e)) from e
+
+    def upload_image_to_cloud_accounts(self, image_name, image_checksum, cloud_accounts=None):
+        self._log.debug("uploading image %s to all cloud accounts", image_name)
+        upload_job = self._client.create_job_threadsafe(image_name, image_checksum, cloud_accounts)
+        try:
+            upload_job.wait_until_complete_threadsafe()
+        except client.UploadJobError as e:
+            raise ImageUploadError("Failed to upload image (image_name) to cloud accounts") from e