package com.sequenceiq.cloudbreak.converter; import static com.sequenceiq.cloudbreak.api.model.Status.REQUESTED; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.base.Strings; import com.sequenceiq.cloudbreak.api.model.BlueprintInputJson; import com.sequenceiq.cloudbreak.api.model.ClusterRequest; import com.sequenceiq.cloudbreak.api.model.CustomContainerRequest; import com.sequenceiq.cloudbreak.api.model.ExposedService; import com.sequenceiq.cloudbreak.api.model.FileSystemBase; import com.sequenceiq.cloudbreak.api.model.GatewayJson; import com.sequenceiq.cloudbreak.api.model.KerberosRequest; import com.sequenceiq.cloudbreak.api.model.SSOType; import com.sequenceiq.cloudbreak.controller.CloudbreakApiException; import com.sequenceiq.cloudbreak.domain.Cluster; import com.sequenceiq.cloudbreak.domain.ClusterAttributes; import com.sequenceiq.cloudbreak.domain.ExposedServices; import com.sequenceiq.cloudbreak.domain.FileSystem; import com.sequenceiq.cloudbreak.domain.Gateway; import com.sequenceiq.cloudbreak.domain.KerberosConfig; import com.sequenceiq.cloudbreak.domain.json.Json; import com.sequenceiq.cloudbreak.util.PasswordUtil; @Component public class JsonToClusterConverter extends AbstractConversionServiceAwareConverter<ClusterRequest, Cluster> { private static final Logger LOGGER = LoggerFactory.getLogger(JsonToClusterConverter.class); @Override public Cluster convert(ClusterRequest source) { Cluster cluster = new Cluster(); cluster.setName(source.getName()); cluster.setStatus(REQUESTED); cluster.setDescription(source.getDescription()); cluster.setEmailNeeded(source.getEmailNeeded()); cluster.setUserName(source.getUserName()); cluster.setPassword(source.getPassword()); Boolean enableSecurity = source.getEnableSecurity(); cluster.setSecure(enableSecurity == null ? false : enableSecurity); convertKnox(source, cluster); KerberosRequest kerberos = source.getKerberos(); KerberosConfig kerberosConfig = new KerberosConfig(); if (source.getKerberos() != null) { kerberosConfig.setKerberosMasterKey(kerberos.getMasterKey()); kerberosConfig.setKerberosAdmin(kerberos.getAdmin()); kerberosConfig.setKerberosPassword(kerberos.getPassword()); kerberosConfig.setKerberosUrl(kerberos.getUrl()); kerberosConfig.setKerberosRealm(kerberos.getRealm()); kerberosConfig.setKerberosTcpAllowed(kerberos.getTcpAllowed()); kerberosConfig.setKerberosPrincipal(kerberos.getPrincipal()); kerberosConfig.setKerberosLdapUrl(kerberos.getLdapUrl()); kerberosConfig.setKerberosContainerDn(kerberos.getContainerDn()); } cluster.setKerberosConfig(kerberosConfig); cluster.setLdapRequired(source.getLdapRequired()); cluster.setConfigStrategy(source.getConfigStrategy()); cluster.setEnableShipyard(source.getEnableShipyard()); cluster.setEmailTo(source.getEmailTo()); FileSystemBase fileSystem = source.getFileSystem(); cluster.setCloudbreakAmbariPassword(PasswordUtil.generatePassword()); cluster.setCloudbreakAmbariUser("cloudbreak"); convertAttributes(source, cluster); if (fileSystem != null) { cluster.setFileSystem(getConversionService().convert(fileSystem, FileSystem.class)); } try { Json json = new Json(convertBlueprintInputJsons(source.getBlueprintInputs())); cluster.setBlueprintInputs(source.getBlueprintInputs() == null ? new Json(new HashMap<>()) : json); if (source.getBlueprintCustomProperties() != null) { cluster.setBlueprintCustomProperties(source.getBlueprintCustomProperties()); } else { cluster.setBlueprintCustomProperties(null); } } catch (JsonProcessingException e) { cluster.setBlueprintInputs(null); } try { Json json = new Json(convertContainerConfigs(source.getCustomContainer())); cluster.setCustomContainerDefinition(json); } catch (JsonProcessingException e) { cluster.setCustomContainerDefinition(null); } return cluster; } private void convertAttributes(ClusterRequest source, Cluster cluster) { Map<String, Object> attributesMap = new HashMap<>(); if (source.getCustomQueue() != null) { attributesMap.put(ClusterAttributes.CUSTOM_QUEUE.name(), source.getCustomQueue()); } try { cluster.setAttributes(new Json(attributesMap)); } catch (JsonProcessingException e) { LOGGER.warn("Could not initiate the attribute map on cluster object: ", e); } } private void convertKnox(ClusterRequest source, Cluster cluster) { GatewayJson gatewayJson = source.getGateway(); Gateway gateway = new Gateway(); gateway.setEnableGateway(Boolean.FALSE); gateway.setTopologyName("services"); gateway.setPath(source.getName()); gateway.setSsoType(SSOType.NONE); if (gatewayJson != null) { if (gatewayJson.getPath() != null) { gateway.setPath(gatewayJson.getPath()); } if (gatewayJson.getSsoType() != null) { gateway.setSsoType(gatewayJson.getSsoType()); } gateway.setSignCert(gatewayJson.getSignCert()); gateway.setSignPub(gatewayJson.getSignPub()); } convertExposedServices(gatewayJson, gateway); cluster.setGateway(gateway); gateway.setCluster(cluster); } private void convertExposedServices(GatewayJson gatewayJson, Gateway gateway) { ExposedServices exposedServices = new ExposedServices(); if (gatewayJson != null) { if (gatewayJson.getGatewayType() != null) { gateway.setGatewayType(gatewayJson.getGatewayType()); } if (gatewayJson.getSsoProvider() != null) { gateway.setSsoProvider(gatewayJson.getSsoProvider()); } if (gatewayJson.getEnableGateway() != null) { gateway.setEnableGateway(gatewayJson.getEnableGateway()); if (!Strings.isNullOrEmpty(gatewayJson.getTopologyName())) { gateway.setTopologyName(gatewayJson.getTopologyName()); } if (gatewayJson.getExposedServices() != null) { if (gatewayJson.getExposedServices().contains(ExposedService.ALL.name())) { exposedServices.setServices(ExposedService.getAllKnoxExposed()); } else { exposedServices.setServices(gatewayJson.getExposedServices()); } } } } try { gateway.setExposedServices(new Json(exposedServices)); } catch (JsonProcessingException e) { LOGGER.error("Failed to store exposedServices", e); throw new CloudbreakApiException("Failed to store exposedServices", e); } } private Map<String, String> convertBlueprintInputJsons(Set<BlueprintInputJson> inputs) { Map<String, String> blueprintInputs = new HashMap<>(); for (BlueprintInputJson input : inputs) { blueprintInputs.put(input.getName(), input.getPropertyValue()); } return blueprintInputs; } private Map<String, String> convertContainerConfigs(CustomContainerRequest customContainerRequest) { Map<String, String> configs = new HashMap<>(); if (customContainerRequest != null) { for (Map.Entry<String, String> stringStringEntry : customContainerRequest.getDefinitions().entrySet()) { configs.put(stringStringEntry.getKey(), stringStringEntry.getValue()); } } return configs; } }