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

Commit

Permalink
Merge 362ad10 into f28452d
Browse files Browse the repository at this point in the history
  • Loading branch information
Samuel Ortiz committed Jun 21, 2016
2 parents f28452d + 362ad10 commit e2eba3b
Show file tree
Hide file tree
Showing 22 changed files with 2,591 additions and 33 deletions.
1 change: 1 addition & 0 deletions acceptance/openstack/imageservice/v2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Here be acceptance tests for the image service API.
86 changes: 86 additions & 0 deletions acceptance/openstack/imageservice/v2/common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// +build acceptance imageservice

package v2

import (
"bytes"
"os"
"testing"

"github.com/rackspace/gophercloud"
"github.com/rackspace/gophercloud/acceptance/tools"
"github.com/rackspace/gophercloud/openstack"
"github.com/rackspace/gophercloud/openstack/imageservice/v2/images"
th "github.com/rackspace/gophercloud/testhelper"
)

func newClient(t *testing.T) *gophercloud.ServiceClient {

authURL := os.Getenv("OS_AUTH_URL")
username := os.Getenv("OS_USERNAME")
password := os.Getenv("OS_PASSWORD")
tenantName := os.Getenv("OS_TENANT_NAME")
tenantID := os.Getenv("OS_TENANT_ID")
domainName := os.Getenv("OS_DOMAIN_NAME")
regionName := os.Getenv("OS_REGION_NAME")

t.Logf("Credentials used: OS_AUTH_URL='%s' OS_USERNAME='%s' OS_PASSWORD='*****' OS_TENANT_NAME='%s' OS_TENANT_NAME='%s' OS_REGION_NAME='%s' OS_TENANT_ID='%s' \n",
authURL, username, tenantName, domainName, regionName, tenantID)

client, err := openstack.NewClient(authURL)
th.AssertNoErr(t, err)

ao := gophercloud.AuthOptions{
Username: username,
Password: password,
TenantName: tenantName,
TenantID: tenantID,
DomainName: domainName,
}

err = openstack.AuthenticateV3(client, ao)
th.AssertNoErr(t, err)
t.Logf("Token is %v", client.TokenID)

c, err := openstack.NewImageServiceV2(client, gophercloud.EndpointOpts{
Region: regionName,
})
th.AssertNoErr(t, err)
return c
}

func createTestImage(t *testing.T, client *gophercloud.ServiceClient) images.Image {
//creating image
imageName := tools.RandomString("ACCPT", 16)
containerFormat := "ami"
createResult := images.Create(client, images.CreateOpts{Name: imageName,
ContainerFormat: containerFormat,
DiskFormat: containerFormat})
th.AssertNoErr(t, createResult.Err)
image, err := createResult.Extract()
th.AssertNoErr(t, err)
t.Logf("Image %v", image)

//checking status
image, err = images.Get(client, image.ID).Extract()
th.AssertNoErr(t, err)
th.AssertEquals(t, image.Status, images.ImageStatusQueued)

//uploading image data
data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
uploadResult := images.Upload(client, image.ID, bytes.NewReader(data))
th.AssertNoErr(t, uploadResult.Err)

//checking status
image, err = images.Get(client, image.ID).Extract()
th.AssertNoErr(t, err)
th.AssertEquals(t, image.Status, images.ImageStatusActive)
th.AssertEquals(t, image.SizeBytes, 9)
return *image
}

func deleteImage(t *testing.T, client *gophercloud.ServiceClient, image images.Image) {
//deteting image
deleteResult := images.Delete(client, image.ID)
th.AssertNoErr(t, deleteResult.Err)
}
152 changes: 152 additions & 0 deletions acceptance/openstack/imageservice/v2/imageservice_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
// +build acceptance imageservice

package v2

import (
"bytes"
"io/ioutil"
"testing"

"github.com/rackspace/gophercloud/acceptance/tools"
"github.com/rackspace/gophercloud/openstack/imageservice/v2/images"
"github.com/rackspace/gophercloud/pagination"
th "github.com/rackspace/gophercloud/testhelper"
)

func TestListImages(t *testing.T) {
client := newClient(t)

t.Logf("Id\tName\tOwner\tChecksum\tSizeBytes")

pager := images.List(client, nil)
count, pages := 0, 0
pager.EachPage(func(page pagination.Page) (bool, error) {
pages++
t.Logf("---")

images, err := images.ExtractImages(page)
if err != nil {
return false, err
}

for _, i := range images {
t.Logf("%s\t%s\t%s\t%s\t%v\t\n", i.ID, i.Name, i.Owner, i.Checksum, i.SizeBytes)
count++
}

return true, nil
})

t.Logf("--------\n%d images listed on %d pages.\n", count, pages)
}

func TestListImagesFilter(t *testing.T) {
client := newClient(t)
t.Logf("Id\tName\tOwner\tChecksum\tSizeBytes")

pager := images.List(client, images.ListOpts{Limit: 1})
count, pages := 0, 0
pager.EachPage(func(page pagination.Page) (bool, error) {
pages++
t.Logf("---")

images, err := images.ExtractImages(page)
if err != nil {
return false, err
}

for _, i := range images {
t.Logf("%s\t%s\t%s\t%s\t%v\t\n", i.ID, i.Name, i.Owner, i.Checksum, i.SizeBytes)
count++
}

return true, nil
})

t.Logf("--------\n%d images listed on %d pages.\n", count, pages)

}

func TestCreateDeleteImage(t *testing.T) {
client := newClient(t)
imageName := tools.RandomString("ACCPT", 16)
containerFormat := "ami"
createResult := images.Create(client, images.CreateOpts{Name: &imageName,
ContainerFormat: &containerFormat,
DiskFormat: &containerFormat})

th.AssertNoErr(t, createResult.Err)
image, err := createResult.Extract()
th.AssertNoErr(t, err)

t.Logf("Image %v", image)

image, err = images.Get(client, image.ID).Extract()
th.AssertNoErr(t, err)

th.AssertEquals(t, image.Status, images.ImageStatusQueued)

deleteResult := images.Delete(client, image.ID)
th.AssertNoErr(t, deleteResult.Err)
}

func TestUploadDownloadImage(t *testing.T) {
client := newClient(t)

//creating image
imageName := tools.RandomString("ACCPT", 16)
containerFormat := "ami"
createResult := images.Create(client, images.CreateOpts{Name: &imageName,
ContainerFormat: &containerFormat,
DiskFormat: &containerFormat})
th.AssertNoErr(t, createResult.Err)
image, err := createResult.Extract()
th.AssertNoErr(t, err)
t.Logf("Image %v", image)

//checking status
image, err = images.Get(client, image.ID).Extract()
th.AssertNoErr(t, err)
th.AssertEquals(t, image.Status, images.ImageStatusQueued)

//uploading image data
data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
putImageResult := images.PutImageData(client, image.ID, bytes.NewReader(data))
th.AssertNoErr(t, putImageResult.Err)

//checking status
image, err = images.Get(client, image.ID).Extract()
th.AssertNoErr(t, err)
th.AssertEquals(t, image.Status, images.ImageStatusActive)
th.AssertEquals(t, *image.SizeBytes, 9)

//downloading image data
reader, err := images.GetImageData(client, image.ID).Extract()
th.AssertNoErr(t, err)
receivedData, err := ioutil.ReadAll(reader)
t.Logf("Received data %v", receivedData)
th.AssertNoErr(t, err)
th.AssertByteArrayEquals(t, data, receivedData)

//deteting image
deleteResult := images.Delete(client, image.ID)
th.AssertNoErr(t, deleteResult.Err)

}

func TestUpdateImage(t *testing.T) {
client := newClient(t)

//creating image
image := createTestImage(t, client)

t.Logf("Image tags %v", image.Tags)

tags := []string{"acceptance-testing"}
updatedImage, err := images.Update(client, image.ID, images.UpdateOpts{
images.ReplaceImageTags{
NewTags: tags}}).Extract()
th.AssertNoErr(t, err)
t.Logf("Received tags '%v'", tags)
th.AssertDeepEquals(t, updatedImage.Tags, tags)
}
88 changes: 88 additions & 0 deletions acceptance/openstack/imageservice/v2/members_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// +build acceptance imageservice

package v2

import (
"os"
"testing"

members "github.com/rackspace/gophercloud/openstack/imageservice/v2/members"
th "github.com/rackspace/gophercloud/testhelper"
)

func TestImageMemberCreateListDelete(t *testing.T) {
client := newClient(t)

//creating image
image := createTestImage(t, client)
defer deleteImage(t, client, image)

//creating member
member, err := members.Create(client, image.ID, "tenant").Extract()
th.AssertNoErr(t, err)
th.AssertNotNil(t, member)

t.Logf("Member has been created for image %s", image.ID)

//listing member
var mems *[]members.ImageMember
mems, err = members.List(client, image.ID).Extract()
th.AssertNoErr(t, err)
th.AssertNotNil(t, mems)
th.AssertEquals(t, 1, len(*mems))

t.Logf("Members after adding one %v", mems)

//checking just created member
m := (*mems)[0]
th.AssertEquals(t, "pending", m.Status)
th.AssertEquals(t, "tenant", m.MemberID)

//deleting member
deleteResult := members.Delete(client, image.ID, "tenant")
th.AssertNoErr(t, deleteResult.Err)

//listing member
mems, err = members.List(client, image.ID).Extract()
th.AssertNoErr(t, err)
th.AssertNotNil(t, mems)
th.AssertEquals(t, 0, len(*mems))

t.Logf("Members after deleting one %v", mems)
}

func TestImageMemberDetailsAndUpdate(t *testing.T) {
// getting current tenant id
memberTenantID := os.Getenv("OS_TENANT_ID")
if memberTenantID == "" {
t.Fatalf("Please define OS_TENANT_ID for image member updating test was '%s'", memberTenantID)
}

client := newClient(t)

//creating image
image := createTestImage(t, client)
defer deleteImage(t, client, image)

//creating member
member, err := members.Create(client, image.ID, memberTenantID).Extract()
th.AssertNoErr(t, err)
th.AssertNotNil(t, member)

//checking image member details
member, err = members.Get(client, image.ID, memberTenantID).Extract()
th.AssertNoErr(t, err)
th.AssertNotNil(t, member)

th.AssertEquals(t, memberTenantID, member.MemberID)
th.AssertEquals(t, "pending", member.Status)

t.Logf("Updating image's %s member status for tenant %s to 'accepted' ", image.ID, memberTenantID)

//updating image
member, err = members.Update(client, image.ID, memberTenantID, "accepted").Extract()
th.AssertNoErr(t, err)
th.AssertNotNil(t, member)
th.AssertEquals(t, "accepted", member.Status)

}
1 change: 1 addition & 0 deletions acceptance/openstack/imageservice/v2/pkg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package v2
20 changes: 0 additions & 20 deletions acceptance/openstack/orchestration/v1/buildinfo_test.go

This file was deleted.

14 changes: 13 additions & 1 deletion openstack/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,9 @@ func NewOrchestrationV1(client *gophercloud.ProviderClient, eo gophercloud.Endpo
if err != nil {
return nil, err
}
return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
return &gophercloud.ServiceClient{ProviderClient: client,
Endpoint: url,
ResourceBase: url + "v2/"}, nil
}

// NewDBV1 creates a ServiceClient that may be used to access the v1 DB service.
Expand All @@ -344,3 +346,13 @@ func NewDBV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*
}
return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
}

// NewImageServiceV2 creates a ServiceClient that may be used to access the v2 image service.
func NewImageServiceV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
eo.ApplyDefaults("image")
url, err := client.EndpointLocator(eo)
if err != nil {
return nil, err
}
return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
}
1 change: 1 addition & 0 deletions openstack/imageservice/v2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This provides a Go API which wraps any service implementing the [OpenStack Image Service API, version 2](http://developer.openstack.org/api-ref-image-v2.html).

0 comments on commit e2eba3b

Please sign in to comment.