/* * Copyright (c) 2012-2015 iWave Software LLC * All Rights Reserved */ package com.emc.sa.service.vipr.block; import static com.emc.sa.service.ServiceParams.COUNT; import static com.emc.sa.service.ServiceParams.NAME; import static com.emc.sa.service.ServiceParams.STORAGE_TYPE; import static com.emc.sa.service.ServiceParams.VOLUMES; import java.net.URI; import java.util.List; import com.emc.sa.engine.bind.Param; import com.emc.sa.engine.service.Service; import com.emc.sa.service.vipr.ViPRService; import com.emc.storageos.db.client.model.uimodels.RetainedReplica; import com.emc.storageos.model.DataObjectRestRep; import com.emc.storageos.model.block.BlockObjectRestRep; import com.emc.storageos.model.block.VolumeDeleteTypeEnum; import com.emc.vipr.client.Task; import com.emc.vipr.client.Tasks; @Service("CreateFullCopy") public class CreateFullCopyService extends ViPRService { @Param(value = STORAGE_TYPE, required = false) protected String storageType; @Param(VOLUMES) protected URI volumeId; @Param(NAME) protected String name; @Param(COUNT) protected Integer count; @Override public void precheck() throws Exception { super.precheck(); if (ConsistencyUtils.isVolumeStorageType(storageType)) { BlockStorageUtils.getVolume(volumeId); } } @Override public void execute() throws Exception { Tasks<? extends DataObjectRestRep> tasks; checkAndPurgeObsoleteCopies(volumeId.toString()); if (ConsistencyUtils.isVolumeStorageType(storageType)) { tasks = BlockStorageUtils.createFullCopy(volumeId, name, count); addAffectedResources(tasks); } else { tasks = ConsistencyUtils.createFullCopy(volumeId, name, count); addAffectedResources(tasks); } addRetainedReplicas(volumeId, tasks.getTasks()); for (Task<? extends DataObjectRestRep> copy : tasks.getTasks()) { logInfo("create.full.copy.service", copy.getResource().getName(), copy.getResource().getId()); } } /** * Check retention policy and delete obsolete full copies if necessary * * @param volumeOrCgId - volume id or CG id */ private void checkAndPurgeObsoleteCopies(String volumeOrCgId) { if (!isRetentionRequired()) { return; } List<RetainedReplica> replicas = findObsoleteReplica(volumeOrCgId); for (RetainedReplica replica : replicas) { for (String obsoleteCopyId : replica.getAssociatedReplicaIds()) { BlockObjectRestRep obsoleteCopy = BlockStorageUtils.getVolume(uri(obsoleteCopyId)); info("Delete full copy %s (%s) since it exceeds max number of copies allowed", obsoleteCopyId, obsoleteCopy.getName()); if (ConsistencyUtils.isVolumeStorageType(storageType)) { BlockStorageUtils.removeFullCopy(uri(obsoleteCopyId), VolumeDeleteTypeEnum.FULL); } else { ConsistencyUtils.removeFullCopy(uri(volumeOrCgId), uri(obsoleteCopyId)); } } getModelClient().delete(replica); } } }