|
Packit |
63bb0d |
/*
|
|
Packit |
63bb0d |
Package gophercloud provides a multi-vendor interface to OpenStack-compatible
|
|
Packit |
63bb0d |
clouds. The library has a three-level hierarchy: providers, services, and
|
|
Packit |
63bb0d |
resources.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Authenticating with Providers
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Provider structs represent the cloud providers that offer and manage a
|
|
Packit |
63bb0d |
collection of services. You will generally want to create one Provider
|
|
Packit |
63bb0d |
client per OpenStack cloud.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
It is now recommended to use the `clientconfig` package found at
|
|
Packit |
63bb0d |
https://github.com/gophercloud/utils/tree/master/openstack/clientconfig
|
|
Packit |
63bb0d |
for all authentication purposes.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
The below documentation is still relevant. clientconfig simply implements
|
|
Packit |
63bb0d |
the below and presents it in an easier and more flexible way.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Use your OpenStack credentials to create a Provider client. The
|
|
Packit |
63bb0d |
IdentityEndpoint is typically refered to as "auth_url" or "OS_AUTH_URL" in
|
|
Packit |
63bb0d |
information provided by the cloud operator. Additionally, the cloud may refer to
|
|
Packit |
63bb0d |
TenantID or TenantName as project_id and project_name. Credentials are
|
|
Packit |
63bb0d |
specified like so:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
opts := gophercloud.AuthOptions{
|
|
Packit |
63bb0d |
IdentityEndpoint: "https://openstack.example.com:5000/v2.0",
|
|
Packit |
63bb0d |
Username: "{username}",
|
|
Packit |
63bb0d |
Password: "{password}",
|
|
Packit |
63bb0d |
TenantID: "{tenant_id}",
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
provider, err := openstack.AuthenticatedClient(opts)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
You can authenticate with a token by doing:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
opts := gophercloud.AuthOptions{
|
|
Packit |
63bb0d |
IdentityEndpoint: "https://openstack.example.com:5000/v2.0",
|
|
Packit |
63bb0d |
TokenID: "{token_id}",
|
|
Packit |
63bb0d |
TenantID: "{tenant_id}",
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
provider, err := openstack.AuthenticatedClient(opts)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
You may also use the openstack.AuthOptionsFromEnv() helper function. This
|
|
Packit |
63bb0d |
function reads in standard environment variables frequently found in an
|
|
Packit |
63bb0d |
OpenStack `openrc` file. Again note that Gophercloud currently uses "tenant"
|
|
Packit |
63bb0d |
instead of "project".
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
opts, err := openstack.AuthOptionsFromEnv()
|
|
Packit |
63bb0d |
provider, err := openstack.AuthenticatedClient(opts)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Service Clients
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Service structs are specific to a provider and handle all of the logic and
|
|
Packit |
63bb0d |
operations for a particular OpenStack service. Examples of services include:
|
|
Packit |
63bb0d |
Compute, Object Storage, Block Storage. In order to define one, you need to
|
|
Packit |
63bb0d |
pass in the parent provider, like so:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
opts := gophercloud.EndpointOpts{Region: "RegionOne"}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
client, err := openstack.NewComputeV2(provider, opts)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Resources
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Resource structs are the domain models that services make use of in order
|
|
Packit |
63bb0d |
to work with and represent the state of API resources:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
server, err := servers.Get(client, "{serverId}").Extract()
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Intermediate Result structs are returned for API operations, which allow
|
|
Packit |
63bb0d |
generic access to the HTTP headers, response body, and any errors associated
|
|
Packit |
63bb0d |
with the network transaction. To turn a result into a usable resource struct,
|
|
Packit |
63bb0d |
you must call the Extract method which is chained to the response, or an
|
|
Packit |
63bb0d |
Extract function from an applicable extension:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
result := servers.Get(client, "{serverId}")
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Attempt to extract the disk configuration from the OS-DCF disk config
|
|
Packit |
63bb0d |
// extension:
|
|
Packit |
63bb0d |
config, err := diskconfig.ExtractGet(result)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
All requests that enumerate a collection return a Pager struct that is used to
|
|
Packit |
63bb0d |
iterate through the results one page at a time. Use the EachPage method on that
|
|
Packit |
63bb0d |
Pager to handle each successive Page in a closure, then use the appropriate
|
|
Packit |
63bb0d |
extraction method from that request's package to interpret that Page as a slice
|
|
Packit |
63bb0d |
of results:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
err := servers.List(client, nil).EachPage(func (page pagination.Page) (bool, error) {
|
|
Packit |
63bb0d |
s, err := servers.ExtractServers(page)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return false, err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Handle the []servers.Server slice.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Return "false" or an error to prematurely stop fetching new pages.
|
|
Packit |
63bb0d |
return true, nil
|
|
Packit |
63bb0d |
})
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
If you want to obtain the entire collection of pages without doing any
|
|
Packit |
63bb0d |
intermediary processing on each page, you can use the AllPages method:
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
allPages, err := servers.List(client, nil).AllPages()
|
|
Packit |
63bb0d |
allServers, err := servers.ExtractServers(allPages)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
This top-level package contains utility functions and data types that are used
|
|
Packit |
63bb0d |
throughout the provider and service packages. Of particular note for end users
|
|
Packit |
63bb0d |
are the AuthOptions and EndpointOpts structs.
|
|
Packit |
63bb0d |
*/
|
|
Packit |
63bb0d |
package gophercloud
|