/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.systemservices.impl.resource; import java.util.Date; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.coordinator.client.model.Constants; import com.emc.storageos.coordinator.client.model.DbConsistencyStatus; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.model.db.DbConsistencyStatusRestRep; import com.emc.storageos.security.authorization.CheckPermission; import com.emc.storageos.security.authorization.Role; import com.emc.storageos.svcs.errorhandling.resources.APIException; import com.emc.storageos.systemservices.impl.jobs.DbConsistencyJob; import com.emc.storageos.systemservices.impl.jobs.common.JobProducer; /** * Db consistency service is used to trigger db consistency checker and * query db consistency status */ @Path("/control/db/") public class DbConsistencyService { private static final Logger log = LoggerFactory.getLogger(DbConsistencyService.class); private CoordinatorClient coordinator; private JobProducer jobProducer; /** * Trigger db consistency check * @brief Trigger db consistency check * @return boolean to indicate if start db consistency check successfully or not */ @POST @Path("consistency") @CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN }) public Response checkDbConsistency() { log.info("receive db consistency check request"); if (isDbConsistencyCheckInProgress()) { log.warn("db consistency check is already in progress"); throw APIException.badRequests.dbConsistencyCheckAlreadyProgress(); } enqueueDbConsistencyJob(); log.info("enqueue job into queue successfully"); return Response.ok().build(); } /** * Get the status of db consistency check * @brief Get the status of db consistency check * @return DbConsistencyStatusRestRep the status of db consistency check */ @GET @Path("consistency") @CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public DbConsistencyStatusRestRep getDbConsistencyStatus() { DbConsistencyStatus status = getStatusFromZk(); log.info("db consistency check status {}", status); return toStatusRestRep(status); } /** * Cancel db consistency check if it's in progress * @brief Cancel db consistency check if it's in progress * @return boolean to indicate if db consistency check cancelled or not */ @POST @Path("consistency/cancel") @CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN }) public Response cancelDbConsistencyCheck() { log.info("receive cancel db consistency check request"); if (!isDbConsistencyCheckInProgress()) { log.warn("db consistency check is not in progress"); throw APIException.badRequests.canNotCanceldbConsistencyCheck(); } DbConsistencyStatus status = getStatusFromZk(); status.setStatus(DbConsistencyStatusRestRep.Status.CANCEL); this.coordinator.persistRuntimeState(Constants.DB_CONSISTENCY_STATUS, status); log.info("try to cancel db consistency check"); return Response.ok().build(); } private DbConsistencyStatusRestRep toStatusRestRep(DbConsistencyStatus status) { DbConsistencyStatusRestRep statusRestRep = new DbConsistencyStatusRestRep(); if (status != null) { statusRestRep.setStatus(status.getStatus()); statusRestRep.setStartTime(status.getStartTime()); statusRestRep.setEndTime(status.getEndTime()); statusRestRep.setProgress(status.getProgress()); statusRestRep.setWorkingPoint(status.getWorkingPoint()); } else { statusRestRep.setStatus(DbConsistencyStatusRestRep.Status.NOT_STARTED); } return statusRestRep; } private DbConsistencyStatus getStatusFromZk() { return this.coordinator.queryRuntimeState(Constants.DB_CONSISTENCY_STATUS, DbConsistencyStatus.class); } private void enqueueDbConsistencyJob() { DbConsistencyJob job = new DbConsistencyJob(); job.setStatus(DbConsistencyStatusRestRep.Status.NOT_STARTED); job.setStartTime(new Date()); jobProducer.enqueue(job); } private boolean isDbConsistencyCheckInProgress() { DbConsistencyStatus state = getStatusFromZk(); return state!=null && state.getStatus()==DbConsistencyStatusRestRep.Status.IN_PROGRESS; } public CoordinatorClient getCoordinator() { return coordinator; } public void setCoordinator(CoordinatorClient coordinator) { this.coordinator = coordinator; } public JobProducer getJobProducer() { return jobProducer; } public void setJobProducer(JobProducer jobProducer) { this.jobProducer = jobProducer; } }