blob: 5189431212c1d31eb81308910da5906bf86d77ce [file] [log] [blame]
Ash Wilsonb8401a72014-09-08 17:07:49 -04001package gophercloud
2
3import "errors"
4
5var (
Ash Wilson8c3bc8b2014-10-31 11:40:15 -04006 // ErrServiceNotFound is returned when no service in a service catalog matches
7 // the provided EndpointOpts. This is generally returned by provider service
8 // factory methods like "NewComputeV2()" and can mean that a service is not
9 // enabled for your account.
Ash Wilson1cd3e692014-09-09 11:01:47 -040010 ErrServiceNotFound = errors.New("No suitable service could be found in the service catalog.")
11
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040012 // ErrEndpointNotFound is returned when no available endpoints match the
13 // provided EndpointOpts. This is also generally returned by provider service
14 // factory methods, and usually indicates that a region was specified
15 // incorrectly.
Ash Wilsonb8401a72014-09-08 17:07:49 -040016 ErrEndpointNotFound = errors.New("No suitable endpoint could be found in the service catalog.")
17)
18
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040019// Availability indicates to whom a specific service endpoint is accessible:
20// the internet at large, internal networks only, or only to administrators.
21// Different identity services use different terminology for these. Identity v2
22// lists them as different kinds of URLs within the service catalog ("adminURL",
23// "internalURL", and "publicURL"), while v3 lists them as "Interfaces" in an
Ash Wilsonaa88fd92014-10-31 16:11:57 -040024// endpoint's response.
Ash Wilsonefac18b2014-09-10 14:44:42 -040025type Availability string
Ash Wilson0747d7e2014-09-09 14:27:35 -040026
27const (
Ash Wilsonaa88fd92014-10-31 16:11:57 -040028 // AvailabilityAdmin indicates that an endpoint is only available to
29 // administrators.
Ash Wilsonefac18b2014-09-10 14:44:42 -040030 AvailabilityAdmin Availability = "admin"
Ash Wilson0747d7e2014-09-09 14:27:35 -040031
Ash Wilsonaa88fd92014-10-31 16:11:57 -040032 // AvailabilityPublic indicates that an endpoint is available to everyone on
33 // the internet.
Ash Wilsonefac18b2014-09-10 14:44:42 -040034 AvailabilityPublic Availability = "public"
Ash Wilson0747d7e2014-09-09 14:27:35 -040035
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040036 // AvailabilityInternal indicates that an endpoint is only available within
37 // the cluster's internal network.
Ash Wilsonefac18b2014-09-10 14:44:42 -040038 AvailabilityInternal Availability = "internal"
Ash Wilson0747d7e2014-09-09 14:27:35 -040039)
40
Ash Wilsonaa88fd92014-10-31 16:11:57 -040041// EndpointOpts specifies search criteria used by queries against an
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040042// OpenStack service catalog. The options must contain enough information to
43// unambiguously identify one, and only one, endpoint within the catalog.
44//
45// Usually, these are passed to service client factory functions in a provider
46// package, like "rackspace.NewComputeV2()".
Ash Wilsonb8401a72014-09-08 17:07:49 -040047type EndpointOpts struct {
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040048 // Type [required] is the service type for the client (e.g., "compute",
49 // "object-store"). Generally, this will be supplied by the service client
50 // function, but a user-given value will be honored if provided.
Ash Wilsonb8401a72014-09-08 17:07:49 -040051 Type string
52
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040053 // Name [optional] is the service name for the client (e.g., "nova") as it
54 // appears in the service catalog. Services can have the same Type but a
55 // different Name, which is why both Type and Name are sometimes needed.
Ash Wilsonb8401a72014-09-08 17:07:49 -040056 Name string
57
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040058 // Region [required] is the geographic region in which the endpoint resides,
59 // generally specifying which datacenter should house your resources.
60 // Required only for services that span multiple regions.
Ash Wilsonb8401a72014-09-08 17:07:49 -040061 Region string
62
Ash Wilson8c3bc8b2014-10-31 11:40:15 -040063 // Availability [optional] is the visibility of the endpoint to be returned.
64 // Valid types include the constants AvailabilityPublic, AvailabilityInternal,
65 // or AvailabilityAdmin from this package.
66 //
67 // Availability is not required, and defaults to AvailabilityPublic. Not all
68 // providers or services offer all Availability options.
Ash Wilsonefac18b2014-09-10 14:44:42 -040069 Availability Availability
Ash Wilsonb8401a72014-09-08 17:07:49 -040070}
71
Ash Wilson93fb5a32014-10-31 15:27:58 -040072/*
73EndpointLocator is an internal function to be used by provider implementations.
74
75It provides an implementation that locates a single endpoint from a service
76catalog for a specific ProviderClient based on user-provided EndpointOpts. The
77provider then uses it to discover related ServiceClients.
78*/
Ash Wilsonb8401a72014-09-08 17:07:49 -040079type EndpointLocator func(EndpointOpts) (string, error)
Jon Perritt509fbb62014-09-10 13:29:56 -050080
Ash Wilson93fb5a32014-10-31 15:27:58 -040081// ApplyDefaults is an internal method to be used by provider implementations.
82//
83// It sets EndpointOpts fields if not already set, including a default type.
84// Currently, EndpointOpts.Availability defaults to the public endpoint.
Jon Perritt509fbb62014-09-10 13:29:56 -050085func (eo *EndpointOpts) ApplyDefaults(t string) {
86 if eo.Type == "" {
87 eo.Type = t
88 }
89 if eo.Availability == "" {
90 eo.Availability = AvailabilityPublic
91 }
92}