/*******************************************************************************
* Copyright (c) 2013 GigaSpaces Technologies Ltd. All rights reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package org.cloudifysource.dsl.internal.validators;
import java.io.File;
import org.apache.commons.lang.StringUtils;
import org.cloudifysource.domain.DSLValidation;
import org.cloudifysource.domain.cloud.compute.ComputeTemplate;
import org.cloudifysource.dsl.internal.DSLValidationContext;
import org.cloudifysource.dsl.internal.DSLValidationException;
/**
*
* @author adaml
*
*/
public class ComputeTemplateValidator implements DSLValidator {
private ComputeTemplate entity;
@Override
public void setDSLEntity(Object dslEntity) {
this.entity = (ComputeTemplate) dslEntity;
}
/**
*
* @param context - validation context.
* @throws DSLValidationException - in case validation failed.
*/
@DSLValidation
public void validateDefaultValues(final DSLValidationContext context)
throws DSLValidationException {
if (this.entity.getRemoteDirectory() == null || this.entity.getRemoteDirectory().trim().isEmpty()) {
throw new DSLValidationException("Remote directory for template is missing");
}
if (StringUtils.isBlank(this.entity.getLocalDirectory())) {
throw new DSLValidationException("Local directory for template is missing");
}
if ("ENTER_KEY_FILE_NAME".equals(this.entity.getKeyFile())) {
throw new DSLValidationException(
"Key file name field still has default configuration value of ENTER_KEY_FILE_NAME");
}
}
@DSLValidation
void validateRelativeUploadDir(final DSLValidationContext context)
throws DSLValidationException {
final File uploadDir = findUploadDir(context);
// check key file!
if (StringUtils.isNotBlank(this.entity.getKeyFile())) {
final File keyFile = new File(uploadDir, this.entity.getKeyFile());
if (!keyFile.exists() || !keyFile.isFile()) {
throw new DSLValidationException("The specified key file was not found: " + keyFile);
}
}
// this.localDirectory = uploadDir.getAbsolutePath();
// logger.info("SETTING LOCAL DIRECTORY TO ABSOLUTE PATH: " +
// this.localDirectory);
}
/************
* This is a unique situation: we need two pieces of information - the absolute location of the local directory, and
* the relative location of the local directory. So this validation fills in this field - note that the absolute
* field does not have a setter - groovy files can't directly set this value.
*
* @param context
* .
* @throws DSLValidationException .
*/
@DSLValidation
void validateAbsoluteUploadDir(final DSLValidationContext context)
throws DSLValidationException {
if (entity.getAbsoluteUploadDir() != null) {
throw new DSLValidationException("absolute upload directory may not be set by external code");
}
// logger.fine("SETTING ABSOLUTE LOCAL UPLOAD DIRECTORY TO ABSOLUTE PATH: " + this.entity.getAbsoluteUploadDir());
this.entity.setAbsoluteUploadDir(findUploadDir(context).getAbsolutePath());
}
private File findUploadDir(final DSLValidationContext context)
throws DSLValidationException {
final File relativeUploadDir = new File(this.entity.getLocalDirectory());
if (relativeUploadDir.isAbsolute()) {
throw new DSLValidationException(
"Upload directory of a cloud template must be a relative path, "
+ "relative to the cloud configuration directory");
}
File dslDir = null;
if (context.getFilePath() == null) {
throw new IllegalStateException("The DSL File location is not set! Cannot validate!");
} else {
final File dslFile = new File(context.getFilePath());
dslDir = dslFile.getParentFile();
}
final File uploadDir = new File(dslDir, entity.getLocalDirectory());
if (!uploadDir.exists()) {
throw new DSLValidationException(
"Could not find upload directory at: " + uploadDir);
}
if (!uploadDir.isDirectory()) {
throw new DSLValidationException(
"Upload directory, set to: " + uploadDir + " is not a directory");
}
return uploadDir;
}
@DSLValidation
public void validateOpenFilesLimitOnProvilegedMode(final DSLValidationContext context)
throws DSLValidationException {
if(this.entity.getOpenFilesLimit() == null) {
return;
}
if(this.entity.isPrivileged()) {
return;
}
throw new DSLValidationException("Setting an open files limit requires that the template run in privileged mode");
}
}