Skip to content
Snippets Groups Projects
Commit 63ab11b3 authored by S.H.'s avatar S.H.
Browse files

sdnconfig.go: Add sdnconfig structures based on json that is generated by

configurationManagementService. This is a better way of managing network
elements and topology than the structs in topology.go. Also added a
sdnconfig json file venv_sdnconfig_full.json that was retrieved by
filling the db via topology and network element services and then using
configurationManagementService to get the json data.
parent ed5c142f
No related branches found
No related tags found
No related merge requests found
Pipeline #263375 failed
Showing with 499 additions and 31 deletions
...@@ -69,11 +69,15 @@ func ClabConfigPath() (string, error) { ...@@ -69,11 +69,15 @@ func ClabConfigPath() (string, error) {
// Read file and parse into ClabConfig struct // Read file and parse into ClabConfig struct
// Only load gosdn environment: rabbitmq, mongodb, // Only load gosdn environment: rabbitmq, mongodb,
func LoadConfig(filename string) (*ClabConfig, error) { func LoadConfig(filename string) (*ClabConfig, error) {
absFilepath, err := filepath.Abs(filename) cwd, err := os.Getwd()
if err != nil { if err != nil {
return nil, fmt.Errorf("Failed to get absolute path: %w", err) return nil, fmt.Errorf("Failed to get working directory: %w", err)
} }
data, err := os.ReadFile(absFilepath) absFilename := filepath.Join(cwd, filename)
if err != nil {
return nil, fmt.Errorf("Error in LoadConfig(): %w", err)
}
data, err := os.ReadFile(absFilename)
if err != nil { if err != nil {
return nil, fmt.Errorf("Failed to read file: %w", err) return nil, fmt.Errorf("Failed to read file: %w", err)
} }
...@@ -83,7 +87,7 @@ func LoadConfig(filename string) (*ClabConfig, error) { ...@@ -83,7 +87,7 @@ func LoadConfig(filename string) (*ClabConfig, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("Failed to unmarshal YAML: %w", err) return nil, fmt.Errorf("Failed to unmarshal YAML: %w", err)
} }
fmt.Println("--- Successfully loaded file:", absFilepath, "----") fmt.Println("--- Successfully loaded clab file:", absFilename, "----")
return &clabconfig, nil return &clabconfig, nil
} }
......
basepnduuid = "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49e"
plugin-registry = "clab-gosdn_realnet-plugin-registry:55057"
help = false
plugin-folder = "plugins"
log-level = "debug"
socket = ":55055"
databaseConnection = "mongodb://root:example@clab-gosdn_realnet-mongodb:27017"
filesystemPathToStores = "stores"
gNMISubscriptionsPath = "configs/gNMISubscriptions.txt"
tlscertfile = '/ssl/certs/gosdn-selfsigned.crt'
tlskeyfile = '/ssl/private/gosdn-selfsigned.key'
tlscacertfile = '/ssl/ca.crt'
maxTokensPerUser = 100
amqpPrefix = "amqp://"
amqpUser = "guest"
amqpPassword = "guest"
amqpHost = "rabbitmq"
amqpPort = "5672"
basepnduuid = "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49e" basepnduuid = "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49e"
plugin-registry = "clab-gosdn_csbi_arista_base-TEST-TWIN-plugin-registry:55057" plugin-registry = "clab-gosdn_csbi_arista_base-TEST-TWIN-plugin-registry:55057"
plugin-registry = ""
help = false help = false
plugin-folder = "plugins" plugin-folder = "plugins"
log-level = "debug" log-level = "debug"
socket = ":55055" socket = ":55055"
databaseConnection = "mongodb://root:example@clab-gosdn_csbi_arista_base-TEST-TWIN-mongodb:27017" databaseConnection = "mongodb://root:example@clab-gosdn_csbi_arista_base-TEST-TWIN-mongodb:27017"
databaseConnection = ""
filesystemPathToStores = "stores" filesystemPathToStores = "stores"
gNMISubscriptionsPath = "configs/gNMISubscriptions.txt" gNMISubscriptionsPath = "configs/gNMISubscriptions.txt"
tlscertfile = '/ssl/certs/gosdn-selfsigned.crt' tlscertfile = '/ssl/certs/gosdn-selfsigned.crt'
......
...@@ -20,7 +20,7 @@ topology: ...@@ -20,7 +20,7 @@ topology:
- 55055:55055 - 55055:55055
- 8080:8080 - 8080:8080
- 40000:40000 - 40000:40000
cmd: --config /app/configs/containerlab-gosdn.toml cmd: --config /app/configs/containerlab-gosdn-realnet.toml
mgmt-ipv4: 172.100.0.5 mgmt-ipv4: 172.100.0.5
env: env:
GOSDN_ADMIN_PASSWORD: TestPassword GOSDN_ADMIN_PASSWORD: TestPassword
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
"nodes": null, "nodes": null,
"ports": null, "ports": null,
"links": null, "links": null,
"plugins": null, "plugins": ["d1c269a2-6482-4010-b0d8-679dff73153b"],
"networkelements": [ "networkelements": [
{ {
"id": "1dc7f8b1-d520-4926-b0af-65c143607211", "id": "1dc7f8b1-d520-4926-b0af-65c143607211",
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
"transport_username": "admin", "transport_username": "admin",
"transport_password": "admin", "transport_password": "admin",
"transport_tls": true, "transport_tls": true,
"plugin": "d8d40442-1461-47ad-b390-a9268ffd37d5", "plugin": "d1c269a2-6482-4010-b0d8-679dff73153b",
"model": "{\"openconfig-interfaces:interfaces\":{\"interface\":[{\"config\":{\"mtu\":1500,\"name\":\"eth0\"},\"name\":\"eth0\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":38,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"172.100.0.11\",\"prefix-length\":16},\"ip\":\"172.100.0.11\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8::9\",\"prefix-length\":64},\"ip\":\"2001:db8::9\"}]}}},{\"config\":{\"index\":1},\"index\":1,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::42:acff:fe64:b\",\"prefix-length\":64},\"ip\":\"fe80::42:acff:fe64:b\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth1\"},\"name\":\"eth1\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":43,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe97:91cd\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe97:91cd\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth2\"},\"name\":\"eth2\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":34,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe7a:f280\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe7a:f280\"}]}}}]}},{\"config\":{\"mtu\":0,\"name\":\"lo\"},\"name\":\"lo\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":1,\"loopback-mode\":true,\"oper-status\":\"UNKNOWN\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"127.0.0.1\",\"prefix-length\":8},\"ip\":\"127.0.0.1\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"::1\",\"prefix-length\":128},\"ip\":\"::1\"}]}}}]}}]},\"openconfig-network-instance:network-instances\":{\"network-instance\":[{\"config\":{\"name\":\"DEFAULT\"},\"name\":\"DEFAULT\",\"protocols\":{\"protocol\":[{\"config\":{\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\"},\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\",\"static-routes\":{\"static\":[{\"config\":{\"prefix\":\"0.0.0.0/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_172.100.0.1\",\"next-hop\":\"172.100.0.1\"},\"index\":\"AUTO_172.100.0.1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"0.0.0.0/0\"},{\"config\":{\"prefix\":\"::/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_2001:db8::1\",\"next-hop\":\"2001:db8::1\"},\"index\":\"AUTO_2001:db8::1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"::/0\"}]}}]}}]},\"openconfig-system:system\":{\"clock\":{\"config\":{\"timezone-name\":\"UTC\"}},\"config\":{\"domain-name\":\"Not.implemented.yet\",\"hostname\":\"gnmi-target-switch0\",\"motd-banner\":\"\\nThe programs included with the Debian GNU/Linux system are free software;\\nthe exact distribution terms for each program are described in the\\nindividual files in /usr/share/doc/*/copyright.\\n\\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\npermitted by applicable law.\\n\"},\"memory\":{\"state\":{\"free\":\"15256980\",\"physical\":\"32767208\",\"used\":\"17510228\"}},\"state\":{\"boot-time\":\"1738492544\",\"current-datetime\":\"2025-02-02T21:54:51Z\",\"software-version\":\"debian:12\"}}}", "model": "{\"openconfig-interfaces:interfaces\":{\"interface\":[{\"config\":{\"mtu\":1500,\"name\":\"eth0\"},\"name\":\"eth0\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":38,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"172.100.0.11\",\"prefix-length\":16},\"ip\":\"172.100.0.11\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8::9\",\"prefix-length\":64},\"ip\":\"2001:db8::9\"}]}}},{\"config\":{\"index\":1},\"index\":1,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::42:acff:fe64:b\",\"prefix-length\":64},\"ip\":\"fe80::42:acff:fe64:b\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth1\"},\"name\":\"eth1\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":43,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe97:91cd\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe97:91cd\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth2\"},\"name\":\"eth2\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":34,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe7a:f280\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe7a:f280\"}]}}}]}},{\"config\":{\"mtu\":0,\"name\":\"lo\"},\"name\":\"lo\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":1,\"loopback-mode\":true,\"oper-status\":\"UNKNOWN\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"127.0.0.1\",\"prefix-length\":8},\"ip\":\"127.0.0.1\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"::1\",\"prefix-length\":128},\"ip\":\"::1\"}]}}}]}}]},\"openconfig-network-instance:network-instances\":{\"network-instance\":[{\"config\":{\"name\":\"DEFAULT\"},\"name\":\"DEFAULT\",\"protocols\":{\"protocol\":[{\"config\":{\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\"},\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\",\"static-routes\":{\"static\":[{\"config\":{\"prefix\":\"0.0.0.0/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_172.100.0.1\",\"next-hop\":\"172.100.0.1\"},\"index\":\"AUTO_172.100.0.1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"0.0.0.0/0\"},{\"config\":{\"prefix\":\"::/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_2001:db8::1\",\"next-hop\":\"2001:db8::1\"},\"index\":\"AUTO_2001:db8::1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"::/0\"}]}}]}}]},\"openconfig-system:system\":{\"clock\":{\"config\":{\"timezone-name\":\"UTC\"}},\"config\":{\"domain-name\":\"Not.implemented.yet\",\"hostname\":\"gnmi-target-switch0\",\"motd-banner\":\"\\nThe programs included with the Debian GNU/Linux system are free software;\\nthe exact distribution terms for each program are described in the\\nindividual files in /usr/share/doc/*/copyright.\\n\\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\npermitted by applicable law.\\n\"},\"memory\":{\"state\":{\"free\":\"15256980\",\"physical\":\"32767208\",\"used\":\"17510228\"}},\"state\":{\"boot-time\":\"1738492544\",\"current-datetime\":\"2025-02-02T21:54:51Z\",\"software-version\":\"debian:12\"}}}",
"pnd_id": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49d" "pnd_id": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49d"
}, },
...@@ -25,9 +25,9 @@ ...@@ -25,9 +25,9 @@
"transport_username": "admin", "transport_username": "admin",
"transport_password": "admin", "transport_password": "admin",
"transport_tls": true, "transport_tls": true,
"plugin": "31a7ab2b-dbc6-43a3-a4bd-7af94047cfca", "plugin": "d1c269a2-6482-4010-b0d8-679dff73153b",
"model": "{\"openconfig-interfaces:interfaces\":{\"interface\":[{\"config\":{\"mtu\":1500,\"name\":\"eth0\"},\"name\":\"eth0\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":40,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"172.100.0.12\",\"prefix-length\":16},\"ip\":\"172.100.0.12\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8::a\",\"prefix-length\":64},\"ip\":\"2001:db8::a\"}]}}},{\"config\":{\"index\":1},\"index\":1,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::42:acff:fe64:c\",\"prefix-length\":64},\"ip\":\"fe80::42:acff:fe64:c\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth1\"},\"name\":\"eth1\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":42,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe34:e8d0\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe34:e8d0\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth2\"},\"name\":\"eth2\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":36,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe7c:d65f\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe7c:d65f\"}]}}}]}},{\"config\":{\"mtu\":0,\"name\":\"lo\"},\"name\":\"lo\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":1,\"loopback-mode\":true,\"oper-status\":\"UNKNOWN\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"127.0.0.1\",\"prefix-length\":8},\"ip\":\"127.0.0.1\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"::1\",\"prefix-length\":128},\"ip\":\"::1\"}]}}}]}}]},\"openconfig-network-instance:network-instances\":{\"network-instance\":[{\"config\":{\"name\":\"DEFAULT\"},\"name\":\"DEFAULT\",\"protocols\":{\"protocol\":[{\"config\":{\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\"},\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\",\"static-routes\":{\"static\":[{\"config\":{\"prefix\":\"0.0.0.0/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_172.100.0.1\",\"next-hop\":\"172.100.0.1\"},\"index\":\"AUTO_172.100.0.1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"0.0.0.0/0\"},{\"config\":{\"prefix\":\"::/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_2001:db8::1\",\"next-hop\":\"2001:db8::1\"},\"index\":\"AUTO_2001:db8::1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"::/0\"}]}}]}}]},\"openconfig-system:system\":{\"clock\":{\"config\":{\"timezone-name\":\"UTC\"}},\"config\":{\"domain-name\":\"Not.implemented.yet\",\"hostname\":\"gnmi-target-switch1\",\"motd-banner\":\"\\nThe programs included with the Debian GNU/Linux system are free software;\\nthe exact distribution terms for each program are described in the\\nindividual files in /usr/share/doc/*/copyright.\\n\\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\npermitted by applicable law.\\n\"},\"memory\":{\"state\":{\"free\":\"15256980\",\"physical\":\"32767208\",\"used\":\"17510228\"}},\"state\":{\"boot-time\":\"1738492544\",\"current-datetime\":\"2025-02-02T21:54:51Z\",\"software-version\":\"debian:12\"}}}", "model": "{\"openconfig-interfaces:interfaces\":{\"interface\":[{\"config\":{\"mtu\":1500,\"name\":\"eth0\"},\"name\":\"eth0\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":40,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"172.100.0.12\",\"prefix-length\":16},\"ip\":\"172.100.0.12\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8::a\",\"prefix-length\":64},\"ip\":\"2001:db8::a\"}]}}},{\"config\":{\"index\":1},\"index\":1,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::42:acff:fe64:c\",\"prefix-length\":64},\"ip\":\"fe80::42:acff:fe64:c\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth1\"},\"name\":\"eth1\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":42,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe34:e8d0\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe34:e8d0\"}]}}}]}},{\"config\":{\"mtu\":9500,\"name\":\"eth2\"},\"name\":\"eth2\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":36,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe7c:d65f\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe7c:d65f\"}]}}}]}},{\"config\":{\"mtu\":0,\"name\":\"lo\"},\"name\":\"lo\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":1,\"loopback-mode\":true,\"oper-status\":\"UNKNOWN\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"127.0.0.1\",\"prefix-length\":8},\"ip\":\"127.0.0.1\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"::1\",\"prefix-length\":128},\"ip\":\"::1\"}]}}}]}}]},\"openconfig-network-instance:network-instances\":{\"network-instance\":[{\"config\":{\"name\":\"DEFAULT\"},\"name\":\"DEFAULT\",\"protocols\":{\"protocol\":[{\"config\":{\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\"},\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\",\"static-routes\":{\"static\":[{\"config\":{\"prefix\":\"0.0.0.0/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_172.100.0.1\",\"next-hop\":\"172.100.0.1\"},\"index\":\"AUTO_172.100.0.1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"0.0.0.0/0\"},{\"config\":{\"prefix\":\"::/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_2001:db8::1\",\"next-hop\":\"2001:db8::1\"},\"index\":\"AUTO_2001:db8::1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"::/0\"}]}}]}}]},\"openconfig-system:system\":{\"clock\":{\"config\":{\"timezone-name\":\"UTC\"}},\"config\":{\"domain-name\":\"Not.implemented.yet\",\"hostname\":\"gnmi-target-switch1\",\"motd-banner\":\"\\nThe programs included with the Debian GNU/Linux system are free software;\\nthe exact distribution terms for each program are described in the\\nindividual files in /usr/share/doc/*/copyright.\\n\\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\npermitted by applicable law.\\n\"},\"memory\":{\"state\":{\"free\":\"15256980\",\"physical\":\"32767208\",\"used\":\"17510228\"}},\"state\":{\"boot-time\":\"1738492544\",\"current-datetime\":\"2025-02-02T21:54:51Z\",\"software-version\":\"debian:12\"}}}",
"pnd_id": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49d" "pnd_id": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49d"
} }
] ]
} }
\ No newline at end of file
{
"pndID": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49e",
"nodes": [
{
"ID": "db563e8d-0755-4df7-8458-56e3242b1cd4",
"Metadata": {
"created_at": "2025-02-23T17:36:31.67Z",
"last_updated": "2025-02-23T17:36:31.67Z"
},
"Name": "gnmi-target-switch0"
},
{
"ID": "f14ccc06-0143-4196-9aba-7812fae01d11",
"Metadata": {
"created_at": "2025-02-23T17:36:31.755Z",
"last_updated": "2025-02-23T17:36:31.755Z"
},
"Name": "gnmi-target-switch1"
},
{
"ID": "c1012f26-99ef-41d0-970b-4642012ebace",
"Metadata": {
"created_at": "2025-02-23T17:36:31.786Z",
"last_updated": "2025-02-23T17:36:31.786Z"
},
"Name": "centos0"
},
{
"ID": "15f1104a-26a7-49e9-ba57-9eed8720e3ad",
"Metadata": {
"created_at": "2025-02-23T17:36:31.789Z",
"last_updated": "2025-02-23T17:36:31.789Z"
},
"Name": "centos1"
}
],
"ports": [
{
"id": "1950bf78-2fe3-4e0f-a4a6-9c42c660fb36",
"name": "eth1",
"configuration": ""
},
{
"id": "b0338d9a-50e4-477f-bb30-18ad3c61302f",
"name": "eth1",
"configuration": ""
},
{
"id": "df55cdb4-aa55-495c-8e27-245e6ed6b806",
"name": "eth2",
"configuration": ""
},
{
"id": "505f067f-62a4-484e-9f06-673f668a1908",
"name": "eth1",
"configuration": ""
},
{
"id": "164c384d-7179-42c9-8c54-4d1ad148b7b8",
"name": "eth2",
"configuration": ""
},
{
"id": "b279ea32-fa61-4167-93aa-54afe45cfdb0",
"name": "eth1",
"configuration": ""
}
],
"links": [
{
"ID": "b482a038-6e38-4dc5-906b-fd31abdbb23e",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "gnmi-target-switch0:gnmi-target-switch1",
"SourceNode": {
"ID": "db563e8d-0755-4df7-8458-56e3242b1cd4",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "gnmi-target-switch0"
},
"SourcePort": {
"Configuration": {
"IP": "192.168.178.2",
"PrefixLength": 24
},
"ID": "1950bf78-2fe3-4e0f-a4a6-9c42c660fb36",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "eth1"
},
"TargetNode": {
"ID": "f14ccc06-0143-4196-9aba-7812fae01d11",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "gnmi-target-switch1"
},
"TargetPort": {
"Configuration": {
"IP": "192.168.178.3",
"PrefixLength": 24
},
"ID": "b0338d9a-50e4-477f-bb30-18ad3c61302f",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "eth1"
}
},
{
"ID": "0bee4805-4a96-4870-9b4a-c0742f58d3e8",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "gnmi-target-switch0:centos0",
"SourceNode": {
"ID": "db563e8d-0755-4df7-8458-56e3242b1cd4",
"Metadata": {
"created_at": "2025-02-23T17:36:31.67Z",
"last_updated": "2025-02-23T17:36:31.67Z"
},
"Name": "gnmi-target-switch0"
},
"SourcePort": {
"Configuration": {
"IP": "192.168.178.2",
"PrefixLength": 24
},
"ID": "df55cdb4-aa55-495c-8e27-245e6ed6b806",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "eth2"
},
"TargetNode": {
"ID": "c1012f26-99ef-41d0-970b-4642012ebace",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "centos0"
},
"TargetPort": {
"Configuration": {
"IP": "192.168.178.3",
"PrefixLength": 24
},
"ID": "505f067f-62a4-484e-9f06-673f668a1908",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "eth1"
}
},
{
"ID": "4fcd6017-dbf2-471b-bf03-42f73b993676",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "gnmi-target-switch1:centos1",
"SourceNode": {
"ID": "f14ccc06-0143-4196-9aba-7812fae01d11",
"Metadata": {
"created_at": "2025-02-23T17:36:31.755Z",
"last_updated": "2025-02-23T17:36:31.755Z"
},
"Name": "gnmi-target-switch1"
},
"SourcePort": {
"Configuration": {
"IP": "192.168.178.2",
"PrefixLength": 24
},
"ID": "164c384d-7179-42c9-8c54-4d1ad148b7b8",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "eth2"
},
"TargetNode": {
"ID": "15f1104a-26a7-49e9-ba57-9eed8720e3ad",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "centos1"
},
"TargetPort": {
"Configuration": {
"IP": "192.168.178.3",
"PrefixLength": 24
},
"ID": "b279ea32-fa61-4167-93aa-54afe45cfdb0",
"Metadata": {
"created_at": "0001-01-01T00:00:00Z",
"last_updated": "0001-01-01T00:00:00Z"
},
"Name": "eth1"
}
}
],
"plugins": null,
"networkelements": [
{
"id": "db563e8d-0755-4df7-8458-56e3242b1cd4",
"name": "gnmi-target-switch0",
"transport_type": "gnmi",
"transport_address": "172.100.0.11:7030",
"transport_username": "admin",
"transport_password": "admin",
"transport_tls": true,
"plugin": "78e5a86f-6ba8-4468-97b2-441afca0ebc2",
"model": "{\"openconfig-interfaces:interfaces\":{\"interface\":[{\"config\":{\"enabled\":true,\"mtu\":1500,\"name\":\"eth0\"},\"name\":\"eth0\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":689,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"172.100.0.11\",\"prefix-length\":16},\"ip\":\"172.100.0.11\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8::a\",\"prefix-length\":64},\"ip\":\"2001:db8::a\"}]}}},{\"config\":{\"index\":1},\"index\":1,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::42:acff:fe64:b\",\"prefix-length\":64},\"ip\":\"fe80::42:acff:fe64:b\"}]}}}]}},{\"config\":{\"enabled\":true,\"mtu\":9500,\"name\":\"eth1\"},\"name\":\"eth1\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":692,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fee9:fd3e\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fee9:fd3e\"}]}}}]}},{\"config\":{\"enabled\":true,\"mtu\":9500,\"name\":\"eth2\"},\"name\":\"eth2\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":683,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fec1:7e5e\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fec1:7e5e\"}]}}}]}},{\"config\":{\"enabled\":false,\"mtu\":0,\"name\":\"lo\"},\"name\":\"lo\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":1,\"loopback-mode\":true,\"oper-status\":\"UNKNOWN\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"127.0.0.1\",\"prefix-length\":8},\"ip\":\"127.0.0.1\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"::1\",\"prefix-length\":128},\"ip\":\"::1\"}]}}}]}}]},\"openconfig-network-instance:network-instances\":{\"network-instance\":[{\"config\":{\"name\":\"DEFAULT\"},\"name\":\"DEFAULT\",\"protocols\":{\"protocol\":[{\"config\":{\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\"},\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\",\"static-routes\":{\"static\":[{\"config\":{\"prefix\":\"0.0.0.0/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_172.100.0.1\",\"next-hop\":\"172.100.0.1\"},\"index\":\"AUTO_172.100.0.1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"0.0.0.0/0\"},{\"config\":{\"prefix\":\"::/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_2001:db8::1\",\"next-hop\":\"2001:db8::1\"},\"index\":\"AUTO_2001:db8::1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"::/0\"}]}}]}}]},\"openconfig-system:system\":{\"clock\":{\"config\":{\"timezone-name\":\"UTC\"}},\"config\":{\"domain-name\":\"Not.implemented.yet\",\"hostname\":\"gnmi-target-switch0\",\"motd-banner\":\"\\nThe programs included with the Debian GNU/Linux system are free software;\\nthe exact distribution terms for each program are described in the\\nindividual files in /usr/share/doc/*/copyright.\\n\\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\npermitted by applicable law.\\n\"},\"memory\":{\"state\":{\"free\":\"14843876\",\"physical\":\"32767196\",\"used\":\"17923320\"}},\"state\":{\"boot-time\":\"1740300792\",\"current-datetime\":\"2025-02-23T17:36:16Z\",\"software-version\":\"debian:12\"}}}",
"pnd_id": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49e"
},
{
"id": "f14ccc06-0143-4196-9aba-7812fae01d11",
"name": "gnmi-target-switch1",
"transport_type": "gnmi",
"transport_address": "172.100.0.12:7030",
"transport_username": "admin",
"transport_password": "admin",
"transport_tls": true,
"plugin": "caa55b54-570b-4dfc-90ec-c3eb0d6db03c",
"model": "{\"openconfig-interfaces:interfaces\":{\"interface\":[{\"config\":{\"enabled\":true,\"mtu\":1500,\"name\":\"eth0\"},\"name\":\"eth0\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":687,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"172.100.0.12\",\"prefix-length\":16},\"ip\":\"172.100.0.12\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8::9\",\"prefix-length\":64},\"ip\":\"2001:db8::9\"}]}}},{\"config\":{\"index\":1},\"index\":1,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::42:acff:fe64:c\",\"prefix-length\":64},\"ip\":\"fe80::42:acff:fe64:c\"}]}}}]}},{\"config\":{\"enabled\":true,\"mtu\":9500,\"name\":\"eth1\"},\"name\":\"eth1\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":691,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:feaa:12d1\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:feaa:12d1\"}]}}}]}},{\"config\":{\"enabled\":true,\"mtu\":9500,\"name\":\"eth2\"},\"name\":\"eth2\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":685,\"loopback-mode\":false,\"oper-status\":\"UP\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"fe80::a8c1:abff:fe0b:6be9\",\"prefix-length\":64},\"ip\":\"fe80::a8c1:abff:fe0b:6be9\"}]}}}]}},{\"config\":{\"enabled\":false,\"mtu\":0,\"name\":\"lo\"},\"name\":\"lo\",\"state\":{\"admin-status\":\"UP\",\"ifindex\":1,\"loopback-mode\":true,\"oper-status\":\"UNKNOWN\"},\"subinterfaces\":{\"subinterface\":[{\"config\":{\"index\":0},\"index\":0,\"openconfig-if-ip:ipv4\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"127.0.0.1\",\"prefix-length\":8},\"ip\":\"127.0.0.1\"}]}},\"openconfig-if-ip:ipv6\":{\"addresses\":{\"address\":[{\"config\":{\"ip\":\"::1\",\"prefix-length\":128},\"ip\":\"::1\"}]}}}]}}]},\"openconfig-network-instance:network-instances\":{\"network-instance\":[{\"config\":{\"name\":\"DEFAULT\"},\"name\":\"DEFAULT\",\"protocols\":{\"protocol\":[{\"config\":{\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\"},\"identifier\":\"openconfig-policy-types:STATIC\",\"name\":\"STATIC\",\"static-routes\":{\"static\":[{\"config\":{\"prefix\":\"0.0.0.0/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_172.100.0.1\",\"next-hop\":\"172.100.0.1\"},\"index\":\"AUTO_172.100.0.1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"0.0.0.0/0\"},{\"config\":{\"prefix\":\"::/0\"},\"next-hops\":{\"next-hop\":[{\"config\":{\"index\":\"AUTO_2001:db8::1\",\"next-hop\":\"2001:db8::1\"},\"index\":\"AUTO_2001:db8::1\",\"interface-ref\":{\"config\":{\"interface\":\"eth0\"}}}]},\"prefix\":\"::/0\"}]}}]}}]},\"openconfig-system:system\":{\"clock\":{\"config\":{\"timezone-name\":\"UTC\"}},\"config\":{\"domain-name\":\"Not.implemented.yet\",\"hostname\":\"gnmi-target-switch1\",\"motd-banner\":\"\\nThe programs included with the Debian GNU/Linux system are free software;\\nthe exact distribution terms for each program are described in the\\nindividual files in /usr/share/doc/*/copyright.\\n\\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\npermitted by applicable law.\\n\"},\"memory\":{\"state\":{\"free\":\"14843372\",\"physical\":\"32767196\",\"used\":\"17923824\"}},\"state\":{\"boot-time\":\"1740300792\",\"current-datetime\":\"2025-02-23T17:36:16Z\",\"software-version\":\"debian:12\"}}}",
"pnd_id": "5f20f34b-cbd0-4511-9ddc-c50cf6a3b49e"
}
]
}
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"syscall" "syscall"
RtdtMan "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-manager" RtdtMan "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-manager"
//"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/sdnconfig"
venv "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/venv" venv "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/venv"
) )
...@@ -23,10 +24,10 @@ func main() { ...@@ -23,10 +24,10 @@ func main() {
var address string var address string
var pass string var pass string
var user string var user string
var topology_file string var clabConfigName string
var withTwin bool var withTwin bool
var benchmark bool var benchmark bool
var sdnConfig string var sdnConfigPath string
flag.StringVar(&address, "address", "172.100.0.5:55055", "Address of the gosdn controller") flag.StringVar(&address, "address", "172.100.0.5:55055", "Address of the gosdn controller")
flag.StringVar(&address, "a", "172.100.0.5:55055", "Address of the gosdn controller (shorthand)") flag.StringVar(&address, "a", "172.100.0.5:55055", "Address of the gosdn controller (shorthand)")
...@@ -35,11 +36,11 @@ func main() { ...@@ -35,11 +36,11 @@ func main() {
flag.StringVar(&user, "user", "admin", "Username") flag.StringVar(&user, "user", "admin", "Username")
flag.StringVar(&user, "u", "admin", "Username (shorthand)") flag.StringVar(&user, "u", "admin", "Username (shorthand)")
flag.BoolVar(&withTwin, "with-twin", false, "Whether to start a twin") flag.BoolVar(&withTwin, "with-twin", false, "Whether to start a twin")
flag.StringVar(&topology_file, "topology", "data/clab.yaml", "Containerlab file on the basis of which to create topo") flag.StringVar(&clabConfigName, "clabfile", "data/clab.yaml", "Containerlab file with basic gosdn environment")
flag.StringVar(&topology_file, "t", "data/clab.yaml", "Containerlab file on the basis of which to create topo (shorthand)") flag.StringVar(&clabConfigName, "c", "data/clab.yaml", "Containerlab file with basic gosdn environment (shorthand)")
flag.BoolVar(&benchmark, "benchmark", false, "Run performance tests (measure propagation delay)") flag.BoolVar(&benchmark, "benchmark", false, "Run performance tests (measure propagation delay)")
flag.BoolVar(&benchmark, "b", false, "Run performance tests (measure propagation delay)") flag.BoolVar(&benchmark, "b", false, "Run performance tests (measure propagation delay)")
flag.StringVar(&sdnConfig, "sdnconfig", "applications/rtdt-manager/data/sample_venv_sdnconfig.json", "SdnConfig file (json)") flag.StringVar(&sdnConfigPath, "sdnconfig", "applications/rtdt-manager/data/sample_venv_sdnconfig.json", "SdnConfig file (json)")
flag.Usage = func() { flag.Usage = func() {
fmt.Println("--address, -a: Address of the gosdn controller (realnet)") fmt.Println("--address, -a: Address of the gosdn controller (realnet)")
...@@ -47,12 +48,14 @@ func main() { ...@@ -47,12 +48,14 @@ func main() {
fmt.Println("--password, -p: Password for the user to log into realnet as") fmt.Println("--password, -p: Password for the user to log into realnet as")
fmt.Println("--topology, -t: Topology .yaml file to use to generate realnet and twins") fmt.Println("--topology, -t: Topology .yaml file to use to generate realnet and twins")
fmt.Println("--with-twin: Whether to start the containerlab virtual environment for the twin") fmt.Println("--with-twin: Whether to start the containerlab virtual environment for the twin")
fmt.Println("--sdnconfig: Path to the sdnconfig .json file that contains information about network elements and links")
} }
flag.Parse() flag.Parse()
fmt.Println("Topology file path: ", topology_file)
// Start virtual environment for realnet // Start virtual environment for realnet
// sdnConfig := sdnconfig.NewSdnConfig()
// sdnConfig.LoadSdnConfig(sdnConfigPath)
var realnet *venv.VEnv var realnet *venv.VEnv
realnet = venv.NewVEnv("REALNET", topology_file, user, pass, &wg) realnet = venv.NewVEnv("realnet-test", clabConfigName, user, pass, &wg)
if realnet == nil { if realnet == nil {
fmt.Println("ERROR: Couldn't deploy the physical network") fmt.Println("ERROR: Couldn't deploy the physical network")
return return
......
...@@ -4,19 +4,27 @@ import ( ...@@ -4,19 +4,27 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"os" "os"
"path/filepath"
"time"
configPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/configurationmanagement"
clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config"
rtdt_auth "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-auth"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/util" "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/util"
) )
type SdnConfig struct { type SdnConfig struct {
PndID string `json:"pndID"` PndID string `json:"pndID"`
Nodes interface{} `json:"nodes"` Nodes []Node `json:"nodes"`
Ports interface{} `json:"ports"` Ports []Port `json:"ports"`
Links interface{} `json:"links"` Links []Link `json:"links"`
Plugins interface{} `json:"plugins"` Plugins []Plugin `json:"plugins"`
NetworkElements []NetworkElement `json:"networkelements"` NetworkElements []NetworkElement `json:"networkelements"`
} }
type Metadata struct {
CreatedAt time.Time `json:"created_at"`
LastUpdated time.Time `json:"last_updated"`
}
type NetworkElement struct { type NetworkElement struct {
ID string `json:"id"` ID string `json:"id"`
Name string `json:"name"` Name string `json:"name"`
...@@ -30,13 +38,64 @@ type NetworkElement struct { ...@@ -30,13 +38,64 @@ type NetworkElement struct {
PndID string `json:"pnd_id"` PndID string `json:"pnd_id"`
} }
type Plugin struct {
ID string `json:"id"`
Manifest string `json:"manifest"`
State int `json:"state"`
ExecPath string `json:"exec_path"`
}
type Link struct {
ID string `json:"ID"`
Metadata Metadata `json:"Metadata"`
Name string `json:"Name"`
SourceNode Node `json:"SourceNode"`
SourcePort LinkPort `json:"SourcePort"`
TargetNode Node `json:"TargetNode"`
TargetPort LinkPort `json:"TargetPort"`
}
type Node struct {
ID string `json:"id"`
Name string `json:"name"`
Metadata Metadata `json:"metadata"`
}
type Port struct {
ID string `json:"id"`
Name string `json:"name"`
Metadata Metadata `json:"metadata"`
Configuration string `json:"configuration"`
}
// this is needed because port in link differs from port in port-store (configuration field)
type LinkPort struct {
ID string `json:"id"`
Name string `json:"name"`
Metadata Metadata `json:"metadata"`
Configuration PortConfig `json:"configuration"`
}
type PortConfig struct {
IP string `json:"ip"`
PrefixLength int `json:"prefix_length"`
}
func NewSdnConfig() *SdnConfig {
return &SdnConfig{}
}
// Load SdnConfig from disk
func (s *SdnConfig) LoadSdnConfig(configFilename string) error { func (s *SdnConfig) LoadSdnConfig(configFilename string) error {
var err error var err error
var absFilename string var absFilename string
absFilename, err = util.GetAbsPath(configFilename) cwd, err := os.Getwd()
if err != nil { if err != nil {
return fmt.Errorf("Error in LoadSdnConfig(): %w", err) fmt.Println("Couldn't get working directory")
}
absFilename = filepath.Join(cwd, configFilename)
if err != nil {
return fmt.Errorf("Error in LoadSdnConfig(): %w", err)
} }
fmt.Println("abFilename:", absFilename)
data, err := os.ReadFile(absFilename) data, err := os.ReadFile(absFilename)
if err != nil { if err != nil {
return fmt.Errorf("Error in LoadSdnConfig(): %w", err) return fmt.Errorf("Error in LoadSdnConfig(): %w", err)
...@@ -48,3 +107,61 @@ func (s *SdnConfig) LoadSdnConfig(configFilename string) error { ...@@ -48,3 +107,61 @@ func (s *SdnConfig) LoadSdnConfig(configFilename string) error {
} }
return nil return nil
} }
func (s *SdnConfig) RetrieveSdnConfig(pndId string, auth rtdt_auth.RtdtAuth) error {
var err error
conn := auth.GetConn()
ctx := auth.CreateContextWithAuthorization()
request := &configPb.ExportSDNConfigRequest{
Timestamp: util.Now(),
Pid: pndId,
}
configService := configPb.NewConfigurationManagementServiceClient(conn)
configResponse, err := configService.ExportSDNConfig(ctx, request)
if err != nil {
return fmt.Errorf("Failed to export sdnConfig from gosdn, err: %w", err)
}
data := []byte(configResponse.GetSdnConfigData())
json.Unmarshal(data, s)
return nil
}
func (s *SdnConfig) UploadSdnConfig(pndId string, auth rtdt_auth.RtdtAuth) error {
var sdnConfig []byte
var err error
conn := auth.GetConn()
ctx := auth.CreateContextWithAuthorization()
sdnConfig, err = json.Marshal(s)
if err != nil {
return fmt.Errorf("Failed to marshall json data: %w", err)
}
request := &configPb.ImportSDNConfigRequest{
Timestamp: util.Now(),
Pid: pndId,
SdnConfigData: string(sdnConfig),
}
configService := configPb.NewConfigurationManagementServiceClient(conn)
_, err = configService.ImportSDNConfig(ctx, request)
if err != nil {
return fmt.Errorf("Failed to import sdnconfig into gosdn, err: %w", err)
}
return nil
}
// Applying an SdnConfig means parsing it and then:
// - Get plugins -> Create them?
// - Get network elements -> Create them
// - Create topology from it -> Create that too
// - Only if the data matches will the sdnconfig apply
func (s *SdnConfig) ApplySdnConfig(auth *rtdt_auth.RtdtAuth) error {
return nil
}
// Takes a base ClabConfig and expands it with topology
func (s *SdnConfig) GenerateClabConfig(clabConfig *clabconfig.ClabConfig) error {
return nil
}
package main
import (
"encoding/json"
"flag"
"fmt"
"os"
"time"
"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/gosdnutil"
rtdt_auth "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-auth"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/sdnconfig"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
// This is for testing sdnconfig files
func main() {
var sdnConfigPath string
flag.StringVar(&sdnConfigPath, "sdnconfig", "applications/rtdt-manager/data/sample_venv_sdnconfig.json", "SdnConfig file (json)")
flag.Parse()
fmt.Println("sdnConfigPath:", sdnConfigPath)
// load the test config, upload to db
testconfig := sdnconfig.NewSdnConfig()
wd, err := os.Getwd()
fmt.Println("Getwd returns:", wd)
err = testconfig.LoadSdnConfig(sdnConfigPath)
if err != nil {
fmt.Println("Couldn't load config, err:", err)
return
}
dialOption := grpc.WithTransportCredentials(insecure.NewCredentials())
conn, err := grpc.NewClient("172.100.0.5:55055", dialOption, grpc.WithDefaultCallOptions())
if err != nil {
fmt.Printf("Error: Failed to create connection to gosdn: %v\n", err)
return
} else {
fmt.Printf("Successfully created connection to gosdn\n")
}
testauth := rtdt_auth.NewRtdtAuth("admin", "172.100.0.5:55055", "TestPassword", conn)
// Get PND of gosdn in created venv
var gosdn_pnd *pnd.PrincipalNetworkDomain
for {
gosdn_pnd, err = gosdnutil.FetchPnd(conn, testauth)
if err == nil {
break
}
fmt.Printf("Couldn't retrieve PND, retrying in 2 seconds..\n")
time.Sleep(time.Second * 2)
}
testdata, err := json.Marshal(testconfig)
if err != nil {
fmt.Println("Failed to marshall data")
return
}
fmt.Println("Data to be uploaded:", string(testdata))
testconfig.UploadSdnConfig(gosdn_pnd.Id, *testauth)
fmt.Println("Successully uploaded config.. waiting..")
time.Sleep(time.Second * 2)
newconfig := sdnconfig.NewSdnConfig()
newconfig.RetrieveSdnConfig(gosdn_pnd.Id, *testauth)
data, err := json.Marshal(newconfig)
if err != nil {
fmt.Println("Failed to marshall data")
return
}
fmt.Println("Successully downloaded config:", string(data))
}
...@@ -19,6 +19,7 @@ import ( ...@@ -19,6 +19,7 @@ import (
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/gosdnutil" "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/gosdnutil"
rtdt_auth "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-auth" rtdt_auth "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-auth"
rtdt_topology "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-topology" rtdt_topology "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-topology"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/sdnconfig"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/util" "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/util"
yangparser "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/yang-parser" yangparser "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/yang-parser"
"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
...@@ -36,28 +37,34 @@ type VEnv struct { ...@@ -36,28 +37,34 @@ type VEnv struct {
conn *grpc.ClientConn // The connection to this specific environment's gosdn conn *grpc.ClientConn // The connection to this specific environment's gosdn
pnd *pnd.PrincipalNetworkDomain pnd *pnd.PrincipalNetworkDomain
clabData *clabconfig.ClabConfig // Represents yaml file that was used to deploy clabData *clabconfig.ClabConfig // Represents yaml file that was used to deploy
clabFilename string // This is the name of the yaml file clabData is based on sdnConfig *sdnconfig.SdnConfig // Represents json config file for configuration grpc interface
topology *rtdt_topology.Topology
clabFilename string // This is the name of the yaml file clabData is based on
StopChan <-chan struct{} StopChan <-chan struct{}
waitGroup *sync.WaitGroup waitGroup *sync.WaitGroup
topology *rtdt_topology.Topology
containerRegistryURL string containerRegistryURL string
savedChanges []*networkelement.ChangeRequest savedChanges []*networkelement.ChangeRequest
} }
// Accepts a yaml filename to deploy a container lab environment // Accepts a yaml filename to deploy a container lab environment
// TODO Split up into sub-functions // TODO Split up into sub-functions
func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { func NewVEnv(name, clabFilename, user, pass string, wg *sync.WaitGroup) *VEnv {
fmt.Printf("[%s] - Creating new virtual environment\n", name) fmt.Printf("[%s] - Creating new virtual environment\n", name)
wg.Add(1) // Register the venv and run atleast until it calls wg.Done() wg.Add(1) // Register the venv and run atleast until it calls wg.Done()
var err error var err error
if err = clab.ClabDeploy(topoYamlFile); err != nil { //clabFilename := name + "-clab.yaml"
fmt.Printf("[%s] - Failed to deploy the physical network\n", name)
// TODO:
// Use baseClab and sdnConfig to construct a config file for containerlab
if err = clab.ClabDeploy(clabFilename); err != nil {
fmt.Printf("[%s] - Failed to deploy the network\n", name)
return nil return nil
} }
// After having deployed it, load the config into clabData // After having deployed it, load the config into clabData
var clabData *clab.ClabConfig var clabData *clab.ClabConfig
clabData, err = clab.LoadConfig(topoYamlFile) clabData, err = clab.LoadConfig(clabFilename)
if err != nil { if err != nil {
fmt.Printf("[%s] - Failed to load config from yaml file\n", name) fmt.Printf("[%s] - Failed to load config from yaml file\n", name)
return nil return nil
...@@ -96,7 +103,7 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { ...@@ -96,7 +103,7 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv {
if err == nil { if err == nil {
break break
} }
fmt.Printf("[%s] - Couldn't retrieve PND, retrying in 2 seconds..", name) fmt.Printf("[%s] - Couldn't retrieve PND, retrying in 2 seconds..\n", name)
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
} }
...@@ -106,7 +113,7 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { ...@@ -106,7 +113,7 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv {
pnd: gosdn_pnd, pnd: gosdn_pnd,
conn: gosdnconn, conn: gosdnconn,
clabData: clabData, clabData: clabData,
clabFilename: topoYamlFile, clabFilename: clabFilename,
waitGroup: wg, waitGroup: wg,
topology: nil, // set this later topology: nil, // set this later
containerRegistryURL: "registry.code.fbi.h-da.de/danet/gnmi-target/", // TODO: Could let user choose containerRegistryURL: "registry.code.fbi.h-da.de/danet/gnmi-target/", // TODO: Could let user choose
......
...@@ -19,6 +19,7 @@ COPY --from=builder /gosdn/controller/configs/development-gosdn.toml.example ./c ...@@ -19,6 +19,7 @@ COPY --from=builder /gosdn/controller/configs/development-gosdn.toml.example ./c
COPY --from=builder /gosdn/controller/configs/integration-test-gosdn.toml ./configs/integration-test-gosdn.toml COPY --from=builder /gosdn/controller/configs/integration-test-gosdn.toml ./configs/integration-test-gosdn.toml
COPY --from=builder /gosdn/controller/configs/containerlab-gosdn.toml.example ./configs/containerlab-gosdn.toml COPY --from=builder /gosdn/controller/configs/containerlab-gosdn.toml.example ./configs/containerlab-gosdn.toml
COPY --from=builder /gosdn/controller/configs/gNMISubscriptions.txt.example ./configs/gNMISubscriptions.txt COPY --from=builder /gosdn/controller/configs/gNMISubscriptions.txt.example ./configs/gNMISubscriptions.txt
COPY --from=builder /gosdn/applications/rtdt-manager/data/containerlab-gosdn-realnet.toml.example ./configs/containerlab-gosdn-realnet.toml
COPY --from=builder /gosdn/applications/rtdt-manager/data/containerlab-gosdn-twin.toml.example ./configs/containerlab-gosdn-twin.toml COPY --from=builder /gosdn/applications/rtdt-manager/data/containerlab-gosdn-twin.toml.example ./configs/containerlab-gosdn-twin.toml
EXPOSE 55055 8080 40000 EXPOSE 55055 8080 40000
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment