package com.sequenceiq.cloudbreak.repository;
import java.util.List;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.api.model.DetailedStackStatus;
import com.sequenceiq.cloudbreak.api.model.Status;
import com.sequenceiq.cloudbreak.cloud.store.InMemoryStateStore;
import com.sequenceiq.cloudbreak.converter.scheduler.StatusToPollGroupConverter;
import com.sequenceiq.cloudbreak.domain.Resource;
import com.sequenceiq.cloudbreak.domain.SecurityConfig;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.domain.StackStatus;
@Component
public class StackUpdater {
private static final Logger LOGGER = LoggerFactory.getLogger(StackUpdater.class);
@Inject
private StackStatusRepository stackStatusRepository;
@Inject
private StackRepository stackRepository;
@Inject
private ResourceRepository resourceRepository;
@Inject
private StatusToPollGroupConverter statusToPollGroupConverter;
@Inject
private SecurityConfigRepository securityConfigRepository;
public Stack updateStackStatus(Long stackId, DetailedStackStatus detailedStatus) {
return doUpdateStackStatus(stackId, detailedStatus, "");
}
public Stack updateStackStatus(Long stackId, DetailedStackStatus detailedStatus, String statusReason) {
return doUpdateStackStatus(stackId, detailedStatus, statusReason);
}
public Stack addStackResources(Long stackId, List<Resource> resources) {
Stack stack = stackRepository.findById(stackId);
for (Resource resource : resources) {
resource.setStack(stack);
}
resourceRepository.save(resources);
stack.getResources().addAll(resources);
return stackRepository.save(stack);
}
public void removeStackResources(List<Resource> resources) {
resourceRepository.delete(resources);
}
public Stack updateStackSecurityConfig(Stack stack, SecurityConfig securityConfig) {
securityConfig = securityConfigRepository.save(securityConfig);
stack.setSecurityConfig(securityConfig);
return stackRepository.save(stack);
}
private Stack doUpdateStackStatus(Long stackId, DetailedStackStatus detailedStatus, String statusReason) {
Stack stack = stackRepository.findById(stackId);
Status status = detailedStatus.getStatus();
if (!stack.isDeleteCompleted()) {
stack.setStackStatus(new StackStatus(stack, status, statusReason, detailedStatus));
InMemoryStateStore.putStack(stackId, statusToPollGroupConverter.convert(status));
if (Status.DELETE_COMPLETED.equals(status)) {
InMemoryStateStore.deleteStack(stackId);
}
stack = stackRepository.save(stack);
}
return stack;
}
}