package io.cattle.platform.process.network;
import static io.cattle.platform.core.model.tables.SubnetTable.*;
import io.cattle.platform.core.constants.NetworkConstants;
import io.cattle.platform.core.constants.NetworkDriverConstants;
import io.cattle.platform.core.model.Network;
import io.cattle.platform.core.model.NetworkDriver;
import io.cattle.platform.core.model.Subnet;
import io.cattle.platform.core.model.tables.records.SubnetRecord;
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.json.JsonMapper;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.process.base.AbstractDefaultProcessHandler;
import io.cattle.platform.util.type.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class NetworkCreate extends AbstractDefaultProcessHandler {
private static final String SUBNET_INDEX = "subnetIndex";
@Inject
JsonMapper jsonMapper;
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Network network = (Network)state.getResource();
Object obj = DataAccessor.field(network, NetworkConstants.FIELD_SUBNETS, Object.class);
if (obj != null) {
Map<Long, Subnet> existingSubnets = new HashMap<>();
for (Subnet subnet : objectManager.children(network, Subnet.class)) {
Long index = DataAccessor.fromDataFieldOf(subnet).withKey(SUBNET_INDEX).as(Long.class);
if (index != null) {
existingSubnets.put(index, subnet);
}
}
List<? extends Subnet> subnets = jsonMapper.convertCollectionValue(obj, ArrayList.class, SubnetRecord.class);
for (int i = 0 ; i < subnets.size() ; i++) {
Long key = new Long(i);
if (existingSubnets.containsKey(key)) {
continue;
}
Subnet subnet = subnets.get(i);
subnet = objectManager.create(Subnet.class,
SUBNET.NAME, subnet.getName(),
SUBNET.DESCRIPTION, subnet.getDescription(),
SUBNET.CIDR_SIZE, subnet.getCidrSize(),
SUBNET.END_ADDRESS, subnet.getEndAddress(),
SUBNET.GATEWAY, subnet.getGateway(),
SUBNET.NETWORK_ADDRESS, subnet.getNetworkAddress(),
SUBNET.NETWORK_ID, network.getId(),
SUBNET.START_ADDRESS, subnet.getStartAddress(),
SUBNET.DATA, CollectionUtils.asMap(SUBNET_INDEX, key),
SUBNET.ACCOUNT_ID, network.getAccountId());
existingSubnets.put(key, subnet);
}
for (Subnet subnet : existingSubnets.values()) {
createThenActivate(subnet, null);
}
}
NetworkDriver driver = objectManager.loadResource(NetworkDriver.class, network.getNetworkDriverId());
if (driver == null) {
return null;
}
Map<String, Object> metadata = DataAccessor.fieldMap(network, NetworkConstants.FIELD_METADATA);
Map<String, Object> driverMetadata = DataAccessor.fieldMap(driver, NetworkDriverConstants.FIELD_NETWORK_METADATA);
Map<String, Object> cniConf = DataAccessor.fieldMap(driver, NetworkDriverConstants.FIELD_CNI_CONFIG);
metadata.putAll(driverMetadata);
metadata.put(NetworkDriverConstants.FIELD_CNI_CONFIG, cniConf);
return new HandlerResult(NetworkConstants.FIELD_METADATA, metadata).withShouldContinue(true);
}
}