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