/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ /** * */ package controllers.arrays; import com.emc.storageos.model.network.NetworkSystemCreate; import com.emc.storageos.model.network.NetworkSystemRestRep; import com.emc.storageos.model.network.NetworkSystemUpdate; import com.emc.vipr.client.Task; import static com.emc.vipr.client.core.util.ResourceUtils.uris; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import controllers.Common; import controllers.deadbolt.Restrict; import controllers.deadbolt.Restrictions; import controllers.util.FlashException; import controllers.util.ViprResourceController; import java.net.URI; import java.util.Arrays; import java.util.Date; import java.util.List; import models.NetworkSystemTypes; import models.RegistrationStatus; import models.datatable.SanSwitchDataTable; import models.datatable.SanSwitchDataTable.SanSwitchInfo; 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.With; import util.DefaultSanSwitchPortMap; import util.EnumOption; import util.MessagesUtils; import util.NetworkSystemUtils; import util.validation.HostNameOrIpAddress; @With(Common.class) @Restrictions({ @Restrict("SYSTEM_ADMIN"), @Restrict("RESTRICTED_SYSTEM_ADMIN") }) public class SanSwitches extends ViprResourceController { protected static final String SAVED = "SanSwitches.saved"; protected static final String DELETED_SUCCESS = "SanSwitches.deleted.success"; protected static final String DELETED_ERROR = "SanSwitches.deleted.error"; protected static final String UNKNOWN = "SanSwitches.unknown"; protected static final String MODEL_NAME = "SanSwitches"; protected static final String DEREGISTER_SUCCESS = "PhysicalAssets.deregistration.success"; protected static final String DEREGISTER_ERROR = "PhysicalAssets.deregistration.error"; protected static final String REGISTER_SUCCESS = "PhysicalAssets.registration.success"; protected static final String REGISTER_ERROR = "PhysicalAssets.registration.error"; private static final String VIPR_START_GUIDE = "VIPR_START_GUIDE"; private static final String GUIDE_DATA = "GUIDE_DATA"; private static final String GUIDE_VISIBLE = "guideVisible"; private static final String GUIDE_FABRICS = "fabrics"; private static final String GUIDE_COMPLETED_STEP = "completedSteps"; // // Add reference data so that they can be reference in html template // private static void addReferenceData() { renderArgs.put("sanSwitchTypeList", NetworkSystemTypes.options(NetworkSystemTypes.VALUES)); // pass brocade enum into template for port defaault logic renderArgs.put("brocadeType", NetworkSystemTypes.BROCADE); List<EnumOption> defaultSanSwitchPortMap = Arrays.asList(EnumOption.options(DefaultSanSwitchPortMap.values())); renderArgs.put("defaultSanSwitchPortMap", defaultSanSwitchPortMap); } public static void list() { renderArgs.put("dataTable", new SanSwitchDataTable()); render(); } public static void listJson() { performListJson(NetworkSystemUtils.getNetworkSystems(), new JsonItemOperation()); } public static void itemsJson(@As(",") String[] ids) { itemsJson(uris(ids)); } private static void itemsJson(List<URI> ids) { performItemsJson(NetworkSystemUtils.getNetworkSystems(ids), new JsonItemOperation()); } public static void itemDetails(String id) { NetworkSystemRestRep networkSystem = NetworkSystemUtils.getNetworkSystem(id); render(networkSystem); } public static void create() { SanSwitchForm sanSwitch = new SanSwitchForm(); // put all "initial create only" defaults here rather than field initializers sanSwitch.useSSL = true; edit(sanSwitch); } private static void edit(SanSwitchForm sanSwitch) { addReferenceData(); render("@edit", sanSwitch); } @FlashException("list") public static void edit(String id) { NetworkSystemRestRep networkSystem = NetworkSystemUtils.getNetworkSystem(id); if (networkSystem == null) { flash.error(MessagesUtils.get(UNKNOWN, id)); list(); } edit(new SanSwitchForm(networkSystem)); } @FlashException(keep = true, referrer = { "create", "edit" }) public static void save(SanSwitchForm sanSwitch) { sanSwitch.validate("sanSwitch"); if (Validation.hasErrors()) { Common.handleError(); } Task<?> sanTask = sanSwitch.save(); flash.success(MessagesUtils.get(SAVED, sanSwitch.name)); JsonObject jobject = getCookieAsJson(VIPR_START_GUIDE); if (jobject != null && jobject.get(GUIDE_COMPLETED_STEP) != null && jobject.get(GUIDE_VISIBLE) != null) { if (jobject.get(GUIDE_COMPLETED_STEP).getAsInt() == 4 && jobject.get(GUIDE_VISIBLE).getAsBoolean()) { JsonObject dataObject = getCookieAsJson(GUIDE_DATA); JsonArray fabrics = dataObject.getAsJsonArray(GUIDE_FABRICS); if (fabrics == null) { fabrics = new JsonArray(); } boolean addToCookie = true; for(Object fabricObject: fabrics) { JsonObject sanswitch = (JsonObject)fabricObject; if(sanswitch.get("id") != null) { String fabricId = sanswitch.get("id").getAsString(); if(StringUtils.equals(fabricId, sanTask.getResourceId().toString())) { addToCookie = false; //update case, don't add in cookie break; } } } if (addToCookie) { JsonObject fabric = new JsonObject(); fabric.addProperty("id", sanTask.getResourceId().toString()); fabric.addProperty("name", sanSwitch.name); fabrics.add(fabric); dataObject.add("fabrics", fabrics); saveJsonAsCookie("GUIDE_DATA", dataObject); } } } list(); } public static void delete(@As(",") String[] ids) { delete(uris(ids)); } private static void delete(List<URI> ids) { performSuccessFail(NetworkSystemUtils.getNetworkSystems(ids), new DeactivateOperation(), DELETED_SUCCESS, DELETED_ERROR); list(); } public static void introspect(@As(",") String[] ids) { discover(uris(ids)); } private static void discover(List<URI> ids) { performSuccess(ids, new DiscoveryOperation(), DISCOVERY_STARTED); list(); } public static void deregister(@As(",") String[] ids, String arrayId) { deregister(uris(ids)); } private static void deregister(List<URI> ids) { performSuccessFail(ids, new DeregisterOperation(), DEREGISTER_SUCCESS, DELETED_ERROR); list(); } public static void register(@As(",") String[] ids, String arrayId) { register(uris(ids)); } private static void register(List<URI> ids) { performSuccessFail(ids, new RegisterOperation(), REGISTER_SUCCESS, DELETED_ERROR); list(); } public static class SanSwitchForm { public String id; @Required public String deviceType; @MaxSize(128) @MinSize(2) @Required public String name; @HostNameOrIpAddress @Required public String ipAddress; @Required public Integer portNumber; @MaxSize(2048) public String userName; @MaxSize(2048) public String userPassword = ""; // NOSONAR ("Suppressing Sonar violation of Password Hardcoded. Password is not hardcoded here.") @MaxSize(2048) public String confirmPassword = ""; // NOSONAR // ("Suppressing Sonar violation of Password Hardcoded. Password is not hardcoded here.") public boolean useSSL; public Date lastDiscoveryRunTime; public SanSwitchForm() { } public SanSwitchForm(NetworkSystemRestRep networkSystemResponse) { readFrom(networkSystemResponse); } public void readFrom(NetworkSystemRestRep sanSwitch) { this.id = stringId(sanSwitch); this.name = sanSwitch.getName(); this.deviceType = sanSwitch.getSystemType(); if (NetworkSystemTypes.isSmisManaged(sanSwitch.getSystemType())) { this.ipAddress = sanSwitch.getSmisProviderIP(); this.userName = sanSwitch.getSmisUserName(); this.portNumber = sanSwitch.getSmisPortNumber(); this.useSSL = sanSwitch.getSmisUseSSL(); } else { this.ipAddress = sanSwitch.getIpAddress(); this.userName = sanSwitch.getUsername(); this.portNumber = sanSwitch.getPortNumber(); this.useSSL = false; } } public boolean isNew() { return StringUtils.isBlank(id); } public Task<NetworkSystemRestRep> save() { if (isNew()) { return create(); } else { return update(); } } private Task<NetworkSystemRestRep> update() { NetworkSystemUpdate sanSwitchParam = new NetworkSystemUpdate(); sanSwitchParam.setName(this.name); // sanSwitchParam.setSystemType(this.deviceType); sanSwitchParam.setIpAddress(this.ipAddress); sanSwitchParam.setPortNumber(this.portNumber); sanSwitchParam.setUserName(StringUtils.trimToNull(this.userName)); sanSwitchParam.setPassword(StringUtils.trimToNull(this.userPassword)); sanSwitchParam.setSmisProviderIp(this.ipAddress); sanSwitchParam.setSmisPortNumber(this.portNumber); sanSwitchParam.setSmisUserName(StringUtils.trimToNull(this.userName)); sanSwitchParam.setSmisPassword(StringUtils.trimToNull(this.userPassword)); sanSwitchParam.setSmisUseSsl(this.useSSL); return NetworkSystemUtils.update(this.id, sanSwitchParam); } private Task<NetworkSystemRestRep> create() { NetworkSystemCreate sanSwitchParam = new NetworkSystemCreate(); sanSwitchParam.setName(this.name); sanSwitchParam.setUserName(this.userName); sanSwitchParam.setPassword(StringUtils.trimToNull(this.userPassword)); sanSwitchParam.setPortNumber(this.portNumber); sanSwitchParam.setIpAddress(this.ipAddress); sanSwitchParam.setSystemType(this.deviceType); sanSwitchParam.setSmisProviderIp(this.ipAddress); sanSwitchParam.setSmisPortNumber(this.portNumber); sanSwitchParam.setSmisUserName(this.userName); sanSwitchParam.setSmisPassword(StringUtils.trimToNull(this.userPassword)); sanSwitchParam.setSmisUseSsl(this.useSSL); Task<NetworkSystemRestRep> task = NetworkSystemUtils.create(sanSwitchParam); this.id = stringId(task.getResource()); return task; } public void validate(String fieldName) { Validation.valid(fieldName, this); if (isNew()) { Validation.required(fieldName + ".userName", this.userName); Validation.required(fieldName + ".userPassword", this.userPassword); Validation.required(fieldName + ".confirmPassword", this.confirmPassword); } if (!StringUtils.equals(StringUtils.trimToEmpty(this.userPassword), StringUtils.trimToEmpty(this.confirmPassword))) { Validation.addError(fieldName + ".confirmPassword", "error.password.doNotMatch"); } // Validation.ipv4Address(fieldName + ".ipAddress", this.ipAddress); } } protected static class JsonItemOperation implements ResourceValueOperation<SanSwitchInfo, NetworkSystemRestRep> { @Override public SanSwitchInfo performOperation(NetworkSystemRestRep networkSystem) throws Exception { return new SanSwitchInfo(networkSystem); } } protected static class DeactivateOperation implements ResourceValueOperation<Void, NetworkSystemRestRep> { @Override public Void performOperation(NetworkSystemRestRep networkSystem) throws Exception { if (RegistrationStatus.isRegistered(networkSystem.getRegistrationStatus())) { NetworkSystemUtils.deregister(networkSystem.getId()); } NetworkSystemUtils.deactivate(networkSystem.getId()); return null; } } protected static class RegisterOperation implements ResourceIdOperation<NetworkSystemRestRep> { @Override public NetworkSystemRestRep performOperation(URI id) throws Exception { return NetworkSystemUtils.register(id); } } protected static class DeregisterOperation implements ResourceIdOperation<NetworkSystemRestRep> { @Override public NetworkSystemRestRep performOperation(URI id) throws Exception { return NetworkSystemUtils.deregister(id); } } protected static class DiscoveryOperation implements ResourceIdOperation<Task<NetworkSystemRestRep>> { @Override public Task<NetworkSystemRestRep> performOperation(URI id) throws Exception { return NetworkSystemUtils.discover(id); } } }