package com.sequenceiq.cloudbreak.service.stack; import java.util.Collections; import java.util.List; import javax.annotation.Resource; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.convert.ConversionService; import org.springframework.stereotype.Service; import com.sequenceiq.cloudbreak.api.model.StackRequest; import com.sequenceiq.cloudbreak.cloud.context.CloudContext; import com.sequenceiq.cloudbreak.cloud.event.model.EventStatus; import com.sequenceiq.cloudbreak.cloud.event.platform.GetStackParamValidationRequest; import com.sequenceiq.cloudbreak.cloud.event.platform.GetStackParamValidationResult; import com.sequenceiq.cloudbreak.cloud.model.StackParamValidation; import com.sequenceiq.cloudbreak.domain.Credential; import com.sequenceiq.cloudbreak.service.credential.CredentialService; import com.sequenceiq.cloudbreak.service.stack.connector.OperationException; import reactor.bus.Event; import reactor.bus.EventBus; @Service public class StackParameterService { private static final Logger LOGGER = LoggerFactory.getLogger(StackParameterService.class); @Inject private CredentialService credentialService; @Resource @Qualifier("conversionService") private ConversionService conversionService; @Inject private EventBus eventBus; public List<StackParamValidation> getStackParams(StackRequest stackRequest) { LOGGER.debug("Get stack params"); Long credentialId = stackRequest.getCredentialId(); if (credentialId != null || stackRequest.getCredential() != null) { Credential credential = null; if (credentialId != null) { credential = credentialService.get(credentialId); } else { credential = conversionService.convert(stackRequest.getCredential(), Credential.class); } CloudContext cloudContext = new CloudContext(credential.getId(), stackRequest.getName(), credential.cloudPlatform(), credential.getOwner()); GetStackParamValidationRequest getStackParamValidationRequest = new GetStackParamValidationRequest(cloudContext); eventBus.notify(getStackParamValidationRequest.selector(), Event.wrap(getStackParamValidationRequest)); try { GetStackParamValidationResult res = getStackParamValidationRequest.await(); LOGGER.info("Get stack params result: {}", res); if (res.getStatus().equals(EventStatus.FAILED)) { LOGGER.error("Failed to get stack params", res.getErrorDetails()); throw new OperationException(res.getErrorDetails()); } return res.getStackParamValidations(); } catch (InterruptedException e) { LOGGER.error("Error while getting the stack params", e); throw new OperationException(e); } } else { return Collections.emptyList(); } } }