diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 8921760c..2d3e4549 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -176,31 +176,31 @@ }, { "ImportPath": "github.com/gophercloud/gophercloud", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/utils", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gophercloud/gophercloud/pagination", - "Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" + "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194" }, { "ImportPath": "github.com/gregjones/httpcache", @@ -476,199 +476,199 @@ }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1alpha1", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/unstructured", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "9496c30d9f9382f60f820cb392433abcabd2f47a" + "Rev": "90cdcb76c44bf1fcf0aa82aeea7f614c034cbd4b" }, { "ImportPath": "k8s.io/kube-openapi/pkg/common", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/client.go b/vendor/github.com/gophercloud/gophercloud/openstack/client.go index e1c699fc..77214cac 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/client.go +++ b/vendor/github.com/gophercloud/gophercloud/openstack/client.go @@ -4,6 +4,8 @@ import ( "fmt" "net/url" "reflect" + "regexp" + "strings" "github.com/gophercloud/gophercloud" tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens" @@ -12,8 +14,13 @@ import ( ) const ( - v20 = "v2.0" - v30 = "v3.0" + // v2 represents Keystone v2. + // It should never increase beyond 2.0. + v2 = "v2.0" + + // v3 represents Keystone v3. + // The version can be anything from v3 to v3.x. + v3 = "v3" ) /* @@ -35,24 +42,25 @@ func NewClient(endpoint string) (*gophercloud.ProviderClient, error) { if err != nil { return nil, err } - hadPath := u.Path != "" - u.Path, u.RawQuery, u.Fragment = "", "", "" - base := u.String() + + u.RawQuery, u.Fragment = "", "" + + var base string + versionRe := regexp.MustCompile("v[0-9.]+/?") + if version := versionRe.FindString(u.Path); version != "" { + base = strings.Replace(u.String(), version, "", -1) + } else { + base = u.String() + } endpoint = gophercloud.NormalizeURL(endpoint) base = gophercloud.NormalizeURL(base) - if hadPath { - return &gophercloud.ProviderClient{ - IdentityBase: base, - IdentityEndpoint: endpoint, - }, nil - } - return &gophercloud.ProviderClient{ IdentityBase: base, - IdentityEndpoint: "", + IdentityEndpoint: endpoint, }, nil + } /* @@ -92,8 +100,8 @@ func AuthenticatedClient(options gophercloud.AuthOptions) (*gophercloud.Provider // supported at the provided endpoint. func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error { versions := []*utils.Version{ - {ID: v20, Priority: 20, Suffix: "/v2.0/"}, - {ID: v30, Priority: 30, Suffix: "/v3/"}, + {ID: v2, Priority: 20, Suffix: "/v2.0/"}, + {ID: v3, Priority: 30, Suffix: "/v3/"}, } chosen, endpoint, err := utils.ChooseVersion(client, versions) @@ -102,9 +110,9 @@ func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOp } switch chosen.ID { - case v20: + case v2: return v2auth(client, endpoint, options, gophercloud.EndpointOpts{}) - case v30: + case v3: return v3auth(client, endpoint, &options, gophercloud.EndpointOpts{}) default: // The switch statement must be out of date from the versions list. @@ -241,6 +249,13 @@ func NewIdentityV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOp } } + // Ensure endpoint still has a suffix of v3. + // This is because EndpointLocator might have found a versionless + // endpoint and requests will fail unless targeted at /v3. + if !strings.HasSuffix(endpoint, "v3/") { + endpoint = endpoint + "v3/" + } + return &gophercloud.ServiceClient{ ProviderClient: client, Endpoint: endpoint, diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go b/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go index c605d084..27da19f9 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go +++ b/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go @@ -68,11 +68,6 @@ func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (* return nil, "", err } - byID := make(map[string]*Version) - for _, version := range recognized { - byID[version.ID] = version - } - var highest *Version var endpoint string @@ -84,20 +79,22 @@ func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (* } } - if matching, ok := byID[value.ID]; ok { - // Prefer a version that exactly matches the provided endpoint. - if href == identityEndpoint { - if href == "" { - return nil, "", fmt.Errorf("Endpoint missing in version %s response from %s", value.ID, client.IdentityBase) + for _, version := range recognized { + if strings.Contains(value.ID, version.ID) { + // Prefer a version that exactly matches the provided endpoint. + if href == identityEndpoint { + if href == "" { + return nil, "", fmt.Errorf("Endpoint missing in version %s response from %s", value.ID, client.IdentityBase) + } + return version, href, nil } - return matching, href, nil - } - // Otherwise, find the highest-priority version with a whitelisted status. - if goodStatus[strings.ToLower(value.Status)] { - if highest == nil || matching.Priority > highest.Priority { - highest = matching - endpoint = href + // Otherwise, find the highest-priority version with a whitelisted status. + if goodStatus[strings.ToLower(value.Status)] { + if highest == nil || version.Priority > highest.Priority { + highest = version + endpoint = href + } } } }