From a45b44a835470632feb0e8a80e875087fbe68113 Mon Sep 17 00:00:00 2001 From: Archit Kulkarni Date: Mon, 14 Oct 2024 22:25:09 +0000 Subject: [PATCH 1/5] Implement STATUS This commit implements the STATUS CNI verb. It adds a new function StatusDetail which returns a list with the status of each network. Signed-off-by: Michael Zappa Signed-off-by: Archit Kulkarni Co-authored-by: Michael Zappa --- cni.go | 26 ++++++++++++++++++++++++++ cni_test.go | 1 + namespace.go | 4 ++++ types.go | 5 +++++ 4 files changed, 36 insertions(+) diff --git a/cni.go b/cni.go index b10af47..bf05417 100644 --- a/cni.go +++ b/cni.go @@ -45,6 +45,8 @@ type CNI interface { Status() error // GetConfig returns a copy of the CNI plugin configurations as parsed by CNI GetConfig() *ConfigResult + // Status executes the status verb of the cni plugin + StatusDetail(context.Context) ([]*NetworkStatus, error) } type ConfigResult struct { @@ -310,3 +312,27 @@ func (c *libcni) GetConfig() *ConfigResult { func (c *libcni) reset() { c.networks = nil } + +// StatusDetail returns a slice of network statuses +func (c *libcni) StatusDetail(ctx context.Context) ([]*NetworkStatus, error) { + err := c.Status() + + if err != nil { + return nil, err + } + + var networks []*NetworkStatus + + for _, network := range c.Networks() { + if network.config.Name == "cni-loopback" { + continue + } + + networks = append(networks, &NetworkStatus{ + Network: network, + Status: network.Status(ctx), + }) + } + + return networks, nil +} diff --git a/cni_test.go b/cni_test.go index ea7d1d5..f453b43 100644 --- a/cni_test.go +++ b/cni_test.go @@ -342,6 +342,7 @@ func TestLibCNIType120(t *testing.T) { Args: [][2]string(nil), CapabilityArgs: map[string]interface{}{}, } + mockCNI.On("GetStatusNetworkList", l.networks[1].config).Return(nil) mockCNI.On("AddNetworkList", l.networks[1].config, expectedRT).Return(&types100.Result{ CNIVersion: "1.1.0", Interfaces: []*types100.Interface{ diff --git a/namespace.go b/namespace.go index 319182b..af3c866 100644 --- a/namespace.go +++ b/namespace.go @@ -45,6 +45,10 @@ func (n *Network) Check(ctx context.Context, ns *Namespace) error { return n.cni.CheckNetworkList(ctx, n.config, ns.config(n.ifName)) } +func (n *Network) Status(ctx context.Context) error { + return n.cni.GetStatusNetworkList(ctx, n.config) +} + type Namespace struct { id string path string diff --git a/types.go b/types.go index 18616c0..92c6254 100644 --- a/types.go +++ b/types.go @@ -60,3 +60,8 @@ type DNS struct { // List of DNS options. Options []string } + +type NetworkStatus struct { + Network *Network + Status error +} From 7afa42f5b018ca8960c6a391ec13ff2a8bc0d27b Mon Sep 17 00:00:00 2001 From: Archit Kulkarni Date: Tue, 15 Oct 2024 17:45:36 +0000 Subject: [PATCH 2/5] Add unit test for StatusDetail() Signed-off-by: Archit Kulkarni --- cni_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cni_test.go b/cni_test.go index f453b43..9d0c4b6 100644 --- a/cni_test.go +++ b/cni_test.go @@ -315,6 +315,7 @@ func TestLibCNIType120(t *testing.T) { Args: [][2]string(nil), CapabilityArgs: map[string]interface{}{}, } + mockCNI.On("GetStatusNetworkList", l.networks[0].config).Return(nil) mockCNI.On("AddNetworkList", l.networks[0].config, expectedRT).Return(&types100.Result{ CNIVersion: "1.1.0", Interfaces: []*types100.Interface{ @@ -375,6 +376,12 @@ func TestLibCNIType120(t *testing.T) { err = l.Remove(ctx, "container-id1", "/proc/12345/ns/net") assert.NoError(t, err) + + statuses, err := l.StatusDetail(ctx) + assert.NoError(t, err) + assert.Len(t, statuses, 2) + assert.Nil(t, statuses[0].Status) + assert.Nil(t, statuses[1].Status) } type MockCNI struct { From a7839ab9d17b4a1578f2cbccd982bf5e38b7cb85 Mon Sep 17 00:00:00 2001 From: Archit Kulkarni Date: Tue, 15 Oct 2024 10:30:07 -0700 Subject: [PATCH 3/5] Update cni.go Co-authored-by: Samuel Karp Signed-off-by: Archit Kulkarni --- cni.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cni.go b/cni.go index bf05417..97d2774 100644 --- a/cni.go +++ b/cni.go @@ -315,9 +315,7 @@ func (c *libcni) reset() { // StatusDetail returns a slice of network statuses func (c *libcni) StatusDetail(ctx context.Context) ([]*NetworkStatus, error) { - err := c.Status() - - if err != nil { + if err := c.Status(); err != nil { return nil, err } From 1d06125c739aee4bbba1d290da6f6d181dee2535 Mon Sep 17 00:00:00 2001 From: Archit Kulkarni Date: Wed, 23 Oct 2024 20:27:01 +0000 Subject: [PATCH 4/5] Add comment about loopback network Signed-off-by: Archit Kulkarni --- cni.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cni.go b/cni.go index 97d2774..99a87ba 100644 --- a/cni.go +++ b/cni.go @@ -30,6 +30,8 @@ import ( "github.com/containernetworking/cni/pkg/version" ) +const LoopbackNetworkName = "cni-loopback" + type CNI interface { // Setup setup the network for the namespace Setup(ctx context.Context, id string, path string, opts ...NamespaceOpts) (*Result, error) @@ -322,7 +324,9 @@ func (c *libcni) StatusDetail(ctx context.Context) ([]*NetworkStatus, error) { var networks []*NetworkStatus for _, network := range c.Networks() { - if network.config.Name == "cni-loopback" { + // Skip checking the status of the loopback network. It would have + // always returned the same thing, and is being deprecated anyway. + if network.config.Name == LoopbackNetworkName { continue } From b110ac0dfd0f925dd0a35750f5dfe2e71fb6b19a Mon Sep 17 00:00:00 2001 From: Archit Kulkarni Date: Wed, 23 Oct 2024 20:28:06 +0000 Subject: [PATCH 5/5] Rename networks to networkStatuses Signed-off-by: Archit Kulkarni --- cni.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cni.go b/cni.go index 99a87ba..d9a223a 100644 --- a/cni.go +++ b/cni.go @@ -321,7 +321,7 @@ func (c *libcni) StatusDetail(ctx context.Context) ([]*NetworkStatus, error) { return nil, err } - var networks []*NetworkStatus + var networkStatuses []*NetworkStatus for _, network := range c.Networks() { // Skip checking the status of the loopback network. It would have @@ -330,11 +330,11 @@ func (c *libcni) StatusDetail(ctx context.Context) ([]*NetworkStatus, error) { continue } - networks = append(networks, &NetworkStatus{ + networkStatuses = append(networkStatuses, &NetworkStatus{ Network: network, Status: network.Status(ctx), }) } - return networks, nil + return networkStatuses, nil }