@Test(expected = CloudbreakOrchestratorFailedException.class)
  public void ambariServerStartInClusterWhenNullPointerOccurredAndOrchestratorFailedComes()
      throws Exception {
    when(ambariServerBootstrap.call()).thenReturn(true);
    doReturn(ambariServerBootstrap)
        .when(underTestSpy)
        .ambariServerBootstrap(
            any(GatewayConfig.class),
            anyString(),
            any(Node.class),
            anyString(),
            any(LogVolumePath.class));
    when(ambariServerDatabaseBootstrap.call()).thenThrow(new NullPointerException("null"));
    doReturn(ambariServerDatabaseBootstrap)
        .when(underTestSpy)
        .ambariServerDatabaseBootstrap(
            any(GatewayConfig.class), anyString(), any(Node.class), any(LogVolumePath.class));

    underTestSpy.startAmbariServer(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("serverdb", "0.0.1"),
        new ContainerConfig("serverdb", "0.0.1"),
        "azure",
        generateLogVolume(),
        false,
        exitCriteriaModel());
  }
  @Test
  public void ambariServerStartInClusterWhenEverythingWorksFine() throws Exception {
    when(ambariServerBootstrap.call()).thenReturn(true);
    doReturn(ambariServerBootstrap)
        .when(underTestSpy)
        .ambariServerBootstrap(
            any(GatewayConfig.class),
            anyString(),
            any(Node.class),
            anyString(),
            any(LogVolumePath.class));
    when(ambariServerDatabaseBootstrap.call()).thenReturn(true);
    doReturn(ambariServerDatabaseBootstrap)
        .when(underTestSpy)
        .ambariServerDatabaseBootstrap(
            any(GatewayConfig.class), anyString(), any(Node.class), any(LogVolumePath.class));

    underTestSpy.startAmbariServer(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("serverdb", "0.0.1"),
        new ContainerConfig("serverdb", "0.0.1"),
        "azure",
        generateLogVolume(),
        false,
        exitCriteriaModel());
  }
  @Test(expected = CloudbreakOrchestratorFailedException.class)
  public void logRotateStartInClusterWhenOrchestratorFailed() throws Exception {
    when(logrotateBootsrap.call()).thenThrow(new CloudbreakOrchestratorFailedException("failed"));
    doReturn(logrotateBootsrap)
        .when(underTestSpy)
        .logrotateBootsrap(any(GatewayConfig.class), anyString(), any(Node.class), anyString());

    underTestSpy.startLogrotate(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("rotate", "0.0.1"),
        exitCriteriaModel());
  }
  @Test
  public void logRotateStartInClusterWhenEverythingWorksFine() throws Exception {
    when(logrotateBootsrap.call()).thenReturn(true);
    doReturn(logrotateBootsrap)
        .when(underTestSpy)
        .logrotateBootsrap(any(GatewayConfig.class), anyString(), any(Node.class), anyString());

    underTestSpy.startLogrotate(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("rotate", "0.0.1"),
        exitCriteriaModel());
  }
  @Test(expected = CloudbreakOrchestratorFailedException.class)
  public void registratorStartInClusterWhenNullPointerOccurredAndOrchestratorFailedComes()
      throws Exception {
    when(registratorBootstrap.call()).thenThrow(new NullPointerException("null"));
    doReturn(registratorBootstrap)
        .when(underTestSpy)
        .registratorBootstrap(any(GatewayConfig.class), anyString(), any(Node.class));

    underTestSpy.startRegistrator(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("registrator", "0.0.1"),
        exitCriteriaModel());
  }
 @SuppressWarnings("unchecked")
 @Before
 public void before() {
   underTest.init(parallelContainerRunner(), exitCriteria());
   underTestSpy = spy(underTest);
   doReturn(parallelContainerRunner()).when(underTestSpy).getParallelContainerRunner();
   when(underTestSpy.runner(
           any(ContainerBootstrap.class),
           any(ExitCriteria.class),
           any(ExitCriteriaModel.class),
           anyMap()))
       .thenAnswer(
           new Answer<Callable<Boolean>>() {
             @Override
             public Callable<Boolean> answer(InvocationOnMock invocation) {
               Object[] arguments = invocation.getArguments();
               ContainerBootstrap containerBootstrap = (ContainerBootstrap) arguments[ZERO];
               ExitCriteria exitCriteria = (ExitCriteria) arguments[ONE];
               ExitCriteriaModel exitCriteriaModel = (ExitCriteriaModel) arguments[TWO];
               Map<String, String> map = (Map<String, String>) arguments[THREE];
               return createRunner(containerBootstrap, exitCriteria, exitCriteriaModel, map);
             }
           });
 }
  @Test(expected = CloudbreakOrchestratorFailedException.class)
  public void bootstrapNewNodesInClusterWhenOrchestratorFailed() throws Exception {
    when(munchausenBootstrap.call()).thenThrow(new CloudbreakOrchestratorFailedException("failed"));
    doReturn(munchausenBootstrap)
        .when(underTestSpy)
        .munchausenNewNodeBootstrap(
            any(GatewayConfig.class), any(String.class), any(String[].class));

    underTestSpy.bootstrapNewNodes(
        gatewayConfig(),
        new ContainerConfig("seq/a", "v1.10"),
        generateNodes(FIX_NODE_COUNT),
        CONSUL_LOG_PATH,
        exitCriteriaModel());
  }
  @Test
  public void bootstrapNewNodesInClusterWhenEverythingWorksFine() throws Exception {
    when(munchausenBootstrap.call()).thenReturn(true);
    doReturn(munchausenBootstrap)
        .when(underTestSpy)
        .munchausenNewNodeBootstrap(
            any(GatewayConfig.class), any(String.class), any(String[].class));

    underTestSpy.bootstrapNewNodes(
        gatewayConfig(),
        new ContainerConfig("seq/a", "v1.10"),
        generateNodes(FIX_NODE_COUNT),
        CONSUL_LOG_PATH,
        exitCriteriaModel());
  }
  @Test(expected = CloudbreakOrchestratorFailedException.class)
  public void bootstrapClusterWhenNullPointerOccurredAndOrchestratorFailedComes() throws Exception {
    when(munchausenBootstrap.call()).thenThrow(new NullPointerException("null"));
    doReturn(munchausenBootstrap)
        .when(underTestSpy)
        .munchausenBootstrap(any(GatewayConfig.class), any(String.class), any(String[].class));

    underTestSpy.bootstrap(
        gatewayConfig(),
        new ContainerConfig("seq/a", "v1.10"),
        generateNodes(FIX_NODE_COUNT),
        FIX_CONSUL_SERVER_COUNT,
        CONSUL_LOG_PATH,
        exitCriteriaModel());
  }
  @Test
  public void consulWatchStartInClusterWhenEverythingWorksFine() throws Exception {
    when(consulWatchBootstrap.call()).thenReturn(true);
    doReturn(consulWatchBootstrap)
        .when(underTestSpy)
        .consulWatchBootstrap(
            any(GatewayConfig.class),
            anyString(),
            any(Node.class),
            anyString(),
            any(LogVolumePath.class));

    underTestSpy.startConsulWatches(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("watch", "0.0.1"),
        generateLogVolume(),
        exitCriteriaModel());
  }
  @Test
  public void kerberosServerStartInClusterWhenEverythingWorksFine() throws Exception {
    when(kerberosServerBootstrap.call()).thenReturn(true);
    doReturn(kerberosServerBootstrap)
        .when(underTestSpy)
        .kerberosServerBootstrap(
            any(KerberosConfiguration.class),
            any(GatewayConfig.class),
            anyString(),
            any(Node.class),
            any(LogVolumePath.class));

    underTestSpy.startKerberosServer(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("bserver", "0.0.1"),
        generateLogVolume(),
        new KerberosConfiguration("", "", ""),
        exitCriteriaModel());
  }
  @Test(expected = CloudbreakOrchestratorFailedException.class)
  public void consulWatchStartInClusterWhenOrchestratorFailed() throws Exception {
    when(consulWatchBootstrap.call())
        .thenThrow(new CloudbreakOrchestratorFailedException("failed"));
    doReturn(consulWatchBootstrap)
        .when(underTestSpy)
        .consulWatchBootstrap(
            any(GatewayConfig.class),
            anyString(),
            any(Node.class),
            anyString(),
            any(LogVolumePath.class));

    underTestSpy.startConsulWatches(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("watch", "0.0.1"),
        generateLogVolume(),
        exitCriteriaModel());
  }
  @Test
  public void kerberosServerStartInClusterWhenNullPointerOccurredAndOrchestratorFailedComes()
      throws Exception {
    when(registratorBootstrap.call()).thenThrow(new NullPointerException("null"));
    doReturn(kerberosServerBootstrap)
        .when(underTestSpy)
        .kerberosServerBootstrap(
            any(KerberosConfiguration.class),
            any(GatewayConfig.class),
            anyString(),
            any(Node.class),
            any(LogVolumePath.class));

    underTestSpy.startKerberosServer(
        containerOrchestratorCluster(gatewayConfig(), generateNodes(FIX_NODE_COUNT)),
        new ContainerConfig("bserver", "0.0.1"),
        generateLogVolume(),
        new KerberosConfiguration("", "", ""),
        exitCriteriaModel());
  }