/*
* 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.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.List;
import models.ComputeImageTypes;
import models.datatable.ComputeImagesDataTable;
import models.datatable.ComputeImagesDataTable.ComputeImagesInfo;
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.ComputeImageUtils;
import util.MessagesUtils;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.compute.ComputeImageCreate;
import com.emc.storageos.model.compute.ComputeImageRestRep;
import com.emc.storageos.model.compute.ComputeImageUpdate;
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 ComputeImages extends ViprResourceController {
protected static final String SAVED = "ComputeImages.saved";
protected static final String UNKNOWN = "ComputeImages.unknown";
protected static final String MODEL_NAME = "ComputeImages";
protected static final String DELETED_SUCCESS = "ComputeImages.deleted.success";
protected static final String DELETED_ERROR = "ComputeImages.deleted.error";
//
// Add reference data so that they can be reference in html template
//
private static void addReferenceData() {
}
public static void list() {
renderArgs.put("dataTable", new ComputeImagesDataTable());
render();
}
public static void listJson() {
performListJson(ComputeImageUtils.getComputeImages(),
new JsonItemOperation());
}
public static void itemsJson(@As(",") String[] ids) {
itemsJson(uris(ids));
}
private static void itemsJson(List<URI> ids) {
performItemsJson(ComputeImageUtils.getComputeImages(ids),
new JsonItemOperation());
}
public static void itemDetails(String id) {
ComputeImageRestRep computeImage = ComputeImageUtils
.getComputeImage(id);
if (computeImage == null) {
error(MessagesUtils.get(UNKNOWN, id));
}
render(computeImage);
}
public static void create() {
addReferenceData();
ComputeImageForm computeImages = new ComputeImageForm();
render("@edit", computeImages);
}
public static void createClone(@As(",") String[] ids) {
if (ids != null && ids.length > 0) {
String imageId = ids[0];
createAClone(imageId);
}
}
public static void createAClone(String imageId) {
addReferenceData();
ComputeImageRestRep computeImage = ComputeImageUtils
.getComputeImage(imageId);
ComputeImageForm computeImages = new ComputeImageForm(computeImage, true);
render("@edit", computeImages);
}
@FlashException("list")
public static void edit(String id) {
addReferenceData();
ComputeImageRestRep computeImage = ComputeImageUtils
.getComputeImage(id);
if (computeImage != null) {
ComputeImageForm computeImages = new ComputeImageForm(computeImage);
renderArgs.put("availableImageServersNames", computeImages.availableImageServerNames);
renderArgs.put("failedImageServersNames", computeImages.failedImageServerNames);
render("@edit", computeImages);
}
else {
flash.error(MessagesUtils.get(UNKNOWN, id));
list();
}
}
@FlashException(keep = true, referrer = { "create", "edit" })
public static void save(ComputeImageForm computeImages) {
computeImages.validate("computeImages");
if (Validation.hasErrors()) {
handleError(computeImages);
}
computeImages.save();
String name = computeImages.name;
flash.success(MessagesUtils.get(SAVED, name));
backToReferrer();
list();
}
private static void handleError(ComputeImageForm computeImages) {
params.flash();
Validation.keep();
if (computeImages.isNew()) {
if (computeImages.imageId == null) {
create();
}
else {
createAClone(computeImages.imageId.toString());
}
}
else {
edit(computeImages.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 void cloneImage(String id) {
cloneImage(id);
list();
}
public static class ComputeImageForm {
public String id;
@MaxSize(128)
@MinSize(2)
@Required
public String name;
@MaxSize(2048)
public String imageUrl;
public URI imageId;
public String imageName;
public String imageType;
public String computeImageStatus;
public String lastImageStatusMessage;
public String availableImageServerNames = "";
public String failedImageServerNames = "";
private List<NamedRelatedResourceRep> availableImageServers;
private List<NamedRelatedResourceRep> failedImageServers;
public String cloneName;
public String cloneExtractedName;
public String cloneType;;
public String cloneUrl;
public ComputeImageForm() {
}
public ComputeImageForm(ComputeImageRestRep computeImage) {
this.id = computeImage.getId().toString();
this.name = computeImage.getName();
this.imageName = computeImage.getImageName();
this.imageType = ComputeImageTypes.getDisplayValue(computeImage.getImageType());
this.imageUrl = computeImage.getImageUrl();
this.computeImageStatus = computeImage.getComputeImageStatus();
this.lastImageStatusMessage = computeImage.getLastImportStatusMessage();
this.availableImageServers = computeImage.getAvailableImageServers();
this.failedImageServers = computeImage.getFailedImageServers();
for (NamedRelatedResourceRep availableImageServer : availableImageServers) {
if (availableImageServer.getName() != null) {
this.availableImageServerNames = availableImageServerNames.concat(availableImageServer.getName() + ", ");
}
}
for (NamedRelatedResourceRep failedImageServer : failedImageServers) {
if (failedImageServer.getName() != null) {
this.failedImageServerNames = failedImageServerNames.concat(failedImageServer.getName() + ", ");
}
}
}
public ComputeImageForm(ComputeImageRestRep computeImage, boolean clone) {
this.imageId = computeImage.getImageId();
this.cloneName = computeImage.getName();
this.cloneExtractedName = computeImage.getImageName();
this.cloneType = ComputeImageTypes.getDisplayValue(computeImage.getImageType());
this.cloneUrl = computeImage.getImageUrl();
}
public boolean isNew() {
return StringUtils.isBlank(this.id);
}
public boolean isCreate() {
return StringUtils.isBlank(this.id) && this.imageId == null;
}
public void validate(String fieldName) {
Validation.valid(fieldName, this);
Validation.required(fieldName + ".name", this.name);
if (isCreate()) {
Validation.required(fieldName + ".imageUrl", this.imageUrl);
try {
new URL(this.imageUrl);// NOSONAR
// ("Suppressing Sonar violation of Object being dropped without using it. Object is used for validation purpose")
} catch (MalformedURLException e) {
Validation.addError(fieldName + ".imageUrl",
MessagesUtils.get("computeImage.invalid.url"));
}
}
}
public Task<ComputeImageRestRep> save() {
if (isNew()) {
return create();
} else {
return update();
}
}
private Task<ComputeImageRestRep> create() {
ComputeImageCreate createParam = new ComputeImageCreate();
createParam.setName(this.name);
createParam.setImageUrl(this.imageUrl);
return ComputeImageUtils.create(createParam);
}
private Task<ComputeImageRestRep> update() {
ComputeImageUpdate updateParam = new ComputeImageUpdate();
updateParam.setName(this.name);
if (this.computeImageStatus.equals("NOT_AVAILABLE") && this.imageUrl != null && this.imageUrl.length() > 0) {
updateParam.setImageUrl(this.imageUrl);
}
return ComputeImageUtils.update(id, updateParam);
}
}
protected static class JsonItemOperation implements
ResourceValueOperation<ComputeImagesInfo, ComputeImageRestRep> {
@Override
public ComputeImagesInfo performOperation(
ComputeImageRestRep computeImage) throws Exception {
return new ComputeImagesInfo(computeImage);
}
}
protected static class DeleteOperation implements ResourceIdOperation<Void> {
@Override
public Void performOperation(URI id) throws Exception {
ComputeImageUtils.deactivate(id);
return null;
}
}
}