remove mapstructure from blockstorage,cdn,compute,db pkgs
diff --git a/openstack/compute/v2/servers/requests.go b/openstack/compute/v2/servers/requests.go
index 7c964d2..06db312 100644
--- a/openstack/compute/v2/servers/requests.go
+++ b/openstack/compute/v2/servers/requests.go
@@ -195,9 +195,7 @@
server["name"] = opts.Name
server["imageRef"] = opts.ImageRef
- server["imageName"] = opts.ImageName
server["flavorRef"] = opts.FlavorRef
- server["flavorName"] = opts.FlavorName
if opts.UserData != nil {
encoded := base64.StdEncoding.EncodeToString(opts.UserData)
@@ -503,10 +501,13 @@
return server, err
}
- server["name"] = opts.Name
server["adminPass"] = opts.AdminPass
server["imageRef"] = opts.ImageID
+ if opts.Name != "" {
+ server["name"] = opts.Name
+ }
+
if opts.AccessIPv4 != "" {
server["accessIPv4"] = opts.AccessIPv4
}
diff --git a/openstack/compute/v2/servers/results.go b/openstack/compute/v2/servers/results.go
index 665b8c8..2517e65 100644
--- a/openstack/compute/v2/servers/results.go
+++ b/openstack/compute/v2/servers/results.go
@@ -1,12 +1,10 @@
package servers
import (
- "reflect"
"fmt"
- "path"
"net/url"
+ "path"
- "github.com/mitchellh/mapstructure"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
@@ -17,29 +15,11 @@
// Extract interprets any serverResult as a Server, if possible.
func (r serverResult) Extract() (*Server, error) {
- if r.Err != nil {
- return nil, r.Err
+ var s struct {
+ Server *Server `json:"server"`
}
-
- var response struct {
- Server Server `mapstructure:"server"`
- }
-
- config := &mapstructure.DecoderConfig{
- DecodeHook: toMapFromString,
- Result: &response,
- }
- decoder, err := mapstructure.NewDecoder(config)
- if err != nil {
- return nil, err
- }
-
- err = decoder.Decode(r.Body)
- if err != nil {
- return nil, err
- }
-
- return &response.Server, nil
+ err := r.ExtractInto(&s)
+ return s.Server, err
}
// CreateResult temporarily contains the response from a Create call.
@@ -92,40 +72,35 @@
if err != nil {
return "", fmt.Errorf("Failed to parse the image id: %s", err.Error())
}
- imageId := path.Base(u.Path)
- if imageId == "." || imageId == "/" {
+ imageID := path.Base(u.Path)
+ if imageID == "." || imageID == "/" {
return "", fmt.Errorf("Failed to parse the ID of newly created image: %s", u)
}
- return imageId, nil
+ return imageID, nil
}
// Extract interprets any RescueResult as an AdminPass, if possible.
func (r RescueResult) Extract() (string, error) {
- if r.Err != nil {
- return "", r.Err
+ var s struct {
+ AdminPass string `json:"adminPass"`
}
-
- var response struct {
- AdminPass string `mapstructure:"adminPass"`
- }
-
- err := mapstructure.Decode(r.Body, &response)
- return response.AdminPass, err
+ err := r.ExtractInto(&s)
+ return s.AdminPass, err
}
// Server exposes only the standard OpenStack fields corresponding to a given server on the user's account.
type Server struct {
// ID uniquely identifies this server amongst all other servers, including those not accessible to the current tenant.
- ID string
+ ID string `json:"id"`
// TenantID identifies the tenant owning this server resource.
- TenantID string `mapstructure:"tenant_id"`
+ TenantID string `json:"tenant_id"`
// UserID uniquely identifies the user account owning the tenant.
- UserID string `mapstructure:"user_id"`
+ UserID string `json:"user_id"`
// Name contains the human-readable name for the server.
- Name string
+ Name string `json:"name"`
// Updated and Created contain ISO-8601 timestamps of when the state of the server last changed, and when it was created.
Updated string
@@ -159,14 +134,14 @@
Links []interface{}
// KeyName indicates which public key was injected into the server on launch.
- KeyName string `json:"key_name" mapstructure:"key_name"`
+ KeyName string `json:"key_name"`
// AdminPass will generally be empty (""). However, it will contain the administrative password chosen when provisioning a new server without a set AdminPass setting in the first place.
// Note that this is the ONLY time this field will be valid.
- AdminPass string `json:"adminPass" mapstructure:"adminPass"`
+ AdminPass string `json:"adminPass"`
// SecurityGroups includes the security groups that this instance has applied to it
- SecurityGroups []map[string]interface{} `json:"security_groups" mapstructure:"security_groups"`
+ SecurityGroups []map[string]interface{} `json:"security_groups"`
}
// ServerPage abstracts the raw results of making a List() request against the API.
@@ -179,47 +154,29 @@
// IsEmpty returns true if a page contains no Server results.
func (page ServerPage) IsEmpty() (bool, error) {
servers, err := ExtractServers(page)
- if err != nil {
- return true, err
- }
- return len(servers) == 0, nil
+ return len(servers) == 0, err
}
// NextPageURL uses the response's embedded link reference to navigate to the next page of results.
func (page ServerPage) NextPageURL() (string, error) {
- type resp struct {
- Links []gophercloud.Link `mapstructure:"servers_links"`
+ var s struct {
+ Links []gophercloud.Link `json:"servers_links"`
}
-
- var r resp
- err := mapstructure.Decode(page.Body, &r)
+ err := page.ExtractInto(&s)
if err != nil {
return "", err
}
-
- return gophercloud.ExtractNextURL(r.Links)
+ return gophercloud.ExtractNextURL(s.Links)
}
// ExtractServers interprets the results of a single page from a List() call, producing a slice of Server entities.
func ExtractServers(page pagination.Page) ([]Server, error) {
- casted := page.(ServerPage).Body
-
- var response struct {
- Servers []Server `mapstructure:"servers"`
+ r := page.(ServerPage)
+ var s struct {
+ Servers []Server `json:"servers"`
}
-
- config := &mapstructure.DecoderConfig{
- DecodeHook: toMapFromString,
- Result: &response,
- }
- decoder, err := mapstructure.NewDecoder(config)
- if err != nil {
- return nil, err
- }
-
- err = decoder.Decode(casted)
-
- return response.Servers, err
+ err := r.ExtractInto(&s)
+ return s.Servers, err
}
// MetadataResult contains the result of a call for (potentially) multiple key-value pairs.
@@ -264,43 +221,26 @@
// Extract interprets any MetadataResult as a Metadata, if possible.
func (r MetadataResult) Extract() (map[string]string, error) {
- if r.Err != nil {
- return nil, r.Err
+ var s struct {
+ Metadata map[string]string `json:"metadata"`
}
-
- var response struct {
- Metadata map[string]string `mapstructure:"metadata"`
- }
-
- err := mapstructure.Decode(r.Body, &response)
- return response.Metadata, err
+ err := r.ExtractInto(&s)
+ return s.Metadata, err
}
// Extract interprets any MetadatumResult as a Metadatum, if possible.
func (r MetadatumResult) Extract() (map[string]string, error) {
- if r.Err != nil {
- return nil, r.Err
+ var s struct {
+ Metadatum map[string]string `json:"meta"`
}
-
- var response struct {
- Metadatum map[string]string `mapstructure:"meta"`
- }
-
- err := mapstructure.Decode(r.Body, &response)
- return response.Metadatum, err
-}
-
-func toMapFromString(from reflect.Kind, to reflect.Kind, data interface{}) (interface{}, error) {
- if (from == reflect.String) && (to == reflect.Map) {
- return map[string]interface{}{}, nil
- }
- return data, nil
+ err := r.ExtractInto(&s)
+ return s.Metadatum, err
}
// Address represents an IP address.
type Address struct {
- Version int `mapstructure:"version"`
- Address string `mapstructure:"addr"`
+ Version int `json:"version"`
+ Address string `json:"addr"`
}
// AddressPage abstracts the raw results of making a ListAddresses() request against the API.
@@ -313,27 +253,18 @@
// IsEmpty returns true if an AddressPage contains no networks.
func (r AddressPage) IsEmpty() (bool, error) {
addresses, err := ExtractAddresses(r)
- if err != nil {
- return true, err
- }
- return len(addresses) == 0, nil
+ return len(addresses) == 0, err
}
// ExtractAddresses interprets the results of a single page from a ListAddresses() call,
// producing a map of addresses.
func ExtractAddresses(page pagination.Page) (map[string][]Address, error) {
- casted := page.(AddressPage).Body
-
- var response struct {
- Addresses map[string][]Address `mapstructure:"addresses"`
+ r := page.(AddressPage)
+ var s struct {
+ Addresses map[string][]Address `json:"addresses"`
}
-
- err := mapstructure.Decode(casted, &response)
- if err != nil {
- return nil, err
- }
-
- return response.Addresses, err
+ err := r.ExtractInto(&s)
+ return s.Addresses, err
}
// NetworkAddressPage abstracts the raw results of making a ListAddressesByNetwork() request against the API.
@@ -346,27 +277,23 @@
// IsEmpty returns true if a NetworkAddressPage contains no addresses.
func (r NetworkAddressPage) IsEmpty() (bool, error) {
addresses, err := ExtractNetworkAddresses(r)
- if err != nil {
- return true, err
- }
- return len(addresses) == 0, nil
+ return len(addresses) == 0, err
}
// ExtractNetworkAddresses interprets the results of a single page from a ListAddressesByNetwork() call,
// producing a slice of addresses.
func ExtractNetworkAddresses(page pagination.Page) ([]Address, error) {
- casted := page.(NetworkAddressPage).Body
-
- var response map[string][]Address
- err := mapstructure.Decode(casted, &response)
+ r := page.(NetworkAddressPage)
+ var s map[string][]Address
+ err := r.ExtractInto(&s)
if err != nil {
return nil, err
}
var key string
- for k := range response {
+ for k := range s {
key = k
}
- return response[key], err
+ return s[key], err
}