mirror of
https://github.com/k8snetworkplumbingwg/multus-cni.git
synced 2025-06-30 01:21:49 +00:00
Merge remote-tracking branch 'origin/master' into feature/multus-4.0
This commit is contained in:
commit
3d9cec4ec9
@ -89,7 +89,7 @@ function warn()
|
|||||||
log "WARN: {$1}"
|
log "WARN: {$1}"
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! type python3 &> /dev/null; then
|
if type python3 &> /dev/null; then
|
||||||
alias python=python3
|
alias python=python3
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -649,7 +649,7 @@ func CmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (c
|
|||||||
// https://docs.google.com/document/d/1Ny03h6IDVy_e_vmElOqR7UdTPAG_RNydhVE1Kx54kFQ (4.1.2.1.9)
|
// https://docs.google.com/document/d/1Ny03h6IDVy_e_vmElOqR7UdTPAG_RNydhVE1Kx54kFQ (4.1.2.1.9)
|
||||||
// the list can be empty; if it is, we'll assume the CNI's config for the default gateway holds,
|
// the list can be empty; if it is, we'll assume the CNI's config for the default gateway holds,
|
||||||
// else we'll update the defaultgateway to the one specified.
|
// else we'll update the defaultgateway to the one specified.
|
||||||
if delegate.GatewayRequest != nil && delegate.GatewayRequest[0] != nil {
|
if delegate.GatewayRequest != nil && len(*delegate.GatewayRequest) != 0 {
|
||||||
deleteV4gateway = true
|
deleteV4gateway = true
|
||||||
adddefaultgateway = true
|
adddefaultgateway = true
|
||||||
logging.Debugf("Detected gateway override on interface %v to %v", ifName, delegate.GatewayRequest)
|
logging.Debugf("Detected gateway override on interface %v to %v", ifName, delegate.GatewayRequest)
|
||||||
@ -665,7 +665,7 @@ func CmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (c
|
|||||||
// https://docs.google.com/document/d/1Ny03h6IDVy_e_vmElOqR7UdTPAG_RNydhVE1Kx54kFQ (4.1.2.1.9)
|
// https://docs.google.com/document/d/1Ny03h6IDVy_e_vmElOqR7UdTPAG_RNydhVE1Kx54kFQ (4.1.2.1.9)
|
||||||
// the list can be empty; if it is, we'll assume the CNI's config for the default gateway holds,
|
// the list can be empty; if it is, we'll assume the CNI's config for the default gateway holds,
|
||||||
// else we'll update the defaultgateway to the one specified.
|
// else we'll update the defaultgateway to the one specified.
|
||||||
if delegate.GatewayRequest != nil && delegate.GatewayRequest[0] != nil {
|
if delegate.GatewayRequest != nil && len(*delegate.GatewayRequest) != 0 {
|
||||||
deleteV6gateway = true
|
deleteV6gateway = true
|
||||||
adddefaultgateway = true
|
adddefaultgateway = true
|
||||||
logging.Debugf("Detected gateway override on interface %v to %v", ifName, delegate.GatewayRequest)
|
logging.Debugf("Detected gateway override on interface %v to %v", ifName, delegate.GatewayRequest)
|
||||||
@ -686,11 +686,11 @@ func CmdAdd(args *skel.CmdArgs, exec invoke.Exec, kubeClient *k8s.ClientInfo) (c
|
|||||||
|
|
||||||
// Here we'll set the default gateway which specified in `default-route` network selection
|
// Here we'll set the default gateway which specified in `default-route` network selection
|
||||||
if adddefaultgateway {
|
if adddefaultgateway {
|
||||||
err = netutils.SetDefaultGW(args.Netns, ifName, delegate.GatewayRequest)
|
err = netutils.SetDefaultGW(args.Netns, ifName, *delegate.GatewayRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cmdErr(k8sArgs, "error setting default gateway: %v", err)
|
return nil, cmdErr(k8sArgs, "error setting default gateway: %v", err)
|
||||||
}
|
}
|
||||||
err = netutils.AddDefaultGWCache(n.CNIDir, rt, netName, ifName, delegate.GatewayRequest)
|
err = netutils.AddDefaultGWCache(n.CNIDir, rt, netName, ifName, *delegate.GatewayRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cmdErr(k8sArgs, "error setting default gateway in cache: %v", err)
|
return nil, cmdErr(k8sArgs, "error setting default gateway in cache: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -68,9 +68,9 @@ func LoadDelegateNetConfList(bytes []byte, delegateConf *DelegateNetConf) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LoadDelegateNetConf converts raw CNI JSON into a DelegateNetConf structure
|
// LoadDelegateNetConf converts raw CNI JSON into a DelegateNetConf structure
|
||||||
func LoadDelegateNetConf(bytes []byte, net *NetworkSelectionElement, deviceID string, resourceName string) (*DelegateNetConf, error) {
|
func LoadDelegateNetConf(bytes []byte, netElement *NetworkSelectionElement, deviceID string, resourceName string) (*DelegateNetConf, error) {
|
||||||
var err error
|
var err error
|
||||||
logging.Debugf("LoadDelegateNetConf: %s, %v, %s", string(bytes), net, deviceID)
|
logging.Debugf("LoadDelegateNetConf: %s, %v, %s", string(bytes), netElement, deviceID)
|
||||||
|
|
||||||
delegateConf := &DelegateNetConf{}
|
delegateConf := &DelegateNetConf{}
|
||||||
if err := json.Unmarshal(bytes, &delegateConf.Conf); err != nil {
|
if err := json.Unmarshal(bytes, &delegateConf.Conf); err != nil {
|
||||||
@ -88,9 +88,11 @@ func LoadDelegateNetConf(bytes []byte, net *NetworkSelectionElement, deviceID st
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, logging.Errorf("LoadDelegateNetConf: failed to add deviceID in NetConfList bytes: %v", err)
|
return nil, logging.Errorf("LoadDelegateNetConf: failed to add deviceID in NetConfList bytes: %v", err)
|
||||||
}
|
}
|
||||||
|
delegateConf.ResourceName = resourceName
|
||||||
|
delegateConf.DeviceID = deviceID
|
||||||
}
|
}
|
||||||
if net != nil && net.CNIArgs != nil {
|
if netElement != nil && netElement.CNIArgs != nil {
|
||||||
bytes, err = addCNIArgsInConfList(bytes, net.CNIArgs)
|
bytes, err = addCNIArgsInConfList(bytes, netElement.CNIArgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, logging.Errorf("LoadDelegateNetConf(): failed to add cni-args in NetConfList bytes: %v", err)
|
return nil, logging.Errorf("LoadDelegateNetConf(): failed to add cni-args in NetConfList bytes: %v", err)
|
||||||
}
|
}
|
||||||
@ -105,45 +107,51 @@ func LoadDelegateNetConf(bytes []byte, net *NetworkSelectionElement, deviceID st
|
|||||||
delegateConf.ResourceName = resourceName
|
delegateConf.ResourceName = resourceName
|
||||||
delegateConf.DeviceID = deviceID
|
delegateConf.DeviceID = deviceID
|
||||||
}
|
}
|
||||||
if net != nil && net.CNIArgs != nil {
|
if netElement != nil && netElement.CNIArgs != nil {
|
||||||
bytes, err = addCNIArgsInConfig(bytes, net.CNIArgs)
|
bytes, err = addCNIArgsInConfig(bytes, netElement.CNIArgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, logging.Errorf("LoadDelegateNetConf(): failed to add cni-args in NetConfList bytes: %v", err)
|
return nil, logging.Errorf("LoadDelegateNetConf(): failed to add cni-args in NetConfList bytes: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if net != nil {
|
if netElement != nil {
|
||||||
if net.Name != "" {
|
if netElement.Name != "" {
|
||||||
// Overwrite CNI config name with net-attach-def name
|
// Overwrite CNI config name with net-attach-def name
|
||||||
delegateConf.Name = fmt.Sprintf("%s/%s", net.Namespace, net.Name)
|
delegateConf.Name = fmt.Sprintf("%s/%s", netElement.Namespace, netElement.Name)
|
||||||
}
|
}
|
||||||
if net.InterfaceRequest != "" {
|
if netElement.InterfaceRequest != "" {
|
||||||
delegateConf.IfnameRequest = net.InterfaceRequest
|
delegateConf.IfnameRequest = netElement.InterfaceRequest
|
||||||
}
|
}
|
||||||
if net.MacRequest != "" {
|
if netElement.MacRequest != "" {
|
||||||
delegateConf.MacRequest = net.MacRequest
|
delegateConf.MacRequest = netElement.MacRequest
|
||||||
}
|
}
|
||||||
if net.IPRequest != nil {
|
if netElement.IPRequest != nil {
|
||||||
delegateConf.IPRequest = net.IPRequest
|
delegateConf.IPRequest = netElement.IPRequest
|
||||||
}
|
}
|
||||||
if net.BandwidthRequest != nil {
|
if netElement.BandwidthRequest != nil {
|
||||||
delegateConf.BandwidthRequest = net.BandwidthRequest
|
delegateConf.BandwidthRequest = netElement.BandwidthRequest
|
||||||
}
|
}
|
||||||
if net.PortMappingsRequest != nil {
|
if netElement.PortMappingsRequest != nil {
|
||||||
delegateConf.PortMappingsRequest = net.PortMappingsRequest
|
delegateConf.PortMappingsRequest = netElement.PortMappingsRequest
|
||||||
}
|
}
|
||||||
if net.GatewayRequest != nil {
|
if netElement.GatewayRequest != nil {
|
||||||
delegateConf.GatewayRequest = append(delegateConf.GatewayRequest, net.GatewayRequest...)
|
var list []net.IP
|
||||||
|
if delegateConf.GatewayRequest != nil {
|
||||||
|
list = append(*delegateConf.GatewayRequest, *netElement.GatewayRequest...)
|
||||||
|
} else {
|
||||||
|
list = *netElement.GatewayRequest
|
||||||
|
}
|
||||||
|
delegateConf.GatewayRequest = &list
|
||||||
}
|
}
|
||||||
if net.InfinibandGUIDRequest != "" {
|
if netElement.InfinibandGUIDRequest != "" {
|
||||||
delegateConf.InfinibandGUIDRequest = net.InfinibandGUIDRequest
|
delegateConf.InfinibandGUIDRequest = netElement.InfinibandGUIDRequest
|
||||||
}
|
}
|
||||||
if net.DeviceID != "" {
|
if netElement.DeviceID != "" {
|
||||||
if deviceID != "" {
|
if deviceID != "" {
|
||||||
logging.Debugf("Warning: Both RuntimeConfig and ResourceMap provide deviceID. Ignoring RuntimeConfig")
|
logging.Debugf("Warning: Both RuntimeConfig and ResourceMap provide deviceID. Ignoring RuntimeConfig")
|
||||||
} else {
|
} else {
|
||||||
delegateConf.DeviceID = net.DeviceID
|
delegateConf.DeviceID = netElement.DeviceID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -603,11 +611,13 @@ func CheckGatewayConfig(delegates []*DelegateNetConf) error {
|
|||||||
|
|
||||||
// Check the gateway
|
// Check the gateway
|
||||||
for _, delegate := range delegates {
|
for _, delegate := range delegates {
|
||||||
for _, gw := range delegate.GatewayRequest {
|
if delegate.GatewayRequest != nil {
|
||||||
if gw.To4() != nil {
|
for _, gw := range *delegate.GatewayRequest {
|
||||||
v4Gateways++
|
if gw.To4() != nil {
|
||||||
} else {
|
v4Gateways++
|
||||||
v6Gateways++
|
} else {
|
||||||
|
v6Gateways++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -623,7 +633,7 @@ func CheckGatewayConfig(delegates []*DelegateNetConf) error {
|
|||||||
delegates[i].IsFilterV4Gateway = true
|
delegates[i].IsFilterV4Gateway = true
|
||||||
delegates[i].IsFilterV6Gateway = true
|
delegates[i].IsFilterV6Gateway = true
|
||||||
} else {
|
} else {
|
||||||
for _, gw := range delegate.GatewayRequest {
|
for _, gw := range *delegate.GatewayRequest {
|
||||||
if gw.To4() != nil {
|
if gw.To4() != nil {
|
||||||
delegates[i].IsFilterV6Gateway = true
|
delegates[i].IsFilterV6Gateway = true
|
||||||
} else {
|
} else {
|
||||||
|
@ -909,4 +909,72 @@ var _ = Describe("config operations", func() {
|
|||||||
Expect(n.Delegates[0].Name).To(Equal("weave-list"))
|
Expect(n.Delegates[0].Name).To(Equal("weave-list"))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("test LoadDelegateNetConf keeps without GatewayRequest", func() {
|
||||||
|
conf := `{
|
||||||
|
"name": "node-cni-network",
|
||||||
|
"type": "multus",
|
||||||
|
"kubeconfig": "/etc/kubernetes/node-kubeconfig.yaml",
|
||||||
|
"delegates": [{
|
||||||
|
"name": "weave-list",
|
||||||
|
"plugins": [ {"type" :"weave"} ]
|
||||||
|
}]
|
||||||
|
}`
|
||||||
|
|
||||||
|
nsJSON := `{ "name": "foobar" }`
|
||||||
|
ns := &NetworkSelectionElement{}
|
||||||
|
|
||||||
|
err := json.Unmarshal([]byte(nsJSON), ns)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
netconf, err := LoadDelegateNetConf([]byte(conf), ns, "", "")
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(netconf.GatewayRequest).To(BeNil())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("test LoadDelegateNetConf keeps empty GatewayRequest", func() {
|
||||||
|
conf := `{
|
||||||
|
"name": "node-cni-network",
|
||||||
|
"type": "multus",
|
||||||
|
"kubeconfig": "/etc/kubernetes/node-kubeconfig.yaml",
|
||||||
|
"delegates": [{
|
||||||
|
"name": "weave-list",
|
||||||
|
"plugins": [ {"type" :"weave"} ]
|
||||||
|
}]
|
||||||
|
}`
|
||||||
|
|
||||||
|
nsJSON := `{ "name": "foobar", "default-route": [] }`
|
||||||
|
ns := &NetworkSelectionElement{}
|
||||||
|
|
||||||
|
err := json.Unmarshal([]byte(nsJSON), ns)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
netconf, err := LoadDelegateNetConf([]byte(conf), ns, "", "")
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(netconf.GatewayRequest).NotTo(BeNil())
|
||||||
|
Expect(len(*netconf.GatewayRequest)).To(BeEquivalentTo(0))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("test LoadDelegateNetConf keeps GatewayRequest", func() {
|
||||||
|
conf := `{
|
||||||
|
"name": "node-cni-network",
|
||||||
|
"type": "multus",
|
||||||
|
"kubeconfig": "/etc/kubernetes/node-kubeconfig.yaml",
|
||||||
|
"delegates": [{
|
||||||
|
"name": "weave-list",
|
||||||
|
"plugins": [ {"type" :"weave"} ]
|
||||||
|
}]
|
||||||
|
}`
|
||||||
|
|
||||||
|
nsJSON := `{ "name": "foobar", "default-route": [ "10.1.1.1" ] }`
|
||||||
|
ns := &NetworkSelectionElement{}
|
||||||
|
|
||||||
|
err := json.Unmarshal([]byte(nsJSON), ns)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
netconf, err := LoadDelegateNetConf([]byte(conf), ns, "", "")
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(netconf.GatewayRequest).NotTo(BeNil())
|
||||||
|
Expect(len(*netconf.GatewayRequest)).To(BeEquivalentTo(1))
|
||||||
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -102,7 +102,7 @@ type DelegateNetConf struct {
|
|||||||
IPRequest []string `json:"ipRequest,omitempty"`
|
IPRequest []string `json:"ipRequest,omitempty"`
|
||||||
PortMappingsRequest []*PortMapEntry `json:"-"`
|
PortMappingsRequest []*PortMapEntry `json:"-"`
|
||||||
BandwidthRequest *BandwidthEntry `json:"-"`
|
BandwidthRequest *BandwidthEntry `json:"-"`
|
||||||
GatewayRequest []net.IP `json:"default-route,omitempty"`
|
GatewayRequest *[]net.IP `json:"default-route,omitempty"`
|
||||||
IsFilterV4Gateway bool
|
IsFilterV4Gateway bool
|
||||||
IsFilterV6Gateway bool
|
IsFilterV6Gateway bool
|
||||||
// MasterPlugin is only used internal housekeeping
|
// MasterPlugin is only used internal housekeeping
|
||||||
@ -153,7 +153,7 @@ type NetworkSelectionElement struct {
|
|||||||
// CNIArgs contains additional CNI arguments for the network interface
|
// CNIArgs contains additional CNI arguments for the network interface
|
||||||
CNIArgs *map[string]interface{} `json:"cni-args"`
|
CNIArgs *map[string]interface{} `json:"cni-args"`
|
||||||
// GatewayRequest contains default route IP address for the pod
|
// GatewayRequest contains default route IP address for the pod
|
||||||
GatewayRequest []net.IP `json:"default-route,omitempty"`
|
GatewayRequest *[]net.IP `json:"default-route,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// K8sArgs is the valid CNI_ARGS used for Kubernetes
|
// K8sArgs is the valid CNI_ARGS used for Kubernetes
|
||||||
|
Loading…
Reference in New Issue
Block a user