Search in sources :

Example 1 with VolumeGroupCopySetList

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;
}
Also used : Volume(com.emc.storageos.db.client.model.Volume) BlockSnapshot(com.emc.storageos.db.client.model.BlockSnapshot) VolumeGroupCopySetList(com.emc.storageos.model.application.VolumeGroupCopySetList) URIQueryResultList(com.emc.storageos.db.client.constraint.URIQueryResultList)

Example 2 with VolumeGroupCopySetList

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;
}
Also used : Volume(com.emc.storageos.db.client.model.Volume) VolumeGroup(com.emc.storageos.db.client.model.VolumeGroup) NamedVolumesList(com.emc.storageos.model.block.NamedVolumesList) VolumeGroupCopySetList(com.emc.storageos.model.application.VolumeGroupCopySetList) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Consumes(javax.ws.rs.Consumes) Produces(javax.ws.rs.Produces) CheckPermission(com.emc.storageos.security.authorization.CheckPermission)

Example 3 with VolumeGroupCopySetList

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;
}
Also used : BlockSnapshotSession(com.emc.storageos.db.client.model.BlockSnapshotSession) VolumeGroup(com.emc.storageos.db.client.model.VolumeGroup) BlockSnapshotSessionList(com.emc.storageos.model.block.BlockSnapshotSessionList) VolumeGroupCopySetList(com.emc.storageos.model.application.VolumeGroupCopySetList) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Consumes(javax.ws.rs.Consumes) Produces(javax.ws.rs.Produces) CheckPermission(com.emc.storageos.security.authorization.CheckPermission)

Example 4 with VolumeGroupCopySetList

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;
}
Also used : BlockConsistencyGroupSnapshotCreate(com.emc.storageos.model.block.BlockConsistencyGroupSnapshotCreate) SnapshotSessionCreateParam(com.emc.storageos.model.block.SnapshotSessionCreateParam) VolumeGroupSnapshotSessionCreateParam(com.emc.storageos.model.application.VolumeGroupSnapshotSessionCreateParam) TaskList(com.emc.storageos.model.TaskList) ArrayList(java.util.ArrayList) TaskResourceRep(com.emc.storageos.model.TaskResourceRep) VolumeGroupCopySetList(com.emc.storageos.model.application.VolumeGroupCopySetList) URI(java.net.URI) NullColumnValueGetter.isNullURI(com.emc.storageos.db.client.util.NullColumnValueGetter.isNullURI) InternalException(com.emc.storageos.svcs.errorhandling.resources.InternalException) APIException(com.emc.storageos.svcs.errorhandling.resources.APIException) InternalException(com.emc.storageos.svcs.errorhandling.resources.InternalException) BlockConsistencyGroup(com.emc.storageos.db.client.model.BlockConsistencyGroup) Entry(java.util.Map.Entry) APIException(com.emc.storageos.svcs.errorhandling.resources.APIException) Volume(com.emc.storageos.db.client.model.Volume) VolumeGroup(com.emc.storageos.db.client.model.VolumeGroup) BlockSnapshotSessionList(com.emc.storageos.model.block.BlockSnapshotSessionList) ArrayList(java.util.ArrayList) TaskList(com.emc.storageos.model.TaskList) NamedVolumeGroupsList(com.emc.storageos.model.block.NamedVolumeGroupsList) HostList(com.emc.storageos.model.host.HostList) URIQueryResultList(com.emc.storageos.db.client.constraint.URIQueryResultList) ClusterList(com.emc.storageos.model.host.cluster.ClusterList) VolumeGroupList(com.emc.storageos.model.application.VolumeGroupList) List(java.util.List) NamedVolumesList(com.emc.storageos.model.block.NamedVolumesList) VolumeGroupCopySetList(com.emc.storageos.model.application.VolumeGroupCopySetList) SnapshotList(com.emc.storageos.model.SnapshotList) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Consumes(javax.ws.rs.Consumes) Produces(javax.ws.rs.Produces) CheckPermission(com.emc.storageos.security.authorization.CheckPermission)

Example 5 with VolumeGroupCopySetList

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;
}
Also used : Volume(com.emc.storageos.db.client.model.Volume) VolumeGroup(com.emc.storageos.db.client.model.VolumeGroup) StringSet(com.emc.storageos.db.client.model.StringSet) VolumeGroupCopySetList(com.emc.storageos.model.application.VolumeGroupCopySetList) Path(javax.ws.rs.Path) Produces(javax.ws.rs.Produces) GET(javax.ws.rs.GET) CheckPermission(com.emc.storageos.security.authorization.CheckPermission)

Aggregations

VolumeGroupCopySetList (com.emc.storageos.model.application.VolumeGroupCopySetList)7 Volume (com.emc.storageos.db.client.model.Volume)5 VolumeGroup (com.emc.storageos.db.client.model.VolumeGroup)5 CheckPermission (com.emc.storageos.security.authorization.CheckPermission)5 Path (javax.ws.rs.Path)5 Produces (javax.ws.rs.Produces)5 Consumes (javax.ws.rs.Consumes)4 POST (javax.ws.rs.POST)4 URIQueryResultList (com.emc.storageos.db.client.constraint.URIQueryResultList)3 BlockSnapshotSessionList (com.emc.storageos.model.block.BlockSnapshotSessionList)3 NamedVolumesList (com.emc.storageos.model.block.NamedVolumesList)3 BlockSnapshotSession (com.emc.storageos.db.client.model.BlockSnapshotSession)2 NullColumnValueGetter.isNullURI (com.emc.storageos.db.client.util.NullColumnValueGetter.isNullURI)2 SnapshotList (com.emc.storageos.model.SnapshotList)2 TaskList (com.emc.storageos.model.TaskList)2 VolumeGroupList (com.emc.storageos.model.application.VolumeGroupList)2 VolumeGroupSnapshotSessionCreateParam (com.emc.storageos.model.application.VolumeGroupSnapshotSessionCreateParam)2 NamedVolumeGroupsList (com.emc.storageos.model.block.NamedVolumeGroupsList)2 SnapshotSessionCreateParam (com.emc.storageos.model.block.SnapshotSessionCreateParam)2 HostList (com.emc.storageos.model.host.HostList)2