Skip to content
This repository was archived by the owner on Aug 1, 2023. It is now read-only.

Commit 36482be

Browse files
funrun11Samuel Ortiz
authored andcommitted
OpenStack Glance support
* added List images feature * improved error output for glance json response parsing * added workaround for https://bugs.launchpad.net/glance/+bug/1481512 * added image update acceptance test * added image create/delete acceptance test * added 'acceptance imageservice' build tags * credentials from env are used * golint passes * bug fixes
1 parent 818308a commit 36482be

File tree

11 files changed

+776
-208
lines changed

11 files changed

+776
-208
lines changed

acceptance/openstack/imageservice/v2/common.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// +build acceptance
1+
// +build acceptance imageservice
22

33
package v2
44

@@ -12,14 +12,32 @@ import (
1212
)
1313

1414
func newClient(t *testing.T) *gophercloud.ServiceClient {
15-
ao, err := openstack.AuthOptionsFromEnv()
15+
16+
authURL := os.Getenv("OS_AUTH_URL")
17+
username := os.Getenv("OS_USERNAME")
18+
password := os.Getenv("OS_PASSWORD")
19+
tenantName := os.Getenv("OS_TENANT_NAME")
20+
domainName := os.Getenv("OS_DOMAIN_NAME")
21+
22+
t.Logf("Credentials used: OS_AUTH_URL='%s' OS_USERNAME='%s' OS_PASSWORD='*****' OS_TENANT_NAME='%s' OS_TENANT_NAME='%s' \n",
23+
authURL, username, tenantName, domainName)
24+
25+
client, err := openstack.NewClient(authURL)
1626
th.AssertNoErr(t, err)
1727

18-
client, err := openstack.AuthenticatedClient(ao)
28+
ao := gophercloud.AuthOptions{
29+
Username: username,
30+
Password: password,
31+
TenantName: tenantName,
32+
DomainName: domainName,
33+
}
34+
35+
err = openstack.AuthenticateV3(client, ao)
1936
th.AssertNoErr(t, err)
37+
t.Logf("Token is %v", client.TokenID)
2038

2139
c, err := openstack.NewImageServiceV2(client, gophercloud.EndpointOpts{
22-
Region: os.Getenv("OS_REGION_NAME"),
40+
Region: "RegionOne",
2341
})
2442
th.AssertNoErr(t, err)
2543
return c
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
// +build acceptance imageservice
2+
3+
package v2
4+
5+
import (
6+
"bytes"
7+
"io/ioutil"
8+
"testing"
9+
10+
"github.com/rackspace/gophercloud/acceptance/tools"
11+
images "github.com/rackspace/gophercloud/openstack/imageservice/v2"
12+
"github.com/rackspace/gophercloud/pagination"
13+
th "github.com/rackspace/gophercloud/testhelper"
14+
)
15+
16+
func TestListImages(t *testing.T) {
17+
client := newClient(t)
18+
19+
t.Logf("Id\tName\tOwner\tChecksum\tSizeBytes")
20+
21+
pager := images.List(client, nil)
22+
count, pages := 0, 0
23+
pager.EachPage(func(page pagination.Page) (bool, error) {
24+
pages++
25+
t.Logf("---")
26+
27+
images, err := images.ExtractImages(page)
28+
if err != nil {
29+
return false, err
30+
}
31+
32+
for _, i := range images {
33+
t.Logf("%s\t%s\t%s\t%s\t%v\t\n", i.ID, i.Name, i.Owner, i.Checksum, i.SizeBytes)
34+
count++
35+
}
36+
37+
return true, nil
38+
})
39+
40+
t.Logf("--------\n%d images listed on %d pages.\n", count, pages)
41+
}
42+
43+
func TestListImagesFilter(t *testing.T) {
44+
client := newClient(t)
45+
t.Logf("Id\tName\tOwner\tChecksum\tSizeBytes")
46+
47+
pager := images.List(client, images.ListOpts{Limit: 1})
48+
count, pages := 0, 0
49+
pager.EachPage(func(page pagination.Page) (bool, error) {
50+
pages++
51+
t.Logf("---")
52+
53+
images, err := images.ExtractImages(page)
54+
if err != nil {
55+
return false, err
56+
}
57+
58+
for _, i := range images {
59+
t.Logf("%s\t%s\t%s\t%s\t%v\t\n", i.ID, i.Name, i.Owner, i.Checksum, i.SizeBytes)
60+
count++
61+
}
62+
63+
return true, nil
64+
})
65+
66+
t.Logf("--------\n%d images listed on %d pages.\n", count, pages)
67+
68+
}
69+
70+
func TestCreateDeleteImage(t *testing.T) {
71+
client := newClient(t)
72+
imageName := tools.RandomString("ACCPT", 16)
73+
containerFormat := "ami"
74+
createResult := images.Create(client, images.CreateOpts{Name: &imageName,
75+
ContainerFormat: &containerFormat,
76+
DiskFormat: &containerFormat})
77+
78+
th.AssertNoErr(t, createResult.Err)
79+
image, err := createResult.Extract()
80+
th.AssertNoErr(t, err)
81+
82+
t.Logf("Image %v", image)
83+
84+
image, err = images.Get(client, image.ID).Extract()
85+
th.AssertNoErr(t, err)
86+
87+
th.AssertEquals(t, image.Status, images.ImageStatusQueued)
88+
89+
deleteResult := images.Delete(client, image.ID)
90+
th.AssertNoErr(t, deleteResult.Err)
91+
}
92+
93+
func TestUploadDownloadImage(t *testing.T) {
94+
client := newClient(t)
95+
96+
//creating image
97+
imageName := tools.RandomString("ACCPT", 16)
98+
containerFormat := "ami"
99+
createResult := images.Create(client, images.CreateOpts{Name: &imageName,
100+
ContainerFormat: &containerFormat,
101+
DiskFormat: &containerFormat})
102+
th.AssertNoErr(t, createResult.Err)
103+
image, err := createResult.Extract()
104+
th.AssertNoErr(t, err)
105+
t.Logf("Image %v", image)
106+
107+
//checking status
108+
image, err = images.Get(client, image.ID).Extract()
109+
th.AssertNoErr(t, err)
110+
th.AssertEquals(t, image.Status, images.ImageStatusQueued)
111+
112+
//uploading image data
113+
data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
114+
putImageResult := images.PutImageData(client, image.ID, bytes.NewReader(data))
115+
th.AssertNoErr(t, putImageResult.Err)
116+
117+
//checking status
118+
image, err = images.Get(client, image.ID).Extract()
119+
th.AssertNoErr(t, err)
120+
th.AssertEquals(t, image.Status, images.ImageStatusActive)
121+
th.AssertEquals(t, *image.SizeBytes, 9)
122+
123+
//downloading image data
124+
reader, err := images.GetImageData(client, image.ID).Extract()
125+
th.AssertNoErr(t, err)
126+
receivedData, err := ioutil.ReadAll(reader)
127+
t.Logf("Received data %v", receivedData)
128+
th.AssertNoErr(t, err)
129+
th.AssertByteArrayEquals(t, data, receivedData)
130+
131+
//deteting image
132+
deleteResult := images.Delete(client, image.ID)
133+
th.AssertNoErr(t, deleteResult.Err)
134+
135+
}
136+
137+
func TestUpdateImage(t *testing.T) {
138+
client := newClient(t)
139+
140+
//creating image
141+
imageName := tools.RandomString("ACCPT", 16)
142+
containerFormat := "ami"
143+
createResult := images.Create(client, images.CreateOpts{Name: &imageName,
144+
ContainerFormat: &containerFormat,
145+
DiskFormat: &containerFormat})
146+
th.AssertNoErr(t, createResult.Err)
147+
image, err := createResult.Extract()
148+
th.AssertNoErr(t, err)
149+
t.Logf("Image %v", image)
150+
151+
//checking status
152+
image, err = images.Get(client, image.ID).Extract()
153+
th.AssertNoErr(t, err)
154+
th.AssertEquals(t, image.Status, images.ImageStatusQueued)
155+
156+
t.Logf("Image tags %v", image.Tags)
157+
158+
tags := []string{"acceptance-testing"}
159+
updatedImage, err := images.Update(client, image.ID, images.UpdateOpts{
160+
images.ReplaceImageTags{
161+
NewTags: tags}}).Extract()
162+
th.AssertNoErr(t, err)
163+
t.Logf("Received tags '%v'", tags)
164+
th.AssertDeepEquals(t, updatedImage.Tags, tags)
165+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package v2

acceptance/openstack/orchestration/v1/buildinfo_test.go

Lines changed: 0 additions & 20 deletions
This file was deleted.

acceptance/openstack/orchestration/v1/images_test.go

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)