From fa36c3843294722844aab12323fe93ad9b5904c4 Mon Sep 17 00:00:00 2001
From: Fabian Seidl <fabian.seidl@h-da.de>
Date: Tue, 20 Dec 2022 15:46:49 +0000
Subject: [PATCH] added values to event, removed writing to storage on update

---
 controller/event/event.go                   | 18 ++++++++---------
 controller/event/event_test.go              | 20 +++++++++----------
 controller/nucleus/networkElementService.go |  8 ++++----
 controller/nucleus/networkElementWatcher.go | 22 +++++++++++++--------
 4 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/controller/event/event.go b/controller/event/event.go
index 8eb6cf8d5..df39d2b9a 100644
--- a/controller/event/event.go
+++ b/controller/event/event.go
@@ -4,10 +4,10 @@ import "github.com/google/uuid"
 
 // Event is a event that can be published via the event service as payload.
 type Event struct {
-	ID       uuid.UUID `json:"id,omitempty"`
-	EntityID uuid.UUID `json:"entity_id,omitempty"`
-	Type     string    `json:"type,omitempty"`
-	Paths    []string  `json:"paths,omitempty"`
+	ID                uuid.UUID         `json:"id,omitempty"`
+	EntityID          uuid.UUID         `json:"entity_id,omitempty"`
+	Type              string            `json:"type,omitempty"`
+	PathsAndValuesMap map[string]string `json:"paths_and_values,omitempty"`
 }
 
 const (
@@ -49,11 +49,11 @@ func NewUpdateEvent(entityID uuid.UUID) Event {
 }
 
 // NewMneUpdateEvent creates a new update event for managed network elements.
-func NewMneUpdateEvent(entityID uuid.UUID, paths []string) Event {
+func NewMneUpdateEvent(entityID uuid.UUID, pathsAndValues map[string]string) Event {
 	return Event{
-		ID:       uuid.New(),
-		EntityID: entityID,
-		Type:     TypeUpdate,
-		Paths:    paths,
+		ID:                uuid.New(),
+		EntityID:          entityID,
+		Type:              TypeUpdate,
+		PathsAndValuesMap: pathsAndValues,
 	}
 }
diff --git a/controller/event/event_test.go b/controller/event/event_test.go
index 96f4a32a8..9150bf0a2 100644
--- a/controller/event/event_test.go
+++ b/controller/event/event_test.go
@@ -123,8 +123,8 @@ func TestNewUpdateEvent(t *testing.T) {
 
 func TestNewMneUpdateEvent(t *testing.T) {
 	type args struct {
-		entityID uuid.UUID
-		paths    []string
+		entityID          uuid.UUID
+		pathsAndValuesMap map[string]string
 	}
 	tests := []struct {
 		name string
@@ -134,20 +134,20 @@ func TestNewMneUpdateEvent(t *testing.T) {
 		{
 			name: "should create a new update event",
 			args: args{
-				entityID: getTestEntityUUID(),
-				paths:    []string{"some/random/path"},
+				entityID:          getTestEntityUUID(),
+				pathsAndValuesMap: map[string]string{"some/random/path": "val"},
 			},
 			want: Event{
-				ID:       uuid.New(),
-				EntityID: getTestEntityUUID(),
-				Type:     TypeUpdate,
-				Paths:    []string{"some/random/path"},
+				ID:                uuid.New(),
+				EntityID:          getTestEntityUUID(),
+				Type:              TypeUpdate,
+				PathsAndValuesMap: map[string]string{"some/random/path": "val"},
 			},
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got := NewMneUpdateEvent(tt.args.entityID, tt.args.paths)
+			got := NewMneUpdateEvent(tt.args.entityID, tt.args.pathsAndValuesMap)
 
 			if !reflect.DeepEqual(got.EntityID, tt.want.EntityID) {
 				t.Errorf("NewMneUpdateEvent().EntityID = %v, want %v", got, tt.want)
@@ -157,7 +157,7 @@ func TestNewMneUpdateEvent(t *testing.T) {
 				t.Errorf("NewMneUpdateEvent().Type = %v, want %v", got, tt.want)
 			}
 
-			if !reflect.DeepEqual(got.Paths, tt.want.Paths) {
+			if !reflect.DeepEqual(got.PathsAndValuesMap, tt.want.PathsAndValuesMap) {
 				t.Errorf("NewMneUpdateEvent().Type = %v, want %v", got, tt.want)
 			}
 		})
diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/networkElementService.go
index b6c0979b3..a41cdc351 100644
--- a/controller/nucleus/networkElementService.go
+++ b/controller/nucleus/networkElementService.go
@@ -137,8 +137,8 @@ func (s *NetworkElementService) UpdateModel(networkElementToUpdate networkelemen
 		return err
 	}
 
-	// TODO (faseid): check if we want to add the paths here instead of empty string array!
-	pubEvent := event.NewMneUpdateEvent(networkElementToUpdate.ID(), []string{})
+	// TODO (faseid): check if we want to add the paths here instead of empty map!
+	pubEvent := event.NewMneUpdateEvent(networkElementToUpdate.ID(), map[string]string{})
 	if err := s.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			s.eventService.Reconnect()
@@ -160,8 +160,8 @@ func (s *NetworkElementService) Update(networkElementToUpdate networkelement.Net
 		return err
 	}
 
-	// TODO (faseid): check if we want to add the paths here instead of empty string array!
-	pubEvent := event.NewMneUpdateEvent(networkElementToUpdate.ID(), []string{})
+	// TODO (faseid): check if we want to add the paths here instead of empty map!
+	pubEvent := event.NewMneUpdateEvent(networkElementToUpdate.ID(), map[string]string{})
 	if err := s.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			s.eventService.Reconnect()
diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go
index 5cb76b0a8..af72cb625 100644
--- a/controller/nucleus/networkElementWatcher.go
+++ b/controller/nucleus/networkElementWatcher.go
@@ -3,6 +3,7 @@ package nucleus
 import (
 	"context"
 	"fmt"
+	"strings"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/event"
@@ -164,19 +165,24 @@ func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.Subscrib
 	err = mne.Transport().ProcessControlPlaneSubscribeResponse(resp, mne.GetModel(), mne.SBI().Schema())
 	if err != nil {
 		log.Error(err)
-	} // else {
-	// 	if err := pnd.UpdateNetworkElementAfterSubscribeResponse(mne); err != nil {
-	// 		log.Error(err)
-	// 	}
-	// }
+	}
 
-	paths := []string{}
+	pathsAndValues := make(map[string]string, 0)
 
 	for _, update := range resp.Update.Update {
-		paths = append(paths, update.String())
+		pathString := ""
+
+		// go through elem to build full path
+		for _, elem := range update.Path.Elem {
+			// remove unwanted parts of path string example: "name:\"system\"" -> "system"
+			filteredElem := elem.String()[strings.Index(elem.String(), ":\"")+2 : len(elem.String())-1]
+			pathString += filteredElem + "/"
+		}
+
+		pathsAndValues[pathString] = update.Val.GetStringVal()
 	}
 
-	pubEvent := event.NewMneUpdateEvent(mne.ID(), paths)
+	pubEvent := event.NewMneUpdateEvent(mne.ID(), pathsAndValues)
 	if err := n.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			n.eventService.Reconnect()
-- 
GitLab