/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package controllers.resources;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import static com.emc.vipr.client.core.util.ResourceUtils.uris;
import java.net.URI;
import java.util.List;
import java.util.Map;
import models.datatable.BlockSnapshotsDataTable;
import org.apache.commons.lang.StringUtils;
import play.data.binding.As;
import play.mvc.With;
import plugin.StorageOsPlugin;
import util.BourneUtil;
import util.MessagesUtils;
import util.datatable.DataTablesSupport;
import com.emc.storageos.coordinator.client.model.Constants;
import com.emc.storageos.coordinator.client.service.CoordinatorClient;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.block.BlockSnapshotRestRep;
import com.emc.storageos.model.block.VolumeDeleteTypeEnum;
import com.emc.storageos.model.block.export.ExportGroupRestRep;
import com.emc.storageos.model.block.export.ITLRestRep;
import com.emc.vipr.client.Task;
import com.emc.vipr.client.Tasks;
import com.emc.vipr.client.ViPRCoreClient;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import controllers.Common;
import controllers.util.FlashException;
@With(Common.class)
public class BlockSnapshots extends ResourceController {
private static final String UNKNOWN = "resources.snapshot.unknown";
private static BlockSnapshotsDataTable blockSnapshotsDataTable = new BlockSnapshotsDataTable();
public static void snapshots(String projectId) {
setActiveProjectId(projectId);
renderArgs.put("dataTable", blockSnapshotsDataTable);
CoordinatorClient coordinatorClient = StorageOsPlugin.getInstance().getCoordinatorClient();
String limit = coordinatorClient.getPropertyInfo().getProperty(Constants.RESOURCE_LIMIT_PROJECT_SNAPSHOTS);
renderArgs.put(Constants.RESOURCE_LIMIT_PROJECT_SNAPSHOTS, limit);
addReferenceData();
render();
}
public static void snapshotsJson(String projectId) {
if (StringUtils.isNotBlank(projectId)) {
setActiveProjectId(projectId);
} else {
projectId = getActiveProjectId();
}
List<BlockSnapshotsDataTable.BlockSnapshot> blockSnapshots = BlockSnapshotsDataTable.fetch(uri(projectId));
renderJSON(DataTablesSupport.createJSON(blockSnapshots, params));
}
public static void snapshotDetails(String snapshotId) {
ViPRCoreClient client = BourneUtil.getViprClient();
AffectedResources.BlockSnapshotDetails blockSnapshot = new AffectedResources.BlockSnapshotDetails(uri(snapshotId));
if (blockSnapshot.blockSnapshot == null) {
flash.error(MessagesUtils.get(UNKNOWN, snapshotId));
snapshots(null);
}
AffectedResources.VolumeDetails volume = new AffectedResources.VolumeDetails(blockSnapshot.volume.getId());
List<Task<BlockSnapshotRestRep>> tasks = null;
if (blockSnapshot.blockSnapshot != null) {
Tasks<BlockSnapshotRestRep> tasksResponse = client.blockSnapshots().getTasks(blockSnapshot.blockSnapshot.getId());
tasks = tasksResponse.getTasks();
}
render(blockSnapshot, volume, tasks);
}
public static void snapshotExports(String snapshotId) {
ViPRCoreClient client = BourneUtil.getViprClient();
Map<URI, ExportGroupRestRep> exportGroups = Maps.newHashMap();
Map<URI, List<ITLRestRep>> exportGroupItlMap = Maps.newHashMap();
List<ITLRestRep> itls = client.blockSnapshots().listExports(uri(snapshotId));
for (ITLRestRep itl : itls) {
NamedRelatedResourceRep export = itl.getExport();
if (export != null && export.getId() != null) {
List<ITLRestRep> exportGroupItls = exportGroupItlMap.get(export.getId());
if (exportGroupItls == null) {
exportGroupItls = Lists.newArrayList();
exportGroupItlMap.put(export.getId(), exportGroupItls);
}
exportGroupItls.add(itl);
if (exportGroups.keySet().contains(export.getId()) == false) {
ExportGroupRestRep exportGroup = client.blockExports().get(export.getId());
exportGroups.put(exportGroup.getId(), exportGroup);
}
}
}
render(itls, exportGroups, exportGroupItlMap);
}
@FlashException(referrer = { "snapshotDetails" })
public static void deleteSnapshot(String snapshotId) {
if (StringUtils.isNotBlank(snapshotId)) {
ViPRCoreClient client = BourneUtil.getViprClient();
Tasks<BlockSnapshotRestRep> task = client.blockSnapshots().deactivate(uri(snapshotId), VolumeDeleteTypeEnum.FULL);
flash.put("info", MessagesUtils.get("resources.snapshot.deactivate", snapshotId));
}
snapshotDetails(snapshotId);
}
@FlashException(value = "snapshots")
public static void delete(@As(",") String[] ids) {
delete(uris(ids));
}
private static void delete(List<URI> ids) {
if (ids != null) {
ViPRCoreClient client = BourneUtil.getViprClient();
for (URI id : ids) {
Tasks<BlockSnapshotRestRep> task = client.blockSnapshots().deactivate(id, VolumeDeleteTypeEnum.FULL);
}
flash.put("info", MessagesUtils.get("resources.snapshots.deactivate", ids.size()));
}
snapshots(null);
}
}