/* * 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.Collections; import java.util.Comparator; import java.util.List; import models.datatable.BlockConsistencyGroupDataTable; import models.datatable.BlockConsistencyGroupDataTable.BlockConsistencyGroup; import org.apache.commons.lang.StringUtils; import play.data.binding.As; import play.data.validation.MaxSize; import play.data.validation.MinSize; import play.data.validation.Required; import play.data.validation.Validation; import play.mvc.Controller; import play.mvc.With; import util.BlockConsistencyGroupUtils; import util.MessagesUtils; import util.ProjectUtils; import util.datatable.DataTablesSupport; import util.validation.CommonFormValidator; import com.emc.storageos.model.block.BlockConsistencyGroupCreate; import com.emc.storageos.model.block.BlockConsistencyGroupRestRep; import com.emc.storageos.model.project.ProjectRestRep; import com.google.common.collect.Lists; import controllers.Common; import controllers.deadbolt.Restrict; import controllers.deadbolt.Restrictions; import controllers.tenant.TenantSelector; import controllers.util.FlashException; import controllers.util.Models; @With(Common.class) @Restrictions({ @Restrict("TENANT_ADMIN"), @Restrict("PROJECT_ADMIN") }) public class ConsistencyGroups extends Controller { private static final String ACTIVE_PROJECT_ID = "activeProjectId"; private static final String PATTERN = "^[a-zA-Z0-9_-]*$"; public static void list() { BlockConsistencyGroupDataTable dataTable = new BlockConsistencyGroupDataTable(); List<ProjectRestRep> projects = ProjectUtils.getProjects(Models.currentAdminTenant()); Collections.sort(projects, new Comparator<ProjectRestRep>() { public int compare(ProjectRestRep proj1, ProjectRestRep proj2) { return proj1.getName().compareTo(proj2.getName()); } }); String activeProjectId = flash.get(ACTIVE_PROJECT_ID); if (activeProjectId == null && !projects.isEmpty()) { activeProjectId = projects.get(0).getId().toString(); } TenantSelector.addRenderArgs(); render(dataTable, projects, activeProjectId); } public static void listJson(String projectId) { List<BlockConsistencyGroup> items = Lists.newArrayList(); if (StringUtils.isNotBlank(projectId)) { for (BlockConsistencyGroupRestRep cg : BlockConsistencyGroupUtils.getBlockConsistencyGroups(projectId)) { items.add(new BlockConsistencyGroup(cg)); } } renderJSON(DataTablesSupport.createJSON(items, params)); } /** * NOTE: This isn't used at the moment as your not able to update a * consistency group name */ public static void edit(String id) { list(); } @FlashException(referrer = { "create", "edit" }) public static void save(ConsistencyGroupForm consistencyGroup) { flash.put(ACTIVE_PROJECT_ID, consistencyGroup.projectId); consistencyGroup.validate("consistencyGroup"); if (Validation.hasErrors()) { Common.handleError(); } // NOTE : Only Create is supported at this time if (consistencyGroup.isNew()) { BlockConsistencyGroupCreate createParam = new BlockConsistencyGroupCreate(); createParam.setName(consistencyGroup.name); createParam.setProject(uri(consistencyGroup.projectId)); createParam.setArrayConsistency(consistencyGroup.arrayConsistency); BlockConsistencyGroupUtils.create(createParam); } flash.success(MessagesUtils.get("consistencyGroups.saved", consistencyGroup.name)); if (StringUtils.isNotBlank(consistencyGroup.referrerUrl)) { redirect(consistencyGroup.referrerUrl); } else { list(); } } public static void create(String projectId) { ConsistencyGroupForm consistencyGroup = new ConsistencyGroupForm(projectId); consistencyGroup.arrayConsistency = true; render("@edit", consistencyGroup); } @FlashException("list") public static void delete(@As(",") String[] ids) { delete(uris(ids)); } private static void delete(List<URI> ids) { if (!ids.isEmpty()) { BlockConsistencyGroupRestRep cg = BlockConsistencyGroupUtils.getBlockConsistencyGroup(ids.get(0)); if (cg != null) { flash.put(ACTIVE_PROJECT_ID, cg.getProject().getId().toString()); } } for (URI id : ids) { BlockConsistencyGroupUtils.deactivate(id); } flash.success(MessagesUtils.get("consistencyGroups.deleted")); list(); } public static class ConsistencyGroupForm { public String id; @Required @MaxSize(64) @MinSize(2) public String name; @Required public String projectId; public String referrerUrl; public boolean arrayConsistency; public ConsistencyGroupForm(String projectId) { this.projectId = projectId; } public ConsistencyGroupForm from(BlockConsistencyGroupRestRep from) { this.id = from.getId().toString(); this.name = from.getName(); this.arrayConsistency = from.getArrayConsistency(); return this; } public boolean isNew() { return StringUtils.isBlank(id); } public void validate(String formName) { Validation.valid(formName, this); if(!this.name.matches(PATTERN)) { Validation.addError(formName + ".name","Use only aphanumeric characters"); } } } }