Search in sources :

Example 1 with GrainAddRunner

use of com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner in project cloudbreak by hortonworks.

the class SaltOrchestrator method executeRecipes.

@SuppressFBWarnings("REC_CATCH_EXCEPTION")
private void executeRecipes(GatewayConfig gatewayConfig, Set<Node> allNodes, ExitCriteriaModel exitCriteriaModel, RecipeExecutionPhase phase) throws CloudbreakOrchestratorFailedException {
    try (SaltConnector sc = new SaltConnector(gatewayConfig, restDebug)) {
        // add 'recipe' grain to all nodes
        Set<String> targets = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        runSaltCommand(sc, new GrainAddRunner(targets, allNodes, "recipes", phase.value(), CompoundType.IP), exitCriteriaModel);
        // Add Deprecated 'PRE/POST' recipe execution for backward compatibility (since version 2.2.0)
        boolean postRecipe = phase.isPostRecipe();
        if (postRecipe) {
            runSaltCommand(sc, new GrainAddRunner(targets, allNodes, "recipes", RecipeExecutionPhase.POST.value(), CompoundType.IP), exitCriteriaModel);
        } else {
            runSaltCommand(sc, new GrainAddRunner(targets, allNodes, "recipes", RecipeExecutionPhase.PRE.value(), CompoundType.IP), exitCriteriaModel);
        }
        Set<String> all = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        runSaltCommand(sc, new SyncGrainsRunner(all, allNodes), exitCriteriaModel);
        runNewService(sc, new HighStateRunner(all, allNodes), exitCriteriaModel, maxRetryRecipe, false);
        // remove 'recipe' grain from all nodes
        targets = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        runSaltCommand(sc, new GrainRemoveRunner(targets, allNodes, "recipes", phase.value(), CompoundType.IP), exitCriteriaModel);
        // Remove Deprecated 'PRE/POST' recipe execution for backward compatibility (since version 2.2.0)
        if (postRecipe) {
            runSaltCommand(sc, new GrainRemoveRunner(targets, allNodes, "recipes", RecipeExecutionPhase.POST.value(), CompoundType.IP), exitCriteriaModel);
        } else {
            runSaltCommand(sc, new GrainRemoveRunner(targets, allNodes, "recipes", RecipeExecutionPhase.PRE.value(), CompoundType.IP), exitCriteriaModel);
        }
    } catch (Exception e) {
        LOGGER.error("Error occurred during recipe execution", e);
        throw new CloudbreakOrchestratorFailedException(e);
    }
}
Also used : GrainRemoveRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainRemoveRunner) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) HighStateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner) Node(com.sequenceiq.cloudbreak.orchestrator.model.Node) GrainAddRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner) SyncGrainsRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.SyncGrainsRunner) SaltConnector(com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector) CloudbreakOrchestratorException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorException) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 2 with GrainAddRunner

use of com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner in project cloudbreak by hortonworks.

the class SaltOrchestratorTest method runServiceTest.

@Test
public void runServiceTest() throws Exception {
    whenNew(SaltBootstrap.class).withAnyArguments().thenReturn(mock(SaltBootstrap.class));
    whenNew(OrchestratorBootstrapRunner.class).withAnyArguments().thenReturn(mock(OrchestratorBootstrapRunner.class));
    PillarSave pillarSave = mock(PillarSave.class);
    whenNew(PillarSave.class).withAnyArguments().thenReturn(pillarSave);
    GrainAddRunner addRemoveGrainRunner = mock(GrainAddRunner.class);
    whenNew(GrainAddRunner.class).withAnyArguments().thenReturn(addRemoveGrainRunner);
    SaltCommandTracker roleCheckerSaltCommandTracker = mock(SaltCommandTracker.class);
    whenNew(SaltCommandTracker.class).withArguments(eq(saltConnector), eq(addRemoveGrainRunner)).thenReturn(roleCheckerSaltCommandTracker);
    SyncGrainsRunner syncGrainsRunner = mock(SyncGrainsRunner.class);
    whenNew(SyncGrainsRunner.class).withAnyArguments().thenReturn(syncGrainsRunner);
    SaltCommandTracker syncGrainsCheckerSaltCommandTracker = mock(SaltCommandTracker.class);
    whenNew(SaltCommandTracker.class).withArguments(eq(saltConnector), eq(syncGrainsRunner)).thenReturn(syncGrainsCheckerSaltCommandTracker);
    HighStateRunner highStateRunner = mock(HighStateRunner.class);
    whenNew(HighStateRunner.class).withAnyArguments().thenReturn(highStateRunner);
    SaltJobIdTracker saltJobIdTracker = mock(SaltJobIdTracker.class);
    whenNew(SaltJobIdTracker.class).withAnyArguments().thenReturn(saltJobIdTracker);
    saltOrchestrator.init(parallelOrchestratorComponentRunner, exitCriteria);
    SaltConfig saltConfig = new SaltConfig();
    saltOrchestrator.runService(Collections.singletonList(gatewayConfig), targets, saltConfig, exitCriteriaModel);
    // verify pillar save
    verifyNew(OrchestratorBootstrapRunner.class, times(1)).withArguments(eq(pillarSave), eq(exitCriteria), eq(exitCriteriaModel), any(), anyInt(), anyInt());
    // verify ambari server role
    verifyNew(GrainAddRunner.class, times(1)).withArguments(eq(Sets.newHashSet(gatewayConfig.getPrivateAddress())), eq(targets), eq("ambari_server_install"));
    // verify ambari server role
    verifyNew(GrainAddRunner.class, times(1)).withArguments(eq(Sets.newHashSet(gatewayConfig.getPrivateAddress())), eq(targets), eq("ambari_server"));
    // verify ambari agent role
    Set<String> allNodes = targets.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
    verifyNew(GrainAddRunner.class, times(1)).withArguments(eq(allNodes), eq(targets), eq("ambari_agent_install"));
    // verify ambari agent role
    allNodes = targets.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
    verifyNew(GrainAddRunner.class, times(1)).withArguments(eq(allNodes), eq(targets), eq("ambari_agent"));
    // verify two role command (amabari server, ambari agent)
    verifyNew(SaltCommandTracker.class, times(4)).withArguments(eq(saltConnector), eq(addRemoveGrainRunner));
    // verify two OrchestratorBootstrapRunner call with rolechecker command tracker
    verifyNew(OrchestratorBootstrapRunner.class, times(4)).withArguments(eq(roleCheckerSaltCommandTracker), eq(exitCriteria), eq(exitCriteriaModel), any(), anyInt(), anyInt());
    // verify syncgrains command
    verifyNew(SyncGrainsRunner.class, times(1)).withArguments(eq(allNodes), eq(targets));
    verifyNew(SaltCommandTracker.class, times(1)).withArguments(eq(saltConnector), eq(syncGrainsRunner));
    verifyNew(OrchestratorBootstrapRunner.class, times(1)).withArguments(eq(syncGrainsCheckerSaltCommandTracker), eq(exitCriteria), eq(exitCriteriaModel), any(), anyInt(), anyInt());
    // verify run new service
    verifyNew(HighStateRunner.class, atLeastOnce()).withArguments(eq(allNodes), eq(targets));
    verifyNew(SaltJobIdTracker.class, atLeastOnce()).withArguments(eq(saltConnector), eq(highStateRunner), eq(true));
}
Also used : HighStateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner) SaltJobIdTracker(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltJobIdTracker) Node(com.sequenceiq.cloudbreak.orchestrator.model.Node) GrainAddRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner) SyncGrainsRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.SyncGrainsRunner) SaltCommandTracker(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltCommandTracker) SaltConfig(com.sequenceiq.cloudbreak.orchestrator.model.SaltConfig) SaltBootstrap(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltBootstrap) OrchestratorBootstrapRunner(com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrapRunner) PillarSave(com.sequenceiq.cloudbreak.orchestrator.salt.poller.PillarSave) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 3 with GrainAddRunner

use of com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner in project cloudbreak by hortonworks.

the class SaltOrchestrator method upgradeAmbari.

@SuppressFBWarnings("REC_CATCH_EXCEPTION")
@Override
public void upgradeAmbari(GatewayConfig gatewayConfig, Set<String> target, Set<Node> allNodes, SaltConfig pillarConfig, ExitCriteriaModel exitCriteriaModel) throws CloudbreakOrchestratorException {
    try (SaltConnector sc = new SaltConnector(gatewayConfig, restDebug)) {
        for (Entry<String, SaltPillarProperties> propertiesEntry : pillarConfig.getServicePillarConfig().entrySet()) {
            OrchestratorBootstrap pillarSave = new PillarSave(sc, Sets.newHashSet(gatewayConfig.getPrivateAddress()), propertiesEntry.getValue());
            Callable<Boolean> saltPillarRunner = runner(pillarSave, exitCriteria, exitCriteriaModel);
            Future<Boolean> saltPillarRunnerFuture = parallelOrchestratorComponentRunner.submit(saltPillarRunner);
            saltPillarRunnerFuture.get();
        }
        // add 'ambari_upgrade' role to all nodes
        Set<String> targets = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        runSaltCommand(sc, new GrainAddRunner(targets, allNodes, "roles", "ambari_upgrade", CompoundType.IP), exitCriteriaModel);
        Set<String> all = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        runSaltCommand(sc, new SyncGrainsRunner(all, allNodes), exitCriteriaModel);
        runNewService(sc, new HighStateRunner(all, allNodes), exitCriteriaModel, maxRetryRecipe, true);
        // remove 'ambari_upgrade' role from all nodes
        targets = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        runSaltCommand(sc, new GrainRemoveRunner(targets, allNodes, "roles", "ambari_upgrade", CompoundType.IP), exitCriteriaModel);
    } catch (Exception e) {
        LOGGER.error("Error occurred during ambari upgrade", e);
        throw new CloudbreakOrchestratorFailedException(e);
    }
}
Also used : HighStateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner) OrchestratorBootstrap(com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrap) Node(com.sequenceiq.cloudbreak.orchestrator.model.Node) GrainAddRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner) SaltConnector(com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector) SaltPillarProperties(com.sequenceiq.cloudbreak.orchestrator.model.SaltPillarProperties) CloudbreakOrchestratorException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorException) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) GrainRemoveRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainRemoveRunner) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) SyncGrainsRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.SyncGrainsRunner) PillarSave(com.sequenceiq.cloudbreak.orchestrator.salt.poller.PillarSave) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 4 with GrainAddRunner

use of com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner in project cloudbreak by hortonworks.

the class SaltOrchestrator method runService.

@SuppressFBWarnings("REC_CATCH_EXCEPTION")
@Override
public void runService(List<GatewayConfig> allGateway, Set<Node> allNodes, SaltConfig saltConfig, ExitCriteriaModel exitModel) throws CloudbreakOrchestratorException {
    LOGGER.info("Run Services on nodes: {}", allNodes);
    GatewayConfig primaryGateway = getPrimaryGatewayConfig(allGateway);
    Set<String> gatewayTargets = getGatewayPrivateIps(allGateway);
    String ambariServerAddress = primaryGateway.getPrivateAddress();
    try (SaltConnector sc = new SaltConnector(primaryGateway, restDebug)) {
        OrchestratorBootstrap hostSave = new PillarSave(sc, gatewayTargets, allNodes);
        Callable<Boolean> saltPillarRunner = runner(hostSave, exitCriteria, exitModel);
        Future<Boolean> saltPillarRunnerFuture = parallelOrchestratorComponentRunner.submit(saltPillarRunner);
        saltPillarRunnerFuture.get();
        for (Entry<String, SaltPillarProperties> propertiesEntry : saltConfig.getServicePillarConfig().entrySet()) {
            OrchestratorBootstrap pillarSave = new PillarSave(sc, gatewayTargets, propertiesEntry.getValue());
            saltPillarRunner = runner(pillarSave, exitCriteria, exitModel);
            saltPillarRunnerFuture = parallelOrchestratorComponentRunner.submit(saltPillarRunner);
            saltPillarRunnerFuture.get();
        }
        Set<String> server = Sets.newHashSet(ambariServerAddress);
        Set<String> all = allNodes.stream().map(Node::getPrivateIp).collect(Collectors.toSet());
        // knox
        if (primaryGateway.getKnoxGatewayEnabled()) {
            runSaltCommand(sc, new GrainAddRunner(gatewayTargets, allNodes, "gateway"), exitModel);
        }
        setPostgreRoleIfNeeded(allNodes, saltConfig, exitModel, sc, server);
        // ambari server
        runSaltCommand(sc, new GrainAddRunner(server, allNodes, "ambari_server_install"), exitModel);
        runSaltCommand(sc, new GrainAddRunner(server, allNodes, "ambari_server"), exitModel);
        // ambari server standby
        Set<String> standbyServers = gatewayTargets.stream().filter(ip -> !server.contains(ip)).collect(Collectors.toSet());
        if (!standbyServers.isEmpty()) {
            runSaltCommand(sc, new GrainAddRunner(standbyServers, allNodes, "ambari_server_install"), exitModel);
            runSaltCommand(sc, new GrainAddRunner(standbyServers, allNodes, "ambari_server_standby"), exitModel);
        }
        // ambari agent
        runSaltCommand(sc, new GrainAddRunner(all, allNodes, "ambari_agent_install"), exitModel);
        runSaltCommand(sc, new GrainAddRunner(all, allNodes, "ambari_agent"), exitModel);
        // kerberos
        if (saltConfig.getServicePillarConfig().containsKey("kerberos")) {
            runSaltCommand(sc, new GrainAddRunner(server, allNodes, "kerberos_server_master"), exitModel);
            if (!standbyServers.isEmpty()) {
                runSaltCommand(sc, new GrainAddRunner(standbyServers, allNodes, "kerberos_server_slave"), exitModel);
            }
        }
        // smartsense
        if (configureSmartSense) {
            runSaltCommand(sc, new GrainAddRunner(gatewayTargets, allNodes, "smartsense"), exitModel);
            runSaltCommand(sc, new GrainAddRunner(all, allNodes, "smartsense_agent_update"), exitModel);
        }
        uploadGrains(allNodes, saltConfig.getGrainsProperties(), exitModel, sc);
        runSaltCommand(sc, new SyncGrainsRunner(all, allNodes), exitModel);
        runSaltCommand(sc, new MineUpdateRunner(gatewayTargets, allNodes), exitModel);
        runNewService(sc, new HighStateRunner(all, allNodes), exitModel);
    } catch (Exception e) {
        LOGGER.error("Error occurred during ambari bootstrap", e);
        if (e instanceof ExecutionException && e.getCause() instanceof CloudbreakOrchestratorFailedException) {
            throw (CloudbreakOrchestratorFailedException) e.getCause();
        }
        throw new CloudbreakOrchestratorFailedException(e);
    }
    LOGGER.info("Run services on nodes finished: {}", allNodes);
}
Also used : ParallelOrchestratorComponentRunner(com.sequenceiq.cloudbreak.orchestrator.executor.ParallelOrchestratorComponentRunner) SaltBootstrap(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltBootstrap) SaltJobIdTracker(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltJobIdTracker) LoggerFactory(org.slf4j.LoggerFactory) HighStateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner) PathMatchingResourcePatternResolver(org.springframework.core.io.support.PathMatchingResourcePatternResolver) Future(java.util.concurrent.Future) PillarSave(com.sequenceiq.cloudbreak.orchestrator.salt.poller.PillarSave) Map(java.util.Map) OrchestratorBootstrap(com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrap) ZipEntry(java.util.zip.ZipEntry) Resource(org.springframework.core.io.Resource) HostOrchestrator(com.sequenceiq.cloudbreak.orchestrator.host.HostOrchestrator) MineUpdateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.MineUpdateRunner) OrchestratorBootstrapRunner(com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrapRunner) SaltPillarProperties(com.sequenceiq.cloudbreak.orchestrator.model.SaltPillarProperties) Collection(java.util.Collection) CompoundType(com.sequenceiq.cloudbreak.orchestrator.salt.client.target.Compound.CompoundType) Set(java.util.Set) SaltCommandTracker(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltCommandTracker) CloudbreakOrchestratorException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorException) Collectors(java.util.stream.Collectors) GrainRemoveRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainRemoveRunner) StandardCharsets(java.nio.charset.StandardCharsets) Sets(com.google.common.collect.Sets) SALT(com.sequenceiq.cloudbreak.common.type.OrchestratorConstants.SALT) IOUtils(org.apache.commons.io.IOUtils) List(java.util.List) SaltStates(com.sequenceiq.cloudbreak.orchestrator.salt.states.SaltStates) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) Node(com.sequenceiq.cloudbreak.orchestrator.model.Node) Entry(java.util.Map.Entry) GatewayConfig(com.sequenceiq.cloudbreak.orchestrator.model.GatewayConfig) Optional(java.util.Optional) Compound(com.sequenceiq.cloudbreak.orchestrator.salt.client.target.Compound) RecipeExecutionPhase(com.sequenceiq.cloudbreak.common.type.RecipeExecutionPhase) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings) ZipOutputStream(java.util.zip.ZipOutputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) SaltUpload(com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltUpload) Callable(java.util.concurrent.Callable) ArrayList(java.util.ArrayList) RecipeModel(com.sequenceiq.cloudbreak.orchestrator.model.RecipeModel) Value(org.springframework.beans.factory.annotation.Value) GrainAddRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner) ExitCriteria(com.sequenceiq.cloudbreak.orchestrator.state.ExitCriteria) Logger(org.slf4j.Logger) ExitCriteriaModel(com.sequenceiq.cloudbreak.orchestrator.state.ExitCriteriaModel) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) HttpStatus(org.springframework.http.HttpStatus) Component(org.springframework.stereotype.Component) BaseSaltJobRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.BaseSaltJobRunner) TreeMap(java.util.TreeMap) SyncGrainsRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.SyncGrainsRunner) MDC(org.slf4j.MDC) ResourcePatternResolver(org.springframework.core.io.support.ResourcePatternResolver) Collections(java.util.Collections) SaltConnector(com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector) InputStream(java.io.InputStream) SaltConfig(com.sequenceiq.cloudbreak.orchestrator.model.SaltConfig) HighStateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner) OrchestratorBootstrap(com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrap) GrainAddRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner) SaltConnector(com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector) SaltPillarProperties(com.sequenceiq.cloudbreak.orchestrator.model.SaltPillarProperties) CloudbreakOrchestratorException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorException) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) MineUpdateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.MineUpdateRunner) SyncGrainsRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.SyncGrainsRunner) ExecutionException(java.util.concurrent.ExecutionException) GatewayConfig(com.sequenceiq.cloudbreak.orchestrator.model.GatewayConfig) PillarSave(com.sequenceiq.cloudbreak.orchestrator.salt.poller.PillarSave) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 5 with GrainAddRunner

use of com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner in project cloudbreak by hortonworks.

the class SaltOrchestrator method changePrimaryGateway.

@SuppressFBWarnings("REC_CATCH_EXCEPTION")
@Override
public void changePrimaryGateway(GatewayConfig formerGateway, GatewayConfig newPrimaryGateway, List<GatewayConfig> allGatewayConfigs, Set<Node> allNodes, ExitCriteriaModel exitCriteriaModel) throws CloudbreakOrchestratorException {
    LOGGER.info("Change primary gateway: {}", formerGateway);
    String ambariServerAddress = newPrimaryGateway.getPrivateAddress();
    try (SaltConnector sc = new SaltConnector(newPrimaryGateway, restDebug)) {
        SaltStates.stopMinions(sc, Collections.singletonMap(formerGateway.getHostname(), formerGateway.getPrivateAddress()));
        // change ambari_server_standby role to ambari_server
        Set<String> server = Collections.singleton(ambariServerAddress);
        runSaltCommand(sc, new GrainAddRunner(server, allNodes, "ambari_server"), exitCriteriaModel);
        runSaltCommand(sc, new GrainRemoveRunner(server, allNodes, "roles", "ambari_server_standby", CompoundType.IP), exitCriteriaModel);
        // add ambari_server_standby role to the standby servers and remove ambari_server role from them.
        Set<String> standByServers = allGatewayConfigs.stream().filter(gwc -> !gwc.getHostname().equals(newPrimaryGateway.getHostname()) && !gwc.getHostname().equals(formerGateway.getHostname())).map(GatewayConfig::getPrivateAddress).collect(Collectors.toSet());
        runSaltCommand(sc, new GrainAddRunner(standByServers, allNodes, "ambari_server_standby"), exitCriteriaModel);
        runSaltCommand(sc, new GrainRemoveRunner(standByServers, allNodes, "roles", "ambari_server", CompoundType.IP), exitCriteriaModel);
        // remove minion key from all remaining gateway nodes
        for (GatewayConfig gatewayConfig : allGatewayConfigs) {
            if (!gatewayConfig.getHostname().equals(formerGateway.getHostname())) {
                try (SaltConnector sc1 = new SaltConnector(gatewayConfig, restDebug)) {
                    LOGGER.info("Removing minion key '{}' from gateway '{}'", formerGateway.getHostname(), gatewayConfig.getHostname());
                    sc1.wheel("key.delete", Collections.singleton(formerGateway.getHostname()), Object.class);
                } catch (Exception ex) {
                    LOGGER.error("Unsuccessful key removal from gateway: " + gatewayConfig.getHostname(), ex);
                }
            }
        }
        // salt '*' state.highstate
        runNewService(sc, new HighStateRunner(server, allNodes), exitCriteriaModel);
    } catch (Exception e) {
        LOGGER.error("Error occurred during primary gateway change", e);
        if (e instanceof ExecutionException && e.getCause() instanceof CloudbreakOrchestratorFailedException) {
            throw (CloudbreakOrchestratorFailedException) e.getCause();
        }
        throw new CloudbreakOrchestratorFailedException(e);
    }
}
Also used : GrainRemoveRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainRemoveRunner) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) HighStateRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner) GrainAddRunner(com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner) ExecutionException(java.util.concurrent.ExecutionException) SaltConnector(com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector) CloudbreakOrchestratorException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorException) CloudbreakOrchestratorFailedException(com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) GatewayConfig(com.sequenceiq.cloudbreak.orchestrator.model.GatewayConfig) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Aggregations

GrainAddRunner (com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainAddRunner)5 HighStateRunner (com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.HighStateRunner)5 CloudbreakOrchestratorException (com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorException)4 CloudbreakOrchestratorFailedException (com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException)4 Node (com.sequenceiq.cloudbreak.orchestrator.model.Node)4 SaltConnector (com.sequenceiq.cloudbreak.orchestrator.salt.client.SaltConnector)4 GrainRemoveRunner (com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.GrainRemoveRunner)4 SyncGrainsRunner (com.sequenceiq.cloudbreak.orchestrator.salt.poller.checker.SyncGrainsRunner)4 SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)4 IOException (java.io.IOException)4 ExecutionException (java.util.concurrent.ExecutionException)4 PillarSave (com.sequenceiq.cloudbreak.orchestrator.salt.poller.PillarSave)3 OrchestratorBootstrap (com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrap)2 OrchestratorBootstrapRunner (com.sequenceiq.cloudbreak.orchestrator.OrchestratorBootstrapRunner)2 GatewayConfig (com.sequenceiq.cloudbreak.orchestrator.model.GatewayConfig)2 SaltConfig (com.sequenceiq.cloudbreak.orchestrator.model.SaltConfig)2 SaltPillarProperties (com.sequenceiq.cloudbreak.orchestrator.model.SaltPillarProperties)2 SaltBootstrap (com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltBootstrap)2 SaltCommandTracker (com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltCommandTracker)2 SaltJobIdTracker (com.sequenceiq.cloudbreak.orchestrator.salt.poller.SaltJobIdTracker)2