github.com/gophercloud/gophercloud@v1.11.0/openstack/orchestration/v1/stackresources/testing/fixtures_test.go (about)

     1  package testing
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/gophercloud/gophercloud"
    10  	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackresources"
    11  	th "github.com/gophercloud/gophercloud/testhelper"
    12  	fake "github.com/gophercloud/gophercloud/testhelper/client"
    13  )
    14  
    15  var Create_time, _ = time.Parse(time.RFC3339, "2018-06-26T07:57:17Z")
    16  var Updated_time, _ = time.Parse(time.RFC3339, "2018-06-26T07:58:17Z")
    17  
    18  // FindExpected represents the expected object from a Find request.
    19  var FindExpected = []stackresources.Resource{
    20  	{
    21  		Name: "hello_world",
    22  		Links: []gophercloud.Link{
    23  			{
    24  				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
    25  				Rel:  "self",
    26  			},
    27  			{
    28  				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
    29  				Rel:  "stack",
    30  			},
    31  		},
    32  		LogicalID:    "hello_world",
    33  		StatusReason: "state changed",
    34  		UpdatedTime:  Updated_time,
    35  		CreationTime: Create_time,
    36  		RequiredBy:   []interface{}{},
    37  		Status:       "CREATE_IN_PROGRESS",
    38  		PhysicalID:   "49181cd6-169a-4130-9455-31185bbfc5bf",
    39  		Type:         "OS::Nova::Server",
    40  		Attributes:   map[string]interface{}{"SXSW": "atx"},
    41  		Description:  "Some resource",
    42  	},
    43  }
    44  
    45  // FindOutput represents the response body from a Find request.
    46  const FindOutput = `
    47  {
    48    "resources": [
    49    {
    50    	"description": "Some resource",
    51    	"attributes": {"SXSW": "atx"},
    52      "resource_name": "hello_world",
    53      "links": [
    54        {
    55        "href": "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
    56        "rel": "self"
    57        },
    58        {
    59          "href": "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
    60          "rel": "stack"
    61        }
    62      ],
    63      "logical_resource_id": "hello_world",
    64      "resource_status_reason": "state changed",
    65      "updated_time": "2018-06-26T07:58:17Z",
    66  	"creation_time": "2018-06-26T07:57:17Z",
    67      "required_by": [],
    68      "resource_status": "CREATE_IN_PROGRESS",
    69      "physical_resource_id": "49181cd6-169a-4130-9455-31185bbfc5bf",
    70      "resource_type": "OS::Nova::Server"
    71    }
    72    ]
    73  }`
    74  
    75  // HandleFindSuccessfully creates an HTTP handler at `/stacks/hello_world/resources`
    76  // on the test handler mux that responds with a `Find` response.
    77  func HandleFindSuccessfully(t *testing.T, output string) {
    78  	th.Mux.HandleFunc("/stacks/hello_world/resources", func(w http.ResponseWriter, r *http.Request) {
    79  		th.TestMethod(t, r, "GET")
    80  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
    81  		th.TestHeader(t, r, "Accept", "application/json")
    82  
    83  		w.Header().Set("Content-Type", "application/json")
    84  		w.WriteHeader(http.StatusOK)
    85  		fmt.Fprintf(w, output)
    86  	})
    87  }
    88  
    89  // ListExpected represents the expected object from a List request.
    90  var ListExpected = []stackresources.Resource{
    91  	{
    92  		Name: "hello_world",
    93  		Links: []gophercloud.Link{
    94  			{
    95  				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
    96  				Rel:  "self",
    97  			},
    98  			{
    99  				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
   100  				Rel:  "stack",
   101  			},
   102  		},
   103  		LogicalID:    "hello_world",
   104  		StatusReason: "state changed",
   105  		UpdatedTime:  Updated_time,
   106  		CreationTime: Create_time,
   107  		RequiredBy:   []interface{}{},
   108  		Status:       "CREATE_IN_PROGRESS",
   109  		PhysicalID:   "49181cd6-169a-4130-9455-31185bbfc5bf",
   110  		Type:         "OS::Nova::Server",
   111  		Attributes:   map[string]interface{}{"SXSW": "atx"},
   112  		Description:  "Some resource",
   113  	},
   114  }
   115  
   116  // ListOutput represents the response body from a List request.
   117  const ListOutput = `{
   118    "resources": [
   119    {
   120      "resource_name": "hello_world",
   121      "links": [
   122      {
   123        "href": "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
   124        "rel": "self"
   125      },
   126      {
   127        "href": "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
   128        "rel": "stack"
   129      }
   130      ],
   131      "logical_resource_id": "hello_world",
   132      "resource_status_reason": "state changed",
   133      "updated_time": "2018-06-26T07:58:17Z",
   134      "creation_time": "2018-06-26T07:57:17Z",
   135      "required_by": [],
   136      "resource_status": "CREATE_IN_PROGRESS",
   137      "physical_resource_id": "49181cd6-169a-4130-9455-31185bbfc5bf",
   138      "resource_type": "OS::Nova::Server",
   139  	"attributes": {"SXSW": "atx"},
   140  	"description": "Some resource"
   141    }
   142  ]
   143  }`
   144  
   145  // HandleListSuccessfully creates an HTTP handler at `/stacks/hello_world/49181cd6-169a-4130-9455-31185bbfc5bf/resources`
   146  // on the test handler mux that responds with a `List` response.
   147  func HandleListSuccessfully(t *testing.T, output string) {
   148  	th.Mux.HandleFunc("/stacks/hello_world/49181cd6-169a-4130-9455-31185bbfc5bf/resources", func(w http.ResponseWriter, r *http.Request) {
   149  		th.TestMethod(t, r, "GET")
   150  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   151  		th.TestHeader(t, r, "Accept", "application/json")
   152  
   153  		w.Header().Set("Content-Type", "application/json")
   154  		r.ParseForm()
   155  		marker := r.Form.Get("marker")
   156  		switch marker {
   157  		case "":
   158  			fmt.Fprintf(w, output)
   159  		case "49181cd6-169a-4130-9455-31185bbfc5bf":
   160  			fmt.Fprintf(w, `{"resources":[]}`)
   161  		default:
   162  			t.Fatalf("Unexpected marker: [%s]", marker)
   163  		}
   164  	})
   165  }
   166  
   167  // GetExpected represents the expected object from a Get request.
   168  var GetExpected = &stackresources.Resource{
   169  	Name: "wordpress_instance",
   170  	Links: []gophercloud.Link{
   171  		{
   172  			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance",
   173  			Rel:  "self",
   174  		},
   175  		{
   176  			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e",
   177  			Rel:  "stack",
   178  		},
   179  	},
   180  	LogicalID:    "wordpress_instance",
   181  	Attributes:   map[string]interface{}{"SXSW": "atx"},
   182  	StatusReason: "state changed",
   183  	UpdatedTime:  Updated_time,
   184  	RequiredBy:   []interface{}{},
   185  	Status:       "CREATE_COMPLETE",
   186  	PhysicalID:   "00e3a2fe-c65d-403c-9483-4db9930dd194",
   187  	Type:         "OS::Nova::Server",
   188  }
   189  
   190  // GetOutput represents the response body from a Get request.
   191  const GetOutput = `
   192  {
   193    "resource": {
   194      "description": "Some resource",
   195      "attributes": {"SXSW": "atx"},
   196      "resource_name": "wordpress_instance",
   197      "description": "",
   198      "links": [
   199      {
   200        "href": "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance",
   201        "rel": "self"
   202      },
   203      {
   204        "href": "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e",
   205        "rel": "stack"
   206      }
   207      ],
   208      "logical_resource_id": "wordpress_instance",
   209      "resource_status": "CREATE_COMPLETE",
   210      "updated_time": "2018-06-26T07:58:17Z",
   211      "required_by": [],
   212      "resource_status_reason": "state changed",
   213      "physical_resource_id": "00e3a2fe-c65d-403c-9483-4db9930dd194",
   214      "resource_type": "OS::Nova::Server"
   215    }
   216  }`
   217  
   218  // HandleGetSuccessfully creates an HTTP handler at `/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance`
   219  // on the test handler mux that responds with a `Get` response.
   220  func HandleGetSuccessfully(t *testing.T, output string) {
   221  	th.Mux.HandleFunc("/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance", func(w http.ResponseWriter, r *http.Request) {
   222  		th.TestMethod(t, r, "GET")
   223  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   224  		th.TestHeader(t, r, "Accept", "application/json")
   225  
   226  		w.Header().Set("Content-Type", "application/json")
   227  		w.WriteHeader(http.StatusOK)
   228  		fmt.Fprintf(w, output)
   229  	})
   230  }
   231  
   232  // MetadataExpected represents the expected object from a Metadata request.
   233  var MetadataExpected = map[string]string{
   234  	"number": "7",
   235  	"animal": "auk",
   236  }
   237  
   238  // MetadataOutput represents the response body from a Metadata request.
   239  const MetadataOutput = `
   240  {
   241      "metadata": {
   242        "number": "7",
   243        "animal": "auk"
   244      }
   245  }`
   246  
   247  // HandleMetadataSuccessfully creates an HTTP handler at `/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance/metadata`
   248  // on the test handler mux that responds with a `Metadata` response.
   249  func HandleMetadataSuccessfully(t *testing.T, output string) {
   250  	th.Mux.HandleFunc("/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance/metadata", func(w http.ResponseWriter, r *http.Request) {
   251  		th.TestMethod(t, r, "GET")
   252  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   253  		th.TestHeader(t, r, "Accept", "application/json")
   254  
   255  		w.Header().Set("Content-Type", "application/json")
   256  		w.WriteHeader(http.StatusOK)
   257  		fmt.Fprintf(w, output)
   258  	})
   259  }
   260  
   261  // ListTypesExpected represents the expected object from a ListTypes request.
   262  var ListTypesExpected = stackresources.ResourceTypes{
   263  	"OS::Nova::Server",
   264  	"OS::Heat::RandomString",
   265  	"OS::Swift::Container",
   266  	"OS::Trove::Instance",
   267  	"OS::Nova::FloatingIPAssociation",
   268  	"OS::Cinder::VolumeAttachment",
   269  	"OS::Nova::FloatingIP",
   270  	"OS::Nova::KeyPair",
   271  }
   272  
   273  // same as above, but sorted
   274  var SortedListTypesExpected = stackresources.ResourceTypes{
   275  	"OS::Cinder::VolumeAttachment",
   276  	"OS::Heat::RandomString",
   277  	"OS::Nova::FloatingIP",
   278  	"OS::Nova::FloatingIPAssociation",
   279  	"OS::Nova::KeyPair",
   280  	"OS::Nova::Server",
   281  	"OS::Swift::Container",
   282  	"OS::Trove::Instance",
   283  }
   284  
   285  // ListTypesOutput represents the response body from a ListTypes request.
   286  const ListTypesOutput = `
   287  {
   288    "resource_types": [
   289      "OS::Nova::Server",
   290      "OS::Heat::RandomString",
   291      "OS::Swift::Container",
   292      "OS::Trove::Instance",
   293      "OS::Nova::FloatingIPAssociation",
   294      "OS::Cinder::VolumeAttachment",
   295      "OS::Nova::FloatingIP",
   296      "OS::Nova::KeyPair"
   297    ]
   298  }`
   299  
   300  // HandleListTypesSuccessfully creates an HTTP handler at `/resource_types`
   301  // on the test handler mux that responds with a `ListTypes` response.
   302  func HandleListTypesSuccessfully(t *testing.T, output string) {
   303  	th.Mux.HandleFunc("/resource_types", func(w http.ResponseWriter, r *http.Request) {
   304  		th.TestMethod(t, r, "GET")
   305  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   306  		th.TestHeader(t, r, "Accept", "application/json")
   307  
   308  		w.Header().Set("Content-Type", "application/json")
   309  		w.WriteHeader(http.StatusOK)
   310  		fmt.Fprintf(w, output)
   311  	})
   312  }
   313  
   314  // GetSchemaExpected represents the expected object from a Schema request.
   315  var GetSchemaExpected = &stackresources.TypeSchema{
   316  	Attributes: map[string]interface{}{
   317  		"an_attribute": map[string]interface{}{
   318  			"description": "An attribute description .",
   319  		},
   320  	},
   321  	Properties: map[string]interface{}{
   322  		"a_property": map[string]interface{}{
   323  			"update_allowed": false,
   324  			"required":       true,
   325  			"type":           "string",
   326  			"description":    "A resource description.",
   327  		},
   328  	},
   329  	ResourceType: "OS::Heat::AResourceName",
   330  	SupportStatus: map[string]interface{}{
   331  		"message": "A status message",
   332  		"status":  "SUPPORTED",
   333  		"version": "2014.1",
   334  	},
   335  }
   336  
   337  // GetSchemaOutput represents the response body from a Schema request.
   338  const GetSchemaOutput = `
   339  {
   340    "attributes": {
   341      "an_attribute": {
   342        "description": "An attribute description ."
   343      }
   344    },
   345    "properties": {
   346      "a_property": {
   347        "update_allowed": false,
   348        "required": true,
   349        "type": "string",
   350        "description": "A resource description."
   351      }
   352    },
   353    "resource_type": "OS::Heat::AResourceName",
   354    "support_status": {
   355  	"message": "A status message",
   356  	"status": "SUPPORTED",
   357  	"version": "2014.1"
   358    }
   359  }`
   360  
   361  // HandleGetSchemaSuccessfully creates an HTTP handler at `/resource_types/OS::Heat::AResourceName`
   362  // on the test handler mux that responds with a `Schema` response.
   363  func HandleGetSchemaSuccessfully(t *testing.T, output string) {
   364  	th.Mux.HandleFunc("/resource_types/OS::Heat::AResourceName", func(w http.ResponseWriter, r *http.Request) {
   365  		th.TestMethod(t, r, "GET")
   366  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   367  		th.TestHeader(t, r, "Accept", "application/json")
   368  
   369  		w.Header().Set("Content-Type", "application/json")
   370  		w.WriteHeader(http.StatusOK)
   371  		fmt.Fprintf(w, output)
   372  	})
   373  }
   374  
   375  // GetTemplateExpected represents the expected object from a Template request.
   376  var GetTemplateExpected = "{\n  \"HeatTemplateFormatVersion\": \"2012-12-12\",\n  \"Outputs\": {\n    \"private_key\": {\n      \"Description\": \"The private key if it has been saved.\",\n      \"Value\": \"{\\\"Fn::GetAtt\\\": [\\\"KeyPair\\\", \\\"private_key\\\"]}\"\n    },\n    \"public_key\": {\n      \"Description\": \"The public key.\",\n      \"Value\": \"{\\\"Fn::GetAtt\\\": [\\\"KeyPair\\\", \\\"public_key\\\"]}\"\n    }\n  },\n  \"Parameters\": {\n    \"name\": {\n      \"Description\": \"The name of the key pair.\",\n      \"Type\": \"String\"\n    },\n    \"public_key\": {\n      \"Description\": \"The optional public key. This allows users to supply the public key from a pre-existing key pair. If not supplied, a new key pair will be generated.\",\n      \"Type\": \"String\"\n    },\n    \"save_private_key\": {\n      \"AllowedValues\": [\n        \"True\",\n        \"true\",\n        \"False\",\n        \"false\"\n      ],\n      \"Default\": false,\n      \"Description\": \"True if the system should remember a generated private key; False otherwise.\",\n      \"Type\": \"String\"\n    }\n  },\n  \"Resources\": {\n    \"KeyPair\": {\n      \"Properties\": {\n        \"name\": {\n          \"Ref\": \"name\"\n        },\n        \"public_key\": {\n          \"Ref\": \"public_key\"\n        },\n        \"save_private_key\": {\n          \"Ref\": \"save_private_key\"\n        }\n      },\n      \"Type\": \"OS::Nova::KeyPair\"\n    }\n  }\n}"
   377  
   378  // GetTemplateOutput represents the response body from a Template request.
   379  const GetTemplateOutput = `
   380  {
   381    "HeatTemplateFormatVersion": "2012-12-12",
   382    "Outputs": {
   383      "private_key": {
   384        "Description": "The private key if it has been saved.",
   385        "Value": "{\"Fn::GetAtt\": [\"KeyPair\", \"private_key\"]}"
   386      },
   387      "public_key": {
   388        "Description": "The public key.",
   389        "Value": "{\"Fn::GetAtt\": [\"KeyPair\", \"public_key\"]}"
   390      }
   391    },
   392    "Parameters": {
   393      "name": {
   394        "Description": "The name of the key pair.",
   395        "Type": "String"
   396      },
   397      "public_key": {
   398        "Description": "The optional public key. This allows users to supply the public key from a pre-existing key pair. If not supplied, a new key pair will be generated.",
   399        "Type": "String"
   400      },
   401      "save_private_key": {
   402        "AllowedValues": [
   403        "True",
   404        "true",
   405        "False",
   406        "false"
   407        ],
   408        "Default": false,
   409        "Description": "True if the system should remember a generated private key; False otherwise.",
   410        "Type": "String"
   411      }
   412    },
   413    "Resources": {
   414      "KeyPair": {
   415        "Properties": {
   416          "name": {
   417            "Ref": "name"
   418          },
   419          "public_key": {
   420            "Ref": "public_key"
   421          },
   422          "save_private_key": {
   423            "Ref": "save_private_key"
   424          }
   425        },
   426        "Type": "OS::Nova::KeyPair"
   427      }
   428    }
   429  }`
   430  
   431  // HandleGetTemplateSuccessfully creates an HTTP handler at `/resource_types/OS::Heat::AResourceName/template`
   432  // on the test handler mux that responds with a `Template` response.
   433  func HandleGetTemplateSuccessfully(t *testing.T, output string) {
   434  	th.Mux.HandleFunc("/resource_types/OS::Heat::AResourceName/template", func(w http.ResponseWriter, r *http.Request) {
   435  		th.TestMethod(t, r, "GET")
   436  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   437  		th.TestHeader(t, r, "Accept", "application/json")
   438  
   439  		w.Header().Set("Content-Type", "application/json")
   440  		w.WriteHeader(http.StatusOK)
   441  		fmt.Fprintf(w, output)
   442  	})
   443  }
   444  
   445  // HandleMarkUnhealthySuccessfully creates an HTTP handler at `/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance`
   446  // on the test handler mux that responds with a `MarkUnhealthy` response.
   447  func HandleMarkUnhealthySuccessfully(t *testing.T) {
   448  	th.Mux.HandleFunc("/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance", func(w http.ResponseWriter, r *http.Request) {
   449  		th.TestMethod(t, r, "PATCH")
   450  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   451  		th.TestHeader(t, r, "Accept", "application/json")
   452  
   453  		w.Header().Set("Content-Type", "application/json")
   454  		w.WriteHeader(http.StatusOK)
   455  	})
   456  }