github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/compute/v2/flavors/testing/requests_test.go (about) 1 package testing 2 3 import ( 4 "fmt" 5 "net/http" 6 "testing" 7 8 "github.com/opentelekomcloud/gophertelekomcloud/openstack/compute/v2/flavors" 9 "github.com/opentelekomcloud/gophertelekomcloud/pagination" 10 th "github.com/opentelekomcloud/gophertelekomcloud/testhelper" 11 fake "github.com/opentelekomcloud/gophertelekomcloud/testhelper/client" 12 ) 13 14 func TestListFlavors(t *testing.T) { 15 th.SetupHTTP() 16 defer th.TeardownHTTP() 17 18 th.Mux.HandleFunc("/flavors/detail", func(w http.ResponseWriter, r *http.Request) { 19 th.TestMethod(t, r, "GET") 20 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 21 22 w.Header().Add("Content-Type", "application/json") 23 _ = r.ParseForm() 24 marker := r.Form.Get("marker") 25 switch marker { 26 case "": 27 _, _ = fmt.Fprintf(w, ` 28 { 29 "flavors": [ 30 { 31 "id": "1", 32 "name": "m1.tiny", 33 "vcpus": 1, 34 "disk": 1, 35 "ram": 512, 36 "swap":"", 37 "os-flavor-access:is_public": true, 38 "OS-FLV-EXT-DATA:ephemeral": 10 39 }, 40 { 41 "id": "2", 42 "name": "m1.small", 43 "vcpus": 1, 44 "disk": 20, 45 "ram": 2048, 46 "swap": 1000, 47 "os-flavor-access:is_public": true, 48 "OS-FLV-EXT-DATA:ephemeral": 0 49 }, 50 { 51 "id": "3", 52 "name": "m1.medium", 53 "vcpus": 2, 54 "disk": 40, 55 "ram": 4096, 56 "swap": 1000, 57 "os-flavor-access:is_public": false, 58 "OS-FLV-EXT-DATA:ephemeral": 0 59 } 60 ], 61 "flavors_links": [ 62 { 63 "href": "%s/flavors/detail?marker=2", 64 "rel": "next" 65 } 66 ] 67 } 68 `, th.Server.URL) 69 case "2": 70 _, _ = fmt.Fprint(w, `{ "flavors": [] }`) 71 default: 72 t.Fatalf("Unexpected marker: [%s]", marker) 73 } 74 }) 75 76 pageCount := 0 77 // Get public and private flavors 78 err := flavors.ListDetail(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) { 79 pageCount += 1 80 81 actual, err := flavors.ExtractFlavors(page) 82 if err != nil { 83 return false, err 84 } 85 86 expected := []flavors.Flavor{ 87 {ID: "1", Name: "m1.tiny", VCPUs: 1, Disk: 1, RAM: 512, Swap: 0, IsPublic: true, Ephemeral: 10}, 88 {ID: "2", Name: "m1.small", VCPUs: 1, Disk: 20, RAM: 2048, Swap: 1000, IsPublic: true, Ephemeral: 0}, 89 {ID: "3", Name: "m1.medium", VCPUs: 2, Disk: 40, RAM: 4096, Swap: 1000, IsPublic: false, Ephemeral: 0}, 90 } 91 92 th.AssertDeepEquals(t, expected, actual) 93 94 return true, nil 95 }) 96 if err != nil { 97 t.Fatal(err) 98 } 99 th.AssertEquals(t, 1, pageCount) 100 if pageCount != 1 { 101 t.Errorf("Expected one page, got %d", pageCount) 102 } 103 } 104 105 func TestGetFlavor(t *testing.T) { 106 th.SetupHTTP() 107 defer th.TeardownHTTP() 108 109 th.Mux.HandleFunc("/flavors/12345", func(w http.ResponseWriter, r *http.Request) { 110 th.TestMethod(t, r, "GET") 111 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 112 113 w.Header().Add("Content-Type", "application/json") 114 _, _ = fmt.Fprint(w, ` 115 { 116 "flavor": { 117 "id": "1", 118 "name": "m1.tiny", 119 "disk": 1, 120 "ram": 512, 121 "vcpus": 1, 122 "rxtx_factor": 1, 123 "swap": "" 124 } 125 } 126 `) 127 }) 128 129 actual, err := flavors.Get(fake.ServiceClient(), "12345").Extract() 130 if err != nil { 131 t.Fatalf("Unable to get flavor: %v", err) 132 } 133 134 expected := &flavors.Flavor{ 135 ID: "1", 136 Name: "m1.tiny", 137 Disk: 1, 138 RAM: 512, 139 VCPUs: 1, 140 RxTxFactor: 1, 141 Swap: 0, 142 } 143 th.AssertDeepEquals(t, expected, actual) 144 } 145 146 func TestCreateFlavor(t *testing.T) { 147 th.SetupHTTP() 148 defer th.TeardownHTTP() 149 150 th.Mux.HandleFunc("/flavors", func(w http.ResponseWriter, r *http.Request) { 151 th.TestMethod(t, r, "POST") 152 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 153 154 w.Header().Add("Content-Type", "application/json") 155 _, _ = fmt.Fprint(w, ` 156 { 157 "flavor": { 158 "id": "1", 159 "name": "m1.tiny", 160 "disk": 1, 161 "ram": 512, 162 "vcpus": 1, 163 "rxtx_factor": 1, 164 "swap": "" 165 } 166 } 167 `) 168 }) 169 170 disk := 1 171 opts := &flavors.CreateOpts{ 172 ID: "1", 173 Name: "m1.tiny", 174 Disk: &disk, 175 RAM: 512, 176 VCPUs: 1, 177 RxTxFactor: 1.0, 178 } 179 actual, err := flavors.Create(fake.ServiceClient(), opts).Extract() 180 if err != nil { 181 t.Fatalf("Unable to create flavor: %v", err) 182 } 183 184 expected := &flavors.Flavor{ 185 ID: "1", 186 Name: "m1.tiny", 187 Disk: 1, 188 RAM: 512, 189 VCPUs: 1, 190 RxTxFactor: 1, 191 Swap: 0, 192 } 193 th.AssertDeepEquals(t, expected, actual) 194 } 195 196 func TestDeleteFlavor(t *testing.T) { 197 th.SetupHTTP() 198 defer th.TeardownHTTP() 199 200 th.Mux.HandleFunc("/flavors/12345678", func(w http.ResponseWriter, r *http.Request) { 201 th.TestMethod(t, r, "DELETE") 202 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 203 204 w.WriteHeader(http.StatusAccepted) 205 }) 206 207 res := flavors.Delete(fake.ServiceClient(), "12345678") 208 th.AssertNoErr(t, res.Err) 209 } 210 211 func TestFlavorAccessesList(t *testing.T) { 212 th.SetupHTTP() 213 defer th.TeardownHTTP() 214 215 th.Mux.HandleFunc("/flavors/12345678/os-flavor-access", func(w http.ResponseWriter, r *http.Request) { 216 th.TestMethod(t, r, "GET") 217 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 218 w.Header().Add("Content-Type", "application/json") 219 _, _ = fmt.Fprint(w, ` 220 { 221 "flavor_access": [ 222 { 223 "flavor_id": "12345678", 224 "tenant_id": "2f954bcf047c4ee9b09a37d49ae6db54" 225 } 226 ] 227 } 228 `) 229 }) 230 231 expected := []flavors.FlavorAccess{ 232 { 233 FlavorID: "12345678", 234 TenantID: "2f954bcf047c4ee9b09a37d49ae6db54", 235 }, 236 } 237 238 allPages, err := flavors.ListAccesses(fake.ServiceClient(), "12345678").AllPages() 239 th.AssertNoErr(t, err) 240 241 actual, err := flavors.ExtractAccesses(allPages) 242 th.AssertNoErr(t, err) 243 th.AssertDeepEquals(t, expected, actual) 244 } 245 246 func TestFlavorAccessAdd(t *testing.T) { 247 th.SetupHTTP() 248 defer th.TeardownHTTP() 249 250 th.Mux.HandleFunc("/flavors/12345678/action", func(w http.ResponseWriter, r *http.Request) { 251 th.TestMethod(t, r, "POST") 252 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 253 th.TestHeader(t, r, "accept", "application/json") 254 th.TestJSONRequest(t, r, ` 255 { 256 "addTenantAccess": { 257 "tenant": "2f954bcf047c4ee9b09a37d49ae6db54" 258 } 259 } 260 `) 261 262 w.Header().Add("Content-Type", "application/json") 263 w.WriteHeader(http.StatusOK) 264 _, _ = fmt.Fprint(w, ` 265 { 266 "flavor_access": [ 267 { 268 "flavor_id": "12345678", 269 "tenant_id": "2f954bcf047c4ee9b09a37d49ae6db54" 270 } 271 ] 272 } 273 `) 274 }) 275 276 expected := []flavors.FlavorAccess{ 277 { 278 FlavorID: "12345678", 279 TenantID: "2f954bcf047c4ee9b09a37d49ae6db54", 280 }, 281 } 282 283 addAccessOpts := flavors.AddAccessOpts{ 284 Tenant: "2f954bcf047c4ee9b09a37d49ae6db54", 285 } 286 287 actual, err := flavors.AddAccess(fake.ServiceClient(), "12345678", addAccessOpts).Extract() 288 th.AssertNoErr(t, err) 289 th.AssertDeepEquals(t, expected, actual) 290 } 291 292 func TestFlavorAccessRemove(t *testing.T) { 293 th.SetupHTTP() 294 defer th.TeardownHTTP() 295 296 th.Mux.HandleFunc("/flavors/12345678/action", func(w http.ResponseWriter, r *http.Request) { 297 th.TestMethod(t, r, "POST") 298 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 299 th.TestHeader(t, r, "accept", "application/json") 300 th.TestJSONRequest(t, r, ` 301 { 302 "removeTenantAccess": { 303 "tenant": "2f954bcf047c4ee9b09a37d49ae6db54" 304 } 305 } 306 `) 307 308 w.Header().Add("Content-Type", "application/json") 309 w.WriteHeader(http.StatusOK) 310 _, _ = fmt.Fprint(w, ` 311 { 312 "flavor_access": [] 313 } 314 `) 315 }) 316 317 removeAccessOpts := flavors.RemoveAccessOpts{ 318 Tenant: "2f954bcf047c4ee9b09a37d49ae6db54", 319 } 320 321 actual, err := flavors.RemoveAccess(fake.ServiceClient(), "12345678", removeAccessOpts).Extract() 322 th.AssertNoErr(t, err) 323 th.AssertDeepEquals(t, []flavors.FlavorAccess{}, actual) 324 } 325 326 func TestFlavorExtraSpecsList(t *testing.T) { 327 th.SetupHTTP() 328 defer th.TeardownHTTP() 329 HandleExtraSpecsListSuccessfully(t) 330 331 expected := ExtraSpecs 332 actual, err := flavors.ListExtraSpecs(fake.ServiceClient(), "1").Extract() 333 th.AssertNoErr(t, err) 334 th.CheckDeepEquals(t, expected, actual) 335 } 336 337 func TestFlavorExtraSpecGet(t *testing.T) { 338 th.SetupHTTP() 339 defer th.TeardownHTTP() 340 HandleExtraSpecGetSuccessfully(t) 341 342 expected := ExtraSpec 343 actual, err := flavors.GetExtraSpec(fake.ServiceClient(), "1", "hw:cpu_policy").Extract() 344 th.AssertNoErr(t, err) 345 th.CheckDeepEquals(t, expected, actual) 346 } 347 348 func TestFlavorExtraSpecsCreate(t *testing.T) { 349 th.SetupHTTP() 350 defer th.TeardownHTTP() 351 HandleExtraSpecsCreateSuccessfully(t) 352 353 createOpts := flavors.ExtraSpecsOpts{ 354 "hw:cpu_policy": "CPU-POLICY", 355 "hw:cpu_thread_policy": "CPU-THREAD-POLICY", 356 } 357 expected := ExtraSpecs 358 actual, err := flavors.CreateExtraSpecs(fake.ServiceClient(), "1", createOpts).Extract() 359 th.AssertNoErr(t, err) 360 th.CheckDeepEquals(t, expected, actual) 361 } 362 363 func TestFlavorExtraSpecUpdate(t *testing.T) { 364 th.SetupHTTP() 365 defer th.TeardownHTTP() 366 HandleExtraSpecUpdateSuccessfully(t) 367 368 updateOpts := flavors.ExtraSpecsOpts{ 369 "hw:cpu_policy": "CPU-POLICY-2", 370 } 371 expected := UpdatedExtraSpec 372 actual, err := flavors.UpdateExtraSpec(fake.ServiceClient(), "1", updateOpts).Extract() 373 th.AssertNoErr(t, err) 374 th.CheckDeepEquals(t, expected, actual) 375 } 376 377 func TestFlavorExtraSpecDelete(t *testing.T) { 378 th.SetupHTTP() 379 defer th.TeardownHTTP() 380 HandleExtraSpecDeleteSuccessfully(t) 381 382 res := flavors.DeleteExtraSpec(fake.ServiceClient(), "1", "hw:cpu_policy") 383 th.AssertNoErr(t, res.Err) 384 }