package io.cattle.platform.process.instance; import io.cattle.platform.allocator.service.AllocatorService; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.dao.GenericMapDao; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.InstanceHostMap; import io.cattle.platform.core.model.Volume; import io.cattle.platform.core.model.VolumeStoragePoolMap; import io.cattle.platform.core.util.InstanceHelpers; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.process.base.AbstractDefaultProcessHandler; import io.cattle.platform.util.type.CollectionUtils; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.inject.Inject; import javax.inject.Named; @Named public class InstanceAllocate extends AbstractDefaultProcessHandler { @Inject AllocatorService allocatorService; @Inject GenericMapDao mapDao; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Instance instance = (Instance)state.getResource(); if (mapDao.findNonRemoved(InstanceHostMap.class, Instance.class, instance.getId()).size() == 0) { allocatorService.instanceAllocate(instance); } return afterAllocate(state, process, new HashMap<Object, Object>()); } protected HandlerResult afterAllocate(ProcessState state, ProcessInstance process, Map<Object, Object> result) { Map<String, Set<Long>> allocationData = new HashMap<String, Set<Long>>(); result.put("_allocationData", allocationData); Instance instance = (Instance) state.getResource(); Long hostId = null; for (InstanceHostMap map : mapDao.findNonRemoved(InstanceHostMap.class, Instance.class, instance.getId())) { CollectionUtils.addToMap(allocationData, "instance:" + instance.getId(), map.getHostId(), HashSet.class); create(map, state.getData()); hostId = map.getHostId(); } result.put(InstanceConstants.FIELD_HOST_ID, hostId); List<Volume> volumes = getObjectManager().children(instance, Volume.class); List<Volume> dataMountVolumes = InstanceHelpers.extractVolumesFromMounts(instance, getObjectManager()); volumes.addAll(dataMountVolumes); for (Volume v : volumes) { allocate(v, state.getData()); } volumes = getObjectManager().children(instance, Volume.class); volumes.addAll(dataMountVolumes); for (Volume v : volumes) { for (VolumeStoragePoolMap map : mapDao.findNonRemoved(VolumeStoragePoolMap.class, Volume.class, v.getId())) { CollectionUtils.addToMap(allocationData, "volume:" + v.getId(), map.getVolumeId(), HashSet.class); create(map, state.getData()); } } return new HandlerResult(result); } }