package com.sequenceiq.cloudbreak.cloud.handler; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.cloud.CloudConnector; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.event.credential.CredentialVerificationException; import com.sequenceiq.cloudbreak.cloud.event.credential.CredentialVerificationRequest; import com.sequenceiq.cloudbreak.cloud.event.credential.CredentialVerificationResult; import com.sequenceiq.cloudbreak.cloud.init.CloudPlatformConnectors; import com.sequenceiq.cloudbreak.cloud.model.CloudCredentialStatus; import com.sequenceiq.cloudbreak.cloud.model.CredentialStatus; import reactor.bus.Event; @Component public class CredentialVerificationHandler implements CloudPlatformEventHandler<CredentialVerificationRequest> { private static final Logger LOGGER = LoggerFactory.getLogger(CredentialVerificationHandler.class); @Inject private CloudPlatformConnectors cloudPlatformConnectors; @Override public Class<CredentialVerificationRequest> type() { return CredentialVerificationRequest.class; } @Override public void accept(Event<CredentialVerificationRequest> createCredentialRequestEvent) { LOGGER.info("Received event: {}", createCredentialRequestEvent); CredentialVerificationRequest request = createCredentialRequestEvent.getData(); try { CloudConnector connector = cloudPlatformConnectors.getDefault(request.getCloudContext().getPlatform()); AuthenticatedContext ac; CloudCredentialStatus cloudCredentialStatus; try { ac = connector.authentication().authenticate(request.getCloudContext(), request.getCloudCredential()); cloudCredentialStatus = connector.credentials().verify(ac); } catch (CredentialVerificationException e) { String errorMessage = e.getMessage(); LOGGER.error(errorMessage, e); cloudCredentialStatus = new CloudCredentialStatus(request.getCloudCredential(), CredentialStatus.FAILED, e, errorMessage); } catch (Exception e) { String errorMessage = String.format("Could not verify credential [credential: '%s'], detailed message: %s", request.getCloudContext().getName(), e.getMessage()); LOGGER.error(errorMessage, e); cloudCredentialStatus = new CloudCredentialStatus(request.getCloudCredential(), CredentialStatus.FAILED, e, errorMessage); } CredentialVerificationResult credentialVerificationResult = new CredentialVerificationResult(request, cloudCredentialStatus); request.getResult().onNext(credentialVerificationResult); LOGGER.info("Credential verification successfully finished"); } catch (Exception e) { request.getResult().onNext(new CredentialVerificationResult(e.getMessage(), e, request)); } } }