package com.sequenceiq.cloudbreak.controller.validation.filesystem;
import java.io.IOException;
import java.util.Set;
import javax.inject.Inject;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.api.model.FileSystemRequest;
import com.sequenceiq.cloudbreak.cloud.context.CloudContext;
import com.sequenceiq.cloudbreak.cloud.event.validation.FileSystemValidationRequest;
import com.sequenceiq.cloudbreak.cloud.event.validation.FileSystemValidationResult;
import com.sequenceiq.cloudbreak.cloud.model.CloudCredential;
import com.sequenceiq.cloudbreak.cloud.model.FileSystem;
import com.sequenceiq.cloudbreak.controller.BadRequestException;
import com.sequenceiq.cloudbreak.converter.spi.FileSystemRequestToFileSystemConverter;
import com.sequenceiq.cloudbreak.service.stack.connector.OperationException;
import com.sequenceiq.cloudbreak.util.JsonUtil;
import reactor.bus.Event;
import reactor.bus.EventBus;
@Component
public class FileSystemValidator {
private static final Logger LOGGER = LoggerFactory.getLogger(FileSystemValidator.class);
@Inject
private EventBus eventBus;
@Inject
private FileSystemRequestToFileSystemConverter converter;
public void validateFileSystem(String platform, CloudCredential cloudCredential, FileSystemRequest fileSystemRequest) {
if (fileSystemRequest == null) {
return;
}
validateFilesystemRequest(fileSystemRequest);
LOGGER.debug("Sending fileSystemRequest to {} to validate the file system", platform);
CloudContext cloudContext = new CloudContext(null, null, platform, null, null, null);
FileSystem fileSystem = converter.convert(fileSystemRequest);
FileSystemValidationRequest request = new FileSystemValidationRequest(fileSystem, cloudCredential, cloudContext);
eventBus.notify(request.selector(), Event.wrap(request));
try {
FileSystemValidationResult result = request.await();
LOGGER.info("File system validation result: {}", result);
Exception exception = result.getErrorDetails();
if (exception != null) {
throw new BadRequestException(result.getStatusReason(), exception);
}
} catch (InterruptedException e) {
LOGGER.error("Error while sending the file system validation request", e);
throw new OperationException(e);
}
}
private void validateFilesystemRequest(FileSystemRequest fileSystemRequest) {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
try {
String json = JsonUtil.writeValueAsString(fileSystemRequest.getProperties());
Object fsConfig = JsonUtil.readValue(json, fileSystemRequest.getType().getClazz());
Set<ConstraintViolation<Object>> violations = validator.validate(fsConfig);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
} catch (IOException e) {
throw new BadRequestException(e.getMessage(), e);
}
}
}