From cdd8ef2bb8d94062958727bd299c84ae65e2e37b Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Wed, 8 Jan 2025 14:39:29 -0600 Subject: [PATCH 1/8] feat: add network interface capability Signed-off-by: Mark Sanders --- Makefile | 2 +- cmd/cmd.go | 4 +- cmd/network/evpn-test.go | 54 -------- cmd/network/{ => evpn}/evpn-bridge-port.go | 4 +- cmd/network/{ => evpn}/evpn-logical-brige.go | 4 +- cmd/network/{ => evpn}/evpn-svi.go | 4 +- cmd/network/{ => evpn}/evpn-utils.go | 2 +- cmd/network/{ => evpn}/evpn-vrf.go | 4 +- cmd/network/netintf/netintf.go | 67 +++++++++ cmd/network/network.go | 105 +++++++++++++++ go.mod | 52 +++---- go.sum | 135 +++++++++---------- testing/mock-server/stub/stub.go | 2 +- 13 files changed, 275 insertions(+), 164 deletions(-) delete mode 100644 cmd/network/evpn-test.go rename cmd/network/{ => evpn}/evpn-bridge-port.go (98%) rename cmd/network/{ => evpn}/evpn-logical-brige.go (98%) rename cmd/network/{ => evpn}/evpn-svi.go (98%) rename cmd/network/{ => evpn}/evpn-utils.go (99%) rename cmd/network/{ => evpn}/evpn-vrf.go (98%) create mode 100644 cmd/network/netintf/netintf.go create mode 100644 cmd/network/network.go diff --git a/Makefile b/Makefile index f49ad0a..86becc9 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ go-build: go-get: @echo " > Checking if there are any missing dependencies..." - @CGO_ENABLED=0 go get . + @CGO_ENABLED=0 go get ./... go-test: @echo " > Running ginkgo test suites..." diff --git a/cmd/cmd.go b/cmd/cmd.go index 991d4bf..d8306f2 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -16,7 +16,7 @@ import ( "github.com/spf13/cobra" ) -// NewCommand handles the cli for evpn, ipsec, invetory and storage +// NewCommand handles the cli for network, ipsec, invetory and storage func NewCommand() *cobra.Command { // // This is the root command for the CLI @@ -36,7 +36,7 @@ func NewCommand() *cobra.Command { c.AddCommand(inventory.NewInventoryCommand()) c.AddCommand(ipsec.NewIPSecCommand()) c.AddCommand(storage.NewStorageCommand()) - c.AddCommand(network.NewEvpnCommand()) + c.AddCommand(network.NewNetworkCommand()) flags := c.PersistentFlags() flags.String(common.AddrCmdLineArg, "localhost:50151", "address of OPI gRPC server") diff --git a/cmd/network/evpn-test.go b/cmd/network/evpn-test.go deleted file mode 100644 index 9ca11dd..0000000 --- a/cmd/network/evpn-test.go +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (c) 2022-2023 Intel Corporation, or its subsidiaries. -// Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. - -// Package network implements the network related CLI commands -package network - -import ( - "log" - - "github.com/spf13/cobra" -) - -// NewEvpnCommand tests the EVPN functionality command -func NewEvpnCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "evpn", - Aliases: []string{"g"}, - Short: "Tests DPU evpn functionality", - Args: cobra.NoArgs, - Run: func(cmd *cobra.Command, _ []string) { - err := cmd.Help() - if err != nil { - log.Fatalf("[ERROR] %s", err.Error()) - } - }, - } - // Bridge cli's - cmd.AddCommand(CreateLogicalBridge()) - cmd.AddCommand(DeleteLogicalBridge()) - cmd.AddCommand(GetLogicalBridge()) - cmd.AddCommand(ListLogicalBridges()) - cmd.AddCommand(UpdateLogicalBridge()) - // Port cli's - cmd.AddCommand(CreateBridgePort()) - cmd.AddCommand(DeleteBridgePort()) - cmd.AddCommand(GetBridgePort()) - cmd.AddCommand(ListBridgePorts()) - cmd.AddCommand(UpdateBridgePort()) - // VRF cli's - cmd.AddCommand(CreateVRF()) - cmd.AddCommand(DeleteVRF()) - cmd.AddCommand(GetVRF()) - cmd.AddCommand(ListVRFs()) - cmd.AddCommand(UpdateVRF()) - // SVI cli's - cmd.AddCommand(CreateSVI()) - cmd.AddCommand(DeleteSVI()) - cmd.AddCommand(GetSVI()) - cmd.AddCommand(ListSVIs()) - cmd.AddCommand(UpdateSVI()) - - return cmd -} diff --git a/cmd/network/evpn-bridge-port.go b/cmd/network/evpn/evpn-bridge-port.go similarity index 98% rename from cmd/network/evpn-bridge-port.go rename to cmd/network/evpn/evpn-bridge-port.go index 196b24e..7e5591e 100644 --- a/cmd/network/evpn-bridge-port.go +++ b/cmd/network/evpn/evpn-bridge-port.go @@ -3,8 +3,8 @@ // Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. // Copyright (c) 2024 Ericsson AB. -// Package network implements the network related CLI commands -package network +// Package evpn implements the evpn network related CLI commands +package evpn import ( "context" diff --git a/cmd/network/evpn-logical-brige.go b/cmd/network/evpn/evpn-logical-brige.go similarity index 98% rename from cmd/network/evpn-logical-brige.go rename to cmd/network/evpn/evpn-logical-brige.go index 91d637a..8b8c482 100644 --- a/cmd/network/evpn-logical-brige.go +++ b/cmd/network/evpn/evpn-logical-brige.go @@ -3,8 +3,8 @@ // Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. // Copyright (c) 2024 Ericsson AB. -// Package network implements the network related CLI commands -package network +// Package evpn implements the evpn network related CLI commands +package evpn import ( "context" diff --git a/cmd/network/evpn-svi.go b/cmd/network/evpn/evpn-svi.go similarity index 98% rename from cmd/network/evpn-svi.go rename to cmd/network/evpn/evpn-svi.go index 2ebe32b..0bf39bd 100644 --- a/cmd/network/evpn-svi.go +++ b/cmd/network/evpn/evpn-svi.go @@ -3,8 +3,8 @@ // Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. // Copyright (c) 2024 Ericsson AB. -// Package network implements the network related CLI commands -package network +// Package evpn implements the evpn related CLI commands +package evpn import ( "context" diff --git a/cmd/network/evpn-utils.go b/cmd/network/evpn/evpn-utils.go similarity index 99% rename from cmd/network/evpn-utils.go rename to cmd/network/evpn/evpn-utils.go index 3a07975..26daa25 100644 --- a/cmd/network/evpn-utils.go +++ b/cmd/network/evpn/evpn-utils.go @@ -4,7 +4,7 @@ // Copyright (c) 2024 Ericsson AB. // Package network implements the network related CLI commands -package network +package evpn import ( "fmt" diff --git a/cmd/network/evpn-vrf.go b/cmd/network/evpn/evpn-vrf.go similarity index 98% rename from cmd/network/evpn-vrf.go rename to cmd/network/evpn/evpn-vrf.go index 2941c2a..70f4886 100644 --- a/cmd/network/evpn-vrf.go +++ b/cmd/network/evpn/evpn-vrf.go @@ -3,8 +3,8 @@ // Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. // Copyright (c) 2024 Ericsson AB. -// Package network implements the network related CLI commands -package network +// Package evpn implements the evpn network related CLI commands +package evpn import ( "context" diff --git a/cmd/network/netintf/netintf.go b/cmd/network/netintf/netintf.go new file mode 100644 index 0000000..79777d5 --- /dev/null +++ b/cmd/network/netintf/netintf.go @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (c) 2025 Dell Inc, or its subsidiaries. + +// Package network implements the network related CLI commands +package netintf + +import ( +// "log" +// "time" + +// "github.com/opiproject/godpu/cmd/common" + "github.com/spf13/cobra" +) + + +// ListNetInterfaces lists all Network Interface details from OPI server +func ListNetInterfaces() *cobra.Command { + var pageSize int32 + var pageToken string + + cmd := &cobra.Command{ + Use: "list-net-interfaces", + Short: "List the network interfaces", + Run: func(c *cobra.Command, _ []string) { +// TODO: Add processing for Network Interface List +// ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + +// tlsFiles, err := c.Flags().GetString(common.TLSFiles) +// cobra.CheckErr(err) + +// addr, err := c.Flags().GetString(common.AddrCmdLineArg) +// cobra.CheckErr(err) + +// evpnClient, err := network.NewLogicalBridge(addr, tlsFiles) +// if err != nil { +// log.Fatalf("could not create gRPC client: %v", err) +// } +// defer cancel() + +// for { +// resp, err := evpnClient.ListLogicalBridges(ctx, pageSize, pageToken) +// if err != nil { +// log.Fatalf("Failed to get items: %v", err) +// } + // Process the server response +// log.Println("List Network Interfaces:") +// for _, lb := range resp.NetInterfaces { +// log.Println("Interface with: ") +// PrintLB(lb) +// } + + // Check if there are more pages to retrieve +// if resp.NextPageToken == "" { + // No more pages, break the loop +// break +// } + // Update the page token for the next request +// pageToken = resp.NextPageToken +// } + }, + } + + cmd.Flags().Int32VarP(&pageSize, "pagesize", "s", 0, "Specify page size") + cmd.Flags().StringVarP(&pageToken, "pagetoken", "t", "", "Specify the token") + + return cmd +} \ No newline at end of file diff --git a/cmd/network/network.go b/cmd/network/network.go new file mode 100644 index 0000000..aa27ff1 --- /dev/null +++ b/cmd/network/network.go @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (c) 2022-2023 Intel Corporation, or its subsidiaries. +// Copyright (c) 2024 Dell Inc, or its subsidiaries. + +// Package network implements the network related CLI commands +package network + +import ( + "log" + "time" + + "github.com/opiproject/godpu/cmd/common" + "github.com/opiproject/godpu/cmd/network/netintf" + "github.com/opiproject/godpu/cmd/network/evpn" + "github.com/spf13/cobra" +) + +// NewNetworkCommand tests the Network functionality command +func NewNetworkCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "network", + Aliases: []string{"g"}, + Short: "Tests DPU networking functionality", + Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, _ []string) { + err := cmd.Help() + if err != nil { + log.Fatalf("[ERROR] %s", err.Error()) + } + }, + } + + flags := cmd.PersistentFlags() + flags.Duration(common.TimeoutCmdLineArg, 10*time.Second, "timeout for a cmd") + + cmd.AddCommand(NewEvpnCommand()) + cmd.AddCommand(NewNetIntfCommand()) + + return cmd +} + +// NewNetworkCommand tests the Network functionality command +func NewNetIntfCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "intf", + Aliases: []string{"g"}, + Short: "Tests DPU network interface functionality", + Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, _ []string) { + err := cmd.Help() + if err != nil { + log.Fatalf("[ERROR] %s", err.Error()) + } + }, + } + + flags := cmd.PersistentFlags() + flags.Duration(common.TimeoutCmdLineArg, 10*time.Second, "timeout for a cmd") + + cmd.AddCommand(netintf.ListNetInterfaces()) + + return cmd +} + +// NewEvpnCommand tests the EVPN functionality command +func NewEvpnCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "evpn", + Aliases: []string{"g"}, + Short: "Tests DPU evpn functionality", + Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, _ []string) { + err := cmd.Help() + if err != nil { + log.Fatalf("[ERROR] %s", err.Error()) + } + }, + } + // Bridge cli's + cmd.AddCommand(evpn.CreateLogicalBridge()) + cmd.AddCommand(evpn.DeleteLogicalBridge()) + cmd.AddCommand(evpn.GetLogicalBridge()) + cmd.AddCommand(evpn.ListLogicalBridges()) + cmd.AddCommand(evpn.UpdateLogicalBridge()) + // Port cli's + cmd.AddCommand(evpn.CreateBridgePort()) + cmd.AddCommand(evpn.DeleteBridgePort()) + cmd.AddCommand(evpn.GetBridgePort()) + cmd.AddCommand(evpn.ListBridgePorts()) + cmd.AddCommand(evpn.UpdateBridgePort()) + // VRF cli's + cmd.AddCommand(evpn.CreateVRF()) + cmd.AddCommand(evpn.DeleteVRF()) + cmd.AddCommand(evpn.GetVRF()) + cmd.AddCommand(evpn.ListVRFs()) + cmd.AddCommand(evpn.UpdateVRF()) + // SVI cli's + cmd.AddCommand(evpn.CreateSVI()) + cmd.AddCommand(evpn.DeleteSVI()) + cmd.AddCommand(evpn.GetSVI()) + cmd.AddCommand(evpn.ListSVIs()) + cmd.AddCommand(evpn.UpdateSVI()) + + return cmd +} diff --git a/go.mod b/go.mod index 3de127c..72595de 100644 --- a/go.mod +++ b/go.mod @@ -1,44 +1,44 @@ module github.com/opiproject/godpu -go 1.19 +go 1.22.0 + +toolchain go1.23.4 require ( github.com/PraserX/ipconv v1.2.0 - github.com/go-chi/chi v1.5.5 - github.com/go-ping/ping v1.1.0 - github.com/google/uuid v1.5.0 + github.com/go-chi/chi/v5 v5.2.0 + github.com/go-ping/ping v1.2.0 + github.com/google/uuid v1.6.0 github.com/lithammer/fuzzysearch v1.1.8 - github.com/onsi/ginkgo/v2 v2.14.0 - github.com/onsi/gomega v1.30.0 - github.com/opiproject/opi-api v0.0.0-20240304222410-5dba226aaa9e - github.com/spf13/cobra v1.8.0 - github.com/stretchr/testify v1.8.4 - go.einride.tech/aip v0.66.0 - golang.org/x/net v0.20.0 - golang.org/x/text v0.14.0 - google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.32.0 + github.com/onsi/ginkgo/v2 v2.22.2 + github.com/onsi/gomega v1.36.2 + github.com/opiproject/opi-api v0.0.0-20241209203403-595a3a1a838b + github.com/spf13/cobra v1.8.1 + github.com/stretchr/testify v1.10.0 + go.einride.tech/aip v0.68.1 + golang.org/x/net v0.33.0 + golang.org/x/text v0.21.0 + google.golang.org/grpc v1.69.2 + google.golang.org/protobuf v1.36.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.3.0 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/tools v0.16.1 // indirect - google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + github.com/stretchr/objx v0.5.2 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/tools v0.28.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ebaa5fd..99bbee7 100644 --- a/go.sum +++ b/go.sum @@ -1,72 +1,70 @@ github.com/PraserX/ipconv v1.2.0 h1:3bboP9EDfsuMF5C3qM25OmZA4+cCfk1Ahpx8zn5G2tM= github.com/PraserX/ipconv v1.2.0/go.mod h1:aBiLM1bDAjp1++Q0Sp3IrGbPd49b74IUgoRWod6EtPY= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-chi/chi v1.5.5 h1:vOB/HbEMt9QqBqErz07QehcOKHaWFtuj87tTDVz2qXE= -github.com/go-chi/chi v1.5.5/go.mod h1:C9JqLr3tIYjDOZpzn+BCuxY8z8vmca43EeMgyZt7irw= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw= -github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/go-chi/chi/v5 v5.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0= +github.com/go-chi/chi/v5 v5.2.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ping/ping v1.2.0 h1:vsJ8slZBZAXNCK4dPcI2PEE9eM9n9RbXbGouVQ/Y4yQ= +github.com/go-ping/ping v1.2.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= -github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= -github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/opiproject/opi-api v0.0.0-20240118183513-e44db269fba4 h1:YBjvYWQQAbNIGsAXvB6FwL9Encr1nzo3/w+bB/tXltM= -github.com/opiproject/opi-api v0.0.0-20240118183513-e44db269fba4/go.mod h1:92pv4ulvvPMuxCJ9ND3aYbmBfEMLx0VCjpkiR7ZTqPY= -github.com/opiproject/opi-api v0.0.0-20240304222410-5dba226aaa9e h1:jUa7DmVLjzLKg051y7rYyCD0NAbEHZQMimM1451D74I= -github.com/opiproject/opi-api v0.0.0-20240304222410-5dba226aaa9e/go.mod h1:92pv4ulvvPMuxCJ9ND3aYbmBfEMLx0VCjpkiR7ZTqPY= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/opiproject/opi-api v0.0.0-20241209203403-595a3a1a838b h1:4k7lhYkkjo+jowQ+vmOU9LfsLipw3QMqfedZWtczMdw= +github.com/opiproject/opi-api v0.0.0-20241209203403-595a3a1a838b/go.mod h1:92pv4ulvvPMuxCJ9ND3aYbmBfEMLx0VCjpkiR7ZTqPY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= -go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.einride.tech/aip v0.68.1 h1:16/AfSxcQISGN5z9C5lM+0mLYXihrHbQ1onvYTr93aQ= +go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -76,24 +74,23 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -102,31 +99,27 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d h1:H8tOf8XM88HvKqLTxe755haY6r1fqqzLbEnfrmLXlSA= +google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/testing/mock-server/stub/stub.go b/testing/mock-server/stub/stub.go index 3e4fb4e..2df1008 100644 --- a/testing/mock-server/stub/stub.go +++ b/testing/mock-server/stub/stub.go @@ -14,7 +14,7 @@ import ( "golang.org/x/text/cases" "golang.org/x/text/language" - "github.com/go-chi/chi" + "github.com/go-chi/chi/v5" ) // Options server options From f59fbf6e30da93206876fb6b2180aee84f200391 Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Wed, 8 Jan 2025 15:53:07 -0600 Subject: [PATCH 2/8] fix(godpu): update dockerfile for new alpine and golang versions Signed-off-by: Mark Sanders --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 504e20e..a2ff20b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 # Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. -FROM docker.io/library/golang:1.21.5-alpine3.17 as builder +FROM docker.io/library/golang:1.23.4-alpine3.21 as builder WORKDIR /app @@ -15,7 +15,7 @@ ENV CGO_ENABLED=0 COPY . . RUN go build -v -o /dpu . -FROM alpine:3.19 +FROM alpine:3.21 WORKDIR / From 7b06a2d28b417831eaf362afcd09a8032d0e9dde Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Wed, 8 Jan 2025 17:19:29 -0600 Subject: [PATCH 3/8] fix(godpu): fix docker-compose evpn test command syntax Signed-off-by: Mark Sanders --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f9b73e9..d1bf31b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ # Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. # Copyright (C) 2023 Intel Corporation --- -version: "3.7" +# version: "3.7" - version is obsolete and can be removed/commented out services: spdk: image: docker.io/opiproject/spdk:v24.01 @@ -161,7 +161,7 @@ services: depends_on: opi-evpn-server: condition: service_healthy - command: evpn create-vrf --name blue --vni 100 --vtep 10.0.0.100/24 --loopback 10.100.0.1/24 --addr opi-evpn-server:50151 + command: network evpn create-vrf --name blue --vni 100 --vtep 10.0.0.100/24 --loopback 10.100.0.1/24 --addr opi-evpn-server:50151 opi-smbios-test: build: From 19a450ea1306424b55ab353111aa970e0aecdedb Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Thu, 9 Jan 2025 11:43:00 -0600 Subject: [PATCH 4/8] fix(godpu): update alpine versions in docker-compose Signed-off-by: Mark Sanders --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d1bf31b..295b337 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -96,7 +96,7 @@ services: sleep infinity' redis: - image: redis:7.2.3-alpine3.18 + image: redis:7.2.7-alpine3.21 networks: - opi healthcheck: @@ -198,7 +198,7 @@ services: /dpu storage delete backend nvme controller --addr=opi-spdk-server:50051 --name "$$nvmf0" && \ opi-test: - image: docker.io/library/alpine:3.19 + image: docker.io/library/alpine:3.21 networks: - opi depends_on: From b654131ad5b1e8cb6f61b5730edc9884e9ea5710 Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Thu, 9 Jan 2025 17:22:59 -0600 Subject: [PATCH 5/8] fix(ci): correct opi-test timeout by waiting after start Signed-off-by: Mark Sanders --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 295b337..fceb9e0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -209,7 +209,7 @@ services: opi-storage-test: condition: service_completed_successfully command: | - sh -c 'exit 0' + sh -c 'sleep 60 && exit 0' networks: opi: From 441f270d5706f86ae70a32e655540dc5b713ff39 Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Wed, 15 Jan 2025 12:42:47 -0600 Subject: [PATCH 6/8] feat(interface): add list interface function Signed-off-by: Mark Sanders --- .golangci.yml | 9 +++- cmd/network/evpn/evpn-utils.go | 2 +- cmd/network/netintf/netintf.go | 80 +++++++++++++++------------- cmd/network/network.go | 6 +-- go.mod | 8 +-- go.sum | 20 +++---- grpc/client.go | 2 +- ipsec/ipsec.go | 6 +-- network/netinterface.go | 64 ++++++++++++++++++++++ storage/goopicsi.go | 2 +- testing/mock-server/server/server.go | 4 +- testing/mock-server/stub/storage.go | 4 +- 12 files changed, 138 insertions(+), 69 deletions(-) create mode 100644 network/netinterface.go diff --git a/.golangci.yml b/.golangci.yml index ac13748..f4bf70b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -7,7 +7,7 @@ run: # output configuration options output: # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" - format: colored-line-number + formats: colored-line-number linters-settings: funlen: @@ -17,13 +17,18 @@ linters-settings: threshold: 200 gocognit: min-complexity: 32 + gosec: + excludes: + # TODO: Re-enable the checks when fixes to gosec for false positives are done. + # The issue began in gosec 2.21.0 and its inclusion in golangci-lint + - G115 # Potential integer overflow when converting between integer types linters: enable: - bodyclose - dogsled - errcheck - - exportloopref + - copyloopvar - funlen - gochecknoinits - gocognit diff --git a/cmd/network/evpn/evpn-utils.go b/cmd/network/evpn/evpn-utils.go index 26daa25..5e24b81 100644 --- a/cmd/network/evpn/evpn-utils.go +++ b/cmd/network/evpn/evpn-utils.go @@ -3,7 +3,7 @@ // Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. // Copyright (c) 2024 Ericsson AB. -// Package network implements the network related CLI commands +// Package evpn implements the evpn related CLI commands package evpn import ( diff --git a/cmd/network/netintf/netintf.go b/cmd/network/netintf/netintf.go index 79777d5..d890f8c 100644 --- a/cmd/network/netintf/netintf.go +++ b/cmd/network/netintf/netintf.go @@ -1,20 +1,21 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright (c) 2025 Dell Inc, or its subsidiaries. -// Package network implements the network related CLI commands +// Package netintf implements the network interface related CLI commands package netintf import ( -// "log" -// "time" + "context" + "log" -// "github.com/opiproject/godpu/cmd/common" + "github.com/opiproject/godpu/cmd/common" + network "github.com/opiproject/godpu/network" "github.com/spf13/cobra" + "google.golang.org/protobuf/encoding/protojson" ) - -// ListNetInterfaces lists all Network Interface details from OPI server -func ListNetInterfaces() *cobra.Command { +// ListNetworkInterfaces lists all Network Interface details from OPI server +func ListNetworkInterfaces() *cobra.Command { var pageSize int32 var pageToken string @@ -22,41 +23,44 @@ func ListNetInterfaces() *cobra.Command { Use: "list-net-interfaces", Short: "List the network interfaces", Run: func(c *cobra.Command, _ []string) { -// TODO: Add processing for Network Interface List -// ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + addr, err := c.Flags().GetString(common.AddrCmdLineArg) + cobra.CheckErr(err) + + timeout, err := c.Flags().GetDuration(common.TimeoutCmdLineArg) + cobra.CheckErr(err) + + tlsFiles, err := c.Flags().GetString(common.TLSFiles) + cobra.CheckErr(err) -// tlsFiles, err := c.Flags().GetString(common.TLSFiles) -// cobra.CheckErr(err) + ctx, cancel := context.WithTimeout(context.Background(), timeout) -// addr, err := c.Flags().GetString(common.AddrCmdLineArg) -// cobra.CheckErr(err) + netifClient, err := network.NewNetInterface(addr, tlsFiles) + if err != nil { + log.Fatalf("could not create gRPC client: %v", err) + } + defer cancel() -// evpnClient, err := network.NewLogicalBridge(addr, tlsFiles) -// if err != nil { -// log.Fatalf("could not create gRPC client: %v", err) -// } -// defer cancel() + for { + resp, err := netifClient.ListNetInterfaces(ctx, pageSize, pageToken) + if err != nil { + log.Fatalf("Failed to get items: %v", err) + } -// for { -// resp, err := evpnClient.ListLogicalBridges(ctx, pageSize, pageToken) -// if err != nil { -// log.Fatalf("Failed to get items: %v", err) -// } - // Process the server response -// log.Println("List Network Interfaces:") -// for _, lb := range resp.NetInterfaces { -// log.Println("Interface with: ") -// PrintLB(lb) -// } + // Process the response + log.Println("List Network Interfaces:") + for _, lif := range resp.NetInterfaces { + log.Println("Interface with: ") + common.PrintResponse(protojson.Format(lif)) + } - // Check if there are more pages to retrieve -// if resp.NextPageToken == "" { - // No more pages, break the loop -// break -// } - // Update the page token for the next request -// pageToken = resp.NextPageToken -// } + // Are there more pages + if resp.NextPageToken == "" { + // if no then break + break + } + // update to next token + pageToken = resp.NextPageToken + } }, } @@ -64,4 +68,4 @@ func ListNetInterfaces() *cobra.Command { cmd.Flags().StringVarP(&pageToken, "pagetoken", "t", "", "Specify the token") return cmd -} \ No newline at end of file +} diff --git a/cmd/network/network.go b/cmd/network/network.go index aa27ff1..ae463ef 100644 --- a/cmd/network/network.go +++ b/cmd/network/network.go @@ -10,8 +10,8 @@ import ( "time" "github.com/opiproject/godpu/cmd/common" - "github.com/opiproject/godpu/cmd/network/netintf" "github.com/opiproject/godpu/cmd/network/evpn" + "github.com/opiproject/godpu/cmd/network/netintf" "github.com/spf13/cobra" ) @@ -39,7 +39,7 @@ func NewNetworkCommand() *cobra.Command { return cmd } -// NewNetworkCommand tests the Network functionality command +// NewNetIntfCommand tests the Network functionality command func NewNetIntfCommand() *cobra.Command { cmd := &cobra.Command{ Use: "intf", @@ -57,7 +57,7 @@ func NewNetIntfCommand() *cobra.Command { flags := cmd.PersistentFlags() flags.Duration(common.TimeoutCmdLineArg, 10*time.Second, "timeout for a cmd") - cmd.AddCommand(netintf.ListNetInterfaces()) + cmd.AddCommand(netintf.ListNetworkInterfaces()) return cmd } diff --git a/go.mod b/go.mod index 72595de..4ed84c2 100644 --- a/go.mod +++ b/go.mod @@ -7,16 +7,16 @@ toolchain go1.23.4 require ( github.com/PraserX/ipconv v1.2.0 github.com/go-chi/chi/v5 v5.2.0 - github.com/go-ping/ping v1.2.0 github.com/google/uuid v1.6.0 github.com/lithammer/fuzzysearch v1.1.8 github.com/onsi/ginkgo/v2 v2.22.2 github.com/onsi/gomega v1.36.2 github.com/opiproject/opi-api v0.0.0-20241209203403-595a3a1a838b + github.com/prometheus-community/pro-bing v0.5.0 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.10.0 go.einride.tech/aip v0.68.1 - golang.org/x/net v0.33.0 + golang.org/x/net v0.34.0 golang.org/x/text v0.21.0 google.golang.org/grpc v1.69.2 google.golang.org/protobuf v1.36.1 @@ -36,8 +36,8 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/tools v0.28.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/tools v0.29.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 99bbee7..1dd3461 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ping/ping v1.2.0 h1:vsJ8slZBZAXNCK4dPcI2PEE9eM9n9RbXbGouVQ/Y4yQ= -github.com/go-ping/ping v1.2.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -20,7 +18,6 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= @@ -41,6 +38,8 @@ github.com/opiproject/opi-api v0.0.0-20241209203403-595a3a1a838b h1:4k7lhYkkjo+j github.com/opiproject/opi-api v0.0.0-20241209203403-595a3a1a838b/go.mod h1:92pv4ulvvPMuxCJ9ND3aYbmBfEMLx0VCjpkiR7ZTqPY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus-community/pro-bing v0.5.0 h1:Fq+4BUXKIvsPtXUY8K+04ud9dkAuFozqGmRAyNUpffY= +github.com/prometheus-community/pro-bing v0.5.0/go.mod h1:1joR9oXdMEAcAJJvhs+8vNDvTg5thfAZcRFhcUozG2g= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -71,26 +70,23 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -105,8 +101,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= -golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d h1:H8tOf8XM88HvKqLTxe755haY6r1fqqzLbEnfrmLXlSA= google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY= diff --git a/grpc/client.go b/grpc/client.go index 3f4f3f3..f7428e8 100644 --- a/grpc/client.go +++ b/grpc/client.go @@ -32,7 +32,7 @@ type Connector interface { // New returns a new gRPC connector for the server at the given address func New(address string, tlsfile string) (Connector, error) { - return NewWithDialler(address, grpc.Dial, tlsfile) + return NewWithDialler(address, grpc.NewClient, tlsfile) } // NewWithDialler returns a new gRPC client for the server at the given address using the gRPC dialler provided diff --git a/ipsec/ipsec.go b/ipsec/ipsec.go index e40cccf..c7e776a 100644 --- a/ipsec/ipsec.go +++ b/ipsec/ipsec.go @@ -9,8 +9,8 @@ import ( "log" "time" - "github.com/go-ping/ping" pb "github.com/opiproject/opi-api/security/v1/gen/go" + probing "github.com/prometheus-community/pro-bing" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -175,7 +175,7 @@ func getVersion(ctx context.Context, client pb.IPsecServiceClient) { func doPing(a string) { // .NOTE: The container this test runs in is linked to the appropriate // strongSwan container. - pinger, err := ping.NewPinger(a) + pinger, err := probing.NewPinger(a) if err != nil { log.Fatalf("Cannot create Pinger") } @@ -236,7 +236,7 @@ func loadConnections(ctx context.Context, client pb.IPsecServiceClient) { func dialConnection(address string) error { var err error - conn, err = grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err = grpc.NewClient(address, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Printf("Failed to connect: %v", err) return err diff --git a/network/netinterface.go b/network/netinterface.go new file mode 100644 index 0000000..cb4677f --- /dev/null +++ b/network/netinterface.go @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (C) 2025 Dell Inc, or its subsidiaries. + +// Package network implements the go library for OPI network functions +package network + +import ( + "context" + "log" + + grpcOpi "github.com/opiproject/godpu/grpc" + pb "github.com/opiproject/opi-api/network/opinetcommon/v1alpha1/gen/go" + "google.golang.org/grpc" +) + +// CreateNetInterfaceClient defines the function type used to retrieve NetInterfaceServiceClient +type CreateNetInterfaceClient func(cc grpc.ClientConnInterface) pb.NetInterfaceServiceClient + +// NetIntfClient is used for managing network interfaces on OPI server +type NetIntfClient struct { + c grpcOpi.Connector + createNetInterfaceClient CreateNetInterfaceClient +} + +// NewNetInterface creates a network interface client for use with OPI server at the given address +func NewNetInterface(addr string, tls string) (*NetIntfClient, error) { + c, err := grpcOpi.New(addr, tls) + if err != nil { + return nil, err + } + + return NewNetInterfaceWithArgs(c, pb.NewNetInterfaceServiceClient) +} + +// NewNetInterfaceWithArgs creates a new instance of the network interface client with non-default members +func NewNetInterfaceWithArgs(connector grpcOpi.Connector, createNetInterfaceClient CreateNetInterfaceClient) (*NetIntfClient, error) { + return &NetIntfClient{ + c: connector, + createNetInterfaceClient: createNetInterfaceClient, + }, nil +} + +// ListNetInterfaces retrieves a list of all network interface details from OPI server +func (c NetIntfClient) ListNetInterfaces(ctx context.Context, pageSize int32, pageToken string) (*pb.ListNetInterfacesResponse, error) { + conn, closer, err := c.c.NewConn() + if err != nil { + log.Printf("error creating connection: %s\n", err) + return nil, err + } + defer closer() + + client := c.createNetInterfaceClient(conn) + + data, err := client.ListNetInterfaces(ctx, &pb.ListNetInterfacesRequest{ + PageSize: pageSize, + PageToken: pageToken, + }) + if err != nil { + log.Printf("error List Network Interfaces: %s\n", err) + return nil, err + } + + return data, nil +} diff --git a/storage/goopicsi.go b/storage/goopicsi.go index 851bcba..5e2bddb 100644 --- a/storage/goopicsi.go +++ b/storage/goopicsi.go @@ -340,7 +340,7 @@ func GenerateHostNQN() string { func dialConnection() error { var err error - conn, err = grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err = grpc.NewClient(address, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Printf("Failed to connect: %v", err) return err diff --git a/testing/mock-server/server/server.go b/testing/mock-server/server/server.go index cf62d88..a38b76c 100644 --- a/testing/mock-server/server/server.go +++ b/testing/mock-server/server/server.go @@ -314,7 +314,7 @@ func FindStub(service, method string, in, out interface{}) error { if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) - return fmt.Errorf(string(body)) + return fmt.Errorf("%s", string(body)) } respRPC := new(response) @@ -324,7 +324,7 @@ func FindStub(service, method string, in, out interface{}) error { } if respRPC.Error != "" { - return fmt.Errorf(respRPC.Error) + return fmt.Errorf("%s", respRPC.Error) } data, _ := json.Marshal(respRPC.Data) diff --git a/testing/mock-server/stub/storage.go b/testing/mock-server/stub/storage.go index 358addf..ac7453b 100644 --- a/testing/mock-server/stub/storage.go +++ b/testing/mock-server/stub/storage.go @@ -104,7 +104,7 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error template += expectString if len(closestMatches) == 0 { - return fmt.Errorf(template) + return fmt.Errorf("%s", template) } highestRank := struct { @@ -131,7 +131,7 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error closestMatchString := renderFieldAsString(closestMatch.expect) template += fmt.Sprintf("\n\nClosest Match \n\n%s:%s", closestMatch.rule, closestMatchString) - return fmt.Errorf(template) + return fmt.Errorf("%s", template) } // we made our own simple ranking logic From 607756efbbf1b3024f8fe71d6f5582cda775f1d6 Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Fri, 17 Jan 2025 11:42:17 -0600 Subject: [PATCH 7/8] fix(godpu): restore missing test file Signed-off-by: Mark Sanders --- cmd/network/evpn/evpn-test.go | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 cmd/network/evpn/evpn-test.go diff --git a/cmd/network/evpn/evpn-test.go b/cmd/network/evpn/evpn-test.go new file mode 100644 index 0000000..da178a0 --- /dev/null +++ b/cmd/network/evpn/evpn-test.go @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (c) 2022-2023 Intel Corporation, or its subsidiaries. +// Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. + +// Package evpn implements the evpn related CLI commands +package evpn + +import ( + "log" + + "github.com/spf13/cobra" +) + +// NewEvpnCommand tests the EVPN functionality command +func NewEvpnCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "evpn", + Aliases: []string{"g"}, + Short: "Tests DPU evpn functionality", + Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, _ []string) { + err := cmd.Help() + if err != nil { + log.Fatalf("[ERROR] %s", err.Error()) + } + }, + } + // Bridge cli's + cmd.AddCommand(CreateLogicalBridge()) + cmd.AddCommand(DeleteLogicalBridge()) + cmd.AddCommand(GetLogicalBridge()) + cmd.AddCommand(ListLogicalBridges()) + cmd.AddCommand(UpdateLogicalBridge()) + // Port cli's + cmd.AddCommand(CreateBridgePort()) + cmd.AddCommand(DeleteBridgePort()) + cmd.AddCommand(GetBridgePort()) + cmd.AddCommand(ListBridgePorts()) + cmd.AddCommand(UpdateBridgePort()) + // VRF cli's + cmd.AddCommand(CreateVRF()) + cmd.AddCommand(DeleteVRF()) + cmd.AddCommand(GetVRF()) + cmd.AddCommand(ListVRFs()) + cmd.AddCommand(UpdateVRF()) + // SVI cli's + cmd.AddCommand(CreateSVI()) + cmd.AddCommand(DeleteSVI()) + cmd.AddCommand(GetSVI()) + cmd.AddCommand(ListSVIs()) + cmd.AddCommand(UpdateSVI()) + + return cmd +} From 0e4ba2c6c6ce5e28fbf643e706ff48e0c53df108 Mon Sep 17 00:00:00 2001 From: Mark Sanders Date: Mon, 20 Jan 2025 10:25:57 -0600 Subject: [PATCH 8/8] fix(godpu): change call for error messages with no format required Signed-off-by: Mark Sanders --- testing/mock-server/server/server.go | 5 +++-- testing/mock-server/stub/storage.go | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/testing/mock-server/server/server.go b/testing/mock-server/server/server.go index a38b76c..ea278ab 100644 --- a/testing/mock-server/server/server.go +++ b/testing/mock-server/server/server.go @@ -9,6 +9,7 @@ import ( "bytes" context2 "context" "encoding/json" + "errors" "fmt" "io" "log" @@ -314,7 +315,7 @@ func FindStub(service, method string, in, out interface{}) error { if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) - return fmt.Errorf("%s", string(body)) + return errors.New(string(body)) } respRPC := new(response) @@ -324,7 +325,7 @@ func FindStub(service, method string, in, out interface{}) error { } if respRPC.Error != "" { - return fmt.Errorf("%s", respRPC.Error) + return errors.New(respRPC.Error) } data, _ := json.Marshal(respRPC.Data) diff --git a/testing/mock-server/stub/storage.go b/testing/mock-server/stub/storage.go index ac7453b..683dcca 100644 --- a/testing/mock-server/stub/storage.go +++ b/testing/mock-server/stub/storage.go @@ -6,6 +6,7 @@ package stub import ( "encoding/json" + "errors" "fmt" "log" "os" @@ -104,7 +105,7 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error template += expectString if len(closestMatches) == 0 { - return fmt.Errorf("%s", template) + return errors.New(template) } highestRank := struct { @@ -131,7 +132,7 @@ func stubNotFoundError(stub *findStubPayload, closestMatches []closeMatch) error closestMatchString := renderFieldAsString(closestMatch.expect) template += fmt.Sprintf("\n\nClosest Match \n\n%s:%s", closestMatch.rule, closestMatchString) - return fmt.Errorf("%s", template) + return errors.New(template) } // we made our own simple ranking logic