package alien4cloud.rest.internal;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
import springfox.documentation.annotations.ApiIgnore;
import alien4cloud.audit.annotation.Audit;
import alien4cloud.configuration.ApplicationBootstrap;
import alien4cloud.rest.model.RestErrorBuilder;
import alien4cloud.rest.model.RestErrorCode;
import alien4cloud.rest.model.RestResponse;
import alien4cloud.rest.model.RestResponseBuilder;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import io.swagger.annotations.ApiOperation;
/**
* Controllers that handle maintenance operations of the Alien platform.
* For ex: disable/unload or enable/load all plugins and orchestrators in a migration/test scenario (hot swap data then reload).
* These operations should only be used with care, the user must know what they are doing, so for the moment it's not exposed in API doc.
*/
@Slf4j
@ApiIgnore
@RestController
@RequestMapping({"/rest/maintenance", "/rest/v1/maintenance", "/rest/latest/maintenance"})
public class AlienMaintenanceController {
@Resource
private ApplicationBootstrap bootstrap;
@ApiOperation(value = "Initialize the platform.", notes = "Initialize the platform, load all enabled plugins and orchestrator, should only be used for testing or maintenance purpose. Role required [ ADMIN ]")
@RequestMapping(value = "/init-platform", method = RequestMethod.POST)
@PreAuthorize("hasAuthority('ADMIN')")
@Audit
public DeferredResult<RestResponse<Void>> initializePlatform() {
final DeferredResult<RestResponse<Void>> initResult = new DeferredResult<>(15L * 60L * 1000L);
Futures.addCallback(bootstrap.bootstrap(), new FutureCallback<Object>() {
@Override
public void onSuccess(Object result) {
initResult.setResult(RestResponseBuilder.<Void> builder().build());
}
@Override
public void onFailure(Throwable t) {
log.error("Unable to initialize platform", t);
initResult.setErrorResult(RestResponseBuilder
.<Void> builder()
.error(RestErrorBuilder.builder(RestErrorCode.ILLEGAL_STATE_OPERATION).message("Unable to bootstrap the platform " + t.getMessage())
.build()).build());
}
});
return initResult;
}
@ApiOperation(value = "Teardown the platform.", notes = "Teardown the platform, unload all enabled plugins and orchestrator, should only be used for testing or maintenance purpose. Role required [ ADMIN ]")
@RequestMapping(value = "/teardown-platform", method = RequestMethod.POST)
@PreAuthorize("hasAuthority('ADMIN')")
@Audit
public RestResponse<Void> teardownPlatform() {
try {
bootstrap.teardown();
return RestResponseBuilder.<Void> builder().build();
} catch (Exception e) {
log.error("Unable to teardown platform", e);
return RestResponseBuilder.<Void> builder()
.error(RestErrorBuilder.builder(RestErrorCode.ILLEGAL_STATE_OPERATION).message("Unable to teardown the platform").build()).build();
}
}
}