/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.block.taskcompleter; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.NamedURI; import com.emc.storageos.db.client.model.Operation.Status; import com.emc.storageos.db.client.model.Volume; import com.emc.storageos.db.client.util.NullColumnValueGetter; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.services.OperationTypeEnum; import com.emc.storageos.svcs.errorhandling.model.ServiceCoded; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; import java.util.Collection; import java.util.List; public class SRDFLinkStopCompleter extends SRDFTaskCompleter { private static final long serialVersionUID = -8405901055468081447L; private static final Logger _log = LoggerFactory.getLogger(SRDFLinkStopCompleter.class); private Collection<Volume> srcVolumes; private Collection<Volume> tgtVolumes; public SRDFLinkStopCompleter(List<URI> ids, String opId) { super(ids, opId); } public void setVolumes(Collection<Volume> srcVolumes, Collection<Volume> targetVolumes) { this.srcVolumes = srcVolumes; this.tgtVolumes = targetVolumes; } @Override protected void complete(DbClient dbClient, Status status, ServiceCoded coded) throws DeviceControllerException { try { setDbClient(dbClient); switch (status) { case ready: if (null != srcVolumes && null != tgtVolumes && !srcVolumes.isEmpty() && !tgtVolumes.isEmpty()) { for (Volume sourceVol : srcVolumes) { sourceVol.setPersonality(NullColumnValueGetter.getNullStr()); sourceVol.setAccessState(Volume.VolumeAccessState.READWRITE.name()); if (null != sourceVol.getSrdfTargets()) { sourceVol.getSrdfTargets().clear(); } sourceVol.setConsistencyGroup(NullColumnValueGetter.getNullURI()); dbClient.persistObject(sourceVol); } for (Volume target : tgtVolumes) { target.setPersonality(NullColumnValueGetter.getNullStr()); target.setAccessState(Volume.VolumeAccessState.READWRITE.name()); target.setSrdfParent(new NamedURI(NullColumnValueGetter.getNullURI(), NullColumnValueGetter.getNullStr())); target.setSrdfCopyMode(NullColumnValueGetter.getNullStr()); target.setSrdfGroup(NullColumnValueGetter.getNullURI()); target.setConsistencyGroup(NullColumnValueGetter.getNullURI()); dbClient.updateAndReindexObject(target); } Volume target = tgtVolumes.iterator().next(); Volume source = srcVolumes.iterator().next(); _log.info("SRDF Devices source {} and target {} converted to non srdf devices", source.getId(), target.getId()); recordSRDFOperation(dbClient, OperationTypeEnum.STOP_SRDF_LINK, status, source.getId().toString(), target .getId().toString()); } default: _log.info("Unable to handle SRDF Link Stop Operational status: {}", status); } } catch (Exception e) { _log.error("Failed updating status. SRDFMirrorStop {}, for task " + getOpId(), getId(), e); } finally { super.complete(dbClient, status, coded); } } @Override protected Volume.LinkStatus getVolumeSRDFLinkStatusForSuccess() { return Volume.LinkStatus.DETACHED; } }