func New()

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
}