package org.zstack.storage.backup; import org.apache.commons.io.FilenameUtils; import org.zstack.core.Platform; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.header.image.ImageConstant.ImageMediaType; import org.zstack.header.image.ImageInventory; import org.zstack.header.storage.snapshot.VolumeSnapshotInventory; import org.zstack.header.storage.snapshot.VolumeSnapshotVO; import org.zstack.header.volume.VolumeInventory; import org.zstack.identity.AccountManager; import org.zstack.utils.DebugUtils; import org.zstack.utils.path.PathUtil; import java.io.File; import java.util.ArrayList; import java.util.List; public class BackupStoragePathMaker { private static final List<String> knownImageExtensions = new ArrayList<String>(); static { knownImageExtensions.add("qcow2"); knownImageExtensions.add("vmdk"); knownImageExtensions.add("ova"); knownImageExtensions.add("img"); knownImageExtensions.add("vhd"); knownImageExtensions.add("qcow"); knownImageExtensions.add("raw"); } private static final String ROOT_VOLUME_TEMPLATE_FOLDER = "rootVolumeTemplates"; private static final String DATA_VOLUME_TEMPLATE_FOLDER = "dataVolumeTemplates"; private static final String ISO_FOLDER = "dataVolumeTemplates"; private static final String VOLUME_SNAPSHOT_FOLDER = "volumeSnapshots"; private static AccountManager accountManager; public static AccountManager getAccountManager() { if (accountManager == null) { accountManager = Platform.getComponentLoader().getComponent(AccountManager.class); } return accountManager; } private static String makeFilename(String installPath, String format) { File f = new File(installPath); String baseName = FilenameUtils.getBaseName(f.getAbsolutePath()); String suffix = FilenameUtils.getExtension(f.getAbsolutePath()); if (!knownImageExtensions.contains(baseName)) { if (format.equals(ImageMediaType.RootVolumeTemplate.toString())) { suffix = "template"; } else if (format.equals(ImageMediaType.ISO.toString())) { suffix = "iso"; } else if (format.equals(ImageMediaType.DataVolumeTemplate.toString())) { suffix = "volume"; } } return String.format("%s.%s", baseName, suffix); } private static String accountFolder(String accountUuid) { return "acct-" + accountUuid; } public static String makeVolumeInstallPath(String url, VolumeInventory vol) { String accountUuid = getAccountManager().getOwnerAccountUuidOfResource(vol.getUuid()); String fileName = makeFilename(url, "volume"); return PathUtil.join("volumes", accountFolder(accountUuid), vol.getUuid(), fileName); } public static String makeImageInstallPath(ImageInventory iminv) { String root; if (iminv.getMediaType().equals(ImageMediaType.RootVolumeTemplate.toString())) { root = ROOT_VOLUME_TEMPLATE_FOLDER; } else if (iminv.getMediaType().equals(ImageMediaType.ISO.toString())) { root = ISO_FOLDER; } else if (iminv.getMediaType().equals(ImageMediaType.DataVolumeTemplate.toString())) { root = DATA_VOLUME_TEMPLATE_FOLDER; } else { throw new CloudRuntimeException(String.format("unknown image mediaType[%s]", iminv.getMediaType())); } String accountUuid = getAccountManager().getOwnerAccountUuidOfResource(iminv.getUuid()); String filename = makeFilename(iminv.getUrl(), iminv.getMediaType()); return PathUtil.join(root, accountFolder(accountUuid), iminv.getUuid(), filename); } public static String makeImageInstallPath(String imageUuid, String mediaType) { String root; String suffix; if (mediaType.equals(ImageMediaType.RootVolumeTemplate.toString())) { root = ROOT_VOLUME_TEMPLATE_FOLDER; suffix = "template"; } else if (mediaType.equals(ImageMediaType.ISO.toString())) { root = ISO_FOLDER; suffix = "iso"; } else if (mediaType.equals(ImageMediaType.DataVolumeTemplate.toString())) { root = DATA_VOLUME_TEMPLATE_FOLDER; suffix = "volume"; } else if (mediaType.equals(VolumeSnapshotVO.class.getSimpleName())) { root = VOLUME_SNAPSHOT_FOLDER; suffix = "snapshot"; } else { throw new CloudRuntimeException(String.format("unknown image mediaType[%s]", mediaType)); } String accountUuid = getAccountManager().getOwnerAccountUuidOfResource(imageUuid); String filename = String.format("%s.%s", imageUuid, suffix); return PathUtil.join(root, accountFolder(accountUuid), imageUuid, filename); } private static String getAccountUuid(String resourceUuid) { AccountManager acntMgr = Platform.getComponentLoader().getComponent(AccountManager.class); String accountUuid = acntMgr.getOwnerAccountUuidOfResource(resourceUuid); DebugUtils.Assert(accountUuid!=null, String.format("cannot find account uuid for resource[uuid:%s]", resourceUuid)); return accountUuid; } public static String makeDataVolumeTemplateInstallFolderPath(String volumeUUid) { String accountUuid = getAccountUuid(volumeUUid); return PathUtil.join(DATA_VOLUME_TEMPLATE_FOLDER, accountFolder(accountUuid), volumeUUid); } public static String makeRootVolumeTemplateInstallFolderPath(String imageUuid) { String accountUuid = getAccountUuid(imageUuid); return PathUtil.join(ROOT_VOLUME_TEMPLATE_FOLDER, accountFolder(accountUuid), imageUuid); } public static String makeVolumeSnapshotInstallFolderPath(String snapshotUuid) { String accountUuid = getAccountUuid(snapshotUuid); return PathUtil.join(VOLUME_SNAPSHOT_FOLDER, accountFolder(accountUuid), snapshotUuid); } }