package com.sequenceiq.cloudbreak.reactor;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.domain.Cluster;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.ClusterSyncRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.ClusterSyncResult;
import com.sequenceiq.cloudbreak.service.cluster.ClusterService;
import com.sequenceiq.cloudbreak.service.cluster.flow.status.AmbariClusterStatusUpdater;
import com.sequenceiq.cloudbreak.service.proxy.ProxyRegistrator;
import com.sequenceiq.cloudbreak.service.stack.StackService;
import com.sequenceiq.cloudbreak.util.StackUtil;
import reactor.bus.Event;
import reactor.bus.EventBus;
@Component
public class ClusterSyncHandler implements ClusterEventHandler<ClusterSyncRequest> {
@Inject
private StackService stackService;
@Inject
private ClusterService clusterService;
@Inject
private AmbariClusterStatusUpdater ambariClusterStatusUpdater;
@Inject
private EventBus eventBus;
@Inject
private ProxyRegistrator proxyRegistrator;
@Inject
private StackUtil stackUtil;
@Override
public Class<ClusterSyncRequest> type() {
return ClusterSyncRequest.class;
}
@Override
public void accept(Event<ClusterSyncRequest> event) {
ClusterSyncRequest request = event.getData();
ClusterSyncResult result;
try {
Stack stack = stackService.getById(request.getStackId());
String proxyIp = stackUtil.extractAmbariIp(stack);
String contextPath = stack.getCluster().getGateway().getPath();
proxyRegistrator.register(stack.getName(), contextPath, proxyIp);
Cluster cluster = clusterService.retrieveClusterByStackId(request.getStackId());
ambariClusterStatusUpdater.updateClusterStatus(stack, cluster);
result = new ClusterSyncResult(request);
} catch (Exception e) {
result = new ClusterSyncResult(e.getMessage(), e, request);
}
eventBus.notify(result.selector(), new Event(event.getHeaders(), result));
}
}