mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			146 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| package network
 | |
| 
 | |
| import (
 | |
| 	"net"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| )
 | |
| 
 | |
| // NcList describes a generic map
 | |
| type NcList map[string]interface{}
 | |
| 
 | |
| // NewNcList creates a generic map of values with string
 | |
| // keys and adds in version and network name
 | |
| func NewNcList(name, version string) NcList {
 | |
| 	n := NcList{}
 | |
| 	n["cniVersion"] = version
 | |
| 	n["name"] = name
 | |
| 	return n
 | |
| }
 | |
| 
 | |
| // NewHostLocalBridge creates a new LocalBridge for host-local
 | |
| func NewHostLocalBridge(name string, isGateWay, isDefaultGW, ipMasq bool, ipamConf IPAMHostLocalConf) *HostLocalBridge {
 | |
| 	hostLocalBridge := HostLocalBridge{
 | |
| 		PluginType: "bridge",
 | |
| 		BrName:     name,
 | |
| 		IPMasq:     ipMasq,
 | |
| 		IPAM:       ipamConf,
 | |
| 	}
 | |
| 	if isGateWay {
 | |
| 		hostLocalBridge.IsGW = true
 | |
| 	}
 | |
| 	if isDefaultGW {
 | |
| 		hostLocalBridge.IsDefaultGW = true
 | |
| 	}
 | |
| 	return &hostLocalBridge
 | |
| }
 | |
| 
 | |
| // NewIPAMHostLocalConf creates a new IPAMHostLocal configfuration
 | |
| func NewIPAMHostLocalConf(subnet *net.IPNet, routes []IPAMRoute, ipRange net.IPNet, gw net.IP) (IPAMHostLocalConf, error) {
 | |
| 	var ipamRanges [][]IPAMLocalHostRangeConf
 | |
| 	ipamConf := IPAMHostLocalConf{
 | |
| 		PluginType: "host-local",
 | |
| 		Routes:     routes,
 | |
| 		// Possible future support ? Leaving for clues
 | |
| 		//ResolveConf: "",
 | |
| 		//DataDir: ""
 | |
| 	}
 | |
| 	IPAMRange, err := newIPAMLocalHostRange(subnet, &ipRange, &gw)
 | |
| 	if err != nil {
 | |
| 		return ipamConf, err
 | |
| 	}
 | |
| 	ipamRanges = append(ipamRanges, IPAMRange)
 | |
| 	ipamConf.Ranges = ipamRanges
 | |
| 	return ipamConf, nil
 | |
| }
 | |
| 
 | |
| func newIPAMLocalHostRange(subnet *net.IPNet, ipRange *net.IPNet, gw *net.IP) ([]IPAMLocalHostRangeConf, error) { //nolint:interfacer
 | |
| 	var ranges []IPAMLocalHostRangeConf
 | |
| 	hostRange := IPAMLocalHostRangeConf{
 | |
| 		Subnet: subnet.String(),
 | |
| 	}
 | |
| 	// an user provided a range, we add it here
 | |
| 	if ipRange.IP != nil {
 | |
| 		first, err := FirstIPInSubnet(ipRange)
 | |
| 		if err != nil {
 | |
| 			return nil, err
 | |
| 		}
 | |
| 		last, err := LastIPInSubnet(ipRange)
 | |
| 		if err != nil {
 | |
| 			return nil, err
 | |
| 		}
 | |
| 		hostRange.RangeStart = first.String()
 | |
| 		hostRange.RangeEnd = last.String()
 | |
| 	}
 | |
| 	if gw != nil {
 | |
| 		hostRange.Gateway = gw.String()
 | |
| 	}
 | |
| 	ranges = append(ranges, hostRange)
 | |
| 	return ranges, nil
 | |
| }
 | |
| 
 | |
| // NewIPAMRoute creates a new IPAM route configuration
 | |
| func NewIPAMRoute(r *net.IPNet) IPAMRoute { //nolint:interfacer
 | |
| 	return IPAMRoute{Dest: r.String()}
 | |
| }
 | |
| 
 | |
| // NewIPAMDefaultRoute creates a new IPAMDefault route of
 | |
| // 0.0.0.0/0
 | |
| func NewIPAMDefaultRoute() (IPAMRoute, error) {
 | |
| 	_, n, err := net.ParseCIDR("0.0.0.0/0")
 | |
| 	if err != nil {
 | |
| 		return IPAMRoute{}, err
 | |
| 	}
 | |
| 	return NewIPAMRoute(n), nil
 | |
| }
 | |
| 
 | |
| // NewPortMapPlugin creates a predefined, default portmapping
 | |
| // configuration
 | |
| func NewPortMapPlugin() PortMapConfig {
 | |
| 	caps := make(map[string]bool)
 | |
| 	caps["portMappings"] = true
 | |
| 	p := PortMapConfig{
 | |
| 		PluginType:   "portmap",
 | |
| 		Capabilities: caps,
 | |
| 	}
 | |
| 	return p
 | |
| }
 | |
| 
 | |
| // NewFirewallPlugin creates a generic firewall plugin
 | |
| func NewFirewallPlugin() FirewallConfig {
 | |
| 	return FirewallConfig{
 | |
| 		PluginType: "firewall",
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // NewDNSNamePlugin creates the dnsname config with a given
 | |
| // domainname
 | |
| func NewDNSNamePlugin(domainName string) DNSNameConfig {
 | |
| 	return DNSNameConfig{
 | |
| 		PluginType: "dnsname",
 | |
| 		DomainName: domainName,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // HasDNSNamePlugin looks to see if the dnsname cni plugin is present
 | |
| func HasDNSNamePlugin(paths []string) bool {
 | |
| 	for _, p := range paths {
 | |
| 		if _, err := os.Stat(filepath.Join(p, "dnsname")); err == nil {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| // NewMacVLANPlugin creates a macvlanconfig with a given device name
 | |
| func NewMacVLANPlugin(device string) MacVLANConfig {
 | |
| 	i := IPAMDHCP{DHCP: "dhcp"}
 | |
| 
 | |
| 	m := MacVLANConfig{
 | |
| 		PluginType: "macvlan",
 | |
| 		Master:     device,
 | |
| 		IPAM:       i,
 | |
| 	}
 | |
| 	return m
 | |
| }
 |