in plugins/vpc-shared-eni/config/netconfig.go [77:190]
func New(args *cniSkel.CmdArgs, isAddCmd bool) (*NetConfig, error) {
// Parse network configuration.
var config netConfigJSON
err := json.Unmarshal(args.StdinData, &config)
if err != nil {
return nil, fmt.Errorf("failed to parse network config: %v", err)
}
// Validate if all the required fields are present.
if config.ENIName == "" && config.ENIMACAddress == "" {
return nil, fmt.Errorf("missing required parameter ENIName or ENIMACAddress")
}
// Set defaults.
if config.BridgeType == "" {
config.BridgeType = BridgeTypeL3
}
if config.BridgeNetNSPath == "" {
config.BridgeNetNSPath = defaultBridgeNetNSPath
}
if config.InterfaceType == "" {
config.InterfaceType = IfTypeVETH
}
// Populate NetConfig.
netConfig := NetConfig{
NetConf: config.NetConf,
ENIName: config.ENIName,
BridgeType: config.BridgeType,
BridgeNetNSPath: config.BridgeNetNSPath,
InterfaceType: config.InterfaceType,
}
// Parse the ENI MAC address.
if config.ENIMACAddress != "" {
netConfig.ENIMACAddress, err = net.ParseMAC(config.ENIMACAddress)
if err != nil {
return nil, fmt.Errorf("invalid ENIMACAddress %s", config.ENIMACAddress)
}
}
// Parse the optional ENI IP addresses.
for _, eniIPString := range config.ENIIPAddresses {
eniIP, err := vpc.GetIPAddressFromString(eniIPString)
if err != nil {
return nil, fmt.Errorf("invalid ENIIPAddress %s", eniIPString)
}
netConfig.ENIIPAddresses = append(netConfig.ENIIPAddresses, *eniIP)
}
// Parse the optional VPC CIDR blocks.
if config.VPCCIDRs != nil {
for _, cidrString := range config.VPCCIDRs {
_, cidr, err := net.ParseCIDR(cidrString)
if err != nil {
return nil, fmt.Errorf("invalid VPCCIDR %s", cidrString)
}
netConfig.VPCCIDRs = append(netConfig.VPCCIDRs, *cidr)
}
}
// Parse the bridge type.
if config.BridgeType != BridgeTypeL2 && config.BridgeType != BridgeTypeL3 {
return nil, fmt.Errorf("invalid BridgeType %s", config.BridgeType)
}
// Parse the optional IP addresses.
for _, ipString := range config.IPAddresses {
ipAddress, err := vpc.GetIPAddressFromString(ipString)
if err != nil {
return nil, fmt.Errorf("invalid IPAddress %s", ipString)
}
netConfig.IPAddresses = append(netConfig.IPAddresses, *ipAddress)
}
// Parse the optional gateway IP address.
if config.GatewayIPAddress != "" {
netConfig.GatewayIPAddress = net.ParseIP(config.GatewayIPAddress)
if netConfig.GatewayIPAddress == nil {
return nil, fmt.Errorf("invalid GatewayIPAddress %s", config.GatewayIPAddress)
}
}
// Parse the interface type.
if config.InterfaceType != IfTypeVETH && config.InterfaceType != IfTypeTAP {
return nil, fmt.Errorf("invalid InterfaceType %s", config.InterfaceType)
}
// Parse the optional TAP user ID.
if config.TapUserID != "" {
netConfig.TapUserID, err = strconv.Atoi(config.TapUserID)
if err != nil {
return nil, fmt.Errorf("invalid TapUserID %s", config.TapUserID)
}
}
// Parse orchestrator-specific configuration.
if strings.Contains(args.Args, "K8S") {
netConfig.Kubernetes = &KubernetesConfig{
ServiceCIDR: config.ServiceCIDR,
}
err = parseKubernetesArgs(&netConfig, args, isAddCmd)
if err != nil {
return nil, fmt.Errorf("failed to parse Kubernetes args: %v", err)
}
}
// Validation complete. Return the parsed NetConfig object.
log.Debugf("Created NetConfig: %+v", netConfig)
return &netConfig, nil
}