Exemple #1
0
def clean_vm_or_volume_snapshot(source_name):
    snapshot_name = "ecloud-snapshot-%s" % source_name
    vm_snapshots = yield list_volume(name=snapshot_name,
                                     vd_type=2,
                                     detailed=False)
    for vm_snapshot_item in vm_snapshots:
        yield delete_snapshot(vm_snapshot_item["id"])
Exemple #2
0
def list_snapshot(name):
    """
    :param name: vm or volume name
    :return:
    """
    try:
        snapshots = yield list_volume(name="ecloud-snapshot-%s" % name,
                                      vd_type=2)
        out_snapshots = []
        for snapshot in snapshots:
            if snapshot.get("status") == "deleting":
                continue
            out_snapshots.append({
                "id":
                snapshot["id"],
                "name":
                snapshot["name"],
                "displayname":
                snapshot["metadata"]["displayname"],
                "create_at":
                snapshot['created_at'],
                "des":
                snapshot["metadata"]["des"],
                "size":
                snapshot["size_gb"],
                "status":
                snapshot["status"]
            })
    except Exception as e:
        LOG.error("List Snapshots Error, msg : %s" % e)
        raise e
    raise gen.Return(out_snapshots)
Exemple #3
0
 def delete_snapshots(self):
     """
     :return:
     """
     snapshots = yield volume_package.list_volume(detailed=False, vd_type=2)
     for snapshot_item in snapshots:
         snapshot_info = yield snapshot_package.delete_snapshot(
             snapshot_item["id"])
     self.response(Response())
Exemple #4
0
 def delete_server(self, vm_id, delete_volume_ids=None):
     """ delete vm and delete vm attach volumes
     :param vm_id: the id of to delete vm
     :param delete_volume_ids: the ids of to delete attach volume
     """
     try:
         vm_info = {}
         if vm_id.startswith("vm-"):
             server_task = yield get_task_flow(name=vm_id)
             if server_task:
                 server_task = server_task[0]
                 params = server_task.get("param")
                 server_info = params["body"]["server"]
                 vm_info["network"] = server_info["networks"]
                 vm_info["name"] = server_info["name"]
                 vm_info["displayname"] = server_info["displayname"]
         else:
             vm_infos = yield compute.list_server(vm_ids=vm_id,
                                                  with_task=False)
             if not vm_infos:
                 raise VmNotExist(args=['vm_id', vm_id])
             vm_info = vm_infos[0]
         info = vm_info
         if delete_volume_ids:
             delete_volume_ids = delete_volume_ids.split(",")
         else:
             delete_volume_ids = []
         if not vm_id.startswith("vm-"):
             yield snapshot.clean_vm_or_volume_snapshot(info["name"])
         if delete_volume_ids:
             del_volumes = yield list_volume(detailed=False,
                                             volume_id=delete_volume_ids)
             for del_volume_item in del_volumes:
                 yield snapshot.clean_vm_or_volume_snapshot(
                     del_volume_item["name"])
                 optLog.write(self.request, Type.VDISK,
                              str(del_volume_item["name"]), Operator.DELETE,
                              str(del_volume_item["name"]))
         yield del_server(vm_id, delete_volume_ids=delete_volume_ids)
         optLog.write(
             self.request, Type.VM, str(info["name"]), Operator.DELETE,
             str(info["displayname"]) + " " +
             gen_network_comment(info['network'].values()))
         self.response(Response())
     except Exception as e:
         LOG.error("delete_server error: %s" % e)
         raise e
Exemple #5
0
def snapshot_create(source_id,
                    snapshot_type,
                    name,
                    description,
                    volume_ids=[]):
    """
    :param source_id:
    :param snapshot_type:
    :param name:
    :param description:
    :param volume_ids:
    :return:
    """
    snapshots = []
    data_volumes = []
    volume_mate = {}
    if snapshot_type == SNAPSHOT_TYPE_VM:  # vm
        LOG.debug("Create Snapshot Type is vm")
        vm_info = yield compute.get_server(vm_id=source_id)
        vm_state = vm_info.get("state")
        if vm_state not in ["active", "stopped"]:
            raise VmMustActiveOrStop()
        vm_id = vm_info["id"]
        vm_name = vm_info["name"]
        tenant_id = vm_info["tenant"]["id"]
        sys_volumes = yield list_server_attach_volume(vm_id, vd_type=1)
        if not sys_volumes:
            raise InvalidVm
        sys_volume = sys_volumes[0]
        sys_volume_id = sys_volume["volume_id"]
        sys_volume_size = sys_volume["size"]
        sys_volume_type = sys_volume["type"]
        sys_volume_status = sys_volume["status"]
        host = sys_volume["host"]
        total_size = sys_volume_size
        total_count = 1
        if volume_ids:
            data_volumes = yield list_volume(volume_id=volume_ids)
            metadatas = yield volume_request.volume_metadata(volume_ids)
            for meta_item in metadatas:
                if meta_item["volume_id"] in volume_mate:
                    volume_mate[meta_item["volume_id"]].update(
                        {meta_item["meta_key"]: meta_item["meta_value"]})
                else:
                    volume_mate[meta_item["volume_id"]] = {
                        meta_item["meta_key"]: meta_item["meta_value"]
                    }

            for item_vol in data_volumes:
                if item_vol["status"] not in ["in-use", "available"]:
                    raise VolumeStatusNotAvailable(args=[item_vol["id"]])
                total_size += item_vol["size_gb"]
            total_count += len(data_volumes)
        quota = yield check_tenant_snapshot_quota(tenant_id, total_size,
                                                  total_count)
        yield update_tenant_snapshot_quotas(tenant_id,
                                            used_size=quota.get("used_size"),
                                            used_count=quota.get("used_count"))
        yield set_or_update_vm_meta(vm_id, "status", "snapshoting")
        snapshots.append({
            "volume_id": sys_volume_id,
            "tenant_id": tenant_id,
            "name": "ecloud-snapshot-%s" % vm_name,
            "size": sys_volume_size,
            "volume_type": sys_volume_type,
            "display_discription": TYPE_SNAPSHOT_VOLUME,
            "status": sys_volume_status,
            "metadata": {
                "des":
                description,
                "displayname":
                name,
                "vm_id":
                source_id,
                "availability_zone":
                host[:host.index("@")]
                if "lvm" in host else CONF.storage.share_storage_access,
                "sys_volume_id":
                sys_volume_id,
                "source_status":
                sys_volume_status
            }
        })
    else:
        LOG.debug("Create Snapshot Type is vd")
        volume_ids.append(source_id)
        total_size = 0
        data_volumes = yield list_volume(volume_id=volume_ids)
        metadatas = yield volume_request.volume_metadata(volume_ids)
        for meta_item in metadatas:
            if meta_item["volume_id"] in volume_mate:
                volume_mate[meta_item["volume_id"]].update(
                    {meta_item["meta_key"]: meta_item["meta_value"]})
            else:
                volume_mate[meta_item["volume_id"]] = {
                    meta_item["meta_key"]: meta_item["meta_value"]
                }

        for item_vol in data_volumes:
            if item_vol["status"] not in ["in-use", "available"]:
                raise VolumeStatusNotAvailable(args=[item_vol["id"]])
            total_size += item_vol["size_gb"]
        tenant_id = data_volumes[0]["tenant"]["id"]
        quota = yield check_tenant_snapshot_quota(tenant_id, total_size,
                                                  len(data_volumes))
        yield update_tenant_snapshot_quotas(tenant_id,
                                            used_size=quota.get("used_size"),
                                            used_count=quota.get("used_count"))
    for volume_item in data_volumes:
        volume_id = volume_item["id"]
        volume_name = volume_item["name"]
        volume_size = volume_item["size_gb"]
        volume_tenant_id = volume_item["tenant"]["id"]
        status = volume_item["status"]
        host = volume_item["location"]
        snapshots.append({
            "volume_id": volume_id,
            "tenant_id": volume_tenant_id,
            "name": "ecloud-snapshot-%s" % volume_name,
            "size": volume_size,
            "volume_type": host[host.rindex("#") + 1:],
            "display_discription": TYPE_SNAPSHOT_VOLUME,
            "status": status,
            "volume_matedata": volume_mate[volume_id],
            "metadata": {
                "des":
                description,
                "displayname":
                name,
                "availability_zone":
                host[:host.index("@")]
                if "lvm" in host else CONF.storage.share_storage_access,
                "volume_id":
                volume_id,
                "source_status":
                status
            }
        })
    LOG.debug("Snapshot Info Ready. Start gen snapshot volume.")
    yield _gen_snapshot_volume(snapshots)
Exemple #6
0
    force delete a server.
    :param vm_id: id of server to get
    :return
    """
    try:
        server = yield server_action(vm_id, "forceDelete")
    except Exception, e:
        LOG.error("force delete server error: %s" % e)
        raise ServerOperationFailed()
    finally:
        servers = yield server_list(server_ids=vm_id)
        if servers and servers[0].get("vm_state") == VM_STATUS_ERROR:
            server = servers[0]
            vd_name = "ecloud-sys-volume-%s" % server["name"]
            sys_vds = yield list_volume(detailed=False,
                                        name=vd_name,
                                        vd_type=1)
            if sys_vds:
                sys_vd_id = sys_vds[0]["id"]
                yield delete_volume(sys_vd_id)
            yield delete_instance_info(vm_id)
            yield task.delete_task_flow_by_resource(server["name"])
    raise gen.Return(server)


@gen.coroutine
def server_restore(vm_id):
    """
    restore a server.

    :param vm_id: id of server to get
Exemple #7
0
__author__ = '*****@*****.**'


@gen.coroutine
def clean_rubbish():
    """clean task"""
    try:
        db = dbpools.get_local()
        sql = "update taskflow set status=4, updated_at=now() where status=3"
        yield dbpools.update(db, sql)
    except Exception, e:
        pass
    try:
        """clean volume"""
        need_del_volume = yield volume.list_volume(detailed=False, vd_type=5)
        for vol in need_del_volume:
            yield volume.delete_volume(vol.get("id"))
    except Exception, e:
        pass
    try:
        """clean sys volume"""
        need_del_sys_volume = yield volume.list_volume(detailed=False,
                                                       vd_type=1,
                                                       available=True)
        for vol in need_del_sys_volume:
            vm = yield compute.get_server(
                name=vol.get("name")[len('ecloud-sys-volume-'):])
            if not vm:
                yield snapshot.update_volume_db(volume_id=vol.get("id"),
                                                status="available",