package io.cattle.platform.vm.process; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.Nic; import io.cattle.platform.core.util.SystemLabels; 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.json.JsonMapper; import io.cattle.platform.metadata.service.MetadataService; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic; import io.cattle.platform.util.type.Priority; import io.github.ibuildthecloud.gdapi.id.IdFormatter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class VirtualMachineMetadata extends AbstractObjectProcessLogic implements ProcessPostListener, Priority { private static Logger log = LoggerFactory.getLogger(VirtualMachineMetadata.class); @Inject MetadataService metadataService; @Inject IdFormatter idFormatter; @Inject JsonMapper jsonMapper; @Override public String[] getProcessNames() { return new String[] { "nic.activate" }; } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Nic nic = (Nic) state.getResource(); Instance instance = objectManager.loadResource(Instance.class, nic.getInstanceId()); if (instance == null) { return null; } Map<String, Object> labels = new HashMap<>(DataAccessor.fieldMap(instance, InstanceConstants.FIELD_LABELS)); if (!"true".equals(labels.get(SystemLabels.LABEL_VM))) { return null; } Map<String, Object> metadata = metadataService.getMetadataForInstance(instance, idFormatter); Map<String, Object> osMetadata = metadataService.getOsMetadata(instance, metadata); try { labels.put(SystemLabels.LABEL_VM_METADATA, jsonMapper.writeValueAsString(metadata)); } catch (IOException e) { log.error("Failed to marshall metadata", e); } try { labels.put(SystemLabels.LABEL_VM_OS_METADATA, jsonMapper.writeValueAsString(osMetadata)); } catch (IOException e) { log.error("Failed to marshall metadata", e); } objectManager.setFields(instance, InstanceConstants.FIELD_LABELS, labels); return null; } @Override public int getPriority() { return Priority.PRE; } }