diff --git a/applications/rtdt-manager/data/.twin-clab.yaml.bak b/applications/rtdt-manager/data/.twin-clab.yaml.bak new file mode 100644 index 0000000000000000000000000000000000000000..48eca667b19b7dc516e2e51d1e4343c417d6b787 --- /dev/null +++ b/applications/rtdt-manager/data/.twin-clab.yaml.bak @@ -0,0 +1,92 @@ +name: gosdn_csbi_arista_base_test-twin +mgmt: + network: gosdn_csbi_arista_base-test-twin + ipv4-subnet: 172.101.0.0/16 + ipv6-subnet: 2001:db9::/64 + mtu: 1500 +topology: + nodes: + centos0-test-twin: + kind: linux + image: centos:8 + mgmt-ipv4: 172.101.0.3 + group: server + centos1-test-twin: + kind: linux + image: centos:8 + mgmt-ipv4: 172.101.0.4 + group: server + gnmi-target-switch0-test-twin: + kind: linux + image: registry.code.fbi.h-da.de/danet/gnmi-target/debian:master + ports: + - 7035:7030 + cmd: start --ca_file /etc/gnmi-target/ssl/ca.crt --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key + mgmt-ipv4: 172.101.0.11 + binds: + - ../../../artifacts/ssl/gnmi-target:/etc/gnmi-target/ssl + startup-delay: 5 + gnmi-target-switch1-test-twin: + kind: linux + image: registry.code.fbi.h-da.de/danet/gnmi-target/debian:master + ports: + - 7036:7030 + cmd: start --ca_file /etc/gnmi-target/ssl/ca.crt --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key + mgmt-ipv4: 172.101.0.12 + binds: + - ../../../artifacts/ssl/gnmi-target:/etc/gnmi-target/ssl + startup-delay: 5 + gosdn-test-twin: + kind: linux + image: gosdn + ports: + - 55060:55055 + - 8085:8080 + - 40005:40000 + cmd: --config /app/configs/containerlab-gosdn.toml + mgmt-ipv4: 172.101.0.5 + env: + GOSDN_ADMIN_PASSWORD: TestPassword + binds: + - ../../../artifacts/ssl/gosdn:/app/ssl + mongodb-express-test-twin: + kind: linux + image: mongo-express:1.0.2 + ports: + - 8086:8081 + mgmt-ipv4: 172.101.0.14 + env: + ME_CONFIG_BASICAUTH: "false" + ME_CONFIG_MONGODB_AUTH_PASSWORD: example + ME_CONFIG_MONGODB_AUTH_USERNAME: root + ME_CONFIG_MONGODB_SERVER: mongodb + mongodb-test-twin: + kind: linux + image: mongo:7 + ports: + - 27022:27017 + mgmt-ipv4: 172.101.0.13 + env: + MONGO_INITDB_ROOT_PASSWORD: example + MONGO_INITDB_ROOT_USERNAME: root + plugin-registry-test-twin: + kind: linux + image: plugin-registry + mgmt-ipv4: 172.101.0.16 + rabbitmq-test-twin: + kind: linux + image: rabbitmq:3-management + ports: + - 127.0.0.1:5677:5672 + - 127.0.0.1:15677:15672 + mgmt-ipv4: 172.101.0.15 + links: + - endpoints: + - gnmi-target-switch0-test-twin:eth1 + - gnmi-target-switch1-test-twin:eth1 + - endpoints: + - gnmi-target-switch0-test-twin:eth2 + - centos0-test-twin:eth1 + - endpoints: + - gnmi-target-switch1-test-twin:eth2 + - centos1-test-twin:eth1 diff --git a/applications/rtdt-manager/data/paths.json b/applications/rtdt-manager/data/paths.json new file mode 100644 index 0000000000000000000000000000000000000000..69f6ccc72e02fb49d7105b3e0ce33a7b862ac6c5 --- /dev/null +++ b/applications/rtdt-manager/data/paths.json @@ -0,0 +1,289 @@ +{ + "openconfig-interfaces:interfaces": { + "interface": [ + { + "config": { + "mtu": 1500, + "name": "eth0" + }, + "name": "eth0", + "state": { + "admin-status": "UP", + "ifindex": 26, + "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": 28, + "loopback-mode": false, + "oper-status": "UP" + }, + "subinterfaces": { + "subinterface": [ + { + "config": { + "index": 0 + }, + "index": 0, + "openconfig-if-ip:ipv6": { + "addresses": { + "address": [ + { + "config": { + "ip": "fe80::a8c1:abff:fe61:a95f", + "prefix-length": 64 + }, + "ip": "fe80::a8c1:abff:fe61:a95f" + } + ] + } + } + } + ] + } + }, + { + "config": { + "mtu": 9500, + "name": "eth2" + }, + "name": "eth2", + "state": { + "admin-status": "UP", + "ifindex": 22, + "loopback-mode": false, + "oper-status": "UP" + }, + "subinterfaces": { + "subinterface": [ + { + "config": { + "index": 0 + }, + "index": 0, + "openconfig-if-ip:ipv6": { + "addresses": { + "address": [ + { + "config": { + "ip": "fe80::a8c1:abff:fead:f866", + "prefix-length": 64 + }, + "ip": "fe80::a8c1:abff:fead:f866" + } + ] + } + } + } + ] + } + }, + { + "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": "59508184", + "physical": "63586192", + "used": "4078008" + } + }, + "state": { + "boot-time": "1738230616", + "current-datetime": "2025-01-30T10:07:31Z", + "software-version": "debian:12" + } + } +} diff --git a/applications/rtdt-manager/data/twin-clab.yaml b/applications/rtdt-manager/data/twin-clab.yaml new file mode 100644 index 0000000000000000000000000000000000000000..48eca667b19b7dc516e2e51d1e4343c417d6b787 --- /dev/null +++ b/applications/rtdt-manager/data/twin-clab.yaml @@ -0,0 +1,92 @@ +name: gosdn_csbi_arista_base_test-twin +mgmt: + network: gosdn_csbi_arista_base-test-twin + ipv4-subnet: 172.101.0.0/16 + ipv6-subnet: 2001:db9::/64 + mtu: 1500 +topology: + nodes: + centos0-test-twin: + kind: linux + image: centos:8 + mgmt-ipv4: 172.101.0.3 + group: server + centos1-test-twin: + kind: linux + image: centos:8 + mgmt-ipv4: 172.101.0.4 + group: server + gnmi-target-switch0-test-twin: + kind: linux + image: registry.code.fbi.h-da.de/danet/gnmi-target/debian:master + ports: + - 7035:7030 + cmd: start --ca_file /etc/gnmi-target/ssl/ca.crt --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key + mgmt-ipv4: 172.101.0.11 + binds: + - ../../../artifacts/ssl/gnmi-target:/etc/gnmi-target/ssl + startup-delay: 5 + gnmi-target-switch1-test-twin: + kind: linux + image: registry.code.fbi.h-da.de/danet/gnmi-target/debian:master + ports: + - 7036:7030 + cmd: start --ca_file /etc/gnmi-target/ssl/ca.crt --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key + mgmt-ipv4: 172.101.0.12 + binds: + - ../../../artifacts/ssl/gnmi-target:/etc/gnmi-target/ssl + startup-delay: 5 + gosdn-test-twin: + kind: linux + image: gosdn + ports: + - 55060:55055 + - 8085:8080 + - 40005:40000 + cmd: --config /app/configs/containerlab-gosdn.toml + mgmt-ipv4: 172.101.0.5 + env: + GOSDN_ADMIN_PASSWORD: TestPassword + binds: + - ../../../artifacts/ssl/gosdn:/app/ssl + mongodb-express-test-twin: + kind: linux + image: mongo-express:1.0.2 + ports: + - 8086:8081 + mgmt-ipv4: 172.101.0.14 + env: + ME_CONFIG_BASICAUTH: "false" + ME_CONFIG_MONGODB_AUTH_PASSWORD: example + ME_CONFIG_MONGODB_AUTH_USERNAME: root + ME_CONFIG_MONGODB_SERVER: mongodb + mongodb-test-twin: + kind: linux + image: mongo:7 + ports: + - 27022:27017 + mgmt-ipv4: 172.101.0.13 + env: + MONGO_INITDB_ROOT_PASSWORD: example + MONGO_INITDB_ROOT_USERNAME: root + plugin-registry-test-twin: + kind: linux + image: plugin-registry + mgmt-ipv4: 172.101.0.16 + rabbitmq-test-twin: + kind: linux + image: rabbitmq:3-management + ports: + - 127.0.0.1:5677:5672 + - 127.0.0.1:15677:15672 + mgmt-ipv4: 172.101.0.15 + links: + - endpoints: + - gnmi-target-switch0-test-twin:eth1 + - gnmi-target-switch1-test-twin:eth1 + - endpoints: + - gnmi-target-switch0-test-twin:eth2 + - centos0-test-twin:eth1 + - endpoints: + - gnmi-target-switch1-test-twin:eth2 + - centos1-test-twin:eth1 diff --git a/applications/rtdt-manager/main.go b/applications/rtdt-manager/main.go index 0b465113d20f5b8489cc9b579b0fc78717deb526..f592e7be19ce3ceebf03c9ce852d1703fde76074 100644 --- a/applications/rtdt-manager/main.go +++ b/applications/rtdt-manager/main.go @@ -24,6 +24,7 @@ func main() { var user string var topology_file string var generate bool + var withTwin bool 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(&pass, "password", "TestPassword", "Password for admin user") @@ -32,6 +33,7 @@ func main() { flag.StringVar(&user, "u", "admin", "Username (shorthand)") flag.BoolVar(&generate, "generate", false, "Whether to start the realnet containerlab environment ourselves") flag.BoolVar(&generate, "g", false, "Whether to start the realnet containerlab environment ourselves (shorthand)") + 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(&topology_file, "t", "data/clab.yaml", "Containerlab file on the basis of which to create topo (shorthand)") @@ -42,6 +44,7 @@ func main() { 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("--generate, -g: Whether to start the realnet containerlab environment ourselves") + fmt.Println("--with-twin: Whether to start the realnet containerlab environment for the twin") } flag.Parse() fmt.Println("Topology file path: ", topology_file) @@ -68,7 +71,9 @@ func main() { fmt.Println("Couldn't initialize rtdt-manager, quitting!") return } - rtdtMan.LaunchTwin("172.101.0.0/16", "2001:db9::/64", "test-twin") + if withTwin { + rtdtMan.LaunchTwin("172.101.0.0/16", "2001:db9::/64", "test-twin") + } if err := rtdtMan.Run(); err != nil { fmt.Println("Program exited with errors: %w", err) } diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go index 862e275406d27037ba56250b81f3403aa3d20180..896f703487c04e3aa96a9a9cfb0b6e6e2c7fb291 100644 --- a/applications/rtdt-manager/venv/venv.go +++ b/applications/rtdt-manager/venv/venv.go @@ -132,6 +132,7 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { waitGroup: wg, } } + func (v *VEnv) InitEventSystem() error { realnet_auth := v.auth @@ -177,15 +178,19 @@ func (v *VEnv) InitEventSystem() error { } func (v *VEnv) updateMNECallback(event *event.Event) { - fmt.Println("MNE Event has happened (type: update), hurray!") + fmt.Println("--------------------------------") + fmt.Println("---------- MNE EVENT -----------") fmt.Println("EventID: ", event.ID.ID()) fmt.Println("Event Type: ", event.Type) + fmt.Println("PathsAndValuesMap: ", event.PathsAndValuesMap) } func (v *VEnv) userEventCallback(event *event.Event) { - fmt.Println("User Event has happened (type: update), hurray!") + fmt.Println("--------------------------------") + fmt.Println("---------- USER EVENT ----------") fmt.Println("EventID: ", event.ID.ID()) fmt.Println("Event Type: ", event.Type) + fmt.Println("PathsAndValuesMap: ", event.PathsAndValuesMap) } // For later, topology stuff