github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/volumes_test.go (about) 1 package cmd 2 3 import ( 4 "bytes" 5 "fmt" 6 "net/http" 7 "testing" 8 9 "github.com/drycc/controller-sdk-go/api" 10 "github.com/drycc/workflow-cli/pkg/testutil" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestVolumesList(t *testing.T) { 15 t.Parallel() 16 cf, server, err := testutil.NewTestServerAndClient() 17 if err != nil { 18 t.Fatal(err) 19 } 20 defer server.Close() 21 var b bytes.Buffer 22 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 23 24 server.Mux.HandleFunc("/v2/apps/example-go/volumes/", func(w http.ResponseWriter, _ *http.Request) { 25 testutil.SetHeaders(w) 26 fmt.Fprintf(w, `{ 27 "count": 1, 28 "next": null, 29 "previous": null, 30 "results": [ 31 { 32 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 33 "owner": "test", 34 "app": "example-go", 35 "name": "myvolume", 36 "size": "500G", 37 "path": {"cmd": "/data/cmd1", "cmd123": "/data/cmd123"}, 38 "type": "csi", 39 "parameters": {}, 40 "created": "2020-08-26T00:00:00UTC", 41 "updated": "2020-08-26T00:00:00UTC" 42 } 43 ] 44 }`) 45 }) 46 47 err = cmdr.VolumesList("example-go", -1) 48 assert.NoError(t, err) 49 assert.Equal(t, b.String(), `NAME OWNER TYPE PTYPE PATH SIZE 50 myvolume test csi cmd /data/cmd1 500G 51 myvolume test csi cmd123 /data/cmd123 500G 52 `, "output") 53 } 54 55 func TestVolumesCreate(t *testing.T) { 56 t.Parallel() 57 cf, server, err := testutil.NewTestServerAndClient() 58 if err != nil { 59 t.Fatal(err) 60 } 61 defer server.Close() 62 var b bytes.Buffer 63 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 64 65 server.Mux.HandleFunc("/v2/apps/example-go/volumes/", func(w http.ResponseWriter, r *http.Request) { 66 testutil.AssertBody(t, api.Volume{Name: "myvolume", Size: "500G", Type: "csi"}, r) 67 testutil.SetHeaders(w) 68 w.WriteHeader(http.StatusCreated) 69 // Body isn't used by CLI, so it isn't set. 70 w.Write([]byte("{}")) 71 }) 72 73 err = cmdr.VolumesCreate("example-go", "myvolume", "csi", "500G", map[string]interface{}{}) 74 assert.NoError(t, err) 75 err = cmdr.VolumesCreate("example-go", "myvolume", "csi", "500K", map[string]interface{}{}) 76 expected := `500K doesn't fit format #unit 77 Examples: 2G 2g` 78 assert.Equal(t, err.Error(), expected, "output") 79 80 assert.Equal(t, testutil.StripProgress(b.String()), "Creating myvolume to example-go... done\n", "output") 81 } 82 83 func TestVolumesInfo(t *testing.T) { 84 t.Parallel() 85 cf, server, err := testutil.NewTestServerAndClient() 86 if err != nil { 87 t.Fatal(err) 88 } 89 defer server.Close() 90 var b bytes.Buffer 91 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 92 93 server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/", func(w http.ResponseWriter, _ *http.Request) { 94 testutil.SetHeaders(w) 95 fmt.Fprintf(w, `{ 96 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 97 "owner": "test", 98 "app": "example-go", 99 "name": "myvolume", 100 "size": "0G", 101 "path": {"cmd": "/data/cmd1", "cmd123": "/data/cmd123"}, 102 "type": "nfs", 103 "parameters": { 104 "nfs": { 105 "server": "nfs.drycc.cc", 106 "path": "/mnt", 107 "readOnly": true 108 } 109 }, 110 "created": "2020-08-26T00:00:00UTC", 111 "updated": "2020-08-26T00:00:00UTC" 112 }`) 113 }) 114 115 err = cmdr.VolumesInfo("example-go", "myvolume") 116 assert.NoError(t, err) 117 assert.Equal(t, b.String(), `UUID: de1bf5b5-4a72-4f94-a10c-d2a3741cdf75 118 Name: myvolume 119 Owner: test 120 Type: nfs 121 Path: 122 cmd: /data/cmd1 123 cmd123: /data/cmd123 124 125 Parameters: 126 nfs: 127 path: /mnt 128 readOnly: true 129 server: nfs.drycc.cc 130 131 Created: 2020-08-26T00:00:00UTC 132 Updated: 2020-08-26T00:00:00UTC 133 `, "output") 134 } 135 136 func TestVolumesExpand(t *testing.T) { 137 t.Parallel() 138 cf, server, err := testutil.NewTestServerAndClient() 139 if err != nil { 140 t.Fatal(err) 141 } 142 defer server.Close() 143 var b bytes.Buffer 144 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 145 146 server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/", func(w http.ResponseWriter, r *http.Request) { 147 testutil.AssertBody(t, api.Volume{Name: "myvolume", Size: "500G"}, r) 148 testutil.SetHeaders(w) 149 w.WriteHeader(http.StatusCreated) 150 // Body isn't used by CLI, so it isn't set. 151 w.Write([]byte("{}")) 152 }) 153 154 err = cmdr.VolumesExpand("example-go", "myvolume", "500G") 155 assert.NoError(t, err) 156 err = cmdr.VolumesExpand("example-go", "myvolume", "500K") 157 expected := `500K doesn't fit format #unit 158 Examples: 2G 2g` 159 assert.Equal(t, err.Error(), expected, "output") 160 161 assert.Equal(t, testutil.StripProgress(b.String()), "Expand myvolume to example-go... done\n", "output") 162 } 163 164 func TestVolumesDelete(t *testing.T) { 165 t.Parallel() 166 cf, server, err := testutil.NewTestServerAndClient() 167 if err != nil { 168 t.Fatal(err) 169 } 170 defer server.Close() 171 var b bytes.Buffer 172 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 173 174 server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/", func(w http.ResponseWriter, _ *http.Request) { 175 testutil.SetHeaders(w) 176 w.WriteHeader(http.StatusNoContent) 177 }) 178 179 err = cmdr.VolumesDelete("example-go", "myvolume") 180 assert.NoError(t, err) 181 182 assert.Equal(t, testutil.StripProgress(b.String()), "Deleting myvolume from example-go... done\n", "output") 183 } 184 185 func TestVolumesMount(t *testing.T) { 186 t.Parallel() 187 cf, server, err := testutil.NewTestServerAndClient() 188 if err != nil { 189 t.Fatal(err) 190 } 191 defer server.Close() 192 193 server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/path/", func(w http.ResponseWriter, r *http.Request) { 194 testutil.SetHeaders(w) 195 if r.Method == "PATCH" { 196 testutil.AssertBody(t, api.Volume{ 197 Path: map[string]interface{}{ 198 "cmd": "/data/cmd1", 199 }, 200 }, r) 201 } 202 fmt.Fprintf(w, `{ 203 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 204 "owner": "test", 205 "app": "example-go", 206 "name": "myvolume", 207 "size": "500G", 208 "path": {"cmd": "/data/cmd1"}, 209 "type": "csi", 210 "parameters": {}, 211 "created": "2020-08-26T00:00:00UTC", 212 "updated": "2020-08-26T00:00:00UTC" 213 }`) 214 }) 215 216 var b bytes.Buffer 217 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 218 219 err = cmdr.VolumesMount("example-go", "myvolume", []string{"cmd=/data/cmd1"}) 220 assert.NoError(t, err) 221 222 assert.Equal(t, testutil.StripProgress(b.String()), `Mounting volume... done 223 The pods should be restart, please check the pods up or not. 224 `, "output") 225 } 226 227 func TestVolumesUnmount(t *testing.T) { 228 t.Parallel() 229 cf, server, err := testutil.NewTestServerAndClient() 230 if err != nil { 231 t.Fatal(err) 232 } 233 defer server.Close() 234 235 server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/path/", func(w http.ResponseWriter, r *http.Request) { 236 testutil.SetHeaders(w) 237 if r.Method == "PATCH" { 238 testutil.AssertBody(t, api.Volume{ 239 Path: map[string]interface{}{ 240 "cmd": nil, 241 }, 242 }, r) 243 } 244 fmt.Fprintf(w, `{ 245 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 246 "owner": "test", 247 "app": "example-go", 248 "name": "myvolume", 249 "size": "500G", 250 "path": {}, 251 "type": "csi", 252 "parameters": {}, 253 "created": "2020-08-26T00:00:00UTC", 254 "updated": "2020-08-26T00:00:00UTC" 255 }`) 256 }) 257 258 var b bytes.Buffer 259 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 260 261 err = cmdr.VolumesUnmount("example-go", "myvolume", []string{"cmd"}) 262 assert.NoError(t, err) 263 264 assert.Equal(t, testutil.StripProgress(b.String()), `Unmounting volume... done 265 The pods should be restart, please check the pods up or not. 266 `, "output") 267 }