package com.sequenceiq.cloudbreak.orchestrator.salt.poller;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrap;
import com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException;
import com.sequenceiq.cloudbreak.orchestrator.model.GenericResponse;
import com.sequenceiq.cloudbreak.orchestrator.model.GenericResponses;
import com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector;
public class SaltUpload implements OrchestratorBootstrap {
private static final Logger LOGGER = LoggerFactory.getLogger(SaltUpload.class);
private final SaltConnector sc;
private final Set<String> originalTargets;
private final String path;
private final String fileName;
private final byte[] content;
private Set<String> targets;
public SaltUpload(SaltConnector sc, Set<String> targets, String path, String fileName, byte[] content) {
this.sc = sc;
this.originalTargets = targets;
this.targets = targets;
this.path = path;
this.fileName = fileName;
this.content = content;
}
@Override
public Boolean call() throws Exception {
LOGGER.info("Uploading files to: {}", targets);
if (!targets.isEmpty()) {
LOGGER.info("Current targets for upload: {}", targets);
GenericResponses responses = sc.upload(targets, path, fileName, content);
Set<String> failedTargets = new HashSet<>();
LOGGER.info("Salt file upload responses: {}", responses);
for (GenericResponse genericResponse : responses.getResponses()) {
if (genericResponse.getStatusCode() != HttpStatus.CREATED.value()) {
LOGGER.info("Failed upload attempt to: " + genericResponse.getAddress());
String address = genericResponse.getAddress().split(":")[0];
failedTargets.addAll(originalTargets.stream().filter(a -> a.equals(address)).collect(Collectors.toList()));
}
}
targets = failedTargets;
if (!targets.isEmpty()) {
LOGGER.info("Missing nodes for file upload: {}", targets);
throw new CloudbreakOrchestratorFailedException("There are missing nodes for file upload: " + targets);
}
}
LOGGER.info("File upload has been completed on nodes: {}", originalTargets);
return true;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("SaltUpload{");
sb.append("sc=").append(sc);
sb.append(", originalTargets=").append(originalTargets);
sb.append(", path='").append(path).append('\'');
sb.append(", fileName='").append(fileName).append('\'');
sb.append(", targets=").append(targets);
sb.append('}');
return sb.toString();
}
}