From df610e17b8a31a02dbfe6e1093b59df300f1387e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Sterba?= <andre.sterba@stud.h-da.de>
Date: Tue, 26 Sep 2023 08:02:22 +0200
Subject: [PATCH] Move models in dedicated package

---
 .../nucleus/databaseNetworkElementStore.go    |  3 +-
 controller/nucleus/initialise_test.go         |  5 +-
 controller/nucleus/{ => model}/change.go      |  2 +-
 controller/nucleus/{ => model}/change_test.go |  2 +-
 .../nucleus/{ => model}/gnmi_transport.go     |  2 +-
 .../{ => model}/gnmi_transport_test.go        | 73 ++++++++++++++++++-
 .../nucleus/{ => model}/networkElement.go     |  2 +-
 .../{ => model}/networkElement_test.go        |  2 +-
 controller/nucleus/{ => model}/plugin.go      |  2 +-
 controller/nucleus/{ => model}/plugin_test.go |  2 +-
 .../{ => model}/principalNetworkDomain.go     |  2 +-
 .../principalNetworkDomain_test.go            |  2 +-
 .../nucleus/{ => model}/restconf_transport.go |  2 +-
 .../{ => model}/restconf_transport_test.go    |  2 +-
 controller/nucleus/{ => model}/transport.go   |  2 +-
 .../nucleus/{ => model}/transport_test.go     |  2 +-
 .../networkElementFilesystemStore_test.go     | 19 ++---
 controller/nucleus/networkElementService.go   |  3 +-
 .../nucleus/networkElementService_test.go     |  3 +-
 controller/nucleus/pluginService.go           |  5 +-
 controller/nucleus/pndFilesystemStore.go      |  3 +-
 controller/nucleus/pndFilesystemStore_test.go | 15 ++--
 controller/nucleus/pndService.go              |  3 +-
 23 files changed, 118 insertions(+), 40 deletions(-)
 rename controller/nucleus/{ => model}/change.go (99%)
 rename controller/nucleus/{ => model}/change_test.go (99%)
 rename controller/nucleus/{ => model}/gnmi_transport.go (99%)
 rename controller/nucleus/{ => model}/gnmi_transport_test.go (82%)
 rename controller/nucleus/{ => model}/networkElement.go (99%)
 rename controller/nucleus/{ => model}/networkElement_test.go (99%)
 rename controller/nucleus/{ => model}/plugin.go (99%)
 rename controller/nucleus/{ => model}/plugin_test.go (99%)
 rename controller/nucleus/{ => model}/principalNetworkDomain.go (99%)
 rename controller/nucleus/{ => model}/principalNetworkDomain_test.go (99%)
 rename controller/nucleus/{ => model}/restconf_transport.go (98%)
 rename controller/nucleus/{ => model}/restconf_transport_test.go (99%)
 rename controller/nucleus/{ => model}/transport.go (98%)
 rename controller/nucleus/{ => model}/transport_test.go (99%)

diff --git a/controller/nucleus/databaseNetworkElementStore.go b/controller/nucleus/databaseNetworkElementStore.go
index be64919a6..ac23cbad7 100644
--- a/controller/nucleus/databaseNetworkElementStore.go
+++ b/controller/nucleus/databaseNetworkElementStore.go
@@ -6,6 +6,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
@@ -205,7 +206,7 @@ func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkeleme
 		// Important: You must pass sessCtx as the Context parameter to the operations for them to be executed in the
 		// transaction.
 
-		u, _ := networkElementToUpdate.(*CommonNetworkElement)
+		u, _ := networkElementToUpdate.(*model.CommonNetworkElement)
 		u.Metadata.ResourceVersion = u.Metadata.ResourceVersion + 1
 
 		update := bson.D{primitive.E{Key: "$set", Value: u}}
diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go
index ac99f9175..7b98e690a 100644
--- a/controller/nucleus/initialise_test.go
+++ b/controller/nucleus/initialise_test.go
@@ -12,6 +12,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto"
 	"code.fbi.h-da.de/danet/gosdn/controller/test"
 	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
@@ -82,8 +83,8 @@ func targetRunner() {
 	}
 }
 
-func mockTransport(t testing.TB) Gnmi {
-	return Gnmi{
+func mockTransport(t testing.TB) model.Gnmi {
+	return model.Gnmi{
 		SetNode:  mockPlugin(t).SetNode,
 		RespChan: make(chan *gpb.SubscribeResponse),
 		Options:  newGnmiTransportOptions(),
diff --git a/controller/nucleus/change.go b/controller/nucleus/model/change.go
similarity index 99%
rename from controller/nucleus/change.go
rename to controller/nucleus/model/change.go
index 0cdecdcc2..41f548287 100644
--- a/controller/nucleus/change.go
+++ b/controller/nucleus/model/change.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"context"
diff --git a/controller/nucleus/change_test.go b/controller/nucleus/model/change_test.go
similarity index 99%
rename from controller/nucleus/change_test.go
rename to controller/nucleus/model/change_test.go
index 994760ffb..fc7e8df1b 100644
--- a/controller/nucleus/change_test.go
+++ b/controller/nucleus/model/change_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 // import (
 // 	"context"
diff --git a/controller/nucleus/gnmi_transport.go b/controller/nucleus/model/gnmi_transport.go
similarity index 99%
rename from controller/nucleus/gnmi_transport.go
rename to controller/nucleus/model/gnmi_transport.go
index a51770d76..5676c6a50 100644
--- a/controller/nucleus/gnmi_transport.go
+++ b/controller/nucleus/model/gnmi_transport.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"context"
diff --git a/controller/nucleus/gnmi_transport_test.go b/controller/nucleus/model/gnmi_transport_test.go
similarity index 82%
rename from controller/nucleus/gnmi_transport_test.go
rename to controller/nucleus/model/gnmi_transport_test.go
index e7230b1af..afe276e7b 100644
--- a/controller/nucleus/gnmi_transport_test.go
+++ b/controller/nucleus/model/gnmi_transport_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"context"
@@ -7,7 +7,9 @@ import (
 	"testing"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/types"
+	"code.fbi.h-da.de/danet/gosdn/controller/test"
 
 	mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
@@ -16,12 +18,79 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
 	openconfig "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 	pluginSDK "code.fbi.h-da.de/danet/gosdn/plugins/sdk"
+	"github.com/google/uuid"
 	gpb "github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/ygot/ygot"
+	log "github.com/sirupsen/logrus"
 	"github.com/stretchr/testify/mock"
+	pb "google.golang.org/protobuf/proto"
 )
 
-// testSetupGnmi bootstraps tests for gnmi transport.
+var gnmiConfig *gnmi.Config
+var startGnmiTarget chan string
+var stopGnmiTarget chan bool
+
+var mockContext = mock.MatchedBy(func(ctx context.Context) bool { return true })
+
+var defaultPluginID = uuid.MustParse("b70c8425-68c7-4d4b-bb5e-5586572bd64b")
+
+var gnmiMessages = map[string]pb.Message{
+	"../test/proto/cap-resp-arista-ceos":                  &gpb.CapabilityResponse{},
+	"../test/proto/req-full-node":                         &gpb.GetRequest{},
+	"../test/proto/req-full-node-arista-ceos":             &gpb.GetRequest{},
+	"../test/proto/req-interfaces-arista-ceos":            &gpb.GetRequest{},
+	"../test/proto/req-interfaces-interface-arista-ceos":  &gpb.GetRequest{},
+	"../test/proto/req-interfaces-wildcard":               &gpb.GetRequest{},
+	"../test/proto/resp-full-node":                        &gpb.GetResponse{},
+	"../test/proto/resp-full-node-arista-ceos":            &gpb.GetResponse{},
+	"../test/proto/resp-interfaces-arista-ceos":           &gpb.GetResponse{},
+	"../test/proto/resp-interfaces-interface-arista-ceos": &gpb.GetResponse{},
+	"../test/proto/resp-interfaces-wildcard":              &gpb.GetResponse{},
+	"../test/proto/resp-set-system-config-hostname":       &gpb.SetResponse{},
+}
+
+func mockTransport(t testing.TB) Gnmi {
+	return Gnmi{
+		SetNode:  mockPlugin(t).SetNode,
+		RespChan: make(chan *gpb.SubscribeResponse),
+		Options:  newGnmiTransportOptions(),
+		client:   &mocks.GNMIClient{},
+		config:   gnmiConfig,
+	}
+}
+
+func mockPlugin(t testing.TB) plugin.Plugin {
+	mockPlugin := &mocks.Plugin{}
+	mockPlugin.On("ID").Return(defaultPluginID)
+	mockPlugin.On("Unmarshal", mock.Anything, mock.Anything).Return(nil)
+	mockPlugin.On("Model", mock.Anything).Return([]byte(
+		"{\n\t\"Acl\": null,\n\t\"Bfd\": null,\n\t\"Components\": null,\n\t\"Interfaces\": null,\n\t\"Keychains\": null,\n\t\"Lldp\": null,\n\t\"Messages\": null,\n\t\"NetworkInstances\": null,\n\t\"RoutingPolicy\": null,\n\t\"System\": null\n}"),
+		nil,
+	)
+	return mockPlugin
+}
+
+func newGnmiTransportOptions() *tpb.TransportOption {
+	return &tpb.TransportOption{
+		Address:  "localhost:13371",
+		Username: "test",
+		Password: "test",
+		TransportOption: &tpb.TransportOption_GnmiTransportOption{
+			GnmiTransportOption: &tpb.GnmiTransportOption{},
+		},
+	}
+}
+
+func targetRunner() {
+	for {
+		addr := <-startGnmiTarget
+		if err := test.GnmiTarget(stopGnmiTarget, addr); err != nil {
+			log.Fatal(err)
+		}
+	}
+}
+
+// TestSetupGnmi bootstraps tests for gnmi transport.
 func testSetupGnmi() {
 	// TODO: Set sane defaults
 	gnmiConfig = &gnmi.Config{
diff --git a/controller/nucleus/networkElement.go b/controller/nucleus/model/networkElement.go
similarity index 99%
rename from controller/nucleus/networkElement.go
rename to controller/nucleus/model/networkElement.go
index 365595301..5ad9b6054 100644
--- a/controller/nucleus/networkElement.go
+++ b/controller/nucleus/model/networkElement.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"encoding/json"
diff --git a/controller/nucleus/networkElement_test.go b/controller/nucleus/model/networkElement_test.go
similarity index 99%
rename from controller/nucleus/networkElement_test.go
rename to controller/nucleus/model/networkElement_test.go
index 6294cf07d..5e18ab37f 100644
--- a/controller/nucleus/networkElement_test.go
+++ b/controller/nucleus/model/networkElement_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 // import (
 // 	"reflect"
diff --git a/controller/nucleus/plugin.go b/controller/nucleus/model/plugin.go
similarity index 99%
rename from controller/nucleus/plugin.go
rename to controller/nucleus/model/plugin.go
index 032c30ed4..2fe4e0eaf 100644
--- a/controller/nucleus/plugin.go
+++ b/controller/nucleus/model/plugin.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"encoding/json"
diff --git a/controller/nucleus/plugin_test.go b/controller/nucleus/model/plugin_test.go
similarity index 99%
rename from controller/nucleus/plugin_test.go
rename to controller/nucleus/model/plugin_test.go
index 5a4619ae5..2887f91d2 100644
--- a/controller/nucleus/plugin_test.go
+++ b/controller/nucleus/model/plugin_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 //import (
 //	"testing"
diff --git a/controller/nucleus/principalNetworkDomain.go b/controller/nucleus/model/principalNetworkDomain.go
similarity index 99%
rename from controller/nucleus/principalNetworkDomain.go
rename to controller/nucleus/model/principalNetworkDomain.go
index b9577dead..dbb329107 100644
--- a/controller/nucleus/principalNetworkDomain.go
+++ b/controller/nucleus/model/principalNetworkDomain.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"go.mongodb.org/mongo-driver/bson"
diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/model/principalNetworkDomain_test.go
similarity index 99%
rename from controller/nucleus/principalNetworkDomain_test.go
rename to controller/nucleus/model/principalNetworkDomain_test.go
index 0ce34a5a0..6b9f4f5e3 100644
--- a/controller/nucleus/principalNetworkDomain_test.go
+++ b/controller/nucleus/model/principalNetworkDomain_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 // import (
 // 	"io"
diff --git a/controller/nucleus/restconf_transport.go b/controller/nucleus/model/restconf_transport.go
similarity index 98%
rename from controller/nucleus/restconf_transport.go
rename to controller/nucleus/model/restconf_transport.go
index 42a6b44f8..84fd34808 100644
--- a/controller/nucleus/restconf_transport.go
+++ b/controller/nucleus/model/restconf_transport.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"context"
diff --git a/controller/nucleus/restconf_transport_test.go b/controller/nucleus/model/restconf_transport_test.go
similarity index 99%
rename from controller/nucleus/restconf_transport_test.go
rename to controller/nucleus/model/restconf_transport_test.go
index e722632a7..c134ba1c5 100644
--- a/controller/nucleus/restconf_transport_test.go
+++ b/controller/nucleus/model/restconf_transport_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"context"
diff --git a/controller/nucleus/transport.go b/controller/nucleus/model/transport.go
similarity index 98%
rename from controller/nucleus/transport.go
rename to controller/nucleus/model/transport.go
index 1f4a6c3f3..699289309 100644
--- a/controller/nucleus/transport.go
+++ b/controller/nucleus/model/transport.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
diff --git a/controller/nucleus/transport_test.go b/controller/nucleus/model/transport_test.go
similarity index 99%
rename from controller/nucleus/transport_test.go
rename to controller/nucleus/model/transport_test.go
index 96768ff10..3c8d6e32c 100644
--- a/controller/nucleus/transport_test.go
+++ b/controller/nucleus/model/transport_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package model
 
 import (
 	"testing"
diff --git a/controller/nucleus/networkElementFilesystemStore_test.go b/controller/nucleus/networkElementFilesystemStore_test.go
index 5050219fd..eb83bd32d 100644
--- a/controller/nucleus/networkElementFilesystemStore_test.go
+++ b/controller/nucleus/networkElementFilesystemStore_test.go
@@ -7,6 +7,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/mock"
@@ -40,7 +41,7 @@ func TestAddNetworkElement(t *testing.T) {
 	plugin1.On("Model", mock.Anything).Return([]byte{}, nil)
 
 	networkElementStore := NewNetworkElementStore()
-	mne, _ := NewNetworkElement("testNetworkElement", mneID, &trop, defaultPndID, plugin1, conflict.Metadata{})
+	mne, _ := model.NewNetworkElement("testNetworkElement", mneID, &trop, defaultPndID, plugin1, conflict.Metadata{})
 
 	err := networkElementStore.Add(mne)
 	if err != nil {
@@ -63,12 +64,12 @@ func TestGetAllNetworkElements(t *testing.T) {
 
 	transportOptions := returnBasicTransportOption()
 
-	mne1, err := NewNetworkElement("testname", mneID1, &transportOptions, defaultPndID, plugin, conflict.Metadata{})
+	mne1, err := model.NewNetworkElement("testname", mneID1, &transportOptions, defaultPndID, plugin, conflict.Metadata{})
 	if err != nil {
 		t.Error(err)
 	}
 
-	mne2, err := NewNetworkElement("testname2", mneID2, &transportOptions, defaultPndID, plugin, conflict.Metadata{})
+	mne2, err := model.NewNetworkElement("testname2", mneID2, &transportOptions, defaultPndID, plugin, conflict.Metadata{})
 	if err != nil {
 		t.Error(err)
 	}
@@ -117,12 +118,12 @@ func TestGetNetworkElement(t *testing.T) {
 
 	trop := returnBasicTransportOption()
 
-	mne1, err := NewNetworkElement("testname", mneID1, &trop, defaultPndID, plugin, conflict.Metadata{})
+	mne1, err := model.NewNetworkElement("testname", mneID1, &trop, defaultPndID, plugin, conflict.Metadata{})
 	if err != nil {
 		t.Error(err)
 	}
 
-	mne2, err := NewNetworkElement("testname2", mneID2, &trop, defaultPndID, plugin, conflict.Metadata{})
+	mne2, err := model.NewNetworkElement("testname2", mneID2, &trop, defaultPndID, plugin, conflict.Metadata{})
 	if err != nil {
 		t.Error(err)
 	}
@@ -164,14 +165,14 @@ func TestUpdateNetworkElement(t *testing.T) {
 	plugin1.On("Model", mock.Anything).Return([]byte{}, nil)
 
 	networkElementStore := NewNetworkElementStore()
-	mne, _ := NewNetworkElement("testNetworkElement", mneID, &trop, defaultPndID, plugin1, conflict.Metadata{})
+	mne, _ := model.NewNetworkElement("testNetworkElement", mneID, &trop, defaultPndID, plugin1, conflict.Metadata{})
 
 	err := networkElementStore.Add(mne)
 	if err != nil {
 		t.Error(err)
 	}
 
-	mne, _ = NewNetworkElement(updatedNetworkElementName, mneID, &trop, defaultPndID, plugin1, conflict.Metadata{})
+	mne, _ = model.NewNetworkElement(updatedNetworkElementName, mneID, &trop, defaultPndID, plugin1, conflict.Metadata{})
 
 	err = networkElementStore.Update(mne)
 	if err != nil {
@@ -206,12 +207,12 @@ func TestDeleteNetworkElement(t *testing.T) {
 
 	trop := returnBasicTransportOption()
 
-	mne1, err := NewNetworkElement("testname", mneID1, &trop, defaultPndID, plugin, conflict.Metadata{})
+	mne1, err := model.NewNetworkElement("testname", mneID1, &trop, defaultPndID, plugin, conflict.Metadata{})
 	if err != nil {
 		t.Error(err)
 	}
 
-	mne2, err := NewNetworkElement("testname2", mneID2, &trop, defaultPndID, plugin, conflict.Metadata{})
+	mne2, err := model.NewNetworkElement("testname2", mneID2, &trop, defaultPndID, plugin, conflict.Metadata{})
 	if err != nil {
 		t.Error(err)
 	}
diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/networkElementService.go
index 32736bdbb..6974d70b4 100644
--- a/controller/nucleus/networkElementService.go
+++ b/controller/nucleus/networkElementService.go
@@ -8,6 +8,7 @@ import (
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/openconfig/gnmi/proto/gnmi"
@@ -216,7 +217,7 @@ func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkEleme
 		return nil, err
 	}
 
-	mne, err := NewNetworkElement(
+	mne, err := model.NewNetworkElement(
 		loadedNetworkElement.Name,
 		uuid.MustParse(loadedNetworkElement.ID),
 		&tpb.TransportOption{
diff --git a/controller/nucleus/networkElementService_test.go b/controller/nucleus/networkElementService_test.go
index 1df0d17dc..0b0849693 100644
--- a/controller/nucleus/networkElementService_test.go
+++ b/controller/nucleus/networkElementService_test.go
@@ -8,6 +8,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/mock"
@@ -15,7 +16,7 @@ import (
 )
 
 func getMockNetworkElement(mneID uuid.UUID, plugin plugin.Plugin) (networkelement.NetworkElement, error) {
-	return &CommonNetworkElement{
+	return &model.CommonNetworkElement{
 		UUID:      mneID,
 		Plugin:    plugin,
 		transport: &mocks.Transport{},
diff --git a/controller/nucleus/pluginService.go b/controller/nucleus/pluginService.go
index ed7a7ab68..565d32a6a 100644
--- a/controller/nucleus/pluginService.go
+++ b/controller/nucleus/pluginService.go
@@ -16,6 +16,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/event"
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
@@ -119,7 +120,7 @@ func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin)
 	plugin, err := s.createPluginFromStoreFn(loadedPlugin)
 	if err != nil {
 		if errors.Is(err, hcplugin.ErrProcessNotFound) {
-			plugin, err = NewPlugin(uuid.MustParse(loadedPlugin.ID), loadedPlugin.ExecPath)
+			plugin, err = model.NewPlugin(uuid.MustParse(loadedPlugin.ID), loadedPlugin.ExecPath)
 			if err != nil {
 				return nil, err
 			}
@@ -162,7 +163,7 @@ func (s *PluginService) RequestPlugin(requestID uuid.UUID) (plugin.Plugin, error
 		}
 	}
 
-	plugin, err := NewPlugin(uuid.New(), path)
+	plugin, err := model.NewPlugin(uuid.New(), path)
 	if err != nil {
 		return nil, err
 	}
diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pndFilesystemStore.go
index 386fc025a..31c49239d 100644
--- a/controller/nucleus/pndFilesystemStore.go
+++ b/controller/nucleus/pndFilesystemStore.go
@@ -9,6 +9,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -58,7 +59,7 @@ func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, e
 	// }
 
 	for i, loadedPND := range loadedPnds {
-		newPnd := NewPND(
+		newPnd := model.NewPND(
 			uuid.MustParse(loadedPND.ID),
 			loadedPND.Name,
 			loadedPND.Description,
diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go
index e4a1e69dc..0ced4bf3e 100644
--- a/controller/nucleus/pndFilesystemStore_test.go
+++ b/controller/nucleus/pndFilesystemStore_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 )
@@ -15,7 +16,7 @@ func TestAddPnd(t *testing.T) {
 	pndStore := NewPndStore(pluginServiceMock)
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
-	pnd := NewPND(pndID, "testpnd", "test")
+	pnd := model.NewPND(pndID, "testpnd", "test")
 
 	err := pndStore.Add(pnd)
 
@@ -31,8 +32,8 @@ func TestGetAllPnds(t *testing.T) {
 	pndStore := NewPndStore(pluginServiceMock)
 	pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	pndID2, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bab")
-	pnd1 := NewPND(pndID1, "testpnd", "test")
-	pnd2 := NewPND(pndID2, "testpnd2", "test")
+	pnd1 := model.NewPND(pndID1, "testpnd", "test")
+	pnd2 := model.NewPND(pndID2, "testpnd2", "test")
 
 	inputPnds := [2]networkdomain.NetworkDomain{pnd1, pnd2}
 
@@ -68,8 +69,8 @@ func TestGetPnd(t *testing.T) {
 	pndStore := NewPndStore(pluginServiceMock)
 	pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	pndID2, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bab")
-	pnd1 := NewPND(pndID1, "testpnd", "test")
-	pnd2 := NewPND(pndID2, "testpnd2", "test")
+	pnd1 := model.NewPND(pndID1, "testpnd", "test")
+	pnd2 := model.NewPND(pndID2, "testpnd2", "test")
 
 	inputPnds := [2]networkdomain.NetworkDomain{pnd1, pnd2}
 
@@ -103,8 +104,8 @@ func TestDeletePnd(t *testing.T) {
 	pndStore := NewPndStore(pluginServiceMock)
 	pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	pndID2, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bab")
-	pnd1 := NewPND(pndID1, "testpnd", "test")
-	pnd2 := NewPND(pndID2, "testpnd2", "test")
+	pnd1 := model.NewPND(pndID1, "testpnd", "test")
+	pnd2 := model.NewPND(pndID2, "testpnd2", "test")
 
 	inputPnds := [2]networkdomain.NetworkDomain{pnd1, pnd2}
 
diff --git a/controller/nucleus/pndService.go b/controller/nucleus/pndService.go
index fc2124a87..a35a6eff4 100644
--- a/controller/nucleus/pndService.go
+++ b/controller/nucleus/pndService.go
@@ -2,6 +2,7 @@ package nucleus
 
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 )
@@ -67,5 +68,5 @@ func (p *PndService) GetAll() ([]networkdomain.NetworkDomain, error) {
 }
 
 func (p *PndService) createPndFromStore(loadedPnd networkdomain.LoadedPnd) networkdomain.NetworkDomain {
-	return NewPND(uuid.MustParse(loadedPnd.ID), loadedPnd.Name, loadedPnd.Description)
+	return model.NewPND(uuid.MustParse(loadedPnd.ID), loadedPnd.Name, loadedPnd.Description)
 }
-- 
GitLab