def reassign_volume(volume, project): if volume.index == 0: raise faults.Conflict("Cannot reassign: %s is a system volume" % volume.id) if volume.machine_id is not None: server = util.get_server(volume.userid, volume.machine_id, for_update=True, non_deleted=True, exception=faults.BadRequest) commands.validate_server_action(server, "REASSIGN") action_fields = {"from_project": volume.project, "to_project": project} log.info("Reassigning volume %s from project %s to %s", volume.id, volume.project, project) volume.project = project volume.save() quotas.issue_and_accept_commission(volume, action="REASSIGN", action_fields=action_fields)
def delete(volume): """Delete a Volume""" # A volume is deleted by detaching it from the server that is attached. # Deleting a detached volume is not implemented. server_id = volume.machine_id if server_id is not None: server = util.get_server(volume.userid, server_id, for_update=True, non_deleted=True, exception=faults.BadRequest) server_attachments.detach_volume(server, volume) log.info("Detach volume '%s' from server '%s', job: %s", volume.id, server_id, volume.backendjobid) else: raise faults.BadRequest("Cannot delete a detached volume") return volume
def create(user_id, size, server_id, name=None, description=None, source_volume_id=None, source_snapshot_id=None, source_image_id=None, volume_type_id=None, metadata=None, project=None): # Currently we cannot create volumes without being attached to a server if server_id is None: raise faults.BadRequest("Volume must be attached to server") server = util.get_server(user_id, server_id, for_update=True, non_deleted=True, exception=faults.BadRequest) server_vtype = server.flavor.volume_type if volume_type_id is not None: volume_type = util.get_volume_type(volume_type_id, include_deleted=False, exception=faults.BadRequest) if volume_type != server_vtype: raise faults.BadRequest("Cannot create a volume with type '%s' to" " a server with volume type '%s'." % (volume_type.id, server_vtype.id)) else: volume_type = server_vtype # Assert that not more than one source are used sources = filter(lambda x: x is not None, [source_volume_id, source_snapshot_id, source_image_id]) if len(sources) > 1: raise faults.BadRequest("Volume can not have more than one source!") if source_volume_id is not None: source_type = "volume" source_uuid = source_volume_id elif source_snapshot_id is not None: source_type = "snapshot" source_uuid = source_snapshot_id elif source_image_id is not None: source_type = "image" source_uuid = source_image_id else: source_type = "blank" source_uuid = None if project is None: project = user_id if metadata is not None and \ len(metadata) > settings.CYCLADES_VOLUME_MAX_METADATA: raise faults.BadRequest("Volumes cannot have more than %s metadata " "items" % settings.CYCLADES_VOLUME_MAX_METADATA) volume = _create_volume(server, user_id, project, size, source_type, source_uuid, volume_type=volume_type, name=name, description=description, index=None) if metadata is not None: for meta_key, meta_val in metadata.items(): utils.check_name_length(meta_key, VolumeMetadata.KEY_LENGTH, "Metadata key is too long") utils.check_name_length(meta_val, VolumeMetadata.VALUE_LENGTH, "Metadata key is too long") volume.metadata.create(key=meta_key, value=meta_val) server_attachments.attach_volume(server, volume) return volume