diff --git a/applications/rtdt-manager/.gitignore b/applications/rtdt-manager/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..62a0f8364060161d22ddcd805a50d2e653d5b507 --- /dev/null +++ b/applications/rtdt-manager/.gitignore @@ -0,0 +1,2 @@ +*.bak +twin* diff --git a/applications/rtdt-manager/clab-config/clab-config.go b/applications/rtdt-manager/clab-config/clab-config.go index 47bb2c914e9edd61c201f4776c4d4fe6a2253dfe..4b58257152d1cf89647f4c9e008b6ad38cf44cb2 100644 --- a/applications/rtdt-manager/clab-config/clab-config.go +++ b/applications/rtdt-manager/clab-config/clab-config.go @@ -98,7 +98,7 @@ func DeriveConfig(clabconfig *ClabConfig, newIPv4Subnet, newIPv6Subnet string, p derivedConfig := *clabconfig derivedConfig.Topology.Nodes = make(map[string]Node) derivedConfig.Topology.Links = append([]Link{}, clabconfig.Topology.Links...) // Copy links - portOffset := 5 // TODO set dynamically in some way + portOffset := 5 // TODO set dynamically in some way derivedConfig.Name = fmt.Sprintf("%s-%s", clabconfig.Name, postfix) subnetParts := strings.Split(newIPv4Subnet, ".") @@ -114,13 +114,13 @@ func DeriveConfig(clabconfig *ClabConfig, newIPv4Subnet, newIPv6Subnet string, p if strings.HasPrefix(name, "gosdn") { node.Cmd = "--config /app/configs/containerlab-gosdn-twin.toml" - node.Binds = []string{"../../../applications/rtdt-manager/data/ssl/gosdn:/app/ssl"} - } - - //use separate ssl folders, testing - if strings.HasPrefix(name, "gnmi-target") { - node.Binds = []string{"../../../applications/rtdt-manager/data/ssl/gnmi-target:/etc/gnmi-target/ssl"} + //node.Binds = []string{"../../../applications/rtdt-manager/data/ssl/gosdn:/app/ssl"} } + // + // //use separate ssl folders, testing + // if strings.HasPrefix(name, "gnmi-target") { + // node.Binds = []string{"../../../applications/rtdt-manager/data/ssl/gnmi-target:/etc/gnmi-target/ssl"} + // } // Ports: host side needs to be incremented or there will be conflicts // for now just use 5 as increment for i, portBinding := range node.Ports { diff --git a/applications/rtdt-manager/data/.twin-clab.yaml.bak b/applications/rtdt-manager/data/.twin-clab.yaml.bak deleted file mode 100644 index 48eca667b19b7dc516e2e51d1e4343c417d6b787..0000000000000000000000000000000000000000 --- a/applications/rtdt-manager/data/.twin-clab.yaml.bak +++ /dev/null @@ -1,92 +0,0 @@ -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/twin-clab.yaml b/applications/rtdt-manager/data/twin-clab.yaml index 48eca667b19b7dc516e2e51d1e4343c417d6b787..c6e575598e016f4170c13612c46608c18dd4be17 100644 --- a/applications/rtdt-manager/data/twin-clab.yaml +++ b/applications/rtdt-manager/data/twin-clab.yaml @@ -1,22 +1,22 @@ -name: gosdn_csbi_arista_base_test-twin +name: gosdn_csbi_arista_base-TEST-TWIN mgmt: - network: gosdn_csbi_arista_base-test-twin + 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: + centos0: kind: linux image: centos:8 mgmt-ipv4: 172.101.0.3 group: server - centos1-test-twin: + centos1: kind: linux image: centos:8 mgmt-ipv4: 172.101.0.4 group: server - gnmi-target-switch0-test-twin: + gnmi-target-switch0: kind: linux image: registry.code.fbi.h-da.de/danet/gnmi-target/debian:master ports: @@ -26,7 +26,7 @@ topology: binds: - ../../../artifacts/ssl/gnmi-target:/etc/gnmi-target/ssl startup-delay: 5 - gnmi-target-switch1-test-twin: + gnmi-target-switch1: kind: linux image: registry.code.fbi.h-da.de/danet/gnmi-target/debian:master ports: @@ -36,20 +36,29 @@ topology: binds: - ../../../artifacts/ssl/gnmi-target:/etc/gnmi-target/ssl startup-delay: 5 - gosdn-test-twin: + gosdn: kind: linux image: gosdn ports: - 55060:55055 - 8085:8080 - 40005:40000 - cmd: --config /app/configs/containerlab-gosdn.toml + cmd: --config /app/configs/containerlab-gosdn-twin.toml mgmt-ipv4: 172.101.0.5 env: GOSDN_ADMIN_PASSWORD: TestPassword binds: - ../../../artifacts/ssl/gosdn:/app/ssl - mongodb-express-test-twin: + mongodb: + 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 + mongodb-express: kind: linux image: mongo-express:1.0.2 ports: @@ -60,20 +69,11 @@ topology: 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: + plugin-registry: kind: linux image: plugin-registry mgmt-ipv4: 172.101.0.16 - rabbitmq-test-twin: + rabbitmq: kind: linux image: rabbitmq:3-management ports: @@ -82,11 +82,11 @@ topology: mgmt-ipv4: 172.101.0.15 links: - endpoints: - - gnmi-target-switch0-test-twin:eth1 - - gnmi-target-switch1-test-twin:eth1 + - gnmi-target-switch0:eth1 + - gnmi-target-switch1:eth1 - endpoints: - - gnmi-target-switch0-test-twin:eth2 - - centos0-test-twin:eth1 + - gnmi-target-switch0:eth2 + - centos0:eth1 - endpoints: - - gnmi-target-switch1-test-twin:eth2 - - centos1-test-twin:eth1 + - gnmi-target-switch1:eth2 + - centos1:eth1 diff --git a/applications/rtdt-manager/gosdnutil/gosdnutil.go b/applications/rtdt-manager/gosdnutil/gosdnutil.go index ecc8449c51c8ba08d36d6c12412f600e5ad6d9ce..0067898d65ed69c180dca75e6a0e802fee53be59 100644 --- a/applications/rtdt-manager/gosdnutil/gosdnutil.go +++ b/applications/rtdt-manager/gosdnutil/gosdnutil.go @@ -1,11 +1,16 @@ package gosdnutil import ( + "time" + + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" pnd "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" + spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" + tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" 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" - "fmt" + uuid "github.com/google/uuid" "google.golang.org/grpc" ) @@ -15,13 +20,43 @@ func FetchPnd(conn *grpc.ClientConn, auth *rtdt_auth.RtdtAuth) (*pnd.PrincipalNe ctx := auth.CreateContextWithAuthorization() pndResponse, err := pndService.GetPndList(ctx, &pnd.GetPndListRequest{Timestamp: util.Now()}) if err != nil { - return nil, fmt.Errorf("Failed to retrieve PND information:\npndresponse: %v\nerror: %w\n", pndResponse, err) + return nil, fmt.Errorf("Failed to retrieve PND information:\npndresponse: %v\nerror: %w\n", pndResponse, err) } if pndList := pndResponse.GetPnd(); pndList != nil { fmt.Println("pndUUID is now: ", pndList[0].Id) - p = pndList[0] // TODO: Only supports one pnd for now + p = pndList[0] // TODO: Only supports one pnd for now return p, nil } else { return nil, fmt.Errorf("Failed to retrieve PND from Pnd List: %w", err) } } + +// This function is necessary because AddNetworkElement from gosdn api uses a shared connection for all created services +func AddNetworkElement(rtdtAuth *rtdt_auth.RtdtAuth, addr, mneName, mneUUID string, opt *tpb.TransportOption, pluginID, pid uuid.UUID, gNMISubscribePaths []string) (*mnepb.AddListResponse, error) { + // Here wee use the pb generated code directly instead of using nbi + mneClient := mnepb.NewNetworkElementServiceClient(rtdtAuth.GetConn()) + + req := &mnepb.AddListRequest{ + Timestamp: time.Now().UnixNano(), + Mne: []*mnepb.SetMne{ + { + Address: opt.GetAddress(), + MneName: mneName, + PluginId: pluginID.String(), + Pid: pid.String(), + TransportOption: opt, + GnmiSubscribePaths: gNMISubscribePaths, + MneId: mneUUID, + }, + }, + Pid: pid.String(), + } + switch t := opt.Type; t { + case spb.Type_TYPE_CONTAINERISED, spb.Type_TYPE_PLUGIN: + req.Mne[0].TransportOption.Type = t + default: + } + listResponse, err := mneClient.AddList(rtdtAuth.CreateContextWithAuthorization(), req) + // Return AddListResponse + return listResponse, err +} diff --git a/applications/rtdt-manager/mneadd/main.go b/applications/rtdt-manager/mneadd/main.go index 679ecf182e2ebcbc9750b4850e6606664cc580f4..deea6f0f064155d94c92bd303a351310daa58cdc 100644 --- a/applications/rtdt-manager/mneadd/main.go +++ b/applications/rtdt-manager/mneadd/main.go @@ -15,10 +15,10 @@ import ( ) func main() { - gosdn_addr1 := "172.100.0.5:55055" - gosdn_addr2 := "172.101.0.5:55055" - mneAddr1 := "172.100.0.11:7030" - mneAddr2 := "172.101.0.11:7030" + gosdn_addr2 := "172.100.0.5:55055" + gosdn_addr1 := "172.101.0.5:55055" + mneAddr2 := "172.100.0.11:7030" + mneAddr1 := "172.101.0.11:7030" var sessionToken1 string var sessionToken2 string @@ -60,7 +60,7 @@ func main() { //pluginUUID, _ := uuid.Parse("823aad29-69be-42f0-b279-90f2c1b6a94d") //pluginID0, _ := uuid.Parse("d1c269a2-6482-4010-b0d8-679dff73153b") // TODO Get this dynamically - pluginID, _ := uuid.Parse("e2c358b3-6482-4010-b0d8-679dff73153b") // TODO Get this dynamically + pluginID1, _ := uuid.Parse("e2c358b3-6482-4010-b0d8-679dff73153b") // TODO Get this dynamically //fmt.Println("pluginID: ", pluginID) opt := &tpb.TransportOption{ @@ -72,12 +72,12 @@ func main() { GnmiTransportOption: &tpb.GnmiTransportOption{}, }, } - listResponse, err := api.AddNetworkElement(ctx1, gosdn_addr1, "elem1", "", opt, pluginID, pndID1, nil) + listResponse, err := api.AddNetworkElement(ctx1, gosdn_addr1, "elem1", "", opt, pluginID1, pndID1, nil) if err != nil { fmt.Println("Failed to add network element: ", err) return } else { - fmt.Println("Successfylly added network element!") + fmt.Println("Successfully added network element!") } _ = listResponse @@ -87,7 +87,7 @@ func main() { // Create Connection 2 dialOption2 := grpc.WithTransportCredentials(insecure.NewCredentials()) conn2, err := grpc.NewClient(gosdn_addr2, dialOption2, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(100*1024*1024))) - conn2.Connect() + conn2.Connect() // Log in to controller // Register loginResponse2, err := api.Login(context.Background(), gosdn_addr2, "admin", "TestPassword") @@ -95,7 +95,7 @@ func main() { fmt.Println("Couldn't log in to gosdn controller:", err) return } else { - fmt.Println("Successully logged in to gosdn controller at", gosdn_addr2) + fmt.Println("Successfully logged in to gosdn controller at", gosdn_addr2) time.Sleep(time.Second) } sessionToken2 = loginResponse2.GetToken() @@ -142,7 +142,7 @@ func main() { fmt.Println("Failed to add network element: ", err) return } else { - fmt.Println("Successfylly added network element!") + fmt.Println("Successfully added network element!") } _ = listResponse2 conn2.Close() diff --git a/applications/rtdt-manager/rtdt-auth/rtdt-auth.go b/applications/rtdt-manager/rtdt-auth/rtdt-auth.go index 0b576517b492cd50c241726ec9f3ac646229a8f5..8b3e15d3a933e9c8ec506b7daf99f58e44273684 100644 --- a/applications/rtdt-manager/rtdt-auth/rtdt-auth.go +++ b/applications/rtdt-manager/rtdt-auth/rtdt-auth.go @@ -4,12 +4,14 @@ import ( "context" "fmt" - "code.fbi.h-da.de/danet/gosdn/controller/api" - "google.golang.org/grpc" + rbac_pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" + "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/util" + grpc "google.golang.org/grpc" "google.golang.org/grpc/metadata" ) type RtdtAuth struct { + cc grpc.ClientConnInterface userName string password string address string @@ -19,7 +21,17 @@ type RtdtAuth struct { // Source: documentation on https://code.fbi.h-da.de/danet/gosdn func NewRtdtAuth(userName, url, password string, conn *grpc.ClientConn) *RtdtAuth { - loginResponse, err := api.Login(context.Background(), url, userName, password) + var authServiceClient rbac_pb.AuthServiceClient + authServiceClient = rbac_pb.NewAuthServiceClient(conn) + + loginRequest := rbac_pb.LoginRequest{ + Timestamp: util.Now(), + Username: userName, + Pwd: password, + } + // TODO Add dial option? + loginResponse, err := authServiceClient.Login(context.Background(), &loginRequest) + if err != nil { fmt.Println("Encountered error while trying to log in: ", err) return nil @@ -29,12 +41,12 @@ func NewRtdtAuth(userName, url, password string, conn *grpc.ClientConn) *RtdtAut password: password, address: url, sessionTok: loginResponse.GetToken(), + cc: conn, } } // createContextWithAuthorization creates a context with the token received after login. func (r *RtdtAuth) CreateContextWithAuthorization() context.Context { - fmt.Println("Creating Context with session token: ", r.sessionTok) md := metadata.Pairs("authorize", r.sessionTok) return metadata.NewOutgoingContext(context.Background(), md) } @@ -52,3 +64,6 @@ func (r RtdtAuth) GetUsername() string { func (r RtdtAuth) GetPassword() string { return r.password } +func (r RtdtAuth) GetConn() grpc.ClientConnInterface { + return r.cc +} diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go index 8fcb26b0375dbcbdd669be68e58997f92bec31d6..4dfdacabab111045e715c2148febda8db1c420d3 100644 --- a/applications/rtdt-manager/venv/venv.go +++ b/applications/rtdt-manager/venv/venv.go @@ -18,7 +18,6 @@ import ( rtdt_topology "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-topology" "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/util" yangparser "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/yang-parser" - "code.fbi.h-da.de/danet/gosdn/controller/api" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" uuid "github.com/google/uuid" gnmi "github.com/openconfig/gnmi/proto/gnmi" @@ -67,8 +66,8 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { } } - fmt.Printf("[%s] - Sleep for 5 seconds to give containers time to settle..\n", name) - time.Sleep(time.Second * 5) + fmt.Printf("[%s] - Sleep for 10 seconds to give containers time to settle..\n", name) + time.Sleep(time.Second * 10) // Now log into gosdn physical network dialOption := grpc.WithTransportCredentials(insecure.NewCredentials()) gosdnconn, err := grpc.NewClient(gosdnAddress, dialOption, grpc.WithDefaultCallOptions()) @@ -77,9 +76,7 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { return nil } else { fmt.Printf("[%s] - Successfully created connection to gosdn\n", name) - fmt.Printf("[%s] - State of conn: \n%v\n\n", name, gosdnconn) } - time.Sleep(time.Second * 2) gosdnauth := rtdt_auth.NewRtdtAuth(user, gosdnAddress, pass, gosdnconn) // logs in and stores token if gosdnauth == nil { fmt.Printf("[%s] - Couldn't log in to gosdn, quitting!\n", name) @@ -139,9 +136,9 @@ func NewVEnv(name, topoYamlFile, user, pass string, wg *sync.WaitGroup) *VEnv { fmt.Printf("[%s] - Found target: %s with addr: %s\n", name, node, addr) fmt.Printf("[%s] - Gosdn controller at %s\n", name, gosdnAddress) - ctx := gosdnauth.CreateContextWithAuthorization() //listResponse, err := api.AddNetworkElement(ctx, val.MgmtIPv4+":7030", node, "", opt, mneUUID, pid, []string{"/"}) - listResponse, err := api.AddNetworkElement(ctx, gosdnAddress, node, "", opt, pluginID, pndID, []string{"/interfaces"}) + listResponse, err := gosdnutil.AddNetworkElement(gosdnauth, gosdnAddress, node, "", opt, pluginID, pndID, []string{"/"}) + //listResponse, err := api.AddNetworkElement(ctx, gosdnAddress, node, "", opt, pluginID, pndID, []string{"/interfaces"}) if err != nil { fmt.Printf("[%s] - Failed to add network elements: %v\n", name, err) return nil