github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/volume/inspect_test.go (about)

     1  package volume
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"testing"
     7  
     8  	"github.com/docker/cli/internal/test"
     9  	"github.com/docker/cli/internal/test/builders"
    10  	"github.com/docker/docker/api/types/swarm"
    11  	"github.com/docker/docker/api/types/volume"
    12  	"github.com/pkg/errors"
    13  	"gotest.tools/v3/assert"
    14  	"gotest.tools/v3/golden"
    15  )
    16  
    17  func TestVolumeInspectErrors(t *testing.T) {
    18  	testCases := []struct {
    19  		args              []string
    20  		flags             map[string]string
    21  		volumeInspectFunc func(volumeID string) (volume.Volume, error)
    22  		expectedError     string
    23  	}{
    24  		{
    25  			expectedError: "requires at least 1 argument",
    26  		},
    27  		{
    28  			args: []string{"foo"},
    29  			volumeInspectFunc: func(volumeID string) (volume.Volume, error) {
    30  				return volume.Volume{}, errors.Errorf("error while inspecting the volume")
    31  			},
    32  			expectedError: "error while inspecting the volume",
    33  		},
    34  		{
    35  			args: []string{"foo"},
    36  			flags: map[string]string{
    37  				"format": "{{invalid format}}",
    38  			},
    39  			expectedError: "template parsing error",
    40  		},
    41  		{
    42  			args: []string{"foo", "bar"},
    43  			volumeInspectFunc: func(volumeID string) (volume.Volume, error) {
    44  				if volumeID == "foo" {
    45  					return volume.Volume{
    46  						Name: "foo",
    47  					}, nil
    48  				}
    49  				return volume.Volume{}, errors.Errorf("error while inspecting the volume")
    50  			},
    51  			expectedError: "error while inspecting the volume",
    52  		},
    53  	}
    54  	for _, tc := range testCases {
    55  		cmd := newInspectCommand(
    56  			test.NewFakeCli(&fakeClient{
    57  				volumeInspectFunc: tc.volumeInspectFunc,
    58  			}),
    59  		)
    60  		cmd.SetArgs(tc.args)
    61  		for key, value := range tc.flags {
    62  			assert.Check(t, cmd.Flags().Set(key, value))
    63  		}
    64  		cmd.SetOut(io.Discard)
    65  		cmd.SetErr(io.Discard)
    66  		assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
    67  	}
    68  }
    69  
    70  func TestVolumeInspectWithoutFormat(t *testing.T) {
    71  	testCases := []struct {
    72  		name              string
    73  		args              []string
    74  		volumeInspectFunc func(volumeID string) (volume.Volume, error)
    75  	}{
    76  		{
    77  			name: "single-volume",
    78  			args: []string{"foo"},
    79  			volumeInspectFunc: func(volumeID string) (volume.Volume, error) {
    80  				if volumeID != "foo" {
    81  					return volume.Volume{}, errors.Errorf("Invalid volumeID, expected %s, got %s", "foo", volumeID)
    82  				}
    83  				return *builders.Volume(), nil
    84  			},
    85  		},
    86  		{
    87  			name: "multiple-volume-with-labels",
    88  			args: []string{"foo", "bar"},
    89  			volumeInspectFunc: func(volumeID string) (volume.Volume, error) {
    90  				return *builders.Volume(builders.VolumeName(volumeID), builders.VolumeLabels(map[string]string{
    91  					"foo": "bar",
    92  				})), nil
    93  			},
    94  		},
    95  	}
    96  	for _, tc := range testCases {
    97  		cli := test.NewFakeCli(&fakeClient{
    98  			volumeInspectFunc: tc.volumeInspectFunc,
    99  		})
   100  		cmd := newInspectCommand(cli)
   101  		cmd.SetArgs(tc.args)
   102  		assert.NilError(t, cmd.Execute())
   103  		golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("volume-inspect-without-format.%s.golden", tc.name))
   104  	}
   105  }
   106  
   107  func TestVolumeInspectWithFormat(t *testing.T) {
   108  	volumeInspectFunc := func(volumeID string) (volume.Volume, error) {
   109  		return *builders.Volume(builders.VolumeLabels(map[string]string{
   110  			"foo": "bar",
   111  		})), nil
   112  	}
   113  	testCases := []struct {
   114  		name              string
   115  		format            string
   116  		args              []string
   117  		volumeInspectFunc func(volumeID string) (volume.Volume, error)
   118  	}{
   119  		{
   120  			name:              "simple-template",
   121  			format:            "{{.Name}}",
   122  			args:              []string{"foo"},
   123  			volumeInspectFunc: volumeInspectFunc,
   124  		},
   125  		{
   126  			name:              "json-template",
   127  			format:            "{{json .Labels}}",
   128  			args:              []string{"foo"},
   129  			volumeInspectFunc: volumeInspectFunc,
   130  		},
   131  	}
   132  	for _, tc := range testCases {
   133  		cli := test.NewFakeCli(&fakeClient{
   134  			volumeInspectFunc: tc.volumeInspectFunc,
   135  		})
   136  		cmd := newInspectCommand(cli)
   137  		cmd.SetArgs(tc.args)
   138  		assert.Check(t, cmd.Flags().Set("format", tc.format))
   139  		assert.NilError(t, cmd.Execute())
   140  		golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("volume-inspect-with-format.%s.golden", tc.name))
   141  	}
   142  }
   143  
   144  func TestVolumeInspectCluster(t *testing.T) {
   145  	volumeInspectFunc := func(volumeID string) (volume.Volume, error) {
   146  		return volume.Volume{
   147  			Name:   "clustervolume",
   148  			Driver: "clusterdriver1",
   149  			Scope:  "global",
   150  			ClusterVolume: &volume.ClusterVolume{
   151  				ID: "fooid",
   152  				Meta: swarm.Meta{
   153  					Version: swarm.Version{
   154  						Index: uint64(123),
   155  					},
   156  				},
   157  				Spec: volume.ClusterVolumeSpec{
   158  					Group: "group0",
   159  					AccessMode: &volume.AccessMode{
   160  						Scope:       volume.ScopeMultiNode,
   161  						Sharing:     volume.SharingAll,
   162  						BlockVolume: &volume.TypeBlock{},
   163  					},
   164  					AccessibilityRequirements: &volume.TopologyRequirement{
   165  						Requisite: []volume.Topology{
   166  							{
   167  								Segments: map[string]string{
   168  									"region": "R1",
   169  									"zone":   "Z1",
   170  								},
   171  							}, {
   172  								Segments: map[string]string{
   173  									"region": "R1",
   174  									"zone":   "Z2",
   175  								},
   176  							},
   177  						},
   178  						Preferred: []volume.Topology{
   179  							{
   180  								Segments: map[string]string{
   181  									"region": "R1",
   182  									"zone":   "Z1",
   183  								},
   184  							},
   185  						},
   186  					},
   187  					CapacityRange: &volume.CapacityRange{
   188  						RequiredBytes: 1000,
   189  						LimitBytes:    1000000,
   190  					},
   191  					Secrets: []volume.Secret{
   192  						{
   193  							Key:    "secretkey1",
   194  							Secret: "mysecret1",
   195  						}, {
   196  							Key:    "secretkey2",
   197  							Secret: "mysecret2",
   198  						},
   199  					},
   200  					Availability: volume.AvailabilityActive,
   201  				},
   202  				Info: &volume.Info{
   203  					CapacityBytes: 10000,
   204  					VolumeContext: map[string]string{
   205  						"the": "context",
   206  						"has": "entries",
   207  					},
   208  					VolumeID: "clusterdriver1volume1id",
   209  					AccessibleTopology: []volume.Topology{
   210  						{
   211  							Segments: map[string]string{
   212  								"region": "R1",
   213  								"zone":   "Z1",
   214  							},
   215  						},
   216  					},
   217  				},
   218  				PublishStatus: []*volume.PublishStatus{
   219  					{
   220  						NodeID: "node1",
   221  						State:  volume.StatePublished,
   222  						PublishContext: map[string]string{
   223  							"some": "data",
   224  							"yup":  "data",
   225  						},
   226  					}, {
   227  						NodeID: "node2",
   228  						State:  volume.StatePendingNodeUnpublish,
   229  						PublishContext: map[string]string{
   230  							"some":    "more",
   231  							"publish": "context",
   232  						},
   233  					},
   234  				},
   235  			},
   236  		}, nil
   237  	}
   238  
   239  	cli := test.NewFakeCli(&fakeClient{
   240  		volumeInspectFunc: volumeInspectFunc,
   241  	})
   242  
   243  	cmd := newInspectCommand(cli)
   244  	cmd.SetArgs([]string{"clustervolume"})
   245  	assert.NilError(t, cmd.Execute())
   246  	golden.Assert(t, cli.OutBuffer().String(), "volume-inspect-cluster.golden")
   247  }