/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package controllers.compute;
import static com.emc.vipr.client.core.util.ResourceUtils.uris;
import static controllers.Common.backToReferrer;
import java.net.URI;
import java.util.List;
import models.SearchScopes;
import models.datatable.ComputeImageServersDataTable;
import models.datatable.ComputeImageServersDataTable.ComputeImageServerInfo;
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.ComputeImageServerUtils;
import util.MessagesUtils;
import util.validation.HostNameOrIpAddressCheck;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.compute.ComputeImageServerCreate;
import com.emc.storageos.model.compute.ComputeImageServerRestRep;
import com.emc.storageos.model.compute.ComputeImageServerUpdate;
import com.emc.vipr.client.Task;
import controllers.Common;
import controllers.deadbolt.Restrict;
import controllers.deadbolt.Restrictions;
import controllers.util.FlashException;
import controllers.util.ViprResourceController;
@With(Common.class)
@Restrictions({ @Restrict("SYSTEM_ADMIN"), @Restrict("RESTRICTED_SYSTEM_ADMIN") })
public class ComputeImageServers extends ViprResourceController {
protected static final String SAVED = "ComputeImageServers.saved";
protected static final String UNKNOWN = "ComputeImageServers.unknown";
protected static final String MODEL_NAME = "ComputeImageServers";
protected static final String DELETED_SUCCESS = "ComputeImageServers.deleted.success";
protected static final String DELETED_ERROR = "ComputeImageServers.deleted.error";
//
// Add reference data so that they can be reference in html template
//
private static void addReferenceData() {
renderArgs.put("searchScopeTypeList", SearchScopes.options(
SearchScopes.ONELEVEL, SearchScopes.SUBTREE));
}
public static void list() {
renderArgs.put("dataTable", new ComputeImageServersDataTable());
render();
}
public static void listJson() {
performListJson(ComputeImageServerUtils.getComputeImageServers(),
new JsonItemOperation());
}
public static void itemsJson(@As(",") String[] ids) {
itemsJson(uris(ids));
}
private static void itemsJson(List<URI> ids) {
performItemsJson(ComputeImageServerUtils.getComputeImageServers(ids),
new JsonItemOperation());
}
public static void itemDetails(String id) {
ComputeImageServerRestRep computeImageServer = ComputeImageServerUtils
.getComputeImageServer(id);
if (computeImageServer == null) {
error(MessagesUtils.get(UNKNOWN, id));
}
render(computeImageServer);
}
public static void create() {
addReferenceData();
ComputeImageServerForm ComputeImageServer = new ComputeImageServerForm();
ComputeImageServer.tftpBootDir = MessagesUtils.get("ComputeImageServer.default.tftpBootDir");
ComputeImageServer.osInstallTimeOut = Integer.parseInt(MessagesUtils.get("ComputeImageServer.default.installTimeout"));
render("@edit", ComputeImageServer);
}
@FlashException("list")
public static void edit(String id) {
addReferenceData();
ComputeImageServerRestRep computeImageServer = ComputeImageServerUtils.getComputeImageServer(id);
if (computeImageServer != null) {
ComputeImageServerForm computeImageServers = new ComputeImageServerForm(computeImageServer);
render("@edit", computeImageServers);
}
else {
flash.error(MessagesUtils.get(UNKNOWN, id));
list();
}
}
@FlashException(keep = true, referrer = { "create", "edit" })
public static void save(ComputeImageServerForm computeImageServers) {
computeImageServers.validate("computeImageServers");
if (Validation.hasErrors()) {
handleError(computeImageServers);
}
computeImageServers.save();
flash.success(MessagesUtils.get(SAVED, computeImageServers.imageServerIp));
backToReferrer();
list();
}
private static void handleError(ComputeImageServerForm computeImageServers) {
params.remove("computeImageServers.password");
params.remove("computeImageServers.confirmPassword");
params.flash();
Validation.keep();
if (computeImageServers.isNew()) {
create();
}
else {
edit(computeImageServers.id);
}
}
@FlashException("list")
public static void delete(@As(",") String[] ids) {
delete(uris(ids));
}
private static void delete(List<URI> ids) {
performSuccessFail(ids, new DeleteOperation(), DELETED_SUCCESS, DELETED_ERROR);
list();
}
public static class ComputeImageServerForm {
public String id;
@MaxSize(128)
@MinSize(2)
public String name;
@MaxSize(2048)
public String imageServerIp;
@MaxSize(2048)
public String imageServerSecondIp;
public String osInstallNetworkAddress;
public Integer osInstallTimeOut;
public Integer sshTimeout;
public Integer imageImportTimeout;
public String status;
public String tftpBootDir;
public List<NamedRelatedResourceRep> computeImages;
public List<NamedRelatedResourceRep> failedImages;
@MaxSize(2048)
@Required
public String userName;
@MaxSize(2048)
public String password = "";// 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 ComputeImageServerForm() {
}
public ComputeImageServerForm(ComputeImageServerRestRep computeImageServer) {
this.id = computeImageServer.getId().toString();
this.name = computeImageServer.getName();
this.imageServerIp = computeImageServer.getImageServerIp();
this.osInstallNetworkAddress = computeImageServer.getImageServerSecondIp();
this.status = computeImageServer.getComputeImageServerStatus();
this.tftpBootDir = computeImageServer.getTftpBootDir();
this.userName = computeImageServer.getImageServerUser();
this.osInstallTimeOut = computeImageServer.getOsInstallTimeout();
this.sshTimeout = computeImageServer.getSshTimeout();
this.imageImportTimeout = computeImageServer.getImageImportTimeout();
this.computeImages = computeImageServer.getComputeImages();
this.failedImages = computeImageServer.getFailedImages();
this.password = ""; // the platform will never return the real password //NOSONAR
// ("Suppressing Sonar violation of Password Hardcoded. Password is not hardcoded here.")
}
public boolean isNew() {
return StringUtils.isBlank(this.id);
}
public void validate(String fieldName) {
Validation.valid(fieldName, this);
if (isNew()) {
Validation.required(fieldName + ".password", this.password);
Validation.required(fieldName + ".confirmPassword", this.confirmPassword);
Validation.required(fieldName + ".imageServerIp", this.imageServerIp);
if (!HostNameOrIpAddressCheck.isValidIp(imageServerIp)) {
Validation.addError(fieldName + ".imageServerIp",
MessagesUtils.get("computeSystem.invalid.ipAddress"));
}
Validation.required(fieldName + ".imageServerIp", this.osInstallNetworkAddress);
if (!HostNameOrIpAddressCheck.isValidIp(osInstallNetworkAddress)) {
Validation.addError(fieldName + ".osInstallNetworkAddress",
MessagesUtils.get("computeSystem.invalid.ipAddress"));
}
if (!StringUtils.equals(StringUtils.trim(password),
StringUtils.trim(confirmPassword))) {
Validation.addError(fieldName + ".confirmPassword", MessagesUtils
.get("computeImageServers.confirmPassword.not.match"));
}
}
}
public URI save() {
if (isNew()) {
return create().getResourceId();
}
else {
return update().getId();
}
}
private Task<ComputeImageServerRestRep> create() {
ComputeImageServerCreate createParam = new ComputeImageServerCreate();
createParam.setName(this.name);
createParam.setImageServerIp(this.imageServerIp);
createParam.setImageServerUser(this.userName);
createParam.setImageServerPassword(this.password);
createParam.setOsInstallTimeout(this.osInstallTimeOut);
createParam.setImageImportTimeout(this.imageImportTimeout);
createParam.setSshTimeout(this.sshTimeout);
createParam.setTftpBootDir(this.tftpBootDir);
createParam.setImageServerSecondIp(this.osInstallNetworkAddress);
return ComputeImageServerUtils.create(createParam);
}
private ComputeImageServerRestRep update() {
ComputeImageServerUpdate updateParam = new ComputeImageServerUpdate();
updateParam.setName(this.name);
updateParam.setImageServerIp(this.imageServerIp);
updateParam.setTftpBootDir(this.tftpBootDir);
updateParam.setOsInstallTimeout(this.osInstallTimeOut);
updateParam.setImageImportTimeout(this.imageImportTimeout);
updateParam.setSshTimeout(this.sshTimeout);
updateParam.setImageServerUser(this.userName);
updateParam.setImageServerSecondIp(this.osInstallNetworkAddress);
if (this.password != null && this.password.length() > 0) {
updateParam.setImageServerPassword(this.password);
}
return ComputeImageServerUtils.update(id, updateParam);
}
}
protected static class JsonItemOperation implements
ResourceValueOperation<ComputeImageServerInfo, ComputeImageServerRestRep> {
@Override
public ComputeImageServerInfo performOperation(
ComputeImageServerRestRep computeImageServer) throws Exception {
return new ComputeImageServerInfo(computeImageServer);
}
}
protected static class DeleteOperation implements ResourceIdOperation<Void> {
@Override
public Void performOperation(URI id) throws Exception {
ComputeImageServerUtils.deactivate(id);
return null;
}
}
}