client: NetworkList: wrap result

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn
2025-10-21 17:40:19 +02:00
parent 3fbf5a3bd1
commit 485b95600a
12 changed files with 61 additions and 51 deletions

View File

@@ -131,7 +131,7 @@ type NetworkAPIClient interface {
NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (network.CreateResponse, error) NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (network.CreateResponse, error)
NetworkDisconnect(ctx context.Context, network, container string, force bool) error NetworkDisconnect(ctx context.Context, network, container string, force bool) error
NetworkInspect(ctx context.Context, network string, options NetworkInspectOptions) (NetworkInspectResult, error) NetworkInspect(ctx context.Context, network string, options NetworkInspectOptions) (NetworkInspectResult, error)
NetworkList(ctx context.Context, options NetworkListOptions) ([]network.Summary, error) NetworkList(ctx context.Context, options NetworkListOptions) (NetworkListResult, error)
NetworkRemove(ctx context.Context, network string) error NetworkRemove(ctx context.Context, network string) error
NetworksPrune(ctx context.Context, opts NetworkPruneOptions) (NetworkPruneResult, error) NetworksPrune(ctx context.Context, opts NetworkPruneOptions) (NetworkPruneResult, error)
} }

View File

@@ -8,16 +8,21 @@ import (
"github.com/moby/moby/api/types/network" "github.com/moby/moby/api/types/network"
) )
// NetworkListResult holds the result from the [Client.NetworkList] method.
type NetworkListResult struct {
Items []network.Summary
}
// NetworkList returns the list of networks configured in the docker host. // NetworkList returns the list of networks configured in the docker host.
func (cli *Client) NetworkList(ctx context.Context, options NetworkListOptions) ([]network.Summary, error) { func (cli *Client) NetworkList(ctx context.Context, options NetworkListOptions) (NetworkListResult, error) {
query := url.Values{} query := url.Values{}
options.Filters.updateURLValues(query) options.Filters.updateURLValues(query)
var networkResources []network.Summary
resp, err := cli.get(ctx, "/networks", query, nil) resp, err := cli.get(ctx, "/networks", query, nil)
defer ensureReaderClosed(resp) defer ensureReaderClosed(resp)
if err != nil { if err != nil {
return networkResources, err return NetworkListResult{}, err
} }
err = json.NewDecoder(resp.Body).Decode(&networkResources) var res NetworkListResult
return networkResources, err err = json.NewDecoder(resp.Body).Decode(&res.Items)
return res, err
} }

View File

@@ -84,8 +84,8 @@ func TestNetworkList(t *testing.T) {
})) }))
assert.NilError(t, err) assert.NilError(t, err)
networkResources, err := client.NetworkList(context.Background(), listCase.options) res, err := client.NetworkList(context.Background(), listCase.options)
assert.NilError(t, err) assert.NilError(t, err)
assert.Check(t, is.Len(networkResources, 1)) assert.Check(t, is.Len(res.Items, 1))
} }
} }

View File

@@ -35,8 +35,8 @@ func OnlyDefaultNetworks(ctx context.Context) bool {
if err != nil { if err != nil {
return false return false
} }
networks, err := apiClient.NetworkList(ctx, client.NetworkListOptions{}) res, err := apiClient.NetworkList(ctx, client.NetworkListOptions{})
if err != nil || len(networks) > 0 { if err != nil || len(res.Items) > 0 {
return false return false
} }
return true return true

View File

@@ -31,12 +31,12 @@ func createAmbiguousNetworks(ctx context.Context, t *testing.T, apiClient client
idPrefixNet := network.CreateNoError(ctx, t, apiClient, testNet[:12]) idPrefixNet := network.CreateNoError(ctx, t, apiClient, testNet[:12])
fullIDNet := network.CreateNoError(ctx, t, apiClient, testNet) fullIDNet := network.CreateNoError(ctx, t, apiClient, testNet)
nws, err := apiClient.NetworkList(ctx, client.NetworkListOptions{}) res, err := apiClient.NetworkList(ctx, client.NetworkListOptions{})
assert.NilError(t, err) assert.NilError(t, err)
assert.Check(t, is.Equal(true, containsNetwork(nws, testNet)), "failed to create network testNet") assert.Check(t, is.Equal(true, containsNetwork(res.Items, testNet)), "failed to create network testNet")
assert.Check(t, is.Equal(true, containsNetwork(nws, idPrefixNet)), "failed to create network idPrefixNet") assert.Check(t, is.Equal(true, containsNetwork(res.Items, idPrefixNet)), "failed to create network idPrefixNet")
assert.Check(t, is.Equal(true, containsNetwork(nws, fullIDNet)), "failed to create network fullIDNet") assert.Check(t, is.Equal(true, containsNetwork(res.Items, fullIDNet)), "failed to create network fullIDNet")
return testNet, idPrefixNet, fullIDNet return testNet, idPrefixNet, fullIDNet
} }
@@ -79,9 +79,9 @@ func TestDockerNetworkDeletePreferID(t *testing.T) {
assert.NilError(t, err) assert.NilError(t, err)
// networks "testNet" and "idPrefixNet" should be removed, but "fullIDNet" should still exist // networks "testNet" and "idPrefixNet" should be removed, but "fullIDNet" should still exist
nws, err := apiClient.NetworkList(ctx, client.NetworkListOptions{}) res, err := apiClient.NetworkList(ctx, client.NetworkListOptions{})
assert.NilError(t, err) assert.NilError(t, err)
assert.Check(t, is.Equal(false, containsNetwork(nws, testNet)), "Network testNet not removed") assert.Check(t, is.Equal(false, containsNetwork(res.Items, testNet)), "Network testNet not removed")
assert.Check(t, is.Equal(false, containsNetwork(nws, idPrefixNet)), "Network idPrefixNet not removed") assert.Check(t, is.Equal(false, containsNetwork(res.Items, idPrefixNet)), "Network idPrefixNet not removed")
assert.Check(t, is.Equal(true, containsNetwork(nws, fullIDNet)), "Network fullIDNet not found") assert.Check(t, is.Equal(true, containsNetwork(res.Items, fullIDNet)), "Network fullIDNet not found")
} }

View File

@@ -53,12 +53,12 @@ func LinkDoesntExist(ctx context.Context, t *testing.T, master string) {
// IsNetworkAvailable provides a comparison to check if a docker network is available // IsNetworkAvailable provides a comparison to check if a docker network is available
func IsNetworkAvailable(ctx context.Context, c client.NetworkAPIClient, name string) is.Comparison { func IsNetworkAvailable(ctx context.Context, c client.NetworkAPIClient, name string) is.Comparison {
return func() is.Result { return func() is.Result {
networks, err := c.NetworkList(ctx, client.NetworkListOptions{}) res, err := c.NetworkList(ctx, client.NetworkListOptions{})
if err != nil { if err != nil {
return is.ResultFromError(err) return is.ResultFromError(err)
} }
for _, network := range networks { for _, nw := range res.Items {
if network.Name == name { if nw.Name == name {
return is.ResultSuccess return is.ResultSuccess
} }
} }
@@ -69,12 +69,12 @@ func IsNetworkAvailable(ctx context.Context, c client.NetworkAPIClient, name str
// IsNetworkNotAvailable provides a comparison to check if a docker network is not available // IsNetworkNotAvailable provides a comparison to check if a docker network is not available
func IsNetworkNotAvailable(ctx context.Context, c client.NetworkAPIClient, name string) is.Comparison { func IsNetworkNotAvailable(ctx context.Context, c client.NetworkAPIClient, name string) is.Comparison {
return func() is.Result { return func() is.Result {
networks, err := c.NetworkList(ctx, client.NetworkListOptions{}) res, err := c.NetworkList(ctx, client.NetworkListOptions{})
if err != nil { if err != nil {
return is.ResultFromError(err) return is.ResultFromError(err)
} }
for _, network := range networks { for _, nw := range res.Items {
if network.Name == name { if nw.Name == name {
return is.ResultFailure(fmt.Sprintf("network %s is still present", name)) return is.ResultFailure(fmt.Sprintf("network %s is still present", name))
} }
} }

View File

@@ -11,12 +11,12 @@ import (
// IsNetworkAvailable provides a comparison to check if a docker network is available // IsNetworkAvailable provides a comparison to check if a docker network is available
func IsNetworkAvailable(ctx context.Context, c client.NetworkAPIClient, name string) cmp.Comparison { func IsNetworkAvailable(ctx context.Context, c client.NetworkAPIClient, name string) cmp.Comparison {
return func() cmp.Result { return func() cmp.Result {
networks, err := c.NetworkList(ctx, client.NetworkListOptions{}) res, err := c.NetworkList(ctx, client.NetworkListOptions{})
if err != nil { if err != nil {
return cmp.ResultFromError(err) return cmp.ResultFromError(err)
} }
for _, network := range networks { for _, nw := range res.Items {
if network.Name == name { if nw.Name == name {
return cmp.ResultSuccess return cmp.ResultSuccess
} }
} }
@@ -27,12 +27,12 @@ func IsNetworkAvailable(ctx context.Context, c client.NetworkAPIClient, name str
// IsNetworkNotAvailable provides a comparison to check if a docker network is not available // IsNetworkNotAvailable provides a comparison to check if a docker network is not available
func IsNetworkNotAvailable(ctx context.Context, c client.NetworkAPIClient, name string) cmp.Comparison { func IsNetworkNotAvailable(ctx context.Context, c client.NetworkAPIClient, name string) cmp.Comparison {
return func() cmp.Result { return func() cmp.Result {
networks, err := c.NetworkList(ctx, client.NetworkListOptions{}) res, err := c.NetworkList(ctx, client.NetworkListOptions{})
if err != nil { if err != nil {
return cmp.ResultFromError(err) return cmp.ResultFromError(err)
} }
for _, network := range networks { for _, nw := range res.Items {
if network.Name == name { if nw.Name == name {
return cmp.ResultFailure(fmt.Sprintf("network %s is still present", name)) return cmp.ResultFailure(fmt.Sprintf("network %s is still present", name))
} }
} }

View File

@@ -130,15 +130,15 @@ func TestAPINetworkFilter(t *testing.T) {
ctx := setupTest(t) ctx := setupTest(t)
apiClient := testEnv.APIClient() apiClient := testEnv.APIClient()
networks, err := apiClient.NetworkList(ctx, client.NetworkListOptions{ res, err := apiClient.NetworkList(ctx, client.NetworkListOptions{
Filters: make(client.Filters).Add("name", networkName), Filters: make(client.Filters).Add("name", networkName),
}) })
assert.NilError(t, err) assert.NilError(t, err)
found := false found := false
for _, network := range networks { for _, nw := range res.Items {
if network.Name == networkName { if nw.Name == networkName {
found = true found = true
} }
} }

View File

@@ -144,22 +144,22 @@ func deleteAllVolumes(ctx context.Context, t testing.TB, c client.VolumeAPIClien
func deleteAllNetworks(ctx context.Context, t testing.TB, c client.NetworkAPIClient, daemonPlatform string, protectedNetworks map[string]struct{}) { func deleteAllNetworks(ctx context.Context, t testing.TB, c client.NetworkAPIClient, daemonPlatform string, protectedNetworks map[string]struct{}) {
t.Helper() t.Helper()
networks, err := c.NetworkList(ctx, client.NetworkListOptions{}) res, err := c.NetworkList(ctx, client.NetworkListOptions{})
assert.Check(t, err, "failed to list networks") assert.Check(t, err, "failed to list networks")
for _, n := range networks { for _, nw := range res.Items {
if n.Name == network.NetworkBridge || n.Name == network.NetworkNone || n.Name == network.NetworkHost { if nw.Name == network.NetworkBridge || nw.Name == network.NetworkNone || nw.Name == network.NetworkHost {
continue continue
} }
if _, ok := protectedNetworks[n.ID]; ok { if _, ok := protectedNetworks[nw.ID]; ok {
continue continue
} }
if daemonPlatform == "windows" && strings.ToLower(n.Name) == network.NetworkNat { if daemonPlatform == "windows" && strings.ToLower(nw.Name) == network.NetworkNat {
// nat is a pre-defined network on Windows and cannot be removed // nat is a pre-defined network on Windows and cannot be removed
continue continue
} }
err := c.NetworkRemove(ctx, n.ID) err := c.NetworkRemove(ctx, nw.ID)
assert.Check(t, err, "failed to remove network %s", n.ID) assert.Check(t, err, "failed to remove network %s", nw.ID)
} }
} }

View File

@@ -165,14 +165,14 @@ func ProtectNetworks(ctx context.Context, t testing.TB, testEnv *Execution) {
func getExistingNetworks(ctx context.Context, t testing.TB, testEnv *Execution) []string { func getExistingNetworks(ctx context.Context, t testing.TB, testEnv *Execution) []string {
t.Helper() t.Helper()
apiClient := testEnv.APIClient() apiClient := testEnv.APIClient()
networkList, err := apiClient.NetworkList(ctx, client.NetworkListOptions{}) res, err := apiClient.NetworkList(ctx, client.NetworkListOptions{})
assert.NilError(t, err, "failed to list networks") assert.NilError(t, err, "failed to list networks")
var networks []string var nwIDs []string
for _, network := range networkList { for _, nw := range res.Items {
networks = append(networks, network.ID) nwIDs = append(nwIDs, nw.ID)
} }
return networks return nwIDs
} }
// ProtectPlugin adds the specified plugin(s) to be protected in case of clean // ProtectPlugin adds the specified plugin(s) to be protected in case of clean

View File

@@ -131,7 +131,7 @@ type NetworkAPIClient interface {
NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (network.CreateResponse, error) NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (network.CreateResponse, error)
NetworkDisconnect(ctx context.Context, network, container string, force bool) error NetworkDisconnect(ctx context.Context, network, container string, force bool) error
NetworkInspect(ctx context.Context, network string, options NetworkInspectOptions) (NetworkInspectResult, error) NetworkInspect(ctx context.Context, network string, options NetworkInspectOptions) (NetworkInspectResult, error)
NetworkList(ctx context.Context, options NetworkListOptions) ([]network.Summary, error) NetworkList(ctx context.Context, options NetworkListOptions) (NetworkListResult, error)
NetworkRemove(ctx context.Context, network string) error NetworkRemove(ctx context.Context, network string) error
NetworksPrune(ctx context.Context, opts NetworkPruneOptions) (NetworkPruneResult, error) NetworksPrune(ctx context.Context, opts NetworkPruneOptions) (NetworkPruneResult, error)
} }

View File

@@ -8,16 +8,21 @@ import (
"github.com/moby/moby/api/types/network" "github.com/moby/moby/api/types/network"
) )
// NetworkListResult holds the result from the [Client.NetworkList] method.
type NetworkListResult struct {
Items []network.Summary
}
// NetworkList returns the list of networks configured in the docker host. // NetworkList returns the list of networks configured in the docker host.
func (cli *Client) NetworkList(ctx context.Context, options NetworkListOptions) ([]network.Summary, error) { func (cli *Client) NetworkList(ctx context.Context, options NetworkListOptions) (NetworkListResult, error) {
query := url.Values{} query := url.Values{}
options.Filters.updateURLValues(query) options.Filters.updateURLValues(query)
var networkResources []network.Summary
resp, err := cli.get(ctx, "/networks", query, nil) resp, err := cli.get(ctx, "/networks", query, nil)
defer ensureReaderClosed(resp) defer ensureReaderClosed(resp)
if err != nil { if err != nil {
return networkResources, err return NetworkListResult{}, err
} }
err = json.NewDecoder(resp.Body).Decode(&networkResources) var res NetworkListResult
return networkResources, err err = json.NewDecoder(resp.Body).Decode(&res.Items)
return res, err
} }