package com.sequenceiq.cloudbreak.reactor;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.ClusterCredentialChangeRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.ClusterCredentialChangeResult;
import com.sequenceiq.cloudbreak.service.cluster.flow.AmbariClusterConnector;
import com.sequenceiq.cloudbreak.service.stack.StackService;
import reactor.bus.Event;
import reactor.bus.EventBus;
@Component
public class ClusterCredentialChangeHandler implements ClusterEventHandler<ClusterCredentialChangeRequest> {
@Inject
private AmbariClusterConnector ambariClusterConnector;
@Inject
private StackService stackService;
@Inject
private EventBus eventBus;
@Override
public Class<ClusterCredentialChangeRequest> type() {
return ClusterCredentialChangeRequest.class;
}
@Override
public void accept(Event<ClusterCredentialChangeRequest> event) {
ClusterCredentialChangeRequest request = event.getData();
ClusterCredentialChangeResult result;
try {
Stack stack = stackService.getById(request.getStackId());
switch (request.getType()) {
case REPLACE:
ambariClusterConnector.credentialReplaceAmbariCluster(stack.getId(), request.getUser(), request.getPassword());
break;
case UPDATE:
ambariClusterConnector.credentialUpdateAmbariCluster(stack.getId(), request.getPassword());
break;
default:
throw new UnsupportedOperationException("Ambari credential update request not supported: " + request.getType());
}
result = new ClusterCredentialChangeResult(request);
} catch (Exception e) {
result = new ClusterCredentialChangeResult(e.getMessage(), e, request);
}
eventBus.notify(result.selector(), new Event(event.getHeaders(), result));
}
}