package io.cattle.platform.docker.process.account;
import static io.cattle.platform.core.model.tables.NetworkTable.*;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.core.addon.ServicesPortRange;
import io.cattle.platform.core.constants.AccountConstants;
import io.cattle.platform.core.constants.NetworkConstants;
import io.cattle.platform.core.dao.GenericResourceDao;
import io.cattle.platform.core.dao.NetworkDao;
import io.cattle.platform.core.model.Account;
import io.cattle.platform.core.model.Network;
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.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic;
import io.cattle.platform.util.type.CollectionUtils;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import com.netflix.config.DynamicStringListProperty;
public class DockerAccountCreate extends AbstractObjectProcessLogic implements ProcessPostListener {
DynamicStringListProperty KINDS = ArchaiusUtil.getList("docker.network.create.account.types");
@Inject
NetworkDao networkDao;
@Inject
GenericResourceDao resourceDao;
@Inject
JsonMapper jsonMapper;
@Override
public String[] getProcessNames() {
return new String[]{"account.create"};
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Account account = (Account)state.getResource();
if (!KINDS.get().contains(account.getKind())) {
return null;
}
Map<String, Network> networksByKind = getNetworksByUuid(account);
createNetwork(NetworkConstants.KIND_DOCKER_HOST, account, networksByKind, "Docker Host Network Mode", null);
createNetwork(NetworkConstants.KIND_DOCKER_NONE, account, networksByKind, "Docker None Network Mode", null);
createNetwork(NetworkConstants.KIND_DOCKER_CONTAINER, account, networksByKind, "Docker Container Network Mode", null);
createNetwork(NetworkConstants.KIND_DOCKER_BRIDGE, account, networksByKind, "Docker Bridge Network Mode", null);
ServicesPortRange portRange = DataAccessor.field(account, AccountConstants.FIELD_PORT_RANGE, jsonMapper,
ServicesPortRange.class);
if (portRange == null) {
portRange = AccountConstants.getDefaultServicesPortRange();
}
return new HandlerResult(AccountConstants.FIELD_PORT_RANGE, portRange).withShouldContinue(true);
}
protected Network createNetwork(String kind, Account account, Map<String, Network> networksByKind,
String name, String key, Object... valueKeyValue) {
Network network = networksByKind.get(kind);
if (network != null) {
return network;
}
Map<String, Object> data = key == null ? new HashMap<String, Object>() :
CollectionUtils.asMap(key, valueKeyValue);
data.put(ObjectMetaDataManager.NAME_FIELD, name);
data.put(ObjectMetaDataManager.ACCOUNT_FIELD, account.getId());
data.put(ObjectMetaDataManager.KIND_FIELD, kind);
return resourceDao.createAndSchedule(Network.class, data);
}
protected Map<String, Network> getNetworksByUuid(Account account) {
Map<String, Network> result = new HashMap<>();
for (Network network : objectManager.find(Network.class,
NETWORK.ACCOUNT_ID, account.getId(),
NETWORK.REMOVED, null)) {
result.put(network.getKind(), network);
}
return result;
}
}