package io.cattle.platform.servicediscovery.api.filter;
import io.cattle.platform.core.addon.RollingRestartStrategy;
import io.cattle.platform.core.addon.ServiceRestart;
import io.cattle.platform.core.constants.ServiceConstants;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.Service;
import io.cattle.platform.iaas.api.filter.common.AbstractDefaultResourceManagerFilter;
import io.cattle.platform.json.JsonMapper;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.servicediscovery.api.dao.ServiceExposeMapDao;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager;
import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class ServiceRestartValidationFilter extends AbstractDefaultResourceManagerFilter {
@Inject
ObjectManager objectManager;
@Inject
JsonMapper jsonMapper;
@Inject
ServiceExposeMapDao exposeMapDao;
@Override
public Class<?>[] getTypeClasses() {
return new Class<?>[] { Service.class };
}
@Override
public String[] getTypes() {
return new String[] { "service", "loadBalancerService" };
}
@Override
public Object resourceAction(String type, ApiRequest request, ResourceManager next) {
if (request.getAction().equals(ServiceConstants.ACTION_SERVICE_RESTART)) {
Service service = objectManager.loadResource(Service.class, request.getId());
ServiceRestart restart = jsonMapper.convertValue(request.getRequestObject(),
ServiceRestart.class);
RollingRestartStrategy strategy = restart.getRollingRestartStrategy();
if (strategy == null) {
ValidationErrorCodes.throwValidationError(ValidationErrorCodes.MISSING_REQUIRED,
"Restart strategy needs to be set");
}
Map<Long, Long> instanceToStartCount = new HashMap<>();
for (Instance instance : exposeMapDao.listServiceManagedInstances(service)) {
instanceToStartCount.put(instance.getId(), instance.getStartCount());
}
strategy.setInstanceToStartCount(instanceToStartCount);
restart.setRollingRestartStrategy(strategy);
request.setRequestObject(jsonMapper.writeValueAsMap(restart));
objectManager.persist(service);
}
return super.resourceAction(type, request, next);
}
}