package io.cattle.platform.configitem.server.model.impl; import static io.cattle.platform.core.model.tables.InstanceTable.*; import io.cattle.platform.configitem.context.impl.ServiceMetadataInfoFactory; import io.cattle.platform.configitem.registry.ConfigItemRegistry; import io.cattle.platform.configitem.server.model.ConfigItem; import io.cattle.platform.configitem.server.model.Request; import io.cattle.platform.configitem.version.ConfigItemStatusManager; import io.cattle.platform.core.model.Instance; import io.cattle.platform.object.ObjectManager; import io.github.ibuildthecloud.gdapi.util.RequestUtils; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.Callable; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MetadataConfigItem extends AbstractConfigItem { private static final Logger log = LoggerFactory.getLogger(MetadataConfigItem.class); public static final String ITEM = "metadata-answers"; ObjectManager objectManager; ServiceMetadataInfoFactory factory; String sourceRevision; ConfigItemRegistry itemRegistry; public MetadataConfigItem(ObjectManager objectManager, ServiceMetadataInfoFactory factory, ConfigItemStatusManager versionManager, ConfigItemRegistry itemRegistry) throws IOException { super(ITEM, versionManager); this.factory = factory; this.objectManager = objectManager; this.itemRegistry = itemRegistry; try(InputStream is = ServiceMetadataInfoFactory.class.getResourceAsStream(ServiceMetadataInfoFactory.class.getSimpleName() + ".class")) { sourceRevision = Hex.encodeHexString(DigestUtils.md5(is)); } } @Override public void handleRequest(final Request req) throws IOException { Instance instance = objectManager.findAny(Instance.class, INSTANCE.AGENT_ID, req.getClient().getResourceId()); if (instance == null) { return; } Object obj = req.getParams().get("client"); if (!"v2".equals(RequestUtils.makeSingular(obj))) { req.setResponseCode(Request.NOT_FOUND); ConfigItem item = itemRegistry.getConfigItem(req.getItemName()); if (item != null) { log.info("Setting item [{}] to latest for [{}]", req.getItemName(), req.getClient()); req.setResponseCode(Request.NOT_FOUND); versionManager.setLatest(req.getClient(), req.getItemName(), item.getSourceRevision()); return; } return; } factory.writeMetadata(instance, new Callable<String>() { @Override public String call() throws Exception { return getVersion(req); } }, req); } @Override public String getSourceRevision() { return sourceRevision; } }