From b371bd9d7188f12afae09a660b3e55104b23362f Mon Sep 17 00:00:00 2001
From: Alejandro Tjaarda <alexdecb@yahoo.es>
Date: Wed, 7 Aug 2024 15:36:41 +0000
Subject: [PATCH] switches: updated image so it can work with the overlay crd
 and automates the setup of vxlans

---
 build/build_images.sh                         |  2 +-
 .../config/dev/webhookcainjection_patch.yaml  |  2 +-
 .../config/samples/l2sm_v1_overlay.yaml       | 14 +++-
 .../internal/controller/overlay_controller.go | 23 +++++++
 src/switch/cmd/l2sm-vxlans/main.go            | 68 +++++++++++--------
 src/switch/setup_switch.sh                    |  5 +-
 6 files changed, 83 insertions(+), 31 deletions(-)

diff --git a/build/build_images.sh b/build/build_images.sh
index 1a3fd6f..00136bf 100755
--- a/build/build_images.sh
+++ b/build/build_images.sh
@@ -2,7 +2,7 @@
 set -e
 
 # Set environment variables
-export VERSION="2.5"
+export VERSION="2.6"
 export DOCKERHUB_REPO="alexdecb"
 
 # Function to build image
diff --git a/src/kubernetes-api/config/dev/webhookcainjection_patch.yaml b/src/kubernetes-api/config/dev/webhookcainjection_patch.yaml
index 8a9f00f..c21a924 100644
--- a/src/kubernetes-api/config/dev/webhookcainjection_patch.yaml
+++ b/src/kubernetes-api/config/dev/webhookcainjection_patch.yaml
@@ -13,7 +13,7 @@ webhooks:
   - name: mpod.kb.io
     clientConfig:
       url: https://10.0.2.4:9443/mutate-v1-pod
-      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURIVENDQWdXZ0F3SUJBZ0lVU1hpQm41YVR3TGgyWXZKQWZtWGNiZ25tNVlZd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dERVdNQlFHQTFVRUF3d05iRzlqWVd3dGQyVmlhRzl2YXpBZUZ3MHlOREE0TURZd09EVTRNVE5hRncweQpOVEE0TURZd09EVTRNVE5hTUJneEZqQVVCZ05WQkFNTURXeHZZMkZzTFhkbFltaHZiMnN3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0QmFjb05ISDBwanQ4dkJjS3NxUHVBaHVtV21VMnkzNloKdFhjMGtOVHpOL2Nqekhpc1JIZ2crQVdVaHJ6bllUOGZ2clNlQU9nODhuS2RrMG8wZGJ6aXR5d09vdmJOeG5jbApnU3crRlZKQlprN0tYWTRtN1RzTkxDbXh4RE0vZjN6Rm93NGRKU2dBbzBCOWdZUy9XQnc3WHF2VHdROEdBRUhxCm9WUkluaXoxdW5LVWg1YkluNzNsRk5aMTIzVDI1cERtRGxIWU1lcjZORTdhL3BGZE5LZi9IQUlHYVBCT3FWeTgKaWNTM2pKRjV6V2w2NllNWHNFM2xwa2VORm9ZN3JsYmRFbm5rYUhmL2d3Uk9aNmtRSzFSTG14RUN5akVuaXRiRgpyYkhOU1R6ZWIyYXg1bVkvM3hDWnJKSkd2SmdLdm9UU0JpbmVqWVNHQjJVVElHaE1ROUV4QWdNQkFBR2pYekJkCk1EWUdBMVVkRVFRdk1DMkhCSDhBQUFHSEJBb0FBZ1NDQ1d4dlkyRnNhRzl6ZElJVWQyVmlhRzl2YXkxelpYSjIKWlhJdWJHOWpZV3d3RGdZRFZSMFBBUUgvQkFRREFnV2dNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUZCd01CTUEwRwpDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ2lxNFpMQVVkQ1Z6ajBOUU1ncUkyZEs5YzNEc1IyejUxNjF5ZTMxakR1CkpBV0RNQjFnc2NnTmt0M2JnbGdGZVpQbjZxZHF4VHBVdk1ZUDRSQzR4S25paEQxcm1CMStMOU9oQTdmbGVuTUYKdllaMHVVdnhKdjdMYkdwOVhYMUxFZFFPUWZwd1l6cmVrU25Bci9iYXF4ME1UZDNGZkNpZ205WTJDYjFORVRPMwpUYTBaRS91amNVb2s5cHpJWVdybWxhVDN2SkE1OWZkbXZzcE9Ed3VnbUdQVkRGMzVCZ09MTDg0dnFPb2gvOUM1CjFyN1ZOcFFKcnBoMG8zVTNHcGxQbE9wa1JjRkZFR3Q4MHcrL2pzcUNNamJ3NkpiTWtEL3NmUlFrQ3lwTjhaa2wKTWdhbVRTeDVBcWgrOWZoU1Zudy9HN0RNdTZ4UFQ2M3J4U3R5RDVNenVqMVgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
+      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURIVENDQWdXZ0F3SUJBZ0lVZHFYNk14MmU5dmVvZlFjV0hRWEZhaDA4ajJjd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dERVdNQlFHQTFVRUF3d05iRzlqWVd3dGQyVmlhRzl2YXpBZUZ3MHlOREE0TURjeE1UVTVNekZhRncweQpOVEE0TURjeE1UVTVNekZhTUJneEZqQVVCZ05WQkFNTURXeHZZMkZzTFhkbFltaHZiMnN3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURjc3ppcVZPNmF3UUo2SVREbk90a1pFS1NEVFdrWEFVZDEKaU9kQUo5Q24rZVZjdlAxNGhjVTU0ejZ5NXJwWXRVbXJDMlpZVUlhelViZzFDUXBQb253Q2RaSnlpT0FCNVppQwp4RmxWdk0yUmtvK0xoYzRIU080Yis0VUlDc0M4eUlrSDlKTTM1b2E0WVh2dmJGaFZicUFvejUxK2VianJwaDBkCmk0TGhJVHFuSnp1cXVCSnJUOTRTeTJvalVSSUlIQzdHdG9aNUlpRWVlZGkrRFNlZkt4WFhlL0dzT2xYV3VyVFUKVTg2b1BleTFIUlpSZXJaWG9hNHdSeDVqVkxidFNoL0JhYXVueFV1OHFJcVBFdFQ4aXZkdHhJRmc1NFN5UFl0ZApYZnRsNTFTa3pHRDh4UXRrMkEwZGZPeTFCdVBoK1NZcTc2SDhhUnZRVGlrZ3R0VS92TEVCQWdNQkFBR2pYekJkCk1EWUdBMVVkRVFRdk1DMkhCSDhBQUFHSEJBb0FBZ1NDQ1d4dlkyRnNhRzl6ZElJVWQyVmlhRzl2YXkxelpYSjIKWlhJdWJHOWpZV3d3RGdZRFZSMFBBUUgvQkFRREFnV2dNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUZCd01CTUEwRwpDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ3VPa2IvSStaQkUxNHBYSjhTUi9oNlk2VVRhTlpEVmpRMCtkSHV5aGFVCmZCRVRNMWZDYUpiQ2tmaGNtZEFvTGY0MzJUczBERmY4QTVybGlMTmQybGJodHFEclQxRGZUY1MwWkoxRTBIeHgKU1E3aDVZcjZvSk1mL2pDbWtheUZZSzh5RUlEdUo4Qmxmek1iVGlZL2Z2WHU1SHlvVi9uWkYzT2REM1pFWWtyTApVb3NsNEgzY1Z3WHVta3BDUjN0dDVvd3FvQnI5UUMyOEJvTjRxTDhqdWhvTCtZNTcyMUFKUExBYnRRZXRxWmFYClJEOXdLYW9BTFdLVFZIUzNiVWk2Y3JOK2RuV01YemtzNnBwNVNHYXk4K3czbFJOQnV0U3dpRWFHU202V092SGkKdXBOc2FxVEMrVGZHMXNzZ3c0cHR4WElrR2RoZ3ZUYnRZMTF5Ylh3eVdpcjMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
     rules:
       - operations: [ "CREATE", "UPDATE" ]
         apiGroups: [""]
diff --git a/src/kubernetes-api/config/samples/l2sm_v1_overlay.yaml b/src/kubernetes-api/config/samples/l2sm_v1_overlay.yaml
index 7482d8a..9186d38 100644
--- a/src/kubernetes-api/config/samples/l2sm_v1_overlay.yaml
+++ b/src/kubernetes-api/config/samples/l2sm_v1_overlay.yaml
@@ -23,7 +23,19 @@ spec:
     spec:
       containers:
         - name: l2sm-switch
-          image: alexdecb/l2sm-switch:2.5
+          image: alexdecb/l2sm-switch:2.6
           resources: {}
+          env:
+          - name: NODENAME
+            valueFrom:
+              fieldRef:
+                fieldPath: spec.nodeName
+          - name: NVETHS
+            value: "10"  
+          - name: CONTROLLERIP
+            value: "l2sm-controller-service"
+          securityContext:
+            capabilities:
+              add: ["NET_ADMIN"]
           ports:
             - containerPort: 80
diff --git a/src/kubernetes-api/internal/controller/overlay_controller.go b/src/kubernetes-api/internal/controller/overlay_controller.go
index c033dce..da2ac7c 100644
--- a/src/kubernetes-api/internal/controller/overlay_controller.go
+++ b/src/kubernetes-api/internal/controller/overlay_controller.go
@@ -286,6 +286,29 @@ func (r *OverlayReconciler) createExternalResources(ctx context.Context, overlay
 							Labels: map[string]string{
 								"app": name,
 							},
+							Annotations: map[string]string{
+								"k8s.v1.cni.cncf.io/networks": `[{
+									"name": "veth1", "ips": ["fe80::58d0:b8ff:fe42:debf/64"]
+								}, {
+									"name": "veth2", "ips": ["fe80::58d0:b8ff:fe42:debe/64"]
+								}, {
+									"name": "veth3", "ips": ["fe80::58d0:b8ff:fe42:debd/64"]
+								}, {
+									"name": "veth4", "ips": ["fe80::58d0:b8ff:fe42:debc/64"]
+								}, {
+									"name": "veth5", "ips": ["fe80::58d0:b8ff:fe42:debb/64"]
+								}, {
+									"name": "veth6", "ips": ["fe80::58d0:b8ff:fe42:deba/64"]
+								}, {
+									"name": "veth7", "ips": ["fe80::58d0:b8ff:fe42:deb9/64"]
+								}, {
+									"name": "veth8", "ips": ["fe80::58d0:b8ff:fe42:deb8/64"]
+								}, {
+									"name": "veth9", "ips": ["fe80::58d0:b8ff:fe42:deb7/64"]
+								}, {
+									"name": "veth10", "ips": ["fe80::58d0:b8ff:fe42:deb6/64"]
+								}]`,
+							},
 						},
 						Spec: corev1.PodSpec{
 							InitContainers: overlay.Spec.SwitchTemplate.Spec.InitContainers,
diff --git a/src/switch/cmd/l2sm-vxlans/main.go b/src/switch/cmd/l2sm-vxlans/main.go
index d7a4baf..016d243 100644
--- a/src/switch/cmd/l2sm-vxlans/main.go
+++ b/src/switch/cmd/l2sm-vxlans/main.go
@@ -5,6 +5,7 @@ import (
 	"errors"
 	"flag"
 	"fmt"
+	"net"
 	"os"
 	"ovs-switch/pkg/ovs"
 )
@@ -12,7 +13,7 @@ import (
 type Node struct {
 	Name          string   `json:"name"`
 	NodeIP        string   `json:"nodeIP"`
-	NeighborNodes []string `json:"neighborNodes"`
+	NeighborNodes []string `json:"neighborNodes,omitempty"`
 }
 
 type Link struct {
@@ -94,33 +95,45 @@ func takeArguments() (string, string, string, error) {
 	return configDir, *nodeName, *fileType, nil
 }
 
-/**
+/*
+*
 Example:
-{
-    "Nodes": [
-        {
-            "name": "l2sm1",
-            "nodeIP": "10.1.14.53"
-        },
-        {
-            "name": "l2sm2",
-            "nodeIP": "10.1.14.90"
-        }
-    ],
-    "Links": [
-        {
-            "endpointA": "l2sm1",
-            "endpointB": "l2sm2"
-        }
-    ]
-}
 
+	{
+	    "Nodes": [
+	        {
+	            "name": "l2sm1",
+	            "nodeIP": "10.1.14.53"
+	        },
+	        {
+	            "name": "l2sm2",
+	            "nodeIP": "10.1.14.90"
+	        }
+	    ],
+	    "Links": [
+	        {
+	            "endpointA": "l2sm1",
+	            "endpointB": "l2sm2"
+	        }
+	    ]
+	}
 */
 func createTopology(bridge ovs.Bridge, topology Topology, nodeName string) error {
 
 	nodeMap := make(map[string]string)
 	for _, node := range topology.Nodes {
-		nodeMap[node.Name] = node.NodeIP
+		var nodeIP string
+		if net.ParseIP(nodeIP) != nil {
+			nodeIP = node.NodeIP
+		} else {
+			ips, err := net.LookupHost(node.NodeIP)
+			if err != nil || len(ips) == 0 {
+				fmt.Printf("Failed to resolve %s\n", node.NodeIP)
+				continue
+			}
+			nodeIP = ips[0]
+		}
+		nodeMap[node.Name] = nodeIP
 	}
 
 	localIp := nodeMap[nodeName]
@@ -167,14 +180,15 @@ func readFile(configDir string, dataStruct interface{}) error {
 
 }
 
-/**
+/*
+*
 Example:
 
-        {
-            "Name": "l2sm1",
-            "nodeIP": "10.1.14.53",
-			"neighborNodes":["10.4.2.3","10.4.2.5"]
-		}
+	        {
+	            "Name": "l2sm1",
+	            "nodeIP": "10.1.14.53",
+				"neighborNodes":["10.4.2.3","10.4.2.5"]
+			}
 */
 func connectToNeighbors(bridge ovs.Bridge, node Node) error {
 	for vxlanNumber, neighborIp := range node.NeighborNodes {
diff --git a/src/switch/setup_switch.sh b/src/switch/setup_switch.sh
index c126f5d..5bc2dfe 100644
--- a/src/switch/setup_switch.sh
+++ b/src/switch/setup_switch.sh
@@ -8,5 +8,8 @@ ovs-vswitchd --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach
 
 l2sm-init --n_veths=$NVETHS --controller_ip=$CONTROLLERIP 
 
-#l2sm-vxlans --node_name=$NODENAME /etc/l2sm/switchConfig.json
+sleep 20
+
+l2sm-vxlans --node_name=$NODENAME /etc/l2sm/topology.json
+
 sleep infinity
-- 
GitLab