use of com.sequenceiq.cloudbreak.common.orchestration.Node in project cloudbreak by hortonworks.
the class FreeIpaOrchestrationConfigService method configureOrchestrator.
public void configureOrchestrator(Long stackId) throws CloudbreakOrchestratorException {
Stack stack = stackService.getByIdWithListsInTransaction(stackId);
Set<InstanceMetaData> instanceMetaDatas = stack.getNotDeletedInstanceMetaDataSet();
List<GatewayConfig> gatewayConfigs = gatewayConfigService.getGatewayConfigs(stack, instanceMetaDatas);
Set<Node> allNodes = freeIpaNodeUtilService.mapInstancesToNodes(instanceMetaDatas);
SaltConfig saltConfig = saltConfigProvider.getSaltConfig(stack, allNodes);
hostOrchestrator.initSaltConfig(stack, gatewayConfigs, allNodes, saltConfig, new StackBasedExitCriteriaModel(stackId));
}
use of com.sequenceiq.cloudbreak.common.orchestration.Node in project cloudbreak by hortonworks.
the class BootstrapService method bootstrap.
public void bootstrap(Long stackId, List<String> instanceIds) throws CloudbreakOrchestratorException {
Set<InstanceMetaData> instanceMetaDatas = instanceMetaDataService.findNotTerminatedForStack(stackId).stream().filter(instanceMetaData -> Objects.isNull(instanceIds) || instanceIds.contains(instanceMetaData.getInstanceId())).collect(Collectors.toSet());
Stack stack = stackRepository.findById(stackId).get();
FreeIpa freeIpa = freeIpaService.findByStack(stack);
List<GatewayConfig> gatewayConfigs = gatewayConfigService.getGatewayConfigs(stack, instanceMetaDatas);
Set<Node> allNodes = instanceMetaDatas.stream().map(im -> {
String hostname = getHostname(freeIpa, im);
return new Node(im.getPrivateIp(), im.getPublicIpWrapper(), im.getInstanceId(), im.getInstanceGroup().getTemplate().getInstanceType(), hostname, freeIpa.getDomain(), im.getInstanceGroup().getGroupName());
}).collect(Collectors.toSet());
BootstrapParams params = new BootstrapParams();
params.setCloud(stack.getCloudPlatform());
ImageEntity image = imageService.getByStack(stack);
params.setOs(image.getOs());
params.setSaltBootstrapFpSupported(true);
params.setRestartNeededFlagSupported(true);
try {
byte[] stateConfigZip = getStateConfigZip();
hostOrchestrator.bootstrapNewNodes(gatewayConfigs, allNodes, allNodes, stateConfigZip, params, new StackBasedExitCriteriaModel(stackId));
} catch (IOException e) {
LOGGER.error("Couldn't read state config", e);
throw new CloudbreakOrchestratorFailedException("Couldn't read state config", e);
} catch (CloudbreakOrchestratorException e) {
LOGGER.error("Bootstrap failed", e);
throw e;
}
}
use of com.sequenceiq.cloudbreak.common.orchestration.Node in project cloudbreak by hortonworks.
the class SaltOrchestrator method tearDown.
@Retryable(backoff = @Backoff(delay = 1000, multiplier = 2, maxDelay = 10000), maxAttempts = 5)
@Override
public void tearDown(OrchestratorAware stack, List<GatewayConfig> allGatewayConfigs, Map<String, String> removeNodePrivateIPsByFQDN, Set<Node> remainingNodes, ExitCriteriaModel exitModel) throws CloudbreakOrchestratorException {
LOGGER.debug("Tear down hosts: {},", removeNodePrivateIPsByFQDN);
LOGGER.debug("Gateway config for tear down: {}", allGatewayConfigs);
Set<String> remainingIps = remainingNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
LOGGER.debug("Remaining IPs: {}", remainingIps);
Set<String> minionsToStop = removeNodePrivateIPsByFQDN.values().stream().filter(not(remainingIps::contains)).collect(Collectors.toSet());
LOGGER.debug("Minions to stop: {}", minionsToStop);
GatewayConfig primaryGateway = saltService.getPrimaryGatewayConfig(allGatewayConfigs);
Set<String> gatewayTargetIpAddresses = getGatewayPrivateIps(allGatewayConfigs);
try (SaltConnector saltConnector = saltService.createSaltConnector(primaryGateway)) {
SaltStates.stopMinions(saltConnector, minionsToStop);
if (!CollectionUtils.isEmpty(remainingNodes)) {
saveHostsPillar(stack, exitModel, gatewayTargetIpAddresses, saltConnector);
}
} catch (Exception e) {
LOGGER.info("Error occurred during salt minion tear down", e);
throw new CloudbreakOrchestratorFailedException(e.getMessage(), e);
}
List<GatewayConfig> liveGateways = allGatewayConfigs.stream().filter(gw -> remainingIps.contains(gw.getPrivateAddress())).collect(Collectors.toList());
for (GatewayConfig gatewayConfig : liveGateways) {
try (SaltConnector sc = saltService.createSaltConnector(gatewayConfig)) {
sc.wheel("key.delete", removeNodePrivateIPsByFQDN.keySet(), Object.class);
removeDeadSaltMinions(gatewayConfig);
} catch (Exception e) {
LOGGER.info("Error occurred during salt minion tear down", e);
throw new CloudbreakOrchestratorFailedException(e.getMessage(), e);
}
}
}
use of com.sequenceiq.cloudbreak.common.orchestration.Node in project cloudbreak by hortonworks.
the class SaltOrchestrator method stopClusterManagerAgent.
@Override
public void stopClusterManagerAgent(OrchestratorAware stack, GatewayConfig gatewayConfig, Set<Node> allNodes, Set<Node> nodesUnderStopping, ExitCriteriaModel exitCriteriaModel, CmAgentStopFlags flags) throws CloudbreakOrchestratorFailedException {
try (SaltConnector sc = saltService.createSaltConnector(gatewayConfig)) {
NodeReachabilityResult nodeReachabilityResult = getResponsiveNodes(allNodes, sc);
Set<Node> responsiveNodes = nodeReachabilityResult.getReachableNodes();
Set<String> nodesUnderStoppingIPs = nodesUnderStopping.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
Set<Node> responsiveNodesUnderStopping = responsiveNodes.stream().filter(responsiveNode -> nodesUnderStoppingIPs.contains(responsiveNode.getPrivateIp())).collect(Collectors.toSet());
if (!responsiveNodesUnderStopping.isEmpty()) {
LOGGER.debug("Applying role 'cloudera_manager_agent_stop' on nodes: [{}]", responsiveNodesUnderStopping);
Set<String> targetHostnames = responsiveNodesUnderStopping.stream().map(Node::getHostname).collect(Collectors.toSet());
saltCommandRunner.runModifyGrainCommand(sc, new GrainAddRunner(targetHostnames, responsiveNodesUnderStopping, "roles", "cloudera_manager_agent_stop"), exitCriteriaModel, exitCriteria);
if (flags.isAdJoinable() || flags.isIpaJoinable()) {
String identityRole = flags.isAdJoinable() ? "ad_leave" : "ipa_leave";
LOGGER.debug("Applying role '{}' on nodes: [{}]", identityRole, responsiveNodesUnderStopping);
saltCommandRunner.runModifyGrainCommand(sc, new GrainAddRunner(targetHostnames, responsiveNodesUnderStopping, "roles", identityRole), exitCriteriaModel, exitCriteria);
String removeIdentityRole = flags.isAdJoinable() ? "ad_member" : "ipa_member";
LOGGER.debug("Removing role '{}' on nodes: [{}]", removeIdentityRole, responsiveNodesUnderStopping);
saltCommandRunner.runModifyGrainCommand(sc, new GrainRemoveRunner(targetHostnames, responsiveNodesUnderStopping, "roles", removeIdentityRole), exitCriteriaModel, exitCriteria);
}
Set<String> allHostnames = responsiveNodesUnderStopping.stream().map(Node::getHostname).collect(Collectors.toSet());
runSyncAll(sc, allHostnames, responsiveNodesUnderStopping, exitCriteriaModel);
saveHostsPillar(stack, exitCriteriaModel, getGatewayPrivateIps(Collections.singleton(gatewayConfig)), sc);
runNewService(sc, new HighStateRunner(allHostnames, responsiveNodesUnderStopping), exitCriteriaModel, maxRetry, true);
saltCommandRunner.runModifyGrainCommand(sc, new GrainRemoveRunner(targetHostnames, responsiveNodesUnderStopping, "roles", "cloudera_manager_agent_stop"), exitCriteriaModel, exitCriteria);
if (flags.isAdJoinable() || flags.isIpaJoinable()) {
String identityRole = flags.isAdJoinable() ? "ad_leave" : "ipa_leave";
saltCommandRunner.runModifyGrainCommand(sc, new GrainRemoveRunner(targetHostnames, responsiveNodesUnderStopping, "roles", identityRole), exitCriteriaModel, exitCriteria);
}
}
} catch (Exception e) {
LOGGER.info("Error occurred during executing highstate (for cluster manager agent stop).", e);
throwExceptionIfNotForced(flags.isForced(), e);
}
}
use of com.sequenceiq.cloudbreak.common.orchestration.Node in project cloudbreak by hortonworks.
the class SaltOrchestrator method installFreeIpa.
@SuppressFBWarnings("REC_CATCH_EXCEPTION")
@Override
public void installFreeIpa(GatewayConfig primaryGateway, List<GatewayConfig> allGatewayConfigs, Set<Node> allNodes, ExitCriteriaModel exitCriteriaModel) throws CloudbreakOrchestratorException {
Set<String> freeIpaMasterHostname = new HashSet<>(getHostnamesForRoles(primaryGateway, Set.of(FREEIPA_MASTER_ROLE, FREEIPA_MASTER_REPLACEMENT_ROLE), allNodes));
Set<String> existingFreeIpaReplicaHostnames = new HashSet<>(getHostnamesForRoles(primaryGateway, Set.of(FREEIPA_REPLICA_ROLE), allNodes));
Set<String> unassignedHostnames = allGatewayConfigs.stream().map(GatewayConfig::getHostname).filter(hostname -> !freeIpaMasterHostname.contains(hostname)).filter(hostname -> !existingFreeIpaReplicaHostnames.contains(hostname)).collect(Collectors.toCollection(HashSet::new));
try (SaltConnector sc = saltService.createSaltConnector(primaryGateway)) {
installFreeIpaUpdateExistingReplicas(sc, existingFreeIpaReplicaHostnames, allNodes, exitCriteriaModel);
unassignedHostnames.removeAll(installFreeIpaPrimary(sc, primaryGateway, freeIpaMasterHostname, unassignedHostnames, existingFreeIpaReplicaHostnames, allNodes, exitCriteriaModel));
installFreeIpaReplicas(sc, unassignedHostnames, allNodes, exitCriteriaModel);
LOGGER.debug("Completed installing FreeIPA");
} catch (CloudbreakOrchestratorException e) {
LOGGER.warn("CloudbreakOrchestratorException occurred during FreeIPA installation", e);
throw e;
} catch (ExecutionException e) {
LOGGER.warn("Error occurred during FreeIPA installation", e);
if (e.getCause() instanceof CloudbreakOrchestratorFailedException) {
throw (CloudbreakOrchestratorFailedException) e.getCause();
}
throw new CloudbreakOrchestratorFailedException(e.getMessage(), e);
} catch (Exception e) {
LOGGER.warn("Error occurred during FreeIPA installation", e);
throw new CloudbreakOrchestratorFailedException(e.getMessage(), e);
}
}
Aggregations