package com.sequenceiq.cloudbreak.cloud.task; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.cloud.InstanceConnector; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.event.instance.InstanceConsoleOutputResult; import com.sequenceiq.cloudbreak.cloud.handler.GetSSHFingerprintsHandler; import com.sequenceiq.cloudbreak.cloud.model.CloudInstance; @Component(PollInstanceConsoleOutputTask.NAME) @Scope(value = "prototype") public class PollInstanceConsoleOutputTask extends AbstractPollTask<InstanceConsoleOutputResult> { public static final String NAME = "pollInstanceConsoleOutputTask"; private static final Logger LOGGER = LoggerFactory.getLogger(PollInstanceConsoleOutputTask.class); private static final String CB_FINGERPRINT_END = "-----END SSH HOST KEY FINGERPRINTS-----"; private final CloudInstance instance; private final InstanceConnector instanceConnector; public PollInstanceConsoleOutputTask(InstanceConnector instanceConnector, AuthenticatedContext authenticatedContext, CloudInstance instance) { super(authenticatedContext); this.instanceConnector = instanceConnector; this.instance = instance; } @Override public InstanceConsoleOutputResult call() throws Exception { LOGGER.info("Get console output of instance: {}, for stack: {}.", instance.getInstanceId(), getAuthenticatedContext().getCloudContext().getName()); String consoleOutput = instanceConnector.getConsoleOutput(getAuthenticatedContext(), instance); return new InstanceConsoleOutputResult(getAuthenticatedContext().getCloudContext(), instance, consoleOutput); } @Override public boolean completed(InstanceConsoleOutputResult instanceConsoleOutputResult) { String output = instanceConsoleOutputResult.getConsoleOutput(); boolean contains = output.contains(CB_FINGERPRINT_END); if (contains) { return true; } Set<String> fingerprints = GetSSHFingerprintsHandler.FingerprintParserUtil.parseFingerprints(output); return !fingerprints.isEmpty(); } }