aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/ovn4nfvk8s-cni
diff options
context:
space:
mode:
authorKuralamudhan Ramakrishnan <kuralamudhan.ramakrishnan@intel.com>2020-07-06 16:10:19 -0700
committerKuralamudhan Ramakrishnan <kuralamudhan.ramakrishnan@intel.com>2020-09-17 16:25:10 -0700
commitce14abc0128d4c55a7805c52ea199e2ce6159428 (patch)
tree569f74510b497ed44814e931a4667de73d133ab0 /cmd/ovn4nfvk8s-cni
parent3de63ee756f9d7c0a4524b40a89e92b918a9249f (diff)
Adding node interface, SNAT and OVN Node switch port
- Adding nfn proto for node interface MAC and IP address - Adding node switch ports in NFN Operator - Adding grpc client in nfn agent to get mac and IP address for node interface - Adding feature to create Node interface with OVS internal port - Make sure pod controller requeue the pod request for empty node field in pod spec - Unique node interface name using SHA and maintain 15 charactor for OVS switch port - Adding SNAT for default interface in each node - Adding iptables modules for SNAT rules Signed-off-by: Kuralamudhan Ramakrishnan <kuralamudhan.ramakrishnan@intel.com> Change-Id: I6cfa36e45007e796eb651345f9f0751329defcf7
Diffstat (limited to 'cmd/ovn4nfvk8s-cni')
-rw-r--r--cmd/ovn4nfvk8s-cni/app/helper_linux.go63
1 files changed, 62 insertions, 1 deletions
diff --git a/cmd/ovn4nfvk8s-cni/app/helper_linux.go b/cmd/ovn4nfvk8s-cni/app/helper_linux.go
index 1702597..cfcd4e9 100644
--- a/cmd/ovn4nfvk8s-cni/app/helper_linux.go
+++ b/cmd/ovn4nfvk8s-cni/app/helper_linux.go
@@ -6,13 +6,15 @@ import (
"fmt"
"net"
"os/exec"
+ "ovn4nfv-k8s-plugin/internal/pkg/config"
+ "ovn4nfv-k8s-plugin/internal/pkg/network"
"strconv"
"strings"
- "github.com/sirupsen/logrus"
"github.com/containernetworking/cni/pkg/types/current"
"github.com/containernetworking/plugins/pkg/ip"
"github.com/containernetworking/plugins/pkg/ns"
+ "github.com/sirupsen/logrus"
"github.com/vishvananda/netlink"
)
@@ -35,6 +37,65 @@ func renameLink(curName, newName string) error {
return nil
}
+//Todo Comments
+func CreateNodeOVSInternalPort(nodeintfipaddr, nodeintfmacaddr, node string) error {
+ nodeName := strings.ToLower(node)
+ nodeOVSInternalIntfName := config.GetNodeIntfName(nodeName)
+
+ hwAddr, err := net.ParseMAC(nodeintfmacaddr)
+ if err != nil {
+ logrus.Errorf("Error is converting %q to net hwaddr: %v", nodeOVSInternalIntfName, err)
+ return fmt.Errorf("Error is converting %q to net hwaddr: %v", nodeOVSInternalIntfName, err)
+ }
+
+ ovsArgs := []string{
+ "add-port", "br-int", nodeOVSInternalIntfName, "--", "set",
+ "interface", nodeOVSInternalIntfName, "type=internal",
+ fmt.Sprintf("mac_in_use=%s", strings.ReplaceAll(hwAddr.String(), ":", "\\:")),
+ fmt.Sprintf("mac=%s", strings.ReplaceAll(hwAddr.String(), ":", "\\:")),
+ fmt.Sprintf("external_ids:iface-id=%s", nodeOVSInternalIntfName),
+ }
+ logrus.Infof("ovs-vsctl args - %v", ovsArgs)
+
+ //var out []byte
+ out, err := exec.Command("ovs-vsctl", ovsArgs...).CombinedOutput()
+ if err != nil {
+ logrus.Errorf("failure in creating Node OVS internal port - %s: %v - %q", nodeOVSInternalIntfName, err, string(out))
+ return fmt.Errorf("failure in creating Node OVS internal port - %s: %v - %q", nodeOVSInternalIntfName, err, string(out))
+ }
+ logrus.Infof("ovs-vsctl args - %v output:%v", ovsArgs, string(out))
+
+ link, err := netlink.LinkByName(nodeOVSInternalIntfName)
+ if err != nil {
+ logrus.Errorf("failed to get netlink for Node OVS internal port %s: %v", nodeOVSInternalIntfName, err)
+ return fmt.Errorf("failed to get netlink for Node OVS internal port %s: %v", nodeOVSInternalIntfName, err)
+ }
+
+ if err := netlink.LinkSetUp(link); err != nil {
+ logrus.Errorf("failed to set up netlink for Node OVS internal port %s: %v", nodeOVSInternalIntfName, err)
+ return fmt.Errorf("failed to set up netlink for Node OVS internal port %s: %v", nodeOVSInternalIntfName, err)
+ }
+
+ addr, err := netlink.ParseAddr(nodeintfipaddr)
+ if err != nil {
+ logrus.Errorf("failed to parse IP addr %s: %v", nodeintfipaddr, err)
+ return fmt.Errorf("failed to parse IP addr %s: %v", nodeintfipaddr, err)
+ }
+ err = netlink.AddrAdd(link, addr)
+ if err != nil {
+ logrus.Errorf("failed to parse IP addr %s: %v", nodeintfipaddr, err)
+ return fmt.Errorf("failed to add IP addr %s to %s: %v", nodeintfipaddr, nodeOVSInternalIntfName, err)
+ }
+
+ err = network.SetupAndEnsureIPTables(network.MasqRules(nodeOVSInternalIntfName))
+ if err != nil {
+ logrus.Errorf("failed to apply snat rule for %s: %v", nodeOVSInternalIntfName, err)
+ return fmt.Errorf("failed to apply snat rule for %s: %v", nodeOVSInternalIntfName, err)
+ }
+
+ return nil
+}
+
func setupInterface(netns ns.NetNS, containerID, ifName, macAddress, ipAddress, gatewayIP, defaultGateway string, idx, mtu int) (*current.Interface, *current.Interface, error) {
hostIface := &current.Interface{}
contIface := &current.Interface{}