github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/resources_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 11 "github.com/drycc/workflow-cli/pkg/testutil" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestResourcesServices(t *testing.T) { 16 t.Parallel() 17 cf, server, err := testutil.NewTestServerAndClient() 18 if err != nil { 19 t.Fatal(err) 20 } 21 defer server.Close() 22 var b bytes.Buffer 23 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 24 25 server.Mux.HandleFunc("/v2/resources/services/", func(w http.ResponseWriter, _ *http.Request) { 26 testutil.SetHeaders(w) 27 fmt.Fprintf(w, `{ 28 "results": [ 29 { 30 "id": "332588e0-6c2c-4f56-a6af-a56fd01ec4b4", 31 "name": "mysql", 32 "updateable": true 33 } 34 ], 35 "count": 1 36 }`) 37 }) 38 39 err = cmdr.ResourcesServices(100) 40 assert.NoError(t, err) 41 42 assert.Equal(t, b.String(), `ID NAME UPDATEABLE 43 332588e0-6c2c-4f56-a6af-a56fd01ec4b4 mysql true 44 `, "output") 45 } 46 47 func TestResourcesPlans(t *testing.T) { 48 t.Parallel() 49 cf, server, err := testutil.NewTestServerAndClient() 50 if err != nil { 51 t.Fatal(err) 52 } 53 defer server.Close() 54 var b bytes.Buffer 55 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 56 57 server.Mux.HandleFunc("/v2/resources/services/mysql/plans/", func(w http.ResponseWriter, _ *http.Request) { 58 testutil.SetHeaders(w) 59 fmt.Fprintf(w, `{ 60 "results": [{ 61 "id": "4d1dbd33-201b-45bc-9abb-757584ef7ab8", 62 "name": "standard-1600", 63 "description": "mysql standard-1600 plan which limit persistence size 1600Gi." 64 }], 65 "count": 1 66 }`) 67 }) 68 69 err = cmdr.ResourcesPlans("mysql", 100) 70 assert.NoError(t, err) 71 72 assert.Equal(t, b.String(), `ID NAME DESCRIPTION 73 4d1dbd33-201b-45bc-9abb-757584ef7ab8 standard-1600 mysql standard-1600 plan which limit persistence size 1600Gi. 74 `, "output") 75 } 76 77 func TestResourcesCreate(t *testing.T) { 78 t.Parallel() 79 cf, server, err := testutil.NewTestServerAndClient() 80 if err != nil { 81 t.Fatal(err) 82 } 83 defer server.Close() 84 var b bytes.Buffer 85 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 86 87 server.Mux.HandleFunc("/v2/apps/example-go/resources/", func(w http.ResponseWriter, r *http.Request) { 88 testutil.AssertBody(t, api.Resource{Name: "mysql", Plan: "mysql:5.6"}, r) 89 testutil.SetHeaders(w) 90 w.WriteHeader(http.StatusCreated) 91 // Body isn't used by CLI, so it isn't set. 92 w.Write([]byte("{}")) 93 }) 94 95 err = cmdr.ResourcesCreate("example-go", "mysql:5.6", "mysql", nil, "") 96 assert.NoError(t, err) 97 98 assert.Equal(t, testutil.StripProgress(b.String()), "Creating mysql to example-go... done\n", "output") 99 } 100 101 func TestResourcesList(t *testing.T) { 102 t.Parallel() 103 cf, server, err := testutil.NewTestServerAndClient() 104 if err != nil { 105 t.Fatal(err) 106 } 107 defer server.Close() 108 var b bytes.Buffer 109 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 110 111 server.Mux.HandleFunc("/v2/apps/example-go/resources/", func(w http.ResponseWriter, _ *http.Request) { 112 testutil.SetHeaders(w) 113 fmt.Fprintf(w, `{ 114 "count": 1, 115 "next": null, 116 "previous": null, 117 "results": [ 118 { 119 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 120 "owner": "test", 121 "app": "example-go", 122 "name": "mysql", 123 "plan": "mysql:5.6", 124 "data": {}, 125 "options": {}, 126 "status": null, 127 "binding": null, 128 "created": "2020-09-08T00:00:00UTC", 129 "updated": "2020-09-08T00:00:00UTC" 130 } 131 ] 132 }`) 133 }) 134 135 err = cmdr.ResourcesList("example-go", -1) 136 assert.NoError(t, err) 137 138 assert.Equal(t, b.String(), `UUID NAME OWNER PLAN UPDATED 139 de1bf5b5-4a72-4f94-a10c-d2a3741cdf75 mysql test mysql:5.6 2020-09-08T00:00:00UTC 140 `, "output") 141 } 142 143 func TestResourceGet(t *testing.T) { 144 t.Parallel() 145 cf, server, err := testutil.NewTestServerAndClient() 146 if err != nil { 147 t.Fatal(err) 148 } 149 defer server.Close() 150 var b bytes.Buffer 151 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 152 153 server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/", func(w http.ResponseWriter, _ *http.Request) { 154 testutil.SetHeaders(w) 155 fmt.Fprintf(w, `{ 156 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 157 "owner": "test", 158 "app": "example-go", 159 "name": "mysql", 160 "plan": "mysql:5.6", 161 "data": {"data12":"value1","data3":"value1"}, 162 "options": {"para13451":"value2","para122":"value1"}, 163 "status": "Ready", 164 "binding": "Ready", 165 "created": "2020-09-08T00:00:00UTC", 166 "updated": "2020-09-08T00:00:00UTC" 167 }`) 168 }) 169 170 err = cmdr.ResourceGet("example-go", "mysql") 171 assert.NoError(t, err) 172 // todo format data json to yaml 173 assert.Equal(t, b.String(), `App: example-go 174 UUID: de1bf5b5-4a72-4f94-a10c-d2a3741cdf75 175 Name: mysql 176 Plan: mysql:5.6 177 Owner: test 178 Status: Ready 179 Binding: Ready 180 Data: 181 data12: value1 182 data3: value1 183 Options: 184 para122: value1 185 para13451: value2 186 Message: <none> 187 Created: 2020-09-08T00:00:00UTC 188 Updated: 2020-09-08T00:00:00UTC 189 `, "output") 190 } 191 192 func TestResourceDelete(t *testing.T) { 193 t.Parallel() 194 cf, server, err := testutil.NewTestServerAndClient() 195 if err != nil { 196 t.Fatal(err) 197 } 198 defer server.Close() 199 var b bytes.Buffer 200 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 201 202 server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/", func(w http.ResponseWriter, _ *http.Request) { 203 testutil.SetHeaders(w) 204 w.WriteHeader(http.StatusNoContent) 205 }) 206 207 err = cmdr.ResourceDelete("example-go", "mysql", "mysql") 208 assert.NoError(t, err) 209 210 assert.Equal(t, testutil.StripProgress(b.String()), "Deleting mysql from example-go... done\n", "output") 211 } 212 213 func TestResourcePut(t *testing.T) { 214 t.Parallel() 215 cf, server, err := testutil.NewTestServerAndClient() 216 if err != nil { 217 t.Fatal(err) 218 } 219 defer server.Close() 220 var b bytes.Buffer 221 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 222 223 server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/", func(w http.ResponseWriter, r *http.Request) { 224 paras := make(map[string]interface{}, 1) 225 paras["para1.para2"] = "v1" 226 testutil.AssertBody(t, api.Resource{Plan: "mysql:5.7", Options: paras}, r) 227 testutil.SetHeaders(w) 228 w.WriteHeader(http.StatusCreated) 229 // Body isn't used by CLI, so it isn't set. 230 w.Write([]byte("{}")) 231 }) 232 233 err = cmdr.ResourcePut("example-go", "mysql:5.7", "mysql", []string{"para1.para2=v1"}, "") 234 assert.NoError(t, err) 235 236 assert.Equal(t, testutil.StripProgress(b.String()), "Updating mysql to example-go... done\n", "output") 237 } 238 239 func TestResourceBind(t *testing.T) { 240 t.Parallel() 241 cf, server, err := testutil.NewTestServerAndClient() 242 if err != nil { 243 t.Fatal(err) 244 } 245 defer server.Close() 246 247 server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/binding/", func(w http.ResponseWriter, r *http.Request) { 248 testutil.SetHeaders(w) 249 if r.Method == "PATCH" { 250 testutil.AssertBody(t, api.ResourceBinding{ 251 BindAction: "bind", 252 }, r) 253 } 254 fmt.Fprintf(w, `{ 255 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 256 "owner": "test", 257 "app": "example-go", 258 "name": "mysql", 259 "plan": "mysql:5.7", 260 "data": {}, 261 "options": {}, 262 "status": null, 263 "binding": null, 264 "created": "2020-09-08T00:00:00UTC", 265 "updated": "2020-09-08T00:00:00UTC" 266 }`) 267 }) 268 269 var b bytes.Buffer 270 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 271 272 err = cmdr.ResourceBind("example-go", "mysql") 273 assert.NoError(t, err) 274 275 assert.Equal(t, testutil.StripProgress(b.String()), `Binding resource... done 276 `, "output") 277 } 278 279 func TestResourceUnbind(t *testing.T) { 280 t.Parallel() 281 cf, server, err := testutil.NewTestServerAndClient() 282 if err != nil { 283 t.Fatal(err) 284 } 285 defer server.Close() 286 287 server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/binding/", func(w http.ResponseWriter, r *http.Request) { 288 testutil.SetHeaders(w) 289 if r.Method == "PATCH" { 290 testutil.AssertBody(t, api.ResourceBinding{ 291 BindAction: "unbind", 292 }, r) 293 } 294 fmt.Fprintf(w, `{ 295 "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75", 296 "owner": "test", 297 "app": "example-go", 298 "name": "mysql", 299 "plan": "mysql:5.7", 300 "data": {}, 301 "options": {}, 302 "status": null, 303 "binding": null, 304 "created": "2020-09-08T00:00:00UTC", 305 "updated": "2020-09-08T00:00:00UTC" 306 }`) 307 }) 308 309 var b bytes.Buffer 310 cmdr := DryccCmd{WOut: &b, ConfigFile: cf} 311 312 err = cmdr.ResourceUnbind("example-go", "mysql") 313 assert.NoError(t, err) 314 315 assert.Equal(t, testutil.StripProgress(b.String()), `Unbinding resource... done 316 `, "output") 317 }