package io.cattle.platform.process.metadata; import io.cattle.platform.agent.instance.dao.AgentInstanceDao; import io.cattle.platform.agent.instance.service.AgentMetadataService; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.configitem.version.ConfigItemStatusManager; import io.cattle.platform.core.dao.AccountDao; import io.cattle.platform.core.model.Account; import io.cattle.platform.core.model.HostIpAddressMap; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.InstanceHostMap; import io.cattle.platform.core.model.IpAddress; import io.cattle.platform.core.model.Service; import io.cattle.platform.core.model.ServiceConsumeMap; import io.cattle.platform.core.model.ServiceExposeMap; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.handler.ProcessPostListener; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.object.util.ObjectUtils; import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import javax.inject.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.config.DynamicStringListProperty; @Named public class MetadataProcessHandler extends AbstractObjectProcessLogic implements ProcessPostListener { private static DynamicStringListProperty PROCESSES = ArchaiusUtil.getList("metadata.increment.processes"); private static Logger log = LoggerFactory.getLogger(MetadataProcessHandler.class); @Inject AgentInstanceDao agentInstanceDao; @Inject ConfigItemStatusManager statusManager; @Inject AgentMetadataService agentMetadata; @Inject AccountDao accountDao; @Override public String[] getProcessNames() { List<String> processes = PROCESSES.get(); return processes.toArray(new String[processes.size()]); } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Object obj = getAccountObject(state.getResource()); Object accountId; if (obj instanceof Account) { accountId = ObjectUtils.getId(obj); } else { accountId = ObjectUtils.getAccountId(obj); } if (!(accountId instanceof Long)) { log.error("Failed to find account id for {}:{}", ObjectUtils.getKind(obj), ObjectUtils.getId(obj)); return null; } List<Long> accountIds = new ArrayList<>(); accountIds.add((Long) accountId); accountIds.addAll(accountDao.getLinkedAccounts((Long) accountId)); for (long id : accountIds) { agentMetadata.updateMetadata(id); } return null; } protected Object getAccountObject(Object obj) { if (obj instanceof HostIpAddressMap) { return objectManager.loadResource(IpAddress.class, ((HostIpAddressMap) obj).getIpAddressId()); } else if (obj instanceof InstanceHostMap) { return objectManager.loadResource(Instance.class, ((InstanceHostMap) obj).getInstanceId()); } else if (obj instanceof ServiceConsumeMap) { return objectManager.loadResource(Service.class, ((ServiceConsumeMap) obj).getServiceId()); } else if (obj instanceof ServiceExposeMap) { return objectManager.loadResource(Service.class, ((ServiceExposeMap) obj).getServiceId()); } return obj; } }