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  }