package io.cattle.platform.servicediscovery.process;
import static io.cattle.platform.core.model.tables.InstanceLinkTable.*;
import io.cattle.platform.core.constants.InstanceConstants;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.InstanceLink;
import io.cattle.platform.core.model.ServiceConsumeMap;
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.process.common.handler.AbstractObjectProcessHandler;
import io.cattle.platform.servicediscovery.api.dao.ServiceConsumeMapDao;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class ServiceLinkPreInstanceStateHandler extends AbstractObjectProcessHandler implements ProcessPreListener {
@Inject
ServiceConsumeMapDao consumeMapDao;
@Override
public String[] getProcessNames() {
return new String[]{InstanceConstants.PROCESS_START};
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Instance instance = (Instance)state.getResource();
Set<Long> serviceConsumeMapIds = new HashSet<>();
Set<InstanceLink> links = new HashSet<>();
Set<InstanceLink> toRemove = new HashSet<>();
for (ServiceConsumeMap map : consumeMapDao.findConsumedServicesForInstance(instance.getId(), "service") ) {
serviceConsumeMapIds.add(map.getId());
}
for (InstanceLink link : consumeMapDao.findServiceBasedInstanceLinks(instance.getId())) {
if (serviceConsumeMapIds.remove(link.getServiceConsumeMapId())) {
links.add(link);
} else {
toRemove.add(link);
}
}
for (InstanceLink remove : toRemove) {
deactivateThenRemove(remove, state.getData());
}
for (Long serviceConsumeMapId : serviceConsumeMapIds) {
InstanceLink link = objectManager.create(InstanceLink.class,
INSTANCE_LINK.ACCOUNT_ID, instance.getAccountId(),
INSTANCE_LINK.INSTANCE_ID, instance.getId(),
INSTANCE_LINK.SERVICE_CONSUME_MAP_ID, serviceConsumeMapId);
links.add(link);
}
for (InstanceLink link : links) {
create(link, state.getData());
}
return null;
}
}