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 }