package io.cattle.platform.network.impl; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.constants.NetworkConstants; import io.cattle.platform.core.dao.NetworkDao; import io.cattle.platform.core.model.Network; import io.cattle.platform.core.model.Subnet; import io.cattle.platform.core.util.SystemLabels; import io.cattle.platform.docker.constants.DockerInstanceConstants; import io.cattle.platform.json.JsonMapper; import io.cattle.platform.network.IPAssignment; import io.cattle.platform.network.NetworkService; import io.cattle.platform.object.util.ObjectUtils; import io.cattle.platform.resource.pool.PooledResource; import io.cattle.platform.resource.pool.PooledResourceOptions; import io.cattle.platform.resource.pool.ResourcePoolManager; import io.cattle.platform.util.type.CollectionUtils; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; public class NetworkServiceImpl implements NetworkService { public static final Map<String, String> MODE_TO_KIND = new HashMap<>(); static { MODE_TO_KIND.put(NetworkConstants.NETWORK_MODE_HOST, NetworkConstants.KIND_DOCKER_HOST); MODE_TO_KIND.put(NetworkConstants.NETWORK_MODE_NONE, NetworkConstants.KIND_DOCKER_NONE); MODE_TO_KIND.put(NetworkConstants.NETWORK_MODE_BRIDGE, NetworkConstants.KIND_DOCKER_BRIDGE); MODE_TO_KIND.put(NetworkConstants.NETWORK_MODE_DEFAULT, NetworkConstants.KIND_DOCKER_BRIDGE); MODE_TO_KIND.put(NetworkConstants.NETWORK_MODE_CONTAINER, NetworkConstants.KIND_DOCKER_CONTAINER); } @Inject NetworkDao networkDao; @Inject JsonMapper jsonMapper; @Inject ResourcePoolManager poolManager; @Override public Network resolveNetwork(long accountId, String networkName) { if (networkName == null) { return null; } String mode = networkName; String kind = MODE_TO_KIND.get(mode); if (kind != null) { return networkDao.getNetworkByKind(accountId, kind); } if (NetworkConstants.NETWORK_MODE_MANAGED.equals(networkName)) { return networkDao.getDefaultNetwork(accountId); } return networkDao.getNetworkByName(accountId, networkName); } @Override public boolean shouldAssignIpAddress(Network network) { if (network == null) { return false; } List<Subnet> subnets = networkDao.getSubnets(network); return subnets.size() > 0; } @Override public IPAssignment assignIpAddress(Network network, Object owner, String requestedIp) { if (network == null) { return null; } for (Subnet subnet : networkDao.getSubnets(network)) { PooledResourceOptions options = new PooledResourceOptions(); if (requestedIp != null) { options.setRequestedItem(requestedIp); } PooledResource resource = poolManager.allocateOneResource(subnet, owner, options); if (resource != null) { return new IPAssignment(resource.getName(), subnet); } } return null; } @Override public void releaseIpAddress(Network network, Object owner) { if (network == null) { return; } for (Subnet subnet : networkDao.getSubnets(network)) { poolManager.releaseResource(subnet, owner); } } @Override public String getNetworkMode(Map<String, Object> instanceData) { Map<String, Object> labels = CollectionUtils.toMap(instanceData.get(InstanceConstants.FIELD_LABELS)); String mode = ObjectUtils.toString(labels.get(SystemLabels.LABEL_CNI_NETWORK)); if (mode == null && "true".equals(labels.get(SystemLabels.LABEL_RANCHER_NETWORK))) { mode = NetworkConstants.NETWORK_MODE_MANAGED; } if (mode == null) { if (instanceData.containsKey(DockerInstanceConstants.FIELD_NETWORK_MODE)) { mode = ObjectUtils.toString(instanceData.get(DockerInstanceConstants.FIELD_NETWORK_MODE)); } else { mode = NetworkConstants.NETWORK_MODE_MANAGED; } } return mode; } }