blob: c83bd65f4637a686819c5a2b63e0133f203c75e5 [file] [log] [blame] [view]
Jamie Hannaford6a91bbc2014-10-28 15:48:06 +01001# Upgrading to v1.0.0 release
2
3With the arrival of this new major version increment, the unfortunate news is
4that many breaking changes to existing services have been introduced. The API
5has been completely rewritten to make the library more extendible and easy-to-use.
6
7Below we've compiled specific upgrade instructions for the various services
8that existed before. If you have a specific issue that is not addressed below,
9please [submit an issue](/issues/new) or
10[e-mail our support team](mailto:sdk-support@rackspace.com).
11
12# Authentication
13
14One of the major differences that this release introduces is the level of
15sub-packaging to differentiate between services and providers. You know have
16the option of authenticating with OpenStack and other providers (like Rackspace).
17
18To authenticate with a vanilla OpenStack installation, you can either specify
19your credentials like this:
20
21```go
22import (
23 "github.com/rackspace/gophercloud"
24 "github.com/rackspace/gophercloud/openstack"
25)
26
27opts := gophercloud.AuthOptions{
28 IdentityEndpoint: "https://my-openstack.com:5000/v2.0",
29 Username: "{username}",
30 Password: "{password}",
31 TenantID: "{tenant_id}",
32}
33```
34
35Or have them pulled in through environment variables, like this:
36
37```go
38opts, err := openstack.AuthOptionsFromEnv()
39```
40
41Once you have your `AuthOptions` struct, you pass it in to get back a `Provider`,
42like so:
43
44```go
45provider, err := openstack.AuthenticatedClient(opts)
46```
47
48This provider is the top-level structure that all services are created from.
49
50# Compute
51
52## Client
53
54Before you can interact with the Compute API, you need to retrieve a
55`gophercloud.ServiceClient` client. To do this:
56
57```go
58// Define your region, etc.
59opts := gophercloud.EndpointOpts{Region: "RegionOne"}
60
61client, err := openstack.NewComputeV2(provider, opts)
62```
63
64## List servers
65
66All operations that involve API collections (servers, flavors, images) now use
67the `pagination.Pager` interface. This interface represents paginated entities
68that can be iterated over.
69
70Once you have a Pager, you can then pass a callback function into its `EachPage`
71method, and this will allow you to traverse over the collection and execute
72arbitrary functionality. So, an example with list servers:
73
74```go
75import (
76 "fmt"
77 "github.com/rackspace/gophercloud/pagination"
78 "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
79)
80
81// We have the option of filtering the server list. If we want the full
82// collection, leave it as an empty struct
83opts := servers.ListOpts{Name: "server_1"}
84
85// Retrieve a pager (i.e. a paginated collection)
86pager := servers.List(client, opts)
87
88// Define an anonymous function to be executed on each page's iteration
89err := pager.EachPage(func(page pagination.Page) (bool, error) {
90 serverList, err := servers.ExtractServers(page)
91
92 // `s' will be a servers.Server struct
93 for _, s := range serverList {
94 fmt.Printf("We have a server. ID=%s, Name=%s", s.ID, s.Name)
95 }
96})
97```
98
99## Get server details
100
101```go
102import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
103
104// Get the HTTP result
105response := servers.Get(client, "server_id")
106
107// Extract a Server struct from the response
108server, err := response.Extract()
109```
110
111## Create server
112
113```go
114import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
115
116// Define our options
117opts := servers.CreateOpts{
118 Name: "new_server",
119 FlavorRef: "flavorID",
120 ImageRef: "imageID",
121}
122
123// Get our response
124response := servers.Create(client, opts)
125
126// Extract
127server, err := response.Extract()
128```
129
130## List images
131
132As with listing servers (see above), you first retrieve a Pager, and then pass
133in a callback over each page:
134
135```go
136import (
137 "github.com/rackspace/gophercloud/pagination"
138 "github.com/rackspace/gophercloud/openstack/compute/v2/images"
139)
140
141// We have the option of filtering the image list. If we want the full
142// collection, leave it as an empty struct
143opts := images.ListOpts{ChangesSince: "2014-01-01T01:02:03Z", Name: "Ubuntu 12.04"}
144
145// Retrieve a pager (i.e. a paginated collection)
146pager := images.List(client, opts)
147
148// Define an anonymous function to be executed on each page's iteration
149err := pager.EachPage(func(page pagination.Page) (bool, error) {
150 imageList, err := images.ExtractImages(page)
151
152 for _, i := range imageList {
153 // "i" will be a images.Image
154 }
155})
156```
157
158## List flavors
159
160```go
161import (
162 "github.com/rackspace/gophercloud/pagination"
163 "github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
164)
165
166// We have the option of filtering the flavor list. If we want the full
167// collection, leave it as an empty struct
168opts := flavors.ListOpts{ChangesSince: "2014-01-01T01:02:03Z", MinRAM: 4}
169
170// Retrieve a pager (i.e. a paginated collection)
171pager := flavors.List(client, opts)
172
173// Define an anonymous function to be executed on each page's iteration
174err := pager.EachPage(func(page pagination.Page) (bool, error) {
175 flavorList, err := networks.ExtractFlavors(page)
176
177 for _, f := range flavorList {
178 // "f" will be a flavors.Flavor
179 }
180})
181```
182
183## Change admin password
184
185```go
186import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
187
188result := servers.ChangeAdminPassword(client, "server_id", "newPassword_&123")
189```
190
191## Resize server
192
193```go
194import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
195
196result := servers.Resize(client, "server_id", "new_flavor_id")
197```
198
199## Reboot server
200
201```go
202import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
203
204// You have a choice of two reboot methods: servers.SoftReboot or servers.HardReboot
205result := servers.Reboot(client, "server_id", servers.SoftReboot)
206```
207
208## Update server
209
210```go
211import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
212
213opts := servers.UpdateOpts{Name: "new_name"}
214
215server, err := servers.Update(client, "server_id", opts).Extract()
216```
217
218## Rebuild server
219
220```go
221import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
222
223// You have the option of specifying additional options
224opts := RebuildOpts{
225 Name: "new_name",
226 AdminPass: "admin_password",
227 ImageID: "image_id",
228 Metadata: map[string]string{"owner": "me"},
229}
230
231result := servers.Rebuild(client, "server_id", opts)
232
233// You can extract a servers.Server struct from the HTTP response
234server, err := result.Extract()
235```
236
237## List keypairs
238
239```go
240import "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/keypairs"
241
242// Retrieve a pager (i.e. a paginated collection)
243pager := keypairs.List(client, opts)
244
245// Define an anonymous function to be executed on each page's iteration
246err := pager.EachPage(func(page pagination.Page) (bool, error) {
247 keyList, err := keypairs.ExtractKeyPairs(page)
248
249 for _, k := range keyList {
250 // "k" will be a keypairs.KeyPair
251 }
252})
253```
254
255## Create/delete keypairs
256
257To create a new keypair, you need to specify its name and, optionally, a
258pregenerated OpenSSH-formatted public key.
259
260```go
261import "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/keypairs"
262
263opts := keypairs.CreateOpts{
264 Name: "new_key",
265 PublicKey: "...",
266}
267
268response := keypairs.Create(client, opts)
269
270key, err := response.Extract()
271```
272
273To delete an existing keypair:
274
275```go
276response := keypairs.Delete(client, "keypair_id")
277```
278
279## Create/delete image
280
281Image management has been shifted to Glance, but unfortunately this service is
282not supported as of yet. You can, however, list Compute images like so:
283
284```go
285import "github.com/rackspace/gophercloud/openstack/compute/v2/images"
286
287// Retrieve a pager (i.e. a paginated collection)
288pager := images.List(client, opts)
289
290// Define an anonymous function to be executed on each page's iteration
291err := pager.EachPage(func(page pagination.Page) (bool, error) {
292 imageList, err := images.ExtractImages(page)
293
294 for _, i := range imageList {
295 // "i" will be a images.Image
296 }
297})
298```
299
300## Delete server
301
302```go
303import "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
304
305response := servers.Delete(client, "server_id")
306```
307
308## Rescue server
309
310The server rescue extension for Compute is not currently supported.
311
312## List IP addresses
313
314This operation is not currently supported.