Commit f98326b7 authored by FengyunPan's avatar FengyunPan

Update gophercloud to Handle New Identity Endpoints

Currently openstack cloud provider just support keystone v2.0 and v3 The latest Identity Service is publishing an ID of v3.8, we should update gophercloud to recognize v3.8 as a valid version id.
parent fc8a647f
...@@ -404,31 +404,31 @@ ...@@ -404,31 +404,31 @@
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud", "ImportPath": "github.com/gophercloud/gophercloud",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack", "ImportPath": "github.com/gophercloud/gophercloud/openstack",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants", "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens", "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens", "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/utils", "ImportPath": "github.com/gophercloud/gophercloud/openstack/utils",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/pagination", "ImportPath": "github.com/gophercloud/gophercloud/pagination",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gregjones/httpcache", "ImportPath": "github.com/gregjones/httpcache",
......
...@@ -176,31 +176,31 @@ ...@@ -176,31 +176,31 @@
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud", "ImportPath": "github.com/gophercloud/gophercloud",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack", "ImportPath": "github.com/gophercloud/gophercloud/openstack",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants", "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens", "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens", "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/openstack/utils", "ImportPath": "github.com/gophercloud/gophercloud/openstack/utils",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gophercloud/gophercloud/pagination", "ImportPath": "github.com/gophercloud/gophercloud/pagination",
"Rev": "2bf16b94fdd9b01557c4d076e567fe5cbbe5a961" "Rev": "b4c2377fa77951a0e08163f52dc9b3e206355194"
}, },
{ {
"ImportPath": "github.com/gregjones/httpcache", "ImportPath": "github.com/gregjones/httpcache",
......
...@@ -4,6 +4,8 @@ import ( ...@@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"net/url" "net/url"
"reflect" "reflect"
"regexp"
"strings"
"github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud"
tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens" tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens"
...@@ -12,8 +14,13 @@ import ( ...@@ -12,8 +14,13 @@ import (
) )
const ( const (
v20 = "v2.0" // v2 represents Keystone v2.
v30 = "v3.0" // 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) { ...@@ -35,24 +42,25 @@ func NewClient(endpoint string) (*gophercloud.ProviderClient, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
hadPath := u.Path != ""
u.Path, u.RawQuery, u.Fragment = "", "", ""
base := u.String()
endpoint = gophercloud.NormalizeURL(endpoint) u.RawQuery, u.Fragment = "", ""
base = gophercloud.NormalizeURL(base)
if hadPath { var base string
return &gophercloud.ProviderClient{ versionRe := regexp.MustCompile("v[0-9.]+/?")
IdentityBase: base, if version := versionRe.FindString(u.Path); version != "" {
IdentityEndpoint: endpoint, base = strings.Replace(u.String(), version, "", -1)
}, nil } else {
base = u.String()
} }
endpoint = gophercloud.NormalizeURL(endpoint)
base = gophercloud.NormalizeURL(base)
return &gophercloud.ProviderClient{ return &gophercloud.ProviderClient{
IdentityBase: base, IdentityBase: base,
IdentityEndpoint: "", IdentityEndpoint: endpoint,
}, nil }, nil
} }
/* /*
...@@ -92,8 +100,8 @@ func AuthenticatedClient(options gophercloud.AuthOptions) (*gophercloud.Provider ...@@ -92,8 +100,8 @@ func AuthenticatedClient(options gophercloud.AuthOptions) (*gophercloud.Provider
// supported at the provided endpoint. // supported at the provided endpoint.
func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error { func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error {
versions := []*utils.Version{ versions := []*utils.Version{
{ID: v20, Priority: 20, Suffix: "/v2.0/"}, {ID: v2, Priority: 20, Suffix: "/v2.0/"},
{ID: v30, Priority: 30, Suffix: "/v3/"}, {ID: v3, Priority: 30, Suffix: "/v3/"},
} }
chosen, endpoint, err := utils.ChooseVersion(client, versions) chosen, endpoint, err := utils.ChooseVersion(client, versions)
...@@ -102,9 +110,9 @@ func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOp ...@@ -102,9 +110,9 @@ func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOp
} }
switch chosen.ID { switch chosen.ID {
case v20: case v2:
return v2auth(client, endpoint, options, gophercloud.EndpointOpts{}) return v2auth(client, endpoint, options, gophercloud.EndpointOpts{})
case v30: case v3:
return v3auth(client, endpoint, &options, gophercloud.EndpointOpts{}) return v3auth(client, endpoint, &options, gophercloud.EndpointOpts{})
default: default:
// The switch statement must be out of date from the versions list. // The switch statement must be out of date from the versions list.
...@@ -241,6 +249,13 @@ func NewIdentityV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOp ...@@ -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{ return &gophercloud.ServiceClient{
ProviderClient: client, ProviderClient: client,
Endpoint: endpoint, Endpoint: endpoint,
......
...@@ -68,11 +68,6 @@ func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (* ...@@ -68,11 +68,6 @@ func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (*
return nil, "", err return nil, "", err
} }
byID := make(map[string]*Version)
for _, version := range recognized {
byID[version.ID] = version
}
var highest *Version var highest *Version
var endpoint string var endpoint string
...@@ -84,20 +79,22 @@ func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (* ...@@ -84,20 +79,22 @@ func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (*
} }
} }
if matching, ok := byID[value.ID]; ok { for _, version := range recognized {
// Prefer a version that exactly matches the provided endpoint. if strings.Contains(value.ID, version.ID) {
if href == identityEndpoint { // Prefer a version that exactly matches the provided endpoint.
if href == "" { if href == identityEndpoint {
return nil, "", fmt.Errorf("Endpoint missing in version %s response from %s", value.ID, client.IdentityBase) 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. // Otherwise, find the highest-priority version with a whitelisted status.
if goodStatus[strings.ToLower(value.Status)] { if goodStatus[strings.ToLower(value.Status)] {
if highest == nil || matching.Priority > highest.Priority { if highest == nil || version.Priority > highest.Priority {
highest = matching highest = version
endpoint = href endpoint = href
}
} }
} }
} }
......
...@@ -29,4 +29,5 @@ filegroup( ...@@ -29,4 +29,5 @@ filegroup(
name = "all-srcs", name = "all-srcs",
srcs = [":package-srcs"], srcs = [":package-srcs"],
tags = ["automanaged"], tags = ["automanaged"],
visibility = ["//visibility:public"],
) )
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment