package com.sequenceiq.cloudbreak.reactor.handler.proxy;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.cloud.event.Selectable;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.reactor.api.event.EventSelectorUtil;
import com.sequenceiq.cloudbreak.reactor.api.event.proxy.RegisterProxyFailed;
import com.sequenceiq.cloudbreak.reactor.api.event.proxy.RegisterProxyRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.proxy.RegisterProxySuccess;
import com.sequenceiq.cloudbreak.reactor.handler.ReactorEventHandler;
import com.sequenceiq.cloudbreak.repository.StackRepository;
import com.sequenceiq.cloudbreak.service.proxy.ProxyRegistrator;
import com.sequenceiq.cloudbreak.util.StackUtil;
import reactor.bus.Event;
import reactor.bus.EventBus;
@Component
public class RegisterProxyHandler implements ReactorEventHandler<RegisterProxyRequest> {
@Inject
private StackRepository stackRepository;
@Inject
private ProxyRegistrator proxyRegistrator;
@Inject
private EventBus eventBus;
@Inject
private StackUtil stackUtil;
@Override
public String selector() {
return EventSelectorUtil.selector(RegisterProxyRequest.class);
}
@Override
public void accept(Event<RegisterProxyRequest> event) {
Long stackId = event.getData().getStackId();
Selectable response;
try {
Stack stack = stackRepository.findById(stackId);
String proxyIp = stackUtil.extractAmbariIp(stack);
String contextPath = stack.getCluster().getGateway().getPath();
proxyRegistrator.register(stack.getName(), contextPath, proxyIp);
response = new RegisterProxySuccess(stackId);
} catch (Exception e) {
response = new RegisterProxyFailed(stackId, e);
}
eventBus.notify(response.selector(), new Event(event.getHeaders(), response));
}
}