use of com.emc.storageos.model.application.VolumeGroupCopySetList in project coprhd-controller by CoprHD.
the class VolumeGroupService method getVolumeGroupSnapshotSets.
/*
* get all snapshot sets associated with the volume group
*/
private VolumeGroupCopySetList getVolumeGroupSnapshotSets(VolumeGroup volumeGroup) {
// get all volumes
List<Volume> volumes = ControllerUtils.getVolumeGroupVolumes(_dbClient, volumeGroup);
VolumeGroupCopySetList copySetList = new VolumeGroupCopySetList();
Set<String> copySets = copySetList.getCopySets();
// get snapshots for each volume in the group
for (Volume volume : volumes) {
if (volume.isVPlexVolume(_dbClient)) {
volume = VPlexUtil.getVPLEXBackendVolume(volume, true, _dbClient);
if (volume == null || volume.getInactive()) {
log.warn("Cannot find backend volume for VPLEX volume {}", volume.getLabel());
continue;
}
}
URIQueryResultList snapshotURIs = new URIQueryResultList();
_dbClient.queryByConstraint(ContainmentConstraint.Factory.getVolumeSnapshotConstraint(volume.getId()), snapshotURIs);
if (!snapshotURIs.iterator().hasNext()) {
continue;
}
List<BlockSnapshot> snapshots = _dbClient.queryObject(BlockSnapshot.class, snapshotURIs);
for (BlockSnapshot snapshot : snapshots) {
if (snapshot != null && !snapshot.getInactive()) {
String snapsetLabel = snapshot.getSnapsetLabel();
if (NullColumnValueGetter.isNotNullValue(snapsetLabel)) {
copySets.add(snapsetLabel);
}
}
}
}
return copySetList;
}
use of com.emc.storageos.model.application.VolumeGroupCopySetList in project coprhd-controller by CoprHD.
the class VolumeGroupService method getVolumeGroupFullCopiesForSet.
/**
* List full copies for a volume group belonging to the provided copy set name
*
* @param volumeGroupId The URI of the volume group.
* @param param VolumeGroupCopySetParam containing the copy set name
*
* @brief List full copies for a volume group belonging to the provided copy set name
*
* @return The list of full copies for the volume group belonging to the provided copy set name
*/
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{id}/protection/full-copies/copy-sets")
@CheckPermission(roles = { Role.SYSTEM_MONITOR, Role.TENANT_ADMIN }, acls = { ACL.ANY })
public NamedVolumesList getVolumeGroupFullCopiesForSet(@PathParam("id") final URI volumeGroupId, final VolumeGroupCopySetParam param) {
ArgValidator.checkFieldUriType(volumeGroupId, VolumeGroup.class, "id");
// Query Volume Group
final VolumeGroup volumeGroup = (VolumeGroup) queryResource(volumeGroupId);
// validate that full copy set name is provided
String fullCopySetName = param.getCopySetName();
ArgValidator.checkFieldNotEmpty(fullCopySetName, COPY_SET_NAME_FIELD);
// validate that the provided set name actually belongs to this Application
VolumeGroupCopySetList fullCopySetNames = getVolumeGroupFullCopySets(volumeGroupId);
if (!fullCopySetNames.getCopySets().contains(fullCopySetName)) {
throw APIException.badRequests.setNameDoesNotBelongToVolumeGroup("Full Copy Set name", fullCopySetName, volumeGroup.getLabel());
}
NamedVolumesList fullCopyList = new NamedVolumesList();
List<Volume> fullCopiesForSet = getClonesBySetName(fullCopySetName, volumeGroupId);
for (Volume fullCopy : fullCopiesForSet) {
fullCopyList.getVolumes().add(toNamedRelatedResource(fullCopy));
}
return fullCopyList;
}
use of com.emc.storageos.model.application.VolumeGroupCopySetList in project coprhd-controller by CoprHD.
the class VolumeGroupService method getVolumeGroupSnapshotSessionsByCopySet.
/**
* List snapshot sessions in a session set for a volume group.
*
* @param volumeGroupId The URI of the volume group
* @param param the VolumeGroupCopySetParam containing set name
* @return BlockSnapshotSessionList
* @brief List snapshot sessions in session set for a volume group
*/
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{id}/protection/snapshot-sessions/copy-sets")
@CheckPermission(roles = { Role.SYSTEM_MONITOR, Role.TENANT_ADMIN }, acls = { ACL.ANY })
public BlockSnapshotSessionList getVolumeGroupSnapshotSessionsByCopySet(@PathParam("id") final URI volumeGroupId, final VolumeGroupCopySetParam param) {
ArgValidator.checkFieldUriType(volumeGroupId, VolumeGroup.class, ID_FIELD);
// query volume group
final VolumeGroup volumeGroup = (VolumeGroup) queryResource(volumeGroupId);
// validate snap session set name
String sessionsetName = param.getCopySetName();
ArgValidator.checkFieldNotNull(sessionsetName, COPY_SET_NAME_FIELD);
// get the snapshot sessions for the given set name in the volume group
BlockSnapshotSessionList snapshotSessionList = new BlockSnapshotSessionList();
// validate that the provided set name actually belongs to this Application
VolumeGroupCopySetList copySetList = getVolumeGroupSnapsetSessionSets(volumeGroup);
if (copySetList.getCopySets().contains(sessionsetName)) {
// get the snapshot sessions for the volume group
List<BlockSnapshotSession> volumeGroupSessions = getVolumeGroupSnapshotSessions(volumeGroup);
for (BlockSnapshotSession session : volumeGroupSessions) {
if (sessionsetName.equals(session.getSessionSetName())) {
snapshotSessionList.getSnapSessionRelatedResourceList().add(toNamedRelatedResource(session));
}
}
}
return snapshotSessionList;
}
use of com.emc.storageos.model.application.VolumeGroupCopySetList in project coprhd-controller by CoprHD.
the class VolumeGroupService method createVolumeGroupSnapshot.
/**
* Creates a volume group snapshot
* Creates snapshot for all the array replication groups within this Application.
* If partial flag is specified, it creates snapshot only for set of array replication groups.
* A Volume from each array replication group can be provided to indicate which array replication
* groups are required to take snapshot.
*
* @prereq none
*
* @param volumeGroupId the URI of the Volume Group
* - Volume group URI
* @param param VolumeGroupSnapshotCreateParam
*
* @brief Create volume group snapshot
* @return TaskList
*/
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{id}/protection/snapshots")
@CheckPermission(roles = { Role.SYSTEM_ADMIN }, acls = { ACL.ANY })
public TaskList createVolumeGroupSnapshot(@PathParam("id") final URI volumeGroupId, VolumeGroupSnapshotCreateParam param) {
// Query volume group
final VolumeGroup volumeGroup = (VolumeGroup) queryResource(volumeGroupId);
// validate replica operation for volume group
validateCopyOperationForVolumeGroup(volumeGroup, ReplicaTypeEnum.SNAPSHOT);
// validate name
String name = param.getName();
ArgValidator.checkFieldNotEmpty(name, NAME_FIELD);
name = TimeUtils.formatDateForCurrent(name);
// snapsetLabel is normalized in RP, do it here too to avoid potential mismatch
name = ResourceOnlyNameGenerator.removeSpecialCharsForName(name, SmisConstants.MAX_SNAPSHOT_NAME_LENGTH);
if (StringUtils.isEmpty(name)) {
// original name has special chars only
throw APIException.badRequests.invalidCopySetName(param.getName(), ReplicaTypeEnum.SNAPSHOT.toString());
}
// check name provided is not duplicate
VolumeGroupCopySetList copySetList = getVolumeGroupSnapshotSets(volumeGroup);
if (copySetList.getCopySets().contains(name)) {
// duplicate name
throw APIException.badRequests.duplicateCopySetName(param.getName(), ReplicaTypeEnum.SNAPSHOT.toString());
}
// volumes to be processed
List<Volume> volumes = new ArrayList<Volume>();
List<URI> partialVolumeList = new ArrayList<URI>();
boolean partial = isPartialRequest(param, volumeGroup, partialVolumeList);
if (partial) {
log.info("Snapshot requested for subset of array groups in Application.");
// validate that at least one volume URI is provided
ArgValidator.checkFieldNotEmpty(partialVolumeList, VOLUMES_FIELD);
// validate that provided volumes
for (URI volumeURI : partialVolumeList) {
ArgValidator.checkFieldUriType(volumeURI, Volume.class, VOLUME_FIELD);
// Get the volume
Volume volume = _dbClient.queryObject(Volume.class, volumeURI);
ArgValidator.checkEntity(volume, volumeURI, isIdEmbeddedInURL(volumeURI));
// validate that provided volume is part of Volume Group
if (!volume.getVolumeGroupIds().contains(volumeGroupId.toString())) {
throw APIException.badRequests.replicaOperationNotAllowedVolumeNotInVolumeGroup(ReplicaTypeEnum.SNAPSHOT.toString(), volume.getLabel());
}
volumes.add(volume);
}
} else {
log.info("Snapshot creation for entire Application");
// get all volumes
volumes.addAll(ControllerUtils.getVolumeGroupVolumes(_dbClient, volumeGroup));
// validate that there should be some volumes in VolumeGroup
if (volumes.isEmpty()) {
throw APIException.badRequests.replicaOperationNotAllowedOnEmptyVolumeGroup(volumeGroup.getLabel(), ReplicaTypeEnum.SNAPSHOT.toString());
}
}
// Check for pending tasks
checkForApplicationPendingTasks(volumeGroup, _dbClient, false);
auditOp(OperationTypeEnum.CREATE_VOLUME_GROUP_SNAPSHOT, true, AuditLogManager.AUDITOP_BEGIN, volumeGroupId.toString(), name);
TaskList taskList = new TaskList();
/**
* If there are VMAX3 volumes in the request, we need to create snap session for them.
* For others, create snapshot.
*
* vmax3Volumes - block VMAX3 or backend VMAX3 for VPLEX based on copy side requested
* volumes - except volumes filtered out for above case
*/
// TODO consider copyOnHaSide from user's request once the underlying implementation supports it.
List<Volume> vmax3Volumes = getVMAX3Volumes(volumes, false);
if (!vmax3Volumes.isEmpty()) {
// check snap session name provided is not duplicate
VolumeGroupCopySetList sessionSet = getVolumeGroupSnapsetSessionSets(volumeGroup);
if (sessionSet.getCopySets().contains(name)) {
// duplicate name
throw APIException.badRequests.duplicateCopySetName(name, ReplicaTypeEnum.SNAPSHOT_SESSION.toString());
}
}
// create snapshot
Map<URI, List<URI>> cgToVolUris = ControllerUtils.groupVolumeURIsByCG(volumes);
Set<Entry<URI, List<URI>>> entrySet = cgToVolUris.entrySet();
for (Entry<URI, List<URI>> entry : entrySet) {
URI cgUri = entry.getKey();
log.info("Create snapshot with consistency group {}", cgUri);
try {
BlockConsistencyGroupSnapshotCreate cgSnapshotParam = new BlockConsistencyGroupSnapshotCreate(name, entry.getValue(), param.getCreateInactive(), param.getReadOnly());
TaskList cgTaskList = _blockConsistencyGroupService.createConsistencyGroupSnapshot(cgUri, cgSnapshotParam);
List<TaskResourceRep> taskResourceRepList = cgTaskList.getTaskList();
if (taskResourceRepList != null && !taskResourceRepList.isEmpty()) {
for (TaskResourceRep taskResRep : taskResourceRepList) {
taskList.addTask(taskResRep);
}
}
} catch (InternalException | APIException e) {
log.error("Exception when creating snapshot for consistency group {}", cgUri, e);
BlockConsistencyGroup cg = _dbClient.queryObject(BlockConsistencyGroup.class, cgUri);
TaskResourceRep task = BlockServiceUtils.createFailedTaskOnCG(_dbClient, cg, ResourceOperationTypeEnum.CREATE_CONSISTENCY_GROUP_SNAPSHOT, e);
taskList.addTask(task);
} catch (Exception ex) {
log.error("Unexpected Exception occurred when creating snapshot for consistency group {}", cgUri, ex);
}
}
// create snapshot session for VMAX3
Map<URI, List<URI>> cgToV3VolUris = ControllerUtils.groupVolumeURIsByCG(vmax3Volumes);
Set<Entry<URI, List<URI>>> entrySetV3 = cgToV3VolUris.entrySet();
for (Entry<URI, List<URI>> entry : entrySetV3) {
URI cgUri = entry.getKey();
log.info("Create snapshot session for consistency group {}, volumes {}", cgUri, Joiner.on(',').join(entry.getValue()));
try {
// create snap session with No targets
SnapshotSessionCreateParam cgSnapshotSessionParam = new SnapshotSessionCreateParam(name, null, entry.getValue());
taskList.getTaskList().addAll(_blockConsistencyGroupService.createConsistencyGroupSnapshotSession(cgUri, cgSnapshotSessionParam).getTaskList());
} catch (InternalException | APIException e) {
log.error("Exception while creating snapshot session for consistency group {}: {}", cgUri, e);
BlockConsistencyGroup cg = _dbClient.queryObject(BlockConsistencyGroup.class, cgUri);
TaskResourceRep task = BlockServiceUtils.createFailedTaskOnCG(_dbClient, cg, ResourceOperationTypeEnum.CREATE_CONSISTENCY_GROUP_SNAPSHOT_SESSION, e);
taskList.addTask(task);
} catch (Exception ex) {
log.error("Unexpected Exception occurred while creating snapshot session for consistency group {}: {}", cgUri, ex);
}
}
auditOp(OperationTypeEnum.CREATE_VOLUME_GROUP_SNAPSHOT, true, AuditLogManager.AUDITOP_END, volumeGroupId.toString(), name);
return taskList;
}
use of com.emc.storageos.model.application.VolumeGroupCopySetList in project coprhd-controller by CoprHD.
the class VolumeGroupService method getVolumeGroupFullCopySets.
/**
* List full copy set names for a volume group
*
* @param volumeGroupId The URI of the volume group.
*
* @brief List full copy set names for a volume group
*
* @return The list of full copy set names for the volume group
*/
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/{id}/protection/full-copies/copy-sets")
@CheckPermission(roles = { Role.SYSTEM_MONITOR, Role.TENANT_ADMIN }, acls = { ACL.ANY })
public VolumeGroupCopySetList getVolumeGroupFullCopySets(@PathParam("id") final URI volumeGroupId) {
ArgValidator.checkFieldUriType(volumeGroupId, VolumeGroup.class, "id");
// Query Volume Group
final VolumeGroup volumeGroup = (VolumeGroup) queryResource(volumeGroupId);
// get all volumes
List<Volume> volumes = ControllerUtils.getVolumeGroupVolumes(_dbClient, volumeGroup);
// Cycle over the volumes in the volume group and
// get the full copies for each volume in the group.
VolumeGroupCopySetList fullCopySets = new VolumeGroupCopySetList();
for (Volume volume : volumes) {
StringSet fullCopyIds = volume.getFullCopies();
if (fullCopyIds != null) {
for (String fullCopyId : fullCopyIds) {
Volume fullCopyVolume = _dbClient.queryObject(Volume.class, URI.create(fullCopyId));
if (fullCopyVolume == null || fullCopyVolume.getInactive()) {
log.warn("Stale full copy {} found for volume {}", fullCopyId, volume.getLabel());
continue;
}
String setName = fullCopyVolume.getFullCopySetName();
if (NullColumnValueGetter.isNullValue(setName)) {
// This should not happen
log.warn(String.format("skipping volume %s becuase fullCopySetName is null", fullCopyVolume.getLabel()));
continue;
}
fullCopySets.getCopySets().add(setName);
}
}
}
return fullCopySets;
}
Aggregations