Skip to content

Commit

Permalink
Set nad vlan-id label
Browse files Browse the repository at this point in the history
  • Loading branch information
yaocw2020 authored and guangbochen committed Nov 30, 2021
1 parent 6debe78 commit 3471c8c
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 24 deletions.
39 changes: 22 additions & 17 deletions pkg/controller/agent/nad/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@ package nad

import (
"context"
"encoding/json"
"errors"
"fmt"
"strconv"

hn "github.com/harvester/harvester/pkg/api/network"
ctlcniv1 "github.com/harvester/harvester/pkg/generated/controllers/k8s.cni.cncf.io/v1"
nadv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
"github.com/vishvananda/netlink"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/klog"

networkv1 "github.com/harvester/harvester-network-controller/pkg/apis/network.harvesterhci.io/v1beta1"
"github.com/harvester/harvester-network-controller/pkg/config"
ctlnetworkv1 "github.com/harvester/harvester-network-controller/pkg/generated/controllers/network.harvesterhci.io/v1beta1"
"github.com/harvester/harvester-network-controller/pkg/network"
Expand All @@ -27,7 +25,6 @@ import (
const (
ControllerName = "harvester-network-nad-controller"

vlanLabelKey = networkv1.GroupName + "/vlan-id"
)

type Handler struct {
Expand Down Expand Up @@ -70,13 +67,17 @@ func (h Handler) OnChange(key string, nad *nadv1.NetworkAttachmentDefinition) (*
}

klog.Infof("nad configuration %s has been changed: %s", nad.Name, nad.Spec.Config)
netconf := &hn.NetConf{}
if err := json.Unmarshal([]byte(nad.Spec.Config), netconf); err != nil {
return nil, err
}

// TODO delete previous vlan id when update nad

vlanStr, ok := nad.Labels[utils.KeyVlanLabel]
if !ok {
return nad, nil
}
vlanID, err := strconv.Atoi(vlanStr)
if err != nil {
return nil, fmt.Errorf("invalid vlan %s", vlanStr)
}

v, err := vlan.GetVlan(h.mgmtNetwork)
if err != nil && !errors.As(err, &netlink.LinkNotFoundError{}) && !errors.As(err, &vlan.SlaveNotFoundError{}) {
return nil, err
Expand All @@ -92,7 +93,8 @@ func (h Handler) OnChange(key string, nad *nadv1.NetworkAttachmentDefinition) (*
}
}

if err := v.AddLocalArea(netconf.Vlan, layer3NetworkConf.CIDR); err != nil {

if err := v.AddLocalArea(vlanID, layer3NetworkConf.CIDR); err != nil {
return nil, err
}

Expand All @@ -110,14 +112,17 @@ func (h Handler) OnRemove(key string, nad *nadv1.NetworkAttachmentDefinition) (*

klog.Infof("nad configuration %s has been deleted.", nad.Name)

netconf := &hn.NetConf{}
if err := json.Unmarshal([]byte(nad.Spec.Config), netconf); err != nil {
return nil, err
// there may be multiple nad CR with the same vlan id in different namespaces
vlanStr, ok := nad.Labels[utils.KeyVlanLabel]
if !ok {
return nad, nil
}
vlanID, err := strconv.Atoi(vlanStr)
if err != nil {
return nil, fmt.Errorf("invalid vlan %s", vlanStr)
}

// there may be multiple nad CR with the same vlan id
labelSet := labels.Set(map[string]string{
vlanLabelKey: strconv.Itoa(netconf.Vlan),
utils.KeyVlanLabel: vlanStr,
})
nads, err := h.nadCache.List("", labelSet.AsSelector())
if err != nil {
Expand All @@ -143,7 +148,7 @@ func (h Handler) OnRemove(key string, nad *nadv1.NetworkAttachmentDefinition) (*
}
}

if err := v.RemoveLocalArea(netconf.Vlan, layer3NetworkConf.CIDR); err != nil {
if err := v.RemoveLocalArea(vlanID, layer3NetworkConf.CIDR); err != nil {
return nil, err
}

Expand Down
36 changes: 33 additions & 3 deletions pkg/controller/manager/nad/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@ package nad

import (
"context"
"encoding/json"
"fmt"
"strconv"
"sync"
"time"

"github.com/go-ping/ping"
hn "github.com/harvester/harvester/pkg/api/network"
ctlcniv1 "github.com/harvester/harvester/pkg/generated/controllers/k8s.cni.cncf.io/v1"
cniv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
ctlbatchv1 "github.com/rancher/wrangler/pkg/generated/controllers/batch/v1"
Expand All @@ -27,7 +30,7 @@ const (

jobContainerName = "network-helper"
jobServiceAccountName = "harvester-network-helper"
JobEnvNadNetwork = "NAD_NETWORKS"
JobEnvNadNetwork = "NAD_NETWORKS"
JobEnvDHCPServer = "DHCP_SERVER"

defaultInterface = "net1"
Expand Down Expand Up @@ -88,6 +91,12 @@ func (h Handler) OnChange(key string, nad *cniv1.NetworkAttachmentDefinition) (*
return nil, nil
}

klog.Infof("nad configuration %s has been changed: %s", nad.Name, nad.Spec.Config)

if err := h.ensureLabels(nad); err != nil {
return nil, err
}

// check annotations
if nad.Annotations == nil || nad.Annotations[utils.KeyNetworkConf] == "" {
return nad, nil
Expand All @@ -97,6 +106,8 @@ func (h Handler) OnChange(key string, nad *cniv1.NetworkAttachmentDefinition) (*
return nil, fmt.Errorf("invalid layer 3 network configure: %w", err)
}

klog.Infof("netconf: %+v", networkConf)

if networkConf.CIDR != "" && networkConf.Gateway != "" {
// set connectivity as the initial status unknown
if networkConf.Connectivity == "" {
Expand All @@ -120,6 +131,23 @@ func (h Handler) OnChange(key string, nad *cniv1.NetworkAttachmentDefinition) (*
return nad, nil
}

func (h Handler) ensureLabels(nad *cniv1.NetworkAttachmentDefinition) error {
if _, ok := nad.Labels[utils.KeyVlanLabel]; ok {
return nil
}

netconf := &hn.NetConf{}
if err := json.Unmarshal([]byte(nad.Spec.Config), netconf); err != nil {
return err
}
nadCopy := nad.DeepCopy()
nadCopy.Labels[utils.KeyVlanLabel] = strconv.Itoa(netconf.Vlan)

_, err := h.nadClient.Update(nadCopy)

return err
}

func (h Handler) setUnknown(nad *cniv1.NetworkAttachmentDefinition, networkConf *utils.Layer3NetworkConf) error {
networkConf.Connectivity = utils.Unknown
nadCopy := nad.DeepCopy()
Expand Down Expand Up @@ -221,7 +249,7 @@ func constructJob(cur *batchv1.Job, namespace, image, dhcpServerAddr string, nad
},
},
{
Name: JobEnvDHCPServer,
Name: JobEnvDHCPServer,
Value: dhcpServerAddr,
},
},
Expand All @@ -232,6 +260,8 @@ func constructJob(cur *batchv1.Job, namespace, image, dhcpServerAddr string, nad
ServiceAccountName: jobServiceAccountName,
},
}
backoffLimit := int32(2)
job.Spec.BackoffLimit = &backoffLimit

return job, nil
}
Expand Down Expand Up @@ -273,7 +303,7 @@ func pingGW(gw string) (utils.Connectivity, error) {
stats := pinger.Statistics()

if stats.PacketsSent != stats.PacketsRecv {
connectivity = utils.Unconnetable
connectivity = utils.Unconnectable
} else {
connectivity = utils.Connectable
}
Expand Down
9 changes: 5 additions & 4 deletions pkg/utils/nadconf.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,16 @@ import (
)

const (
KeyNetworkConf = networkv1.GroupName + "/layer3-network"
KeyNetworkConf = networkv1.GroupName + "/route"
KeyVlanLabel = networkv1.GroupName + "/vlan-id"
)

type Connectivity string

const (
Connectable Connectivity = "true"
Unconnetable Connectivity = "false"
Unknown Connectivity = "unknown"
Connectable Connectivity = "true"
Unconnectable Connectivity = "false"
Unknown Connectivity = "unknown"
)

type Mode string
Expand Down

0 comments on commit 3471c8c

Please sign in to comment.