| Ash Wilson | 8ba8224 | 2014-08-28 15:38:55 -0400 | [diff] [blame] | 1 | package openstack | 
 | 2 |  | 
 | 3 | import ( | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 4 | 	"fmt" | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 5 | 	"net/url" | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 6 | 	"reflect" | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 7 | 	"regexp" | 
 | 8 | 	"strings" | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 9 |  | 
| Krzysztof Szukiełojć | 3f41d08 | 2017-05-07 14:43:06 +0200 | [diff] [blame] | 10 | 	"gerrit.mcp.mirantis.net/debian/gophercloud.git" | 
| Krzysztof Szukiełojć | 24a29ce | 2017-05-07 14:24:02 +0200 | [diff] [blame] | 11 | 	tokens2 "gerrit.mcp.mirantis.net/debian/gophercloud.git/openstack/identity/v2/tokens" | 
 | 12 | 	tokens3 "gerrit.mcp.mirantis.net/debian/gophercloud.git/openstack/identity/v3/tokens" | 
 | 13 | 	"gerrit.mcp.mirantis.net/debian/gophercloud.git/openstack/utils" | 
| Ash Wilson | 8ba8224 | 2014-08-28 15:38:55 -0400 | [diff] [blame] | 14 | ) | 
 | 15 |  | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 16 | const ( | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 17 | 	// v2 represents Keystone v2. | 
 | 18 | 	// It should never increase beyond 2.0. | 
 | 19 | 	v2 = "v2.0" | 
 | 20 |  | 
 | 21 | 	// v3 represents Keystone v3. | 
 | 22 | 	// The version can be anything from v3 to v3.x. | 
 | 23 | 	v3 = "v3" | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 24 | ) | 
| Ash Wilson | 8ba8224 | 2014-08-28 15:38:55 -0400 | [diff] [blame] | 25 |  | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 26 | // NewClient prepares an unauthenticated ProviderClient instance. | 
 | 27 | // Most users will probably prefer using the AuthenticatedClient function instead. | 
 | 28 | // This is useful if you wish to explicitly control the version of the identity service that's used for authentication explicitly, | 
 | 29 | // for example. | 
 | 30 | func NewClient(endpoint string) (*gophercloud.ProviderClient, error) { | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 31 | 	u, err := url.Parse(endpoint) | 
 | 32 | 	if err != nil { | 
 | 33 | 		return nil, err | 
 | 34 | 	} | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 35 |  | 
 | 36 | 	u.RawQuery, u.Fragment = "", "" | 
 | 37 |  | 
 | 38 | 	var base string | 
 | 39 | 	versionRe := regexp.MustCompile("v[0-9.]+/?") | 
 | 40 | 	if version := versionRe.FindString(u.Path); version != "" { | 
 | 41 | 		base = strings.Replace(u.String(), version, "", -1) | 
 | 42 | 	} else { | 
 | 43 | 		base = u.String() | 
 | 44 | 	} | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 45 |  | 
| Ash Wilson | a844064 | 2014-10-07 09:55:58 -0400 | [diff] [blame] | 46 | 	endpoint = gophercloud.NormalizeURL(endpoint) | 
 | 47 | 	base = gophercloud.NormalizeURL(base) | 
| Ash Wilson | e7da01c | 2014-09-09 12:31:06 -0400 | [diff] [blame] | 48 |  | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 49 | 	return &gophercloud.ProviderClient{ | 
 | 50 | 		IdentityBase:     base, | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 51 | 		IdentityEndpoint: endpoint, | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 52 | 	}, nil | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 53 |  | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 54 | } | 
 | 55 |  | 
 | 56 | // AuthenticatedClient logs in to an OpenStack cloud found at the identity endpoint specified by options, acquires a token, and | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 57 | // returns a Client instance that's ready to operate. | 
| Ash Wilson | 8ba8224 | 2014-08-28 15:38:55 -0400 | [diff] [blame] | 58 | // It first queries the root identity endpoint to determine which versions of the identity service are supported, then chooses | 
 | 59 | // the most recent identity service available to proceed. | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 60 | func AuthenticatedClient(options gophercloud.AuthOptions) (*gophercloud.ProviderClient, error) { | 
 | 61 | 	client, err := NewClient(options.IdentityEndpoint) | 
 | 62 | 	if err != nil { | 
 | 63 | 		return nil, err | 
 | 64 | 	} | 
 | 65 |  | 
 | 66 | 	err = Authenticate(client, options) | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 67 | 	if err != nil { | 
 | 68 | 		return nil, err | 
 | 69 | 	} | 
 | 70 | 	return client, nil | 
 | 71 | } | 
 | 72 |  | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 73 | // Authenticate or re-authenticate against the most recent identity service supported at the provided endpoint. | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 74 | func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error { | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 75 | 	versions := []*utils.Version{ | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 76 | 		{ID: v2, Priority: 20, Suffix: "/v2.0/"}, | 
 | 77 | 		{ID: v3, Priority: 30, Suffix: "/v3/"}, | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 78 | 	} | 
 | 79 |  | 
| Ash Wilson | 2491b4c | 2015-02-12 16:13:39 -0500 | [diff] [blame] | 80 | 	chosen, endpoint, err := utils.ChooseVersion(client, versions) | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 81 | 	if err != nil { | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 82 | 		return err | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 83 | 	} | 
 | 84 |  | 
 | 85 | 	switch chosen.ID { | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 86 | 	case v2: | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 87 | 		return v2auth(client, endpoint, options, gophercloud.EndpointOpts{}) | 
| Joe Topjian | d74641f | 2017-07-25 02:58:19 +0000 | [diff] [blame] | 88 | 	case v3: | 
| jrperritt | 0bc5578 | 2016-07-27 13:50:14 -0500 | [diff] [blame] | 89 | 		return v3auth(client, endpoint, &options, gophercloud.EndpointOpts{}) | 
| Ash Wilson | 4dee1b8 | 2014-08-29 14:56:45 -0400 | [diff] [blame] | 90 | 	default: | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 91 | 		// The switch statement must be out of date from the versions list. | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 92 | 		return fmt.Errorf("Unrecognized identity version: %s", chosen.ID) | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 93 | 	} | 
 | 94 | } | 
 | 95 |  | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 96 | // AuthenticateV2 explicitly authenticates against the identity v2 endpoint. | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 97 | func AuthenticateV2(client *gophercloud.ProviderClient, options gophercloud.AuthOptions, eo gophercloud.EndpointOpts) error { | 
 | 98 | 	return v2auth(client, "", options, eo) | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 99 | } | 
 | 100 |  | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 101 | func v2auth(client *gophercloud.ProviderClient, endpoint string, options gophercloud.AuthOptions, eo gophercloud.EndpointOpts) error { | 
| Jon Perritt | 376dfce | 2016-02-28 23:39:09 -0600 | [diff] [blame] | 102 | 	v2Client, err := NewIdentityV2(client, eo) | 
 | 103 | 	if err != nil { | 
 | 104 | 		return err | 
 | 105 | 	} | 
 | 106 |  | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 107 | 	if endpoint != "" { | 
 | 108 | 		v2Client.Endpoint = endpoint | 
 | 109 | 	} | 
 | 110 |  | 
| jrperritt | 64d0ef0 | 2016-04-13 13:10:04 -0500 | [diff] [blame] | 111 | 	v2Opts := tokens2.AuthOptions{ | 
 | 112 | 		IdentityEndpoint: options.IdentityEndpoint, | 
 | 113 | 		Username:         options.Username, | 
 | 114 | 		Password:         options.Password, | 
 | 115 | 		TenantID:         options.TenantID, | 
 | 116 | 		TenantName:       options.TenantName, | 
 | 117 | 		AllowReauth:      options.AllowReauth, | 
 | 118 | 		TokenID:          options.TokenID, | 
 | 119 | 	} | 
 | 120 |  | 
 | 121 | 	result := tokens2.Create(v2Client, v2Opts) | 
| Ash Wilson | 52fbd18 | 2014-10-03 13:48:06 -0400 | [diff] [blame] | 122 |  | 
 | 123 | 	token, err := result.ExtractToken() | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 124 | 	if err != nil { | 
 | 125 | 		return err | 
 | 126 | 	} | 
 | 127 |  | 
| Ash Wilson | 52fbd18 | 2014-10-03 13:48:06 -0400 | [diff] [blame] | 128 | 	catalog, err := result.ExtractServiceCatalog() | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 129 | 	if err != nil { | 
 | 130 | 		return err | 
 | 131 | 	} | 
 | 132 |  | 
| Jon Perritt | f4052c6 | 2015-02-14 09:48:18 -0700 | [diff] [blame] | 133 | 	if options.AllowReauth { | 
| Jon Perritt | 6fe7c40 | 2015-02-17 12:24:53 -0700 | [diff] [blame] | 134 | 		client.ReauthFunc = func() error { | 
| Masahiro Sano | 1b2bafe | 2015-03-06 23:26:54 +0900 | [diff] [blame] | 135 | 			client.TokenID = "" | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 136 | 			return v2auth(client, endpoint, options, eo) | 
| Jon Perritt | 6fe7c40 | 2015-02-17 12:24:53 -0700 | [diff] [blame] | 137 | 		} | 
| Jon Perritt | f4052c6 | 2015-02-14 09:48:18 -0700 | [diff] [blame] | 138 | 	} | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 139 | 	client.TokenID = token.ID | 
| Ash Wilson | 130a6e2 | 2014-10-07 10:48:17 -0400 | [diff] [blame] | 140 | 	client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) { | 
 | 141 | 		return V2EndpointURL(catalog, opts) | 
 | 142 | 	} | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 143 |  | 
 | 144 | 	return nil | 
 | 145 | } | 
 | 146 |  | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 147 | // AuthenticateV3 explicitly authenticates against the identity v3 service. | 
| jrperritt | 0bc5578 | 2016-07-27 13:50:14 -0500 | [diff] [blame] | 148 | func AuthenticateV3(client *gophercloud.ProviderClient, options tokens3.AuthOptionsBuilder, eo gophercloud.EndpointOpts) error { | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 149 | 	return v3auth(client, "", options, eo) | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 150 | } | 
 | 151 |  | 
| jrperritt | 0bc5578 | 2016-07-27 13:50:14 -0500 | [diff] [blame] | 152 | func v3auth(client *gophercloud.ProviderClient, endpoint string, opts tokens3.AuthOptionsBuilder, eo gophercloud.EndpointOpts) error { | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 153 | 	// Override the generated service endpoint with the one returned by the version endpoint. | 
| Jon Perritt | 376dfce | 2016-02-28 23:39:09 -0600 | [diff] [blame] | 154 | 	v3Client, err := NewIdentityV3(client, eo) | 
 | 155 | 	if err != nil { | 
 | 156 | 		return err | 
 | 157 | 	} | 
 | 158 |  | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 159 | 	if endpoint != "" { | 
 | 160 | 		v3Client.Endpoint = endpoint | 
 | 161 | 	} | 
 | 162 |  | 
| jrperritt | 0bc5578 | 2016-07-27 13:50:14 -0500 | [diff] [blame] | 163 | 	result := tokens3.Create(v3Client, opts) | 
| Guillaume Giamarchi | b2663b2 | 2015-04-01 01:23:29 +0200 | [diff] [blame] | 164 |  | 
 | 165 | 	token, err := result.ExtractToken() | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 166 | 	if err != nil { | 
 | 167 | 		return err | 
 | 168 | 	} | 
| Guillaume Giamarchi | b2663b2 | 2015-04-01 01:23:29 +0200 | [diff] [blame] | 169 |  | 
 | 170 | 	catalog, err := result.ExtractServiceCatalog() | 
 | 171 | 	if err != nil { | 
 | 172 | 		return err | 
 | 173 | 	} | 
 | 174 |  | 
| Ash Wilson | 63b2a29 | 2014-10-02 09:29:06 -0400 | [diff] [blame] | 175 | 	client.TokenID = token.ID | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 176 |  | 
| jrperritt | 0bc5578 | 2016-07-27 13:50:14 -0500 | [diff] [blame] | 177 | 	if opts.CanReauth() { | 
| Jon Perritt | 6fe7c40 | 2015-02-17 12:24:53 -0700 | [diff] [blame] | 178 | 		client.ReauthFunc = func() error { | 
| hzlouchao | f6e2926 | 2015-10-27 12:51:08 +0800 | [diff] [blame] | 179 | 			client.TokenID = "" | 
| jrperritt | 0bc5578 | 2016-07-27 13:50:14 -0500 | [diff] [blame] | 180 | 			return v3auth(client, endpoint, opts, eo) | 
| Jon Perritt | 6fe7c40 | 2015-02-17 12:24:53 -0700 | [diff] [blame] | 181 | 		} | 
| Jon Perritt | f4052c6 | 2015-02-14 09:48:18 -0700 | [diff] [blame] | 182 | 	} | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 183 | 	client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) { | 
| Guillaume Giamarchi | b2663b2 | 2015-04-01 01:23:29 +0200 | [diff] [blame] | 184 | 		return V3EndpointURL(catalog, opts) | 
| Ash Wilson | 09694b9 | 2014-09-09 14:08:27 -0400 | [diff] [blame] | 185 | 	} | 
 | 186 |  | 
 | 187 | 	return nil | 
 | 188 | } | 
 | 189 |  | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 190 | // NewIdentityV2 creates a ServiceClient that may be used to interact with the v2 identity service. | 
| Jon Perritt | 376dfce | 2016-02-28 23:39:09 -0600 | [diff] [blame] | 191 | func NewIdentityV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 192 | 	endpoint := client.IdentityBase + "v2.0/" | 
 | 193 | 	var err error | 
 | 194 | 	if !reflect.DeepEqual(eo, gophercloud.EndpointOpts{}) { | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 195 | 		eo.ApplyDefaults("identity") | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 196 | 		endpoint, err = client.EndpointLocator(eo) | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 197 | 		if err != nil { | 
 | 198 | 			return nil, err | 
 | 199 | 		} | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 200 | 	} | 
| Ash Wilson | ccd020b | 2014-09-02 10:40:54 -0400 | [diff] [blame] | 201 |  | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 202 | 	return &gophercloud.ServiceClient{ | 
| Ash Wilson | 92c380c | 2014-10-22 09:14:53 -0400 | [diff] [blame] | 203 | 		ProviderClient: client, | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 204 | 		Endpoint:       endpoint, | 
| Jon Perritt | 376dfce | 2016-02-28 23:39:09 -0600 | [diff] [blame] | 205 | 	}, nil | 
| Ash Wilson | 8ba8224 | 2014-08-28 15:38:55 -0400 | [diff] [blame] | 206 | } | 
 | 207 |  | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 208 | // NewIdentityV3 creates a ServiceClient that may be used to access the v3 identity service. | 
| Jon Perritt | 376dfce | 2016-02-28 23:39:09 -0600 | [diff] [blame] | 209 | func NewIdentityV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 210 | 	endpoint := client.IdentityBase + "v3/" | 
 | 211 | 	var err error | 
 | 212 | 	if !reflect.DeepEqual(eo, gophercloud.EndpointOpts{}) { | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 213 | 		eo.ApplyDefaults("identity") | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 214 | 		endpoint, err = client.EndpointLocator(eo) | 
| Jon Perritt | a33da23 | 2016-03-02 04:43:08 -0600 | [diff] [blame] | 215 | 		if err != nil { | 
 | 216 | 			return nil, err | 
 | 217 | 		} | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 218 | 	} | 
| Ash Wilson | a87ee06 | 2014-09-03 11:26:06 -0400 | [diff] [blame] | 219 |  | 
 | 220 | 	return &gophercloud.ServiceClient{ | 
| Ash Wilson | 92c380c | 2014-10-22 09:14:53 -0400 | [diff] [blame] | 221 | 		ProviderClient: client, | 
| jrperritt | 93b4a3c | 2016-07-20 20:29:30 -0500 | [diff] [blame] | 222 | 		Endpoint:       endpoint, | 
| Jon Perritt | 376dfce | 2016-02-28 23:39:09 -0600 | [diff] [blame] | 223 | 	}, nil | 
| feisky | 66803f0 | 2015-08-28 22:06:34 +0800 | [diff] [blame] | 224 | } | 
 | 225 |  | 
| Jon Perritt | bb5e981 | 2014-10-15 17:53:44 -0500 | [diff] [blame] | 226 | // NewObjectStorageV1 creates a ServiceClient that may be used with the v1 object storage package. | 
 | 227 | func NewObjectStorageV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
| Jon Perritt | 509fbb6 | 2014-09-10 13:29:56 -0500 | [diff] [blame] | 228 | 	eo.ApplyDefaults("object-store") | 
 | 229 | 	url, err := client.EndpointLocator(eo) | 
| Ash Wilson | 1cd3e69 | 2014-09-09 11:01:47 -0400 | [diff] [blame] | 230 | 	if err != nil { | 
 | 231 | 		return nil, err | 
 | 232 | 	} | 
| Ash Wilson | 92c380c | 2014-10-22 09:14:53 -0400 | [diff] [blame] | 233 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
| Ash Wilson | 1cd3e69 | 2014-09-09 11:01:47 -0400 | [diff] [blame] | 234 | } | 
| Ash Wilson | 5e57c1b | 2014-09-17 09:24:46 -0400 | [diff] [blame] | 235 |  | 
 | 236 | // NewComputeV2 creates a ServiceClient that may be used with the v2 compute package. | 
 | 237 | func NewComputeV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 238 | 	eo.ApplyDefaults("compute") | 
 | 239 | 	url, err := client.EndpointLocator(eo) | 
 | 240 | 	if err != nil { | 
 | 241 | 		return nil, err | 
 | 242 | 	} | 
| Ash Wilson | 92c380c | 2014-10-22 09:14:53 -0400 | [diff] [blame] | 243 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
| Ash Wilson | 5e57c1b | 2014-09-17 09:24:46 -0400 | [diff] [blame] | 244 | } | 
| Ash Wilson | ebc3d12 | 2014-09-24 13:44:05 -0400 | [diff] [blame] | 245 |  | 
 | 246 | // NewNetworkV2 creates a ServiceClient that may be used with the v2 network package. | 
| Jamie Hannaford | 7ea2958 | 2014-09-11 15:49:46 +0200 | [diff] [blame] | 247 | func NewNetworkV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 248 | 	eo.ApplyDefaults("network") | 
 | 249 | 	url, err := client.EndpointLocator(eo) | 
 | 250 | 	if err != nil { | 
 | 251 | 		return nil, err | 
 | 252 | 	} | 
| Ash Wilson | 99541ab | 2014-10-06 17:32:39 -0400 | [diff] [blame] | 253 | 	return &gophercloud.ServiceClient{ | 
| Ash Wilson | 92c380c | 2014-10-22 09:14:53 -0400 | [diff] [blame] | 254 | 		ProviderClient: client, | 
 | 255 | 		Endpoint:       url, | 
 | 256 | 		ResourceBase:   url + "v2.0/", | 
| Ash Wilson | 99541ab | 2014-10-06 17:32:39 -0400 | [diff] [blame] | 257 | 	}, nil | 
| Jamie Hannaford | 7ea2958 | 2014-09-11 15:49:46 +0200 | [diff] [blame] | 258 | } | 
| Jon Perritt | c5ee85e | 2014-09-17 00:53:19 -0500 | [diff] [blame] | 259 |  | 
 | 260 | // NewBlockStorageV1 creates a ServiceClient that may be used to access the v1 block storage service. | 
 | 261 | func NewBlockStorageV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 262 | 	eo.ApplyDefaults("volume") | 
 | 263 | 	url, err := client.EndpointLocator(eo) | 
 | 264 | 	if err != nil { | 
 | 265 | 		return nil, err | 
 | 266 | 	} | 
| Ash Wilson | 92c380c | 2014-10-22 09:14:53 -0400 | [diff] [blame] | 267 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
| Jon Perritt | c5ee85e | 2014-09-17 00:53:19 -0500 | [diff] [blame] | 268 | } | 
| Jon Perritt | ebd18ec | 2015-01-16 09:13:31 -0700 | [diff] [blame] | 269 |  | 
| feisky | da54614 | 2015-09-17 12:28:23 +0800 | [diff] [blame] | 270 | // NewBlockStorageV2 creates a ServiceClient that may be used to access the v2 block storage service. | 
 | 271 | func NewBlockStorageV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
| Nick Craig-Wood | b64fd20 | 2016-05-13 15:56:18 +0100 | [diff] [blame] | 272 | 	eo.ApplyDefaults("volumev2") | 
| feisky | da54614 | 2015-09-17 12:28:23 +0800 | [diff] [blame] | 273 | 	url, err := client.EndpointLocator(eo) | 
 | 274 | 	if err != nil { | 
 | 275 | 		return nil, err | 
 | 276 | 	} | 
| Nick Craig-Wood | b64fd20 | 2016-05-13 15:56:18 +0100 | [diff] [blame] | 277 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
| feisky | da54614 | 2015-09-17 12:28:23 +0800 | [diff] [blame] | 278 | } | 
 | 279 |  | 
| Krzysztof Szukiełojć | e28b2e2 | 2017-07-31 11:31:06 +0200 | [diff] [blame] | 280 | // NewBlockStorageV3 creates a ServiceClient that may be used to access the v3 block storage service. | 
 | 281 | func NewBlockStorageV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 282 | 	eo.ApplyDefaults("volumev3") | 
 | 283 | 	url, err := client.EndpointLocator(eo) | 
 | 284 | 	if err != nil { | 
 | 285 | 		return nil, err | 
 | 286 | 	} | 
 | 287 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
 | 288 | } | 
 | 289 |  | 
| ehdou | 10f1f85 | 2016-10-14 20:58:23 +0300 | [diff] [blame] | 290 | // NewSharedFileSystemV2 creates a ServiceClient that may be used to access the v2 shared file system service. | 
 | 291 | func NewSharedFileSystemV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 292 | 	eo.ApplyDefaults("sharev2") | 
 | 293 | 	url, err := client.EndpointLocator(eo) | 
 | 294 | 	if err != nil { | 
 | 295 | 		return nil, err | 
 | 296 | 	} | 
 | 297 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
 | 298 | } | 
 | 299 |  | 
| Jon Perritt | ebd18ec | 2015-01-16 09:13:31 -0700 | [diff] [blame] | 300 | // NewCDNV1 creates a ServiceClient that may be used to access the OpenStack v1 | 
 | 301 | // CDN service. | 
 | 302 | func NewCDNV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 303 | 	eo.ApplyDefaults("cdn") | 
 | 304 | 	url, err := client.EndpointLocator(eo) | 
 | 305 | 	if err != nil { | 
 | 306 | 		return nil, err | 
 | 307 | 	} | 
 | 308 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
 | 309 | } | 
| Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 310 |  | 
 | 311 | // NewOrchestrationV1 creates a ServiceClient that may be used to access the v1 orchestration service. | 
 | 312 | func NewOrchestrationV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 313 | 	eo.ApplyDefaults("orchestration") | 
 | 314 | 	url, err := client.EndpointLocator(eo) | 
 | 315 | 	if err != nil { | 
 | 316 | 		return nil, err | 
 | 317 | 	} | 
 | 318 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
 | 319 | } | 
| Jamie Hannaford | 05d200d | 2015-02-20 14:49:05 +0100 | [diff] [blame] | 320 |  | 
| Jamie Hannaford | 75e8cc4 | 2015-11-16 14:09:25 +0100 | [diff] [blame] | 321 | // NewDBV1 creates a ServiceClient that may be used to access the v1 DB service. | 
| Jamie Hannaford | 05d200d | 2015-02-20 14:49:05 +0100 | [diff] [blame] | 322 | func NewDBV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 323 | 	eo.ApplyDefaults("database") | 
 | 324 | 	url, err := client.EndpointLocator(eo) | 
 | 325 | 	if err != nil { | 
 | 326 | 		return nil, err | 
 | 327 | 	} | 
 | 328 | 	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil | 
 | 329 | } | 
| jrperritt | c5c590a | 2016-11-04 14:41:15 -0500 | [diff] [blame] | 330 |  | 
| Joe Topjian | 71b85bd | 2017-03-09 18:55:36 -0700 | [diff] [blame] | 331 | // NewDNSV2 creates a ServiceClient that may be used to access the v2 DNS service. | 
 | 332 | func NewDNSV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 333 | 	eo.ApplyDefaults("dns") | 
 | 334 | 	url, err := client.EndpointLocator(eo) | 
 | 335 | 	if err != nil { | 
 | 336 | 		return nil, err | 
 | 337 | 	} | 
 | 338 | 	return &gophercloud.ServiceClient{ | 
 | 339 | 		ProviderClient: client, | 
 | 340 | 		Endpoint:       url, | 
 | 341 | 		ResourceBase:   url + "v2/"}, nil | 
 | 342 | } | 
 | 343 |  | 
| jrperritt | c5c590a | 2016-11-04 14:41:15 -0500 | [diff] [blame] | 344 | // NewImageServiceV2 creates a ServiceClient that may be used to access the v2 image service. | 
 | 345 | func NewImageServiceV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 346 | 	eo.ApplyDefaults("image") | 
 | 347 | 	url, err := client.EndpointLocator(eo) | 
 | 348 | 	if err != nil { | 
 | 349 | 		return nil, err | 
 | 350 | 	} | 
| Krzysztof Szukiełojć | e4c5dcc | 2017-09-14 14:04:46 +0200 | [diff] [blame] | 351 | 	return &gophercloud.ServiceClient{ProviderClient: client, | 
 | 352 | 		Endpoint:     url, | 
 | 353 | 		ResourceBase: url + "v2/"}, nil | 
| jrperritt | c5c590a | 2016-11-04 14:41:15 -0500 | [diff] [blame] | 354 | } | 
| Michal Kobus | 4f4220e | 2018-12-17 18:45:17 +0100 | [diff] [blame] | 355 |  | 
 | 356 | // NewLoadBalancerV2 creates a ServiceClient that may be used to access the v2 | 
 | 357 | // load balancer service. | 
 | 358 | func NewLoadBalancerV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { | 
 | 359 | 	eo.ApplyDefaults("load-balancer") | 
 | 360 | 	url, err := client.EndpointLocator(eo) | 
 | 361 | 	if err != nil { | 
 | 362 | 		return nil, err | 
 | 363 | 	} | 
 | 364 | 	return &gophercloud.ServiceClient{ProviderClient: client, | 
 | 365 | 		Endpoint:     url, | 
 | 366 | 		ResourceBase: url + "v2.0/"}, nil | 
 | 367 | } |