package io.cattle.platform.configitem.context.impl;
import static io.cattle.platform.core.model.tables.InstanceTable.*;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.configitem.context.ConfigItemContextFactory;
import io.cattle.platform.configitem.model.Client;
import io.cattle.platform.configitem.server.model.ConfigItem;
import io.cattle.platform.configitem.server.model.Request;
import io.cattle.platform.configitem.server.model.impl.ArchiveContext;
import io.cattle.platform.core.model.Agent;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.object.ObjectManager;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractAgentBaseContextFactory implements ConfigItemContextFactory {
private static final Logger log = LoggerFactory.getLogger(AbstractAgentBaseContextFactory.class);
protected ObjectManager objectManager;
String[] items;
public AbstractAgentBaseContextFactory() {
String name = getClass().getSimpleName().replaceAll("Factory", "").replaceAll("([a-z])([A-Z])", "$1.$2").toLowerCase();
List<String> items = ArchaiusUtil.getList(String.format("item.context.%s.items", name)).get();
this.items = items.toArray(new String[items.size()]);
}
@Override
public String[] getItems() {
return items;
}
@Override
public String getContentHash(String hash) {
return hash;
}
@Override
public final void populateContext(Request req, ConfigItem item, ArchiveContext context) {
Client client = req.getClient();
if (!Agent.class.equals(client.getResourceType())) {
return;
}
Agent agent = objectManager.loadResource(Agent.class, client.getResourceId());
if (agent == null) {
return;
}
List<Instance> instances = objectManager.find(Instance.class, INSTANCE.AGENT_ID, agent.getId(), INSTANCE.REMOVED, null);
if (instances.size() > 1) {
List<Long> ids = new ArrayList<Long>();
for (Instance instance : instances) {
ids.add(instance.getId());
}
log.error("Found more that one instance for Agent [{}], instances {}", agent.getId(), ids);
}
populateContext(agent, instances.size() > 0 ? instances.get(0) : null, item, context);
}
protected abstract void populateContext(Agent agent, Instance instance, ConfigItem item, ArchiveContext context);
public ObjectManager getObjectManager() {
return objectManager;
}
@Inject
public void setObjectManager(ObjectManager objectManager) {
this.objectManager = objectManager;
}
}