package com.sequenceiq.cloudbreak.core.flow2.cluster.repair; import java.util.Optional; import java.util.Set; import javax.inject.Inject; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.api.model.DetailedStackStatus; import com.sequenceiq.cloudbreak.api.model.InstanceMetadataType; import com.sequenceiq.cloudbreak.api.model.Status; import com.sequenceiq.cloudbreak.core.CloudbreakException; import com.sequenceiq.cloudbreak.domain.Cluster; import com.sequenceiq.cloudbreak.domain.InstanceMetaData; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.repository.ClusterRepository; import com.sequenceiq.cloudbreak.repository.InstanceMetaDataRepository; import com.sequenceiq.cloudbreak.repository.StackUpdater; import com.sequenceiq.cloudbreak.service.GatewayConfigService; import com.sequenceiq.cloudbreak.service.cluster.ClusterService; import com.sequenceiq.cloudbreak.service.cluster.flow.AmbariClusterConnector; import com.sequenceiq.cloudbreak.service.stack.StackService; import com.sequenceiq.cloudbreak.util.StackUtil; @Component public class ChangePrimaryGatewayService { @Inject private InstanceMetaDataRepository instanceMetaDataRepository; @Inject private GatewayConfigService gatewayConfigService; @Inject private StackService stackService; @Inject private ClusterRepository clusterRepository; @Inject private AmbariClusterConnector ambariClusterConnector; @Inject private ClusterService clusterService; @Inject private StackUpdater stackUpdater; @Inject private StackUtil stackUtil; public void changePrimaryGatewayStarted(Stack stack) { clusterService.updateClusterStatusByStackId(stack.getId(), Status.UPDATE_IN_PROGRESS); stackUpdater.updateStackStatus(stack.getId(), DetailedStackStatus.CLUSTER_OPERATION, String.format("Changing gateway.")); } public void primaryGatewayChanged(Stack stack, String newPrimaryGatewayFQDN) throws CloudbreakException { Set<InstanceMetaData> imds = instanceMetaDataRepository.findAllInStack(stack.getId()); Optional<InstanceMetaData> formerPrimaryGateway = imds.stream().filter(imd -> imd.getInstanceMetadataType() == InstanceMetadataType.GATEWAY_PRIMARY).findFirst(); Optional<InstanceMetaData> newPrimaryGateway = imds.stream().filter(imd -> imd.getDiscoveryFQDN().equals(newPrimaryGatewayFQDN)).findFirst(); if (newPrimaryGateway.isPresent() && formerPrimaryGateway.isPresent()) { InstanceMetaData fpg = formerPrimaryGateway.get(); fpg.setInstanceMetadataType(InstanceMetadataType.GATEWAY); instanceMetaDataRepository.save(fpg); InstanceMetaData npg = newPrimaryGateway.get(); npg.setInstanceMetadataType(InstanceMetadataType.GATEWAY_PRIMARY); instanceMetaDataRepository.save(npg); Stack updatedStack = stackService.getById(stack.getId()); String gatewayIp = gatewayConfigService.getPrimaryGatewayIp(updatedStack); Cluster cluster = updatedStack.getCluster(); cluster.setAmbariIp(gatewayIp); clusterRepository.save(cluster); } else { throw new CloudbreakException("Primary gateway change was not successful."); } } public void ambariServerStarted(Stack stack) { clusterService.updateClusterStatusByStackId(stack.getId(), Status.AVAILABLE); stackUpdater.updateStackStatus(stack.getId(), DetailedStackStatus.AVAILABLE, "Gateway succesfully changed."); } public void changePrimaryGatewayFailed(Stack stack, Exception exception) { clusterService.updateClusterStatusByStackId(stack.getId(), Status.UPDATE_FAILED); stackUpdater.updateStackStatus(stack.getId(), DetailedStackStatus.AVAILABLE, "Cluster could not be started: " + exception.getMessage()); } }