/* * Copyright (c) 2016 EMC * All Rights Reserved */ package com.emc.sa.service.vipr.application; import java.net.URI; import java.util.List; import org.apache.commons.lang.StringUtils; import com.emc.sa.engine.bind.Param; import com.emc.sa.engine.service.Service; import com.emc.sa.service.ServiceParams; import com.emc.sa.service.vipr.ViPRService; import com.emc.sa.service.vipr.application.tasks.CreateSnapshotForApplication; import com.emc.sa.service.vipr.application.tasks.DeleteSnapshotForApplication; import com.emc.sa.service.vipr.application.tasks.DeleteSnapshotSessionForApplication; import com.emc.sa.service.vipr.block.BlockStorageUtils; import com.emc.storageos.db.client.model.uimodels.RetainedReplica; import com.emc.storageos.model.DataObjectRestRep; import com.emc.storageos.model.block.NamedVolumesList; import com.emc.storageos.services.util.TimeUtils; import com.emc.vipr.client.Tasks; @Service("CreateSnapshotOfApplication") public class CreateSnapshotOfApplicationService extends ViPRService { @Param(ServiceParams.APPLICATION) private URI applicationId; @Param(ServiceParams.APPLICATION_COPY_SETS) protected String name; @Param(ServiceParams.APPLICATION_SITE) protected String virtualArrayParameter; @Param(ServiceParams.READ_ONLY) protected Boolean readOnly; @Param(ServiceParams.APPLICATION_SUB_GROUP) protected List<String> subGroups; @Override public void execute() throws Exception { NamedVolumesList volumesToUse = BlockStorageUtils.getVolumesBySite(getClient(), virtualArrayParameter, applicationId); List<URI> volumeIds = BlockStorageUtils.getSingleVolumePerSubGroupAndStorageSystem(volumesToUse, subGroups); checkAndPurgeObsoleteSnapshots(applicationId); String snapshotName = TimeUtils.formatDateForCurrent(name); Tasks<? extends DataObjectRestRep> tasks = execute(new CreateSnapshotForApplication(applicationId, volumeIds, snapshotName, readOnly)); addAffectedResources(tasks); addRetainedReplicas(applicationId, snapshotName); } /** * Check retention policy and delete obsolete snapshots if necessary * * @param applicationId - application id */ private void checkAndPurgeObsoleteSnapshots(URI applicationId) { if (!isRetentionRequired()) { return; } List<RetainedReplica> replicas = findObsoleteReplica(applicationId.toString()); for (RetainedReplica replica : replicas) { for (String applicationCopySet : replica.getAssociatedReplicaIds()) { info("Delete application snapshots %s since it exceeds max number of clones allowed", applicationCopySet); List<URI> snapshotSessionIds = BlockStorageUtils.getSingleSnapshotSessionPerSubGroupAndStorageSystem(applicationId, applicationCopySet, subGroups); if (snapshotSessionIds.size() > 0) { info("Delete snapshot sessions %s ", StringUtils.join(snapshotSessionIds, ",")); execute(new DeleteSnapshotSessionForApplication(applicationId, snapshotSessionIds)); } else { List<URI> snapshotIds = BlockStorageUtils.getSingleSnapshotPerSubGroupAndStorageSystem(applicationId, applicationCopySet, subGroups); info("Delete snapshot %s ", StringUtils.join(snapshotIds, ",")); execute(new DeleteSnapshotForApplication(applicationId, snapshotIds)); } } getModelClient().delete(replica); } } }