Example #1
0
 def _get_reset_instance_progress(self, context, instance_id):
     client = clients.nova(context)
     try:
         instance = client.servers.get(instance_id)
     except clients.novaclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if instance.status != "HARD_REBOOT":
         return operation_util.get_final_progress()
     return None
Example #2
0
 def _get_delete_item_progress(self, context, image_id):
     image_service = clients.glance(context).images
     try:
         image = image_service.get(image_id)
         if image.status in self._deleted_statuses:
             return operation_util.get_final_progress()
     except glanceclient_exc.HTTPNotFound:
         return operation_util.get_final_progress()
     return None
Example #3
0
 def _get_delete_item_progress(self, context, image_id):
     image_service = clients.glance(context).images
     try:
         image = image_service.get(image_id)
         if image.status in self._deleted_statuses:
             return operation_util.get_final_progress()
     except glanceclient_exc.HTTPNotFound:
         return operation_util.get_final_progress()
     return None
Example #4
0
 def _get_add_item_progress(self, context, image_id):
     image_service = clients.glance(context).images
     try:
         image = image_service.get(image_id)
     except glanceclient_exc.HTTPNotFound:
         return operation_util.get_final_progress()
     if image.status not in ["queued", "saving"]:
         return operation_util.get_final_progress(image.status == "killed")
     return None
Example #5
0
 def _get_delete_item_progress(self, context, snapshot_id):
     client = clients.cinder(context)
     try:
         snapshot = client.volume_snapshots.get(snapshot_id)
     except clients.cinderclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if snapshot.status not in ["deleting", "deleted"]:
         return operation_util.get_final_progress(True)
     return None
Example #6
0
 def _get_delete_item_progress(self, context, snapshot_id):
     client = clients.cinder(context)
     try:
         snapshot = client.volume_snapshots.get(snapshot_id)
     except clients.cinderclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if snapshot.status not in ["deleting", "deleted"]:
         return operation_util.get_final_progress(True)
     return None
Example #7
0
 def _get_add_item_progress(self, context, volume_id):
     client = clients.cinder(context)
     try:
         volume = client.volumes.get(volume_id)
     except clients.cinderclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if (volume.status not in ["creating", "downloading"]):
         return operation_util.get_final_progress(volume.status == "error")
     return None
Example #8
0
 def _get_add_item_progress(self, context, image_id):
     image_service = clients.glance(context).images
     try:
         image = image_service.get(image_id)
     except glanceclient_exc.HTTPNotFound:
         return operation_util.get_final_progress()
     if image.status not in ["queued", "saving"]:
         return operation_util.get_final_progress(image.status == "killed")
     return None
Example #9
0
 def _get_delete_item_progress(self, context, instance_id):
     client = clients.nova(context)
     try:
         instance = client.servers.get(instance_id)
     except clients.novaclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if getattr(instance, "OS-EXT-STS:task_state") != "deleting":
         return operation_util.get_final_progress(
                 instance.status != "DELETED")
     return None
Example #10
0
 def _get_add_item_progress(self, context, snapshot_id):
     client = clients.cinder(context)
     try:
         snapshot = client.volume_snapshots.get(snapshot_id)
     except clients.cinderclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if (snapshot.status != "creating"):
         return operation_util.get_final_progress(snapshot.status
                                                  == "error")
     return None
Example #11
0
 def _get_add_item_progress(self, context, snapshot_id):
     client = clients.cinder(context)
     try:
         snapshot = client.volume_snapshots.get(snapshot_id)
     except clients.cinderclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if (snapshot.status != "creating"):
         return operation_util.get_final_progress(
             snapshot.status == "error")
     return None
Example #12
0
 def _get_add_item_progress(self, context, instance_id):
     client = clients.nova(context)
     try:
         instance = client.servers.get(instance_id)
     except clients.novaclient.exceptions.NotFound:
         return operation_util.get_final_progress()
     if instance.status != "BUILD":
         return operation_util.get_final_progress(instance.status
                                                  == "ERROR")
     return None
Example #13
0
    def _attach_volume(self, context):
        params = context.operation_data.get("params")
        if params:
            scope = context.operation_data["scope"]
            context.operation_data.pop("params")
            body = {"sizeGb": params.get("diskSizeGb"),
                    "sourceImage": params["sourceImage"]}
            volume = disk_api.API().add_item(context, params.get("diskName"),
                                             body, scope=scope)
            context.operation_data["disk"] = volume
            return None

        disk = context.operation_data.get("disk")
        if disk:
            volume_id = disk["id"]
            item_progress = disk_api.API()._get_add_item_progress(context,
                                                                  volume_id)
            if not operation_util.is_final_progress(item_progress):
                return None
            context.operation_data.pop("disk")
            context.operation_data["volume_id"] = volume_id

        instance_id = context.operation_data["instance_id"]
        device_name = context.operation_data["device_name"]
        volume_id = context.operation_data["volume_id"]
        volumes_client = clients.nova(context).volumes
        volumes_client.create_server_volume(
                instance_id, volume_id, "/dev/" + device_name)

        args = context.operation_data["register_args"]
        self.register_item(context, args[0], volume_id, args[1], args[2])

        return operation_util.get_final_progress()
Example #14
0
    def _delete_instance(self, context):
        progress = {"progress": 0}
        full_count = context.operation_data.get("count")
        disks = context.operation_data.get("disks")
        instance = context.operation_data.get("instance")
        if instance:
            item_progress = self._get_delete_item_progress(context,
                                                           instance["id"])
            if not operation_util.is_final_progress(item_progress):
                return progress
            context.operation_data.pop("instance")

        progress = {"progress": int(100.0 * (full_count - len(disks))
                                    / full_count)}

        disk = context.operation_data.get("disk")
        if disk:
            volume_id = disk["volume_id"]
            item_progress = disk_api.API()._get_delete_item_progress(context,
                                                                     volume_id)
            if not operation_util.is_final_progress(item_progress):
                return progress
            context.operation_data.pop("disk")
            progress = {"progress": int(100.0 * (full_count - len(disks) + 1)
                                        / full_count)}

        if disks:
            disk = disks.pop()
            try:
                cinder_client = clients.cinder(context)
                volume = cinder_client.volumes.get(disk["volume_id"])
                cinder_client.volumes.delete(volume)
                context.operation_data["disk"] = disk
            except Exception:
                LOG.exception("Failed to remove disk %s of instance" %
                              disk["volume_id"])
            return progress

        return operation_util.get_final_progress()
Example #15
0
    def _attach_volume(self, context):
        params = context.operation_data.get("params")
        if params:
            scope = context.operation_data["scope"]
            context.operation_data.pop("params")
            body = {
                "sizeGb": params.get("diskSizeGb"),
                "sourceImage": params["sourceImage"]
            }
            volume = disk_api.API().add_item(context,
                                             params.get("diskName"),
                                             body,
                                             scope=scope)
            context.operation_data["disk"] = volume
            return None

        disk = context.operation_data.get("disk")
        if disk:
            volume_id = disk["id"]
            item_progress = disk_api.API()._get_add_item_progress(
                context, volume_id)
            if not operation_util.is_final_progress(item_progress):
                return None
            context.operation_data.pop("disk")
            context.operation_data["volume_id"] = volume_id

        instance_id = context.operation_data["instance_id"]
        device_name = context.operation_data["device_name"]
        volume_id = context.operation_data["volume_id"]
        volumes_client = clients.nova(context).volumes
        volumes_client.create_server_volume(instance_id, volume_id,
                                            "/dev/" + device_name)

        args = context.operation_data["register_args"]
        self.register_item(context, args[0], volume_id, args[1], args[2])

        return operation_util.get_final_progress()
Example #16
0
 def _get_delete_item_progress(self, context, dummy_id):
     return operation_util.get_final_progress()
Example #17
0
    def _create_instance(self, context):
        disks = context.operation_data["disks"]
        acs = context.operation_data["acs"]
        full_count = 1 + len(disks) + (1 if acs else 0)
        disk_device = context.operation_data["disk_device"]
        instance = context.operation_data.get("instance")
        progress = {"progress": int(100.0 * disk_device / full_count)}

        disk = context.operation_data.get("disk")
        if disk:
            volume_id = disk["id"]
            item_progress = disk_api.API()._get_add_item_progress(context,
                                                                  volume_id)
            if not operation_util.is_final_progress(item_progress):
                return progress
            context.operation_data.pop("disk")
            disk_device += 1
            context.operation_data["disk_device"] = disk_device
            progress["progress"] = int(100.0 * disk_device / full_count)

        scope = context.operation_data["scope"]
        args = context.operation_data["args"]

        bdm = context.operation_data["bdm"]
        while disk_device < len(disks):
            disk = disks[disk_device]
            if "initializeParams" in disk:
                da = disk_api.API()
                params = disk["initializeParams"]
                body = {"sizeGb": params.get("diskSizeGb"),
                        "sourceImage": params["sourceImage"]}
                volume = da.add_item(context, params.get("diskName", args[0]),
                                     body, scope=scope)
                disk["id"] = volume["id"]
                context.operation_data["disk"] = disk
            # deviceName is optional parameter
            # use passed value if given, othewise generate new dev name
            device_name = disk.get("deviceName")
            if device_name is None:
                device_name = "vd" + string.ascii_lowercase[disk_device]
                disk["deviceName"] = device_name
            bdm[device_name] = disk["id"]

            if "initializeParams" in disk:
                return progress
            disk_device += 1
            context.operation_data["disk_device"] = disk_device

        if not instance:
            kwargs = context.operation_data["kwargs"]
            kwargs["block_device_mapping"] = bdm
            kwargs["availability_zone"] = scope.get_name()
            client = clients.nova(context)
            try:
                instance = client.servers.create(*args, **kwargs)

                for disk in disks:
                    instance_disk_api.API().register_item(context, args[0],
                        disk["id"], disk["deviceName"], disk["autoDelete"])

                instance = utils.to_dict(client.servers.get(instance.id))
                instance = self._prepare_instance(client, context, instance)
                instance["description"] = context.operation_data["description"]
                instance = self._add_db_item(context, instance)
            finally:
                try:
                    ssh_keys = context.operation_data["ssh_keys"]
                    if ssh_keys is not None:
                        client.keypairs.delete(kwargs["key_name"])
                except Exception:
                    pass
            context.operation_data["instance"] = instance
            return progress

        progress = self._get_add_item_progress(context, instance["id"])
        if not operation_util.is_final_progress(progress):
            return progress

        client = clients.nova(context)
        try:
            instance = client.servers.get(instance["id"])
        except clients.novaclient.exceptions.NotFound:
            return operation_util.get_final_progress()

        for net in acs:
            ac = acs[net]
            instance_address_api.API().add_item(context, instance.name,
                net, ac.get("natIP"), ac.get("type"), ac.get("name"))
        return operation_util.get_final_progress()
Example #18
0
 def _get_delete_item_progress(self, context, dummy_id):
     return operation_util.get_final_progress()