From 6e040b722752ba214f74de6e6743685b06d7b4cd Mon Sep 17 00:00:00 2001
From: Fabian Seidl <fabian.b.seidl@stud.h-da.de>
Date: Fri, 22 Jul 2022 09:52:35 +0000
Subject: [PATCH] Resolve "Implement management component with automatic
 subscriptions to NEs"

See merge request danet/gosdn!358
---
 .gitignore                                    |  3 +-
 controller/config/gnmiSubscriptionConfig.go   | 48 +++++++++++++++++++
 .../configs/gNMISubscriptions.txt.example     |  2 +
 controller/controller.go                      | 10 +++-
 4 files changed, 60 insertions(+), 3 deletions(-)
 create mode 100644 controller/config/gnmiSubscriptionConfig.go
 create mode 100644 controller/configs/gNMISubscriptions.txt.example

diff --git a/.gitignore b/.gitignore
index 159fd2d04..7dfe9ba22 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,12 +23,13 @@ cli/gosdnc
 csbi/resources/csbi
 
 # controller
+controller/config/*_test.toml
 controller/configs/testing-gosdn.toml
 controller/configs/gosdn.toml
 controller/configs/development-gosdn.toml
 controller/configs/containerlab-gosdn.toml
-controller/config/*_test.toml
 controller/configs/ci-testing-gosdn.toml
+controller/configs/gNMISubscriptions.txt
 controller/stores_testing
 controller/stores/**
 controller/cmd/gosdn/stores/
diff --git a/controller/config/gnmiSubscriptionConfig.go b/controller/config/gnmiSubscriptionConfig.go
new file mode 100644
index 000000000..fa433e3d8
--- /dev/null
+++ b/controller/config/gnmiSubscriptionConfig.go
@@ -0,0 +1,48 @@
+package config
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+)
+
+const (
+	defaultGnmiSubscriptionFilePath = "controller/configs/gNMISubscriptions.txt"
+)
+
+var gnmiSubscriptionPaths [][]string
+
+// ReadGnmiSubscriptionPaths reads the paths the watcher should subscribe to provided in a file.
+func ReadGnmiSubscriptionPaths() error {
+	currentDir, err := os.Getwd()
+	if err != nil {
+		return err
+	}
+
+	filePath := filepath.Join(currentDir, defaultGnmiSubscriptionFilePath)
+
+	f, err := os.Open(filePath)
+	if err != nil {
+		return err
+	}
+
+	defer f.Close()
+
+	scanner := bufio.NewScanner(f)
+
+	for scanner.Scan() {
+		path := strings.Split(scanner.Text(), "/")
+		gnmiSubscriptionPaths = append(gnmiSubscriptionPaths, path)
+	}
+
+	fmt.Println(gnmiSubscriptionPaths)
+
+	return nil
+}
+
+// GetGnmiSubscriptionPaths returns the paths the watcher should subscribe to.
+func GetGnmiSubscriptionPaths() [][]string {
+	return gnmiSubscriptionPaths
+}
diff --git a/controller/configs/gNMISubscriptions.txt.example b/controller/configs/gNMISubscriptions.txt.example
new file mode 100644
index 000000000..46b4f0456
--- /dev/null
+++ b/controller/configs/gNMISubscriptions.txt.example
@@ -0,0 +1,2 @@
+system/config/hostname
+system/config/domain-name
diff --git a/controller/controller.go b/controller/controller.go
index 7b48477b1..d2f9f454c 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -74,6 +74,11 @@ func initialize() error {
 		return err
 	}
 
+	err = config.ReadGnmiSubscriptionPaths()
+	if err != nil {
+		log.Error("Error reading in gNMI subscription paths, can not watch devices automatically: ", err)
+	}
+
 	eventService, err := eventservice.NewEventService()
 	if err != nil {
 		return err
@@ -107,8 +112,9 @@ func initialize() error {
 	}
 
 	c.deviceWatcher = nucleus.NewDeviceWatcher(c.pndStore)
-	// TODO: udpate with actual paths to subscribe to using template/config
-	c.deviceWatcher.SubToDevices([][]string{{"system", "config", "hostname"}}, nil)
+	// TODO: udpate with actual paths to subscribe when using template/config
+	fmt.Println(config.GetGnmiSubscriptionPaths())
+	c.deviceWatcher.SubToDevices(config.GetGnmiSubscriptionPaths(), nil)
 
 	err = ensureDefaultRoleExists()
 	if err != nil {
-- 
GitLab