package io.cattle.platform.servicediscovery.process;
import io.cattle.platform.core.constants.ServiceConstants;
import io.cattle.platform.core.dao.InstanceDao;
import io.cattle.platform.core.dao.NetworkDao;
import io.cattle.platform.core.dao.impl.InstanceDaoImpl.IpAddressToServiceIndex;
import io.cattle.platform.core.model.Service;
import io.cattle.platform.engine.handler.HandlerResult;
import io.cattle.platform.engine.handler.ProcessPreListener;
import io.cattle.platform.engine.process.ProcessInstance;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic;
import io.cattle.platform.resource.pool.PooledResourceOptions;
import io.cattle.platform.resource.pool.ResourcePoolManager;
import io.cattle.platform.servicediscovery.service.ServiceDiscoveryService;
import io.cattle.platform.util.type.CollectionUtils;
import io.cattle.platform.util.type.Priority;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
/*
* This code takes care of updating retainIp address field
*/
@Named
public class ServiceUpdatePreListener extends AbstractObjectProcessLogic implements ProcessPreListener,
Priority {
@Inject
ServiceDiscoveryService sdService;
@Inject
InstanceDao instanceDao;
@Inject
ResourcePoolManager poolManager;
@Inject
NetworkDao ntwkDao;
@Override
public String[] getProcessNames() {
return new String[] { ServiceConstants.PROCESS_SERVICE_UPDATE };
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Service service = (Service) state.getResource();
Map<String, Object> data = state.getData();
Boolean oldRetainIp = false;
if (data.get("old") != null) {
Map<String, Object> old = CollectionUtils.toMap(data.get("old"));
if (old.get(ServiceConstants.FIELD_SERVICE_RETAIN_IP) != null) {
oldRetainIp = (Boolean) old.get(ServiceConstants.FIELD_SERVICE_RETAIN_IP);
}
}
Boolean newRetainIp = DataAccessor.fieldBoolean(service, ServiceConstants.FIELD_SERVICE_RETAIN_IP);
boolean update = false;
if (newRetainIp.booleanValue() && !oldRetainIp.booleanValue()) {
update = true;
}
if (!update) {
return null;
}
// get all service managed instances and their ips/indexes
List<IpAddressToServiceIndex> ipToIndex = instanceDao.getIpToIndex(service);
for (IpAddressToServiceIndex i : ipToIndex) {
// transfer the resource
PooledResourceOptions options = new PooledResourceOptions();
options.setRequestedItem(i.getIpAddress().getAddress());
poolManager.transferResource(i.getSubnet(), i.getIpAddress(), i.getIndex(), options);
// allocate to service index
sdService.setServiceIndexIp(i.getIndex(), i.getIpAddress().getAddress());
}
return null;
}
@Override
public int getPriority() {
return Priority.DEFAULT;
}
}