package com.sequenceiq.cloudbreak.converter;
import static com.sequenceiq.cloudbreak.cloud.model.Platform.platform;
import static com.sequenceiq.cloudbreak.common.type.CloudConstants.BYOS;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.api.client.repackaged.com.google.common.base.Strings;
import com.sequenceiq.cloudbreak.api.model.CredentialRequest;
import com.sequenceiq.cloudbreak.controller.BadRequestException;
import com.sequenceiq.cloudbreak.domain.Credential;
import com.sequenceiq.cloudbreak.domain.json.Json;
import com.sequenceiq.cloudbreak.service.stack.resource.definition.credential.CredentialDefinitionService;
import com.sequenceiq.cloudbreak.service.topology.TopologyService;
@Component
public class JsonToCredentialConverter extends AbstractConversionServiceAwareConverter<CredentialRequest, Credential> {
private static final String SSH_USER_CENT = "centos";
private static final String SSH_USER_CB = "cloudbreak";
@Inject
private CredentialDefinitionService credentialDefinitionService;
@Inject
private TopologyService topologyService;
@Override
public Credential convert(CredentialRequest source) {
Credential credential = new Credential();
credential.setName(source.getName());
credential.setDescription(source.getDescription());
if (!BYOS.equals(source.getCloudPlatform()) && Strings.isNullOrEmpty(source.getPublicKey())) {
throw new BadRequestException("You should define the publickey!");
}
credential.setPublicKey(source.getPublicKey());
String cloudPlatform = source.getCloudPlatform();
credential.setCloudPlatform(cloudPlatform);
Map<String, Object> parameters = credentialDefinitionService.processProperties(platform(cloudPlatform), source.getParameters());
if (parameters != null && !parameters.isEmpty()) {
try {
credential.setAttributes(new Json(parameters));
} catch (JsonProcessingException e) {
throw new BadRequestException("Invalid parameters");
}
}
if (source.getLoginUserName() != null) {
throw new BadRequestException("You can not modify the default user!");
}
setUserName(credential, source.getParameters());
if (source.getTopologyId() != null) {
credential.setTopology(topologyService.getById(source.getTopologyId()));
}
return credential;
}
private void setUserName(Credential credential, Map<String, Object> parameters) {
if (parameters.containsKey("keystoneVersion")) {
credential.setLoginUserName(SSH_USER_CENT);
} else {
credential.setLoginUserName(SSH_USER_CB);
}
}
}