/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package controllers.resources;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.RelatedResourceRep;
import com.emc.storageos.model.application.VolumeGroupRestRep;
import com.emc.storageos.model.block.BlockSnapshotSessionRestRep;
import com.emc.storageos.model.block.BlockSnapshotRestRep;
import com.emc.storageos.model.block.VolumeRestRep;
import com.emc.vipr.client.core.util.ResourceUtils;
import com.google.common.collect.Lists;
import models.datatable.ApplicationSnapSessionDataTable;
import models.datatable.ApplicationSnapSessionDataTable.ApplicationSnapshotSession;
import models.datatable.ApplicationSnapSessionSetDataTable;
import models.datatable.ApplicationSnapSessionSetDataTable.ApplicationSnapSessionSets;
import models.datatable.ApplicationSnapshotDataTable;
import models.datatable.ApplicationSnapshotSetDataTable;
import models.datatable.ApplicationSnapshotSetDataTable.ApplicationSnapshotSets;
import models.datatable.ApplicationSupportDataTable;
import models.datatable.ApplicationSnapshotDataTable.ApplicationSnapshots;
import models.datatable.BlockVolumesDataTable;
import models.datatable.ApplicationFullCopySetsDataTable;
import models.datatable.ApplicationFullCopySetsDataTable.ApplicationFullCopySets;
import play.mvc.With;
import util.AppSupportUtil;
import util.BourneUtil;
import util.datatable.DataTablesSupport;
import controllers.Common;
import controllers.resources.BlockApplications.VolumeApplicationDataTable.VolumeApplication;
@With(Common.class)
public class BlockApplications extends ResourceController {
private static ApplicationSupportDataTable blockApplicationsDataTable = new ApplicationSupportDataTable();
public static void blockApplications() {
renderArgs.put("dataTable", blockApplicationsDataTable);
addReferenceData();
render();
}
public static void blockApplicationsJson() {
List<ApplicationSupportDataTable.ApplicationSupport> applications = ApplicationSupportDataTable.fetch();
renderJSON(DataTablesSupport.createJSON(applications, params));
}
public static void blockApplicationDetails(String id) {
renderArgs.put("dataTable", new VolumeApplicationDataTable());
renderArgs.put("cloneDataTable", new ApplicationFullCopySetsDataTable());
renderArgs.put("snapshotDataTable", new ApplicationSnapshotSetDataTable());
renderArgs.put("snapsessionDataTable", new ApplicationSnapSessionSetDataTable());
VolumeGroupRestRep application = AppSupportUtil.getApplication(id);
render(application);
}
public static void applicationCloneJson(String id) {
List<ApplicationFullCopySets> cloneDetails = Lists.newArrayList();
Set<String> clonesSet = AppSupportUtil.getFullCopySetsByApplication(id);
for (String clone : clonesSet) {
List<NamedRelatedResourceRep> volumeDetailClone = AppSupportUtil
.getVolumeGroupFullCopiesForSet(id, clone);
cloneDetails.add(new ApplicationFullCopySets(clone,
volumeDetailClone));
}
renderJSON(DataTablesSupport.createJSON(cloneDetails, params));
}
public static void applicationSnapshotJson(String id) {
List<ApplicationSnapshotSets> snapDetails = Lists.newArrayList();
Set<String> snapSets = AppSupportUtil.getVolumeGroupSnapshotSets(id);
for (String snap : snapSets) {
List<NamedRelatedResourceRep> snapshots = AppSupportUtil
.getVolumeGroupSnapshotsForSet(id, snap);
snapDetails.add(new ApplicationSnapshotSets(snap, snapshots));
}
renderJSON(DataTablesSupport.createJSON(snapDetails, params));
}
public static void applicationSnapSessionJson(String id) {
List<ApplicationSnapSessionSets> snapDetails = Lists.newArrayList();
Set<String> sessionSet = AppSupportUtil
.getVolumeGroupSnapsetSessionSets(id);
for (String snap : sessionSet) {
List<NamedRelatedResourceRep> snapshots = AppSupportUtil
.getVolumeGroupSnapshotSessionsByCopySet(id, snap);
snapDetails.add(new ApplicationSnapSessionSets(snap, snapshots));
}
renderJSON(DataTablesSupport.createJSON(snapDetails, params));
}
public static void applicationVolumeJson(String id) {
List<VolumeApplication> volumeDetails = Lists.newArrayList();
List<NamedRelatedResourceRep> volumes = AppSupportUtil.getVolumesByApplication(id);
Map<URI, String> virtualArrays = ResourceUtils.mapNames(BourneUtil.getViprClient().varrays().list());
Map<URI, String> virtualPools = ResourceUtils.mapNames(BourneUtil.getViprClient().blockVpools().list());
for (NamedRelatedResourceRep volume : volumes) {
VolumeRestRep blockVolume = BourneUtil.getViprClient().blockVolumes().get((volume.getId()));
volumeDetails.add(new VolumeApplication(blockVolume, virtualArrays, virtualPools));
}
renderJSON(DataTablesSupport.createJSON(volumeDetails, params));
}
public static void getAssociatedVolumes(String id, String copySet) {
renderArgs.put("dataTable", new VolumeApplicationDataTable());
VolumeGroupRestRep application = AppSupportUtil.getApplication(id);
String copyLabel = id + "~~~" + copySet;
render(application, copyLabel, copySet);
}
public static void getAssociatedVolumesJSON(String copyLabel) {
List<VolumeApplication> volumeDetails = Lists.newArrayList();
String[] copySets = copyLabel.split("~~~");
List<NamedRelatedResourceRep> volumeDetailClone = AppSupportUtil.getVolumeGroupFullCopiesForSet(copySets[0], copySets[1]);
Map<URI, String> virtualArrays = ResourceUtils.mapNames(BourneUtil.getViprClient().varrays().list());
Map<URI, String> virtualPools = ResourceUtils.mapNames(BourneUtil.getViprClient().blockVpools().list());
for (NamedRelatedResourceRep volume : volumeDetailClone) {
VolumeRestRep blockVolume = BourneUtil.getViprClient().blockVolumes().get(volume.getId());
volumeDetails.add(new VolumeApplication(blockVolume, virtualArrays, virtualPools));
}
renderJSON(DataTablesSupport.createJSON(volumeDetails, params));
}
public static void getAssociatedSnapshots(String id, String snapSet) {
renderArgs.put("dataTable", new ApplicationSnapshotDataTable());
VolumeGroupRestRep application = AppSupportUtil.getApplication(id);
String snapLabel = id + "~~~" + snapSet;
render(application,snapLabel,snapSet);
}
public static void getAssociatedSnapshotsJSON(String snapLabel) {
String[] snapSets = snapLabel.split("~~~");
List<ApplicationSnapshots> snapShotDetails = Lists.newArrayList();
List<NamedRelatedResourceRep> snapsetDetails = AppSupportUtil.getVolumeGroupSnapshotsForSet(snapSets[0], snapSets[1]);
for (NamedRelatedResourceRep snapShot : snapsetDetails) {
BlockSnapshotRestRep blockSnapshot = BourneUtil.getViprClient().blockSnapshots().get(snapShot.getId());
snapShotDetails.add(new ApplicationSnapshots(blockSnapshot));
}
renderJSON(DataTablesSupport.createJSON(snapShotDetails, params));
}
public static void getAssociatedSnapSession(String id, String sessionSet) {
renderArgs.put("dataTable", new ApplicationSnapSessionDataTable());
VolumeGroupRestRep application = AppSupportUtil.getApplication(id);
String sessionLabel = id + "~~~" + sessionSet;
render(application, sessionLabel, sessionSet);
}
public static void getAssociatedSnapSessionJSON(String sessionLabel) {
String[] sessionSet = sessionLabel.split("~~~");
List<ApplicationSnapshotSession> sessionDetails = Lists.newArrayList();
List<NamedRelatedResourceRep> sessionSetDetails = AppSupportUtil.getVolumeGroupSnapshotSessionsByCopySet(sessionSet[0],
sessionSet[1]);
for (NamedRelatedResourceRep snapSession : sessionSetDetails) {
BlockSnapshotSessionRestRep snapshotSession = BourneUtil.getViprClient().blockSnapshotSessions().get(snapSession.getId());
sessionDetails.add(new ApplicationSnapshotSession(snapshotSession));
}
renderJSON(DataTablesSupport.createJSON(sessionDetails, params));
}
public static class VolumeApplicationDataTable extends BlockVolumesDataTable {
public VolumeApplicationDataTable() {
alterColumn("protocols").hidden();
alterColumn("wwn").hidden();
addColumn("associatedVolumeRG");
sortAll();
}
public static class VolumeApplication extends Volume {
public RelatedResourceRep associatedSourceVolume;
public VolumeRestRep associatedVolume;
public String associatedVolumeRG;
public VolumeApplication(VolumeRestRep volume, Map<URI, String> virtualArrays, Map<URI, String> virtualPools) {
super(volume, virtualArrays, virtualPools);
if (volume.getProtection() != null && volume.getProtection().getFullCopyRep() != null) {
associatedSourceVolume = volume.getProtection().getFullCopyRep().getAssociatedSourceVolume();
}
if (associatedSourceVolume != null) {
associatedVolume = BourneUtil.getViprClient().blockVolumes().get(associatedSourceVolume.getId());
associatedVolumeRG = associatedVolume.getReplicationGroupInstance();
} else {
associatedVolumeRG = volume.getReplicationGroupInstance();
}
}
}
}
}