From 6ab9121c66e365d3af03521ab61d9071ea0f87fb Mon Sep 17 00:00:00 2001
From: Neil-Jocelyn Schark <neil-jocelyn.schark@stud.h-da.de>
Date: Fri, 11 Jun 2021 09:16:40 +0000
Subject: [PATCH] Resolve "Improve test environment to use seperate ceos
 instance for each pipeline"

---
 build/ci/.golangci-config/.golangci.yml |  2 +-
 build/ci/.terraform-ci.yml              |  4 +++-
 build/ci/.test.yml                      |  4 ++++
 build/ci/generate_port.sh               | 14 ++++++++++++++
 build/ci/generate_port2.sh              | 14 ++++++++++++++
 test/integration/cmdIntegration_test.go | 25 +++++++++++++++++--------
 test/terraform/containers.tf            |  6 +++++-
 test/terraform/main.tf                  |  1 +
 test/terraform/networks.tf              | 15 ---------------
 test/terraform/resources.tf             |  2 +-
 10 files changed, 60 insertions(+), 27 deletions(-)
 create mode 100755 build/ci/generate_port.sh
 create mode 100755 build/ci/generate_port2.sh
 delete mode 100644 test/terraform/networks.tf

diff --git a/build/ci/.golangci-config/.golangci.yml b/build/ci/.golangci-config/.golangci.yml
index 8238d1430..3492086f6 100644
--- a/build/ci/.golangci-config/.golangci.yml
+++ b/build/ci/.golangci-config/.golangci.yml
@@ -33,4 +33,4 @@ linters:
 issues:
   exclude-use-default: false
   max-issues-per-linter: 0
-  max-same-issues: 0
\ No newline at end of file
+  max-same-issues: 0
diff --git a/build/ci/.terraform-ci.yml b/build/ci/.terraform-ci.yml
index 6049f9d3f..e8377f940 100644
--- a/build/ci/.terraform-ci.yml
+++ b/build/ci/.terraform-ci.yml
@@ -4,7 +4,7 @@ variables:
   TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/integration
 
 cache:
-  key: integration
+  key: ${CI_PIPELINE_ID}
   paths:
     - ${TF_ROOT}/.terraform
 
@@ -13,6 +13,7 @@ cache:
   variables:
     CI_DEBUG_TRACE: "false"
   before_script:
+    - ./build/ci/generate_port2.sh $CI_PIPELINE_ID >> ${TF_ROOT}/port
     - cd ${TF_ROOT}
     - export TF_VAR_integration_username=terraform
     - export TF_VAR_integration_access_token=${TERRAFORM_API_TOKEN}
@@ -20,6 +21,7 @@ cache:
     - export TF_VAR_tls_key=${DOCKER_TLS_KEY}
     - export TF_VAR_tls_cert=${DOCKER_TLS_CERT}
     - export TF_VAR_tls_ca_cert=${DOCKER_TLS_CA}
+
   rules:
     - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
       variables:
diff --git a/build/ci/.test.yml b/build/ci/.test.yml
index e4209b3bb..461480c31 100644
--- a/build/ci/.test.yml
+++ b/build/ci/.test.yml
@@ -7,6 +7,8 @@ integration-test:
   variables:
     GOSDN_LOG: "nolog"
     GOSDN_TEST_API_ENDPOINT: http://gosdn-$CI_COMMIT_SHA.apps.ocp.fbi.h-da.de/api
+    GOSDN_TEST_ENDPOINT_IP: 141.100.70.171
+    GOSDN_CHANGE_TIMEOUT: "100ms"
   rules:
     - if: $CI_NIGHTLY
       when: delayed
@@ -19,6 +21,8 @@ integration-test:
       when: delayed
       start_in: 2 minutes
   script:
+    - ./build/ci/generate_port.sh $CI_PIPELINE_ID >> port
+    - export GOSDN_TEST_ENDPOINT_PORT=$(cat port)
     - go test -race ./test/integration -v -coverprofile=coverage.out
 
 .test: &test
diff --git a/build/ci/generate_port.sh b/build/ci/generate_port.sh
new file mode 100755
index 000000000..941a12843
--- /dev/null
+++ b/build/ci/generate_port.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+input=$1
+#trailing_backspace=$2
+
+hashed_value=$(echo $input | sha256sum | awk '{print $1}' )
+
+decimal_value=$((16#$hashed_value))
+decimal_value=${decimal_value/-/}
+
+port=$(((decimal_value % 10000)+50000))
+
+#echo -n $(($port*1))
+echo -n $port
\ No newline at end of file
diff --git a/build/ci/generate_port2.sh b/build/ci/generate_port2.sh
new file mode 100755
index 000000000..f8e1ca304
--- /dev/null
+++ b/build/ci/generate_port2.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+input=$1
+#trailing_backspace=$2
+
+hashed_value=$(echo $input | sha256sum | awk '{print $1}' )
+
+decimal_value=$((16#$hashed_value))
+decimal_value=${decimal_value/-/}
+
+port=$(((decimal_value % 10000)+50000))
+
+#echo -n $(($port*1))
+echo -n $port
\ No newline at end of file
diff --git a/test/integration/cmdIntegration_test.go b/test/integration/cmdIntegration_test.go
index ae3d20904..59a302901 100644
--- a/test/integration/cmdIntegration_test.go
+++ b/test/integration/cmdIntegration_test.go
@@ -1,24 +1,25 @@
 package integration
 
 import (
-	"os"
-	"testing"
-
 	tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport"
-
 	"code.fbi.h-da.de/cocsn/gosdn/api"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto"
+	"fmt"
 	guuid "github.com/google/uuid"
 	gpb "github.com/openconfig/gnmi/proto/gnmi"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
 	pb "google.golang.org/protobuf/proto"
+	"os"
+	"testing"
 )
 
 const unreachable = "203.0.113.10:6030"
 const testPath = "/system/config/hostname"
 
-var testAddress = "141.100.70.171:6030"
+var testIP = "141.100.70.171"
+var testPort = "6030"
+var testAddress = testIP + ":" + testPort
 var testAPIEndpoint = "http://gosdn-latest.apps.ocp.fbi.h-da.de/api"
 var testUsername = "admin"
 var testPassword = "arista"
@@ -34,11 +35,19 @@ func testSetupIntegration() {
 		log.SetLevel(log.PanicLevel)
 	}
 
-	a := os.Getenv("GOSDN_TEST_ENDPOINT")
+	a := os.Getenv("GOSDN_TEST_ENDPOINT_IP")
 	if a != "" {
-		testAddress = a
-		log.Infof("GOSDN_TEST_ENDPOINT set to %v", testAddress)
+		testIP = a
+		log.Infof("GOSDN_TEST_ENDPOINT_IP set to %v", testIP)
 	}
+	port := os.Getenv("GOSDN_TEST_ENDPOINT_PORT")
+	if port != "" {
+		testPort = port
+		log.Infof("GOSDN_TEST_ENDPOINT_PORT set to %v", testPort)
+	}
+	testAddress = testIP + ":" + testPort
+	fmt.Printf("Testadress: %s, Testport: %s, Port: %s", testAddress, testPort, port)
+
 	api := os.Getenv("GOSDN_TEST_API_ENDPOINT")
 	if api != "" {
 		testAPIEndpoint = api
diff --git a/test/terraform/containers.tf b/test/terraform/containers.tf
index 414932231..8f26aab32 100644
--- a/test/terraform/containers.tf
+++ b/test/terraform/containers.tf
@@ -15,6 +15,10 @@ resource "docker_container" "gosdn" {
   }
 }
 
+data "local_file" "port" {
+    filename = "port"
+}
+
 # create arista container
 # namespace is french cheeses
 resource "docker_container" "ceos" {
@@ -24,7 +28,7 @@ resource "docker_container" "ceos" {
 
   ports {
     internal = 6030
-    external = 6030
+    external = data.local_file.port.content
   }
 
   networks_advanced {
diff --git a/test/terraform/main.tf b/test/terraform/main.tf
index 1f2287663..a08c19bb6 100644
--- a/test/terraform/main.tf
+++ b/test/terraform/main.tf
@@ -1,6 +1,7 @@
 terraform {
   backend "http" {
   }
+  
   required_providers {
     docker = {
       source = "kreuzwerker/docker"
diff --git a/test/terraform/networks.tf b/test/terraform/networks.tf
deleted file mode 100644
index 2372a310a..000000000
--- a/test/terraform/networks.tf
+++ /dev/null
@@ -1,15 +0,0 @@
-resource "docker_network" "danet_legacy" {
-  name = "legacy-${random_id.server.hex}"
-
-  ipam_config {
-    subnet = "172.100.100.0/24"
-  }
-}
-
-resource "docker_network" "danet" {
-  name = "danet-${random_id.server.hex}"
-  ipv6 = true
-  ipam_config {
-    subnet = "fdfe::/64"
-  }
-}
\ No newline at end of file
diff --git a/test/terraform/resources.tf b/test/terraform/resources.tf
index 9659f2d94..d5f2938f3 100644
--- a/test/terraform/resources.tf
+++ b/test/terraform/resources.tf
@@ -1,3 +1,3 @@
 resource "random_id" "server" {
   byte_length = 8
-}
+}
\ No newline at end of file
-- 
GitLab