package io.cattle.platform.servicediscovery.process; import io.cattle.platform.activity.ActivityService; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.ServiceConstants; import io.cattle.platform.core.model.Service; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.iaas.api.auditing.AuditService; import io.cattle.platform.object.resource.ResourceMonitor; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.process.common.handler.AbstractObjectProcessHandler; import io.cattle.platform.servicediscovery.api.dao.ServiceExposeMapDao; import io.cattle.platform.servicediscovery.deployment.DeploymentManager; import io.cattle.platform.servicediscovery.service.ServiceDiscoveryService; import io.github.ibuildthecloud.gdapi.id.IdFormatter; import java.util.Collections; import java.util.List; import javax.inject.Inject; import javax.inject.Named; /** * This handler is responsible for activating the service as well as restoring the active service to its scale * The handler can be invoked as a part of service.activate, service.update for both scaleUp and ScaleDown * */ @Named public class ServiceUpdateActivate extends AbstractObjectProcessHandler { @Inject ActivityService activity; @Inject DeploymentManager deploymentMgr; @Inject ServiceDiscoveryService serviceDiscoveryService; @Inject ResourceMonitor resourceMonitor; @Inject IdFormatter idFormatter; @Inject AuditService auditSvc; @Inject ServiceExposeMapDao exposeDao; @Override public String[] getProcessNames() { return new String[] { ServiceConstants.PROCESS_SERVICE_ACTIVATE, ServiceConstants.PROCESS_SERVICE_UPDATE }; } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { final Service service = (Service) state.getResource(); // on inactive service update, do nothing if (process.getName().equalsIgnoreCase(ServiceConstants.PROCESS_SERVICE_UPDATE) && service.getState().equalsIgnoreCase(CommonStatesConstants.UPDATING_INACTIVE)) { return null; } activity.run(service, process.getName(), getMessage(process.getName()), new Runnable() { @Override public void run() { waitForConsumedServicesActivate(state); deploymentMgr.activate(service); } }); objectManager.reload(state.getResource()); return new HandlerResult(ServiceConstants.FIELD_CURRENT_SCALE, exposeDao.getCurrentScale(service.getId())); } protected String getMessage(String name) { if (name == null) { return null; } switch (name) { case "service.activate": return "Activating service"; default: return "Updating service"; } } @SuppressWarnings("unchecked") protected void waitForConsumedServicesActivate(ProcessState state) { List<Integer> consumedServicesIds = DataAccessor.fromMap(state.getData()) .withKey(ServiceConstants.FIELD_WAIT_FOR_CONSUMED_SERVICES_IDS) .withDefault(Collections.EMPTY_LIST).as(List.class); for (Integer consumedServiceId : consumedServicesIds) { Service consumedService = objectManager.loadResource(Service.class, consumedServiceId.longValue()); resourceMonitor.waitForState(consumedService, CommonStatesConstants.ACTIVE); } } }