Skip to content

Commit

Permalink
refactor: controller refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
oilbeater committed Apr 15, 2020
1 parent 8f1f013 commit d99ffff
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 128 deletions.
24 changes: 11 additions & 13 deletions pkg/controller/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,12 @@ func (c *Controller) InitIPAM() error {

//InitNetwork save the cluster default network
func (c *Controller) initNetwork() error {
networkCrd, err := c.config.KubeOvnClient.KubeovnV1().Networks().Get("config", v1.GetOptions{})
if err != nil && !errors.IsNotFound(err) {
_, err := c.config.KubeOvnClient.KubeovnV1().Networks().Get("config", v1.GetOptions{})
if err == nil {
return nil
}

if !errors.IsNotFound(err) {
klog.Errorf("get network config failed %v", err)
return err
}
Expand All @@ -234,21 +238,15 @@ func (c *Controller) initNetwork() error {
networkSpec.VlanRange = c.config.DefaultVlanRange
}

if errors.IsNotFound(err) {
networkConfig := kubeovnv1.Network{
ObjectMeta: v1.ObjectMeta{Name: "config"},
Spec: networkSpec,
}
_, err = c.config.KubeOvnClient.KubeovnV1().Networks().Create(&networkConfig)
return err
networkConfig := kubeovnv1.Network{
ObjectMeta: v1.ObjectMeta{Name: "config"},
Spec: networkSpec,
}

networkCrd.Spec = networkSpec
_, err = c.config.KubeOvnClient.KubeovnV1().Networks().Update(networkCrd)
_, err = c.config.KubeOvnClient.KubeovnV1().Networks().Create(&networkConfig)
return err
}

//InitDefaultVlan init the default vlan when network type is vlan or xvlan
//InitDefaultVlan init the default vlan when network type is vlan or vxlan
func (c *Controller) initDefaultVlan() error {
if c.config.NetworkType != util.NetworkTypeVlan {
return nil
Expand Down
15 changes: 7 additions & 8 deletions pkg/controller/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,13 @@ func (c *Controller) handleAddNode(key string) error {
return err
}
}
if err := c.ovnClient.CreatePort(c.config.NodeSwitch, portName, ip, subnet.Spec.CIDRBlock, mac); err != nil {

tag, err := c.getSubnetVlanTag(subnet)
if err != nil {
return err
}

if err := c.ovnClient.CreatePort(c.config.NodeSwitch, portName, ip, subnet.Spec.CIDRBlock, mac, tag); err != nil {
return err
}

Expand All @@ -221,13 +227,6 @@ func (c *Controller) handleAddNode(key string) error {
}
}

//set node port tag and set address
if c.config.NetworkType != util.NetworkTypeVlan && subnet.Spec.Vlan != "" {
if err := c.addPortVlan(portName, ip, mac, subnet.Spec.Vlan); err != nil {
return err
}
}

patchPayloadTemplate :=
`[{
"op": "%s",
Expand Down
31 changes: 16 additions & 15 deletions pkg/controller/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,24 +339,25 @@ func (c *Controller) handleAddPod(key string) error {
pod.Annotations[fmt.Sprintf(util.AllocatedAnnotationTemplate, subnet.Spec.Provider)] = "true"

if isOvnSubnet(subnet) {
if err := c.ovnClient.CreatePort(subnet.Name, ovs.PodNameToPortName(name, namespace), ip, subnet.Spec.CIDRBlock, mac); err != nil {
c.recorder.Eventf(pod, v1.EventTypeWarning, "CreateOVNPortFailed", err.Error())
return err
}

//set port tag, get vlan id, update pod annotation
if c.config.NetworkType == util.NetworkTypeVlan && subnet.Spec.Vlan != "" {
if err := c.addPortVlan(ovs.PodNameToPortName(name, namespace), ip, mac, subnet.Spec.Vlan); err != nil {
c.recorder.Eventf(pod, v1.EventTypeWarning, "SetPortVlanFailed", err.Error())
if subnet.Spec.Vlan != "" {
vlan, err := c.vlansLister.Get(subnet.Spec.Vlan)
if err != nil {
c.recorder.Eventf(pod, v1.EventTypeWarning, "GetVlanInfoFailed", err.Error())
return err
}
pod.Annotations[util.HostInterfaceName] = c.config.DefaultHostInterface
pod.Annotations[util.VlanIdAnnotation] = strconv.Itoa(vlan.Spec.VlanId)
pod.Annotations[util.ProviderInterfaceName] = c.config.DefaultProviderName
pod.Annotations[util.VlanRangeAnnotation] = c.config.DefaultVlanRange
}

if vlan, err := c.vlansLister.Get(subnet.Spec.Vlan); err == nil {
pod.Annotations[util.HostInterfaceName] = c.config.DefaultHostInterface
pod.Annotations[util.VlanIdAnnotation] = strconv.Itoa(vlan.Spec.VlanId)
pod.Annotations[util.ProviderInterfaceName] = c.config.DefaultProviderName
pod.Annotations[util.VlanRangeAnnotation] = c.config.DefaultVlanRange
}
tag, err := c.getSubnetVlanTag(subnet)
if err != nil {
return err
}
if err := c.ovnClient.CreatePort(subnet.Name, ovs.PodNameToPortName(name, namespace), ip, subnet.Spec.CIDRBlock, mac, tag); err != nil {
c.recorder.Eventf(pod, v1.EventTypeWarning, "CreateOVNPortFailed", err.Error())
return err
}
}
}
Expand Down
20 changes: 19 additions & 1 deletion pkg/controller/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/juju/errors"
"net"
"reflect"
"strconv"
"strings"

v1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -314,8 +315,13 @@ func formatSubnet(subnet *kubeovnv1.Subnet, c *Controller) error {
}
}

if c.config.NetworkType == util.NetworkTypeVlan && subnet.Spec.Vlan == "" {
subnet.Spec.Vlan = c.config.DefaultVlanName
changed = true
}

if subnet.Spec.Vlan != "" {
if _, err := c.config.KubeOvnClient.KubeovnV1().Vlans().Get(subnet.Spec.Vlan, metav1.GetOptions{}); err != nil {
if _, err := c.vlansLister.Get(subnet.Spec.Vlan); err != nil {
subnet.Spec.Vlan = ""
changed = true
}
Expand Down Expand Up @@ -973,3 +979,15 @@ func isOvnSubnet(subnet *kubeovnv1.Subnet) bool {
}
return false
}

func (c *Controller) getSubnetVlanTag(subnet *kubeovnv1.Subnet) (string, error) {
tag := ""
if subnet.Spec.Vlan != "" {
vlan, err := c.vlansLister.Get(subnet.Spec.Vlan)
if err != nil {
return "", err
}
tag = strconv.Itoa(vlan.Spec.VlanId)
}
return tag, nil
}
64 changes: 4 additions & 60 deletions pkg/controller/vlan.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,7 @@ func (c *Controller) handleAddVlan(key string) error {
}

s.Spec.Vlan = vlan.Name
_, err = c.config.KubeOvnClient.KubeovnV1().Subnets().Update(s)
if err != nil {
if _, err = c.config.KubeOvnClient.KubeovnV1().Subnets().Update(s); err != nil {
vlan.Status.SetVlanError("UpdateSubnetVlanFailed", err.Error())
bytes, err := vlan.Status.Bytes()

Expand All @@ -241,8 +240,7 @@ func (c *Controller) handleAddVlan(key string) error {
}

vlan.Spec.Subnet = strings.Join(subnets, ",")
_, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(vlan)
if err != nil {
if _, err = c.config.KubeOvnClient.KubeovnV1().Vlans().Update(vlan); err != nil {
klog.Errorf("failed to update vlan %s, %v", vlan.Name, err)
return err
}
Expand Down Expand Up @@ -321,12 +319,12 @@ func (c *Controller) addLocalnet(subnet *kubeovnv1.Subnet) error {

for _, port := range ports {
if port == localnetPort {
klog.Infof("has exists localnet port %s", localnetPort)
klog.Infof("localnet port %s exists", localnetPort)
return nil
}
}

vlan, err := c.config.KubeOvnClient.KubeovnV1().Vlans().Get(subnet.Spec.Vlan, metav1.GetOptions{})
vlan, err := c.vlansLister.Get(subnet.Spec.Vlan)
if err != nil {
klog.Errorf("failed get vlan object %v", err)
return err
Expand All @@ -349,57 +347,3 @@ func (c *Controller) delLocalnet(key string) error {

return nil
}

func (c *Controller) addPortVlan(port, ip, mac, vlan string) error {
vlanCrd, err := c.vlansLister.Get(vlan)
if err != nil {
klog.Errorf("failed get vlan crd, %v", err)
return err
}

if err := util.ValidateVlan(vlanCrd.Spec.VlanId, c.config.DefaultVlanRange); err != nil {
return err
}

lsps, err := c.ovnClient.ListLogicalSwitchPort()
if err != nil {
klog.Errorf("failed to list logical switch port, %v", err)
return err
}

found := false
for _, lsp := range lsps {
if lsp == port {
found = true
break
}
}

if !found {
return fmt.Errorf("failed to find logical switch port: %s", port)
}

if err = c.ovnClient.SetLogicSwitchPortTag(port, strconv.Itoa(vlanCrd.Spec.VlanId)); err != nil {
klog.Errorf("failed set port %s tag, %v", port, err)
return err
}

if ip != "" || mac != "" {
if err = c.ovnClient.SetLogicalSwitchPortAddress(port, ip, mac); err != nil {
klog.Errorf("failed set port %s address, %v", port, err)
return err
}
}

return nil
}

func (c *Controller) updatePortVlan(port, vlanID string) error {
err := c.ovnClient.SetLogicSwitchPortTag(port, vlanID)
if err != nil {
klog.Errorf("failed to update ovn port: %s tag: %s, %v", port, vlanID, err)
return err
}

return nil
}
39 changes: 10 additions & 29 deletions pkg/ovs/ovn-nbctl.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,18 @@ func (c Client) DeletePort(port string) error {
}

// CreatePort create logical switch port in ovn
func (c Client) CreatePort(ls, port, ip, cidr, mac string) error {
func (c Client) CreatePort(ls, port, ip, cidr, mac, tag string) error {
ovnCommand := []string{MayExist, "lsp-add", ls, port, "--",
"lsp-set-addresses", port, fmt.Sprintf("%s %s", mac, ip), "--"}
"lsp-set-addresses", port, fmt.Sprintf("%s %s", mac, ip)}

if ls != c.NodeSwitch {
ovnCommand = append(ovnCommand,
"lsp-set-port-security", port, fmt.Sprintf("%s %s/%s", mac, ip, strings.Split(cidr, "/")[1]))
"--", "lsp-set-port-security", port, fmt.Sprintf("%s %s/%s", mac, ip, strings.Split(cidr, "/")[1]))
}

if tag != "" {
ovnCommand = append(ovnCommand,
"--", "set", "logical_switch_port", port, fmt.Sprintf("tag=%s", tag))
}

if _, err := c.ovnNbCommand(ovnCommand...); err != nil {
Expand Down Expand Up @@ -680,40 +685,16 @@ func (c Client) GetLogicalSwitchPortByLogicalSwitch(logicalSwitch string) ([]str
return rv, nil
}

func (c Client) SetLogicSwitchPortTag(port, tag string) error {
_, err := c.ovnNbCommand("set", "logical_switch_port", port, fmt.Sprintf("tag=%s", tag))
return err
}

func (c Client) GetLogicSwitchPortTag(port string) (string, error) {
return c.ovnNbCommand("get", "logical_switch_port", port, "tag")
}

func (c Client) SetLogicalSwitchPortAddress(port, ip, mac string) error {
_, err := c.ovnNbCommand("lsp-set-addresses", port, fmt.Sprintf("%s %s", mac, ip))
return err
}

func (c Client) SetLogicalSwitchPortSecurity(port, ip, mac, cidr string) error {
security := fmt.Sprintf("%s %s/%s", mac, ip, strings.Split(cidr, "/")[1])
_, err := c.ovnNbCommand("lsp-set-port-security", port, security)
return err
}

func (c Client) CreateLocalnetPort(ls, port, providerName, vlanID string) error {
_, err := c.ovnNbCommand(MayExist, "lsp-add", ls, port, "--",
"lsp-set-addresses", port, "unknown", "--",
"lsp-set-type", port, "localnet", "--",
"lsp-set-options", port, fmt.Sprintf("network_name=%s", providerName))
"lsp-set-options", port, fmt.Sprintf("network_name=%s", providerName), "--",
"set", "logical_switch_port", port, fmt.Sprintf("tag=%s", vlanID))
if err != nil {
klog.Errorf("create localnet port %s failed, %v", port, err)
return err
}

if err = c.SetLogicSwitchPortTag(port, vlanID); err != nil {
klog.Errorf("set localnet port vlan %s failed, %v", vlanID, err)
return err
}

return nil
}
4 changes: 2 additions & 2 deletions pkg/util/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@ func ValidatePodNetwork(annotations map[string]string) error {
}

func ValidateVlan(vlan int, vlanRange string) error {
vlans := strings.SplitN(vlanRange, ",", 2)
vlans := strings.Split(vlanRange, ",")
if len(vlans) != 2 {
return fmt.Errorf("the vlan range %s is in valid", vlanRange)
return fmt.Errorf("the vlan range %s is invalid", vlanRange)
}

min, err := strconv.Atoi(vlans[0])
Expand Down

0 comments on commit d99ffff

Please sign in to comment.