@Override public boolean makeSureInstallPathNotUsed(StorageTrashSpec spec) { if (spec.getResourceType().equals(VolumeVO.class.getSimpleName())) { return makeSureInstallPathNotUsedByVolume(spec.getInstallPath()); } else if (spec.getResourceType().equals(ImageVO.class.getSimpleName())) { return makeSureInstallPathNotUsedByImage(spec.getInstallPath()); } else if (spec.getResourceType().equals(VolumeSnapshotVO.class.getSimpleName())) { return makeSureInstallPathNotUsedBySnapshot(spec.getInstallPath()); } return true; } }
@Override public Long getTrashId(String storageUuid, String installPath) { DebugUtils.Assert(installPath != null, "installPath is not allowed null here"); List<JsonLabelVO> lables = Q.New(JsonLabelVO.class).eq(JsonLabelVO_.resourceUuid, storageUuid).like(JsonLabelVO_.labelValue, String.format("%%%s%%", installPath)).list(); if (!lables.isEmpty()) { for (JsonLabelVO lable: lables) { for (TrashType type: TrashType.values()) { if (!lable.getLabelKey().startsWith(type.name())) { // if lable key not starts with type, it may not be storage trash continue; } } StorageTrashSpec spec = JSONObjectUtil.toObject(lable.getLabelValue(), StorageTrashSpec.class); if (spec.getInstallPath().equals(installPath)) { return lable.getId(); } } } return null; }
@Override public void run(MessageReply reply) { if (reply.isSuccess()) { logger.info(String.format("Deleted volume %s in Trash.", spec.getInstallPath())); IncreasePrimaryStorageCapacityMsg imsg = new IncreasePrimaryStorageCapacityMsg(); imsg.setPrimaryStorageUuid(self.getUuid()); imsg.setDiskSize(spec.getSize()); bus.makeTargetServiceIdByResourceUuid(imsg, PrimaryStorageConstant.SERVICE_ID, self.getUuid()); bus.send(imsg); trash.removeFromDb(trashId); logger.info(String.format("Returned space[size:%s] to PS %s after volume migration", spec.getSize(), self.getUuid())); result.setSize(spec.getSize()); result.setResourceUuids(CollectionDSL.list(spec.getResourceUuid())); completion.success(result); } else { logger.warn(String.format("Failed to delete volume %s in Trash.", spec.getInstallPath())); completion.fail(reply.getError()); } } });
@Override public void run(FlowTrigger trigger, Map data) { DeleteVolumeBitsOnPrimaryStorageMsg msg = new DeleteVolumeBitsOnPrimaryStorageMsg(); msg.setPrimaryStorageUuid(self.getUuid()); msg.setInstallPath(spec.getInstallPath()); bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, self.getUuid()); bus.send(msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (reply.isSuccess()) { logger.info(String.format("Deleted volume %s in Trash.", spec.getInstallPath())); } else { logger.warn(String.format("Failed to delete volume %s in Trash.", spec.getInstallPath())); } trigger.next(); } }); } });
@Override public void run(FlowTrigger trigger, Map data) { PurgeSnapshotOnPrimaryStorageMsg msg = new PurgeSnapshotOnPrimaryStorageMsg(); msg.setPrimaryStorageUuid(self.getUuid()); msg.setVolumePath(spec.getInstallPath()); bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, self.getUuid()); bus.send(msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (reply.isSuccess()) { logger.info(String.format("Purged all snapshots of volume %s.", spec.getInstallPath())); } else { logger.warn(String.format("Failed to purge snapshots of volume %s.", spec.getInstallPath())); } trigger.next(); } }); } }).then(new NoRollbackFlow() {
@Override public void run(MessageReply reply) { if (reply.isSuccess()) { BackupStorageVO srcBS = dbf.findByUuid(self.getUuid(), BackupStorageVO.class); srcBS.setAvailableCapacity(srcBS.getAvailableCapacity() + spec.getSize()); dbf.update(srcBS); logger.info(String.format("Deleted image %s and returned space[size:%s] to BS[uuid:%s] after image migration", spec.getInstallPath(), spec.getSize(), self.getUuid())); trash.removeFromDb(spec.getTrashId()); result.setSize(spec.getSize()); result.setResourceUuids(CollectionDSL.list(spec.getResourceUuid())); completion.success(result); } else { logger.warn(String.format("Failed to delete image %s in image migration.", spec.getInstallPath())); completion.fail(reply.getError()); } } });
StorageTrashSpec spec = t.getValue(); if (!trash.makeSureInstallPathNotUsed(spec)) { logger.warn(String.format("%s is still in using by %s, only remove it from trash...", spec.getInstallPath(), spec.getResourceType())); trash.removeFromDb(spec.getTrashId()); coml.done(); msg.setInstallPath(spec.getInstallPath()); msg.setBackupStorageUuid(self.getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, BackupStorageConstant.SERVICE_ID, self.getUuid());
logger.warn(String.format("%s is still in using by %s, only remove it from trash...", spec.getInstallPath(), spec.getResourceType())); trash.removeFromDb(spec.getTrashId()); completion.success(result); msg.setInstallPath(spec.getInstallPath()); msg.setBackupStorageUuid(self.getUuid()); bus.makeTargetServiceIdByResourceUuid(msg, BackupStorageConstant.SERVICE_ID, self.getUuid());
logger.warn(String.format("%s is still in using by %s, only remove it from trash...", spec.getInstallPath(), spec.getResourceType())); trash.removeFromDb(spec.getTrashId()); coml.done(); chain.setName(String.format("clean-trash-on-volume-%s", spec.getInstallPath())); chain.then(new NoRollbackFlow() { @Override
logger.warn(String.format("%s is still in using by %s, only remove it from trash...", spec.getInstallPath(), spec.getResourceType())); trash.removeFromDb(spec.getTrashId()); coml.done(); msg.setInstallPath(spec.getInstallPath()); msg.setHypervisorType(spec.getHypervisorType()); msg.setFolder(spec.isFolder());
logger.warn(String.format("%s is still in using by %s, only remove it from trash...", spec.getInstallPath(), spec.getResourceType())); trash.removeFromDb(spec.getTrashId()); completion.success(result); chain.setName(String.format("clean-trash-on-volume-%s", spec.getInstallPath())); chain.then(new NoRollbackFlow() { @Override
logger.warn(String.format("%s is still in using by %s, only remove it from trash...", spec.getInstallPath(), spec.getResourceType())); trash.removeFromDb(spec.getTrashId()); completion.success(result); msg.setInstallPath(spec.getInstallPath()); msg.setHypervisorType(spec.getHypervisorType()); msg.setFolder(spec.isFolder());