@@ -1,55 +0,0 @@
|
||||
// +build acceptance
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func TestBootFromVolume(t *testing.T) {
|
||||
client, err := newClient()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test that requires server creation in short mode.")
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
name := tools.RandomString("Gophercloud-", 8)
|
||||
t.Logf("Creating server [%s].", name)
|
||||
|
||||
bd := []bootfromvolume.BlockDevice{
|
||||
bootfromvolume.BlockDevice{
|
||||
UUID: choices.ImageID,
|
||||
SourceType: bootfromvolume.Image,
|
||||
VolumeSize: 10,
|
||||
},
|
||||
}
|
||||
|
||||
serverCreateOpts := servers.CreateOpts{
|
||||
Name: name,
|
||||
FlavorRef: choices.FlavorID,
|
||||
ImageRef: choices.ImageID,
|
||||
}
|
||||
server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
|
||||
serverCreateOpts,
|
||||
bd,
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Logf("Created server: %+v\n", server)
|
||||
defer servers.Delete(client, server.ID)
|
||||
t.Logf("Deleting server [%s]...", name)
|
||||
}
|
||||
104
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/compute_test.go
generated
vendored
104
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/compute_test.go
generated
vendored
@@ -1,104 +0,0 @@
|
||||
// +build acceptance common
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
)
|
||||
|
||||
func newClient() (*gophercloud.ServiceClient, error) {
|
||||
ao, err := openstack.AuthOptionsFromEnv()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
client, err := openstack.AuthenticatedClient(ao)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return openstack.NewComputeV2(client, gophercloud.EndpointOpts{
|
||||
Region: os.Getenv("OS_REGION_NAME"),
|
||||
})
|
||||
}
|
||||
|
||||
func waitForStatus(client *gophercloud.ServiceClient, server *servers.Server, status string) error {
|
||||
return tools.WaitFor(func() (bool, error) {
|
||||
latest, err := servers.Get(client, server.ID).Extract()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if latest.Status == status {
|
||||
// Success!
|
||||
return true, nil
|
||||
}
|
||||
|
||||
return false, nil
|
||||
})
|
||||
}
|
||||
|
||||
// ComputeChoices contains image and flavor selections for use by the acceptance tests.
|
||||
type ComputeChoices struct {
|
||||
// ImageID contains the ID of a valid image.
|
||||
ImageID string
|
||||
|
||||
// FlavorID contains the ID of a valid flavor.
|
||||
FlavorID string
|
||||
|
||||
// FlavorIDResize contains the ID of a different flavor available on the same OpenStack installation, that is distinct
|
||||
// from FlavorID.
|
||||
FlavorIDResize string
|
||||
|
||||
// NetworkName is the name of a network to launch the instance on.
|
||||
NetworkName string
|
||||
}
|
||||
|
||||
// ComputeChoicesFromEnv populates a ComputeChoices struct from environment variables.
|
||||
// If any required state is missing, an `error` will be returned that enumerates the missing properties.
|
||||
func ComputeChoicesFromEnv() (*ComputeChoices, error) {
|
||||
imageID := os.Getenv("OS_IMAGE_ID")
|
||||
flavorID := os.Getenv("OS_FLAVOR_ID")
|
||||
flavorIDResize := os.Getenv("OS_FLAVOR_ID_RESIZE")
|
||||
networkName := os.Getenv("OS_NETWORK_NAME")
|
||||
|
||||
missing := make([]string, 0, 3)
|
||||
if imageID == "" {
|
||||
missing = append(missing, "OS_IMAGE_ID")
|
||||
}
|
||||
if flavorID == "" {
|
||||
missing = append(missing, "OS_FLAVOR_ID")
|
||||
}
|
||||
if flavorIDResize == "" {
|
||||
missing = append(missing, "OS_FLAVOR_ID_RESIZE")
|
||||
}
|
||||
if networkName == "" {
|
||||
networkName = "public"
|
||||
}
|
||||
|
||||
notDistinct := ""
|
||||
if flavorID == flavorIDResize {
|
||||
notDistinct = "OS_FLAVOR_ID and OS_FLAVOR_ID_RESIZE must be distinct."
|
||||
}
|
||||
|
||||
if len(missing) > 0 || notDistinct != "" {
|
||||
text := "You're missing some important setup:\n"
|
||||
if len(missing) > 0 {
|
||||
text += " * These environment variables must be provided: " + strings.Join(missing, ", ") + "\n"
|
||||
}
|
||||
if notDistinct != "" {
|
||||
text += " * " + notDistinct + "\n"
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf(text)
|
||||
}
|
||||
|
||||
return &ComputeChoices{ImageID: imageID, FlavorID: flavorID, FlavorIDResize: flavorIDResize, NetworkName: networkName}, nil
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
// +build acceptance compute extensionss
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions"
|
||||
"github.com/rackspace/gophercloud/pagination"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func TestListExtensions(t *testing.T) {
|
||||
client, err := newClient()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
err = extensions.List(client).EachPage(func(page pagination.Page) (bool, error) {
|
||||
t.Logf("--- Page ---")
|
||||
|
||||
exts, err := extensions.ExtractExtensions(page)
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
for i, ext := range exts {
|
||||
t.Logf("[%02d] name=[%s]\n", i, ext.Name)
|
||||
t.Logf(" alias=[%s]\n", ext.Alias)
|
||||
t.Logf(" description=[%s]\n", ext.Description)
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
th.AssertNoErr(t, err)
|
||||
}
|
||||
|
||||
func TestGetExtension(t *testing.T) {
|
||||
client, err := newClient()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
ext, err := extensions.Get(client, "os-admin-actions").Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Extension details:")
|
||||
t.Logf(" name=[%s]\n", ext.Name)
|
||||
t.Logf(" namespace=[%s]\n", ext.Namespace)
|
||||
t.Logf(" alias=[%s]\n", ext.Alias)
|
||||
t.Logf(" description=[%s]\n", ext.Description)
|
||||
t.Logf(" updated=[%s]\n", ext.Updated)
|
||||
}
|
||||
57
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/flavors_test.go
generated
vendored
57
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/flavors_test.go
generated
vendored
@@ -1,57 +0,0 @@
|
||||
// +build acceptance compute flavors
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
|
||||
"github.com/rackspace/gophercloud/pagination"
|
||||
)
|
||||
|
||||
func TestListFlavors(t *testing.T) {
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("ID\tRegion\tName\tStatus\tCreated")
|
||||
|
||||
pager := flavors.ListDetail(client, nil)
|
||||
count, pages := 0, 0
|
||||
pager.EachPage(func(page pagination.Page) (bool, error) {
|
||||
t.Logf("---")
|
||||
pages++
|
||||
flavors, err := flavors.ExtractFlavors(page)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
for _, f := range flavors {
|
||||
t.Logf("%s\t%s\t%d\t%d\t%d", f.ID, f.Name, f.RAM, f.Disk, f.VCPUs)
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
|
||||
t.Logf("--------\n%d flavors listed on %d pages.", count, pages)
|
||||
}
|
||||
|
||||
func TestGetFlavor(t *testing.T) {
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
flavor, err := flavors.Get(client, choices.FlavorID).Extract()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to get flavor information: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("Flavor: %#v", flavor)
|
||||
}
|
||||
107
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/floatingip_test.go
generated
vendored
107
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/floatingip_test.go
generated
vendored
@@ -1,107 +0,0 @@
|
||||
// +build acceptance compute servers
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func createFIPServer(t *testing.T, client *gophercloud.ServiceClient, choices *ComputeChoices) (*servers.Server, error) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test that requires server creation in short mode.")
|
||||
}
|
||||
|
||||
name := tools.RandomString("ACPTTEST", 16)
|
||||
t.Logf("Attempting to create server: %s\n", name)
|
||||
|
||||
pwd := tools.MakeNewPassword("")
|
||||
|
||||
server, err := servers.Create(client, servers.CreateOpts{
|
||||
Name: name,
|
||||
FlavorRef: choices.FlavorID,
|
||||
ImageRef: choices.ImageID,
|
||||
AdminPass: pwd,
|
||||
}).Extract()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
|
||||
th.AssertEquals(t, pwd, server.AdminPass)
|
||||
|
||||
return server, err
|
||||
}
|
||||
|
||||
func createFloatingIP(t *testing.T, client *gophercloud.ServiceClient) (*floatingip.FloatingIP, error) {
|
||||
pool := os.Getenv("OS_POOL_NAME")
|
||||
fip, err := floatingip.Create(client, &floatingip.CreateOpts{
|
||||
Pool: pool,
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Obtained Floating IP: %v", fip.IP)
|
||||
|
||||
return fip, err
|
||||
}
|
||||
|
||||
func associateFloatingIP(t *testing.T, client *gophercloud.ServiceClient, serverId string, fip *floatingip.FloatingIP) {
|
||||
err := floatingip.Associate(client, serverId, fip.IP).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Associated floating IP %v from instance %v", fip.IP, serverId)
|
||||
defer func() {
|
||||
err = floatingip.Disassociate(client, serverId, fip.IP).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Disassociated floating IP %v from instance %v", fip.IP, serverId)
|
||||
}()
|
||||
floatingIp, err := floatingip.Get(client, fip.ID).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Floating IP %v is associated with Fixed IP %v", fip.IP, floatingIp.FixedIP)
|
||||
}
|
||||
|
||||
func TestFloatingIP(t *testing.T) {
|
||||
pool := os.Getenv("OS_POOL_NAME")
|
||||
if pool == "" {
|
||||
t.Fatalf("OS_POOL_NAME must be set")
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
server, err := createFIPServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
servers.Delete(client, server.ID)
|
||||
t.Logf("Server deleted.")
|
||||
}()
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatalf("Unable to wait for server: %v", err)
|
||||
}
|
||||
|
||||
fip, err := createFloatingIP(t, client)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create floating IP: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
err = floatingip.Delete(client, fip.ID).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Floating IP deleted.")
|
||||
}()
|
||||
|
||||
associateFloatingIP(t, client, server.ID, fip)
|
||||
|
||||
}
|
||||
37
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/images_test.go
generated
vendored
37
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/images_test.go
generated
vendored
@@ -1,37 +0,0 @@
|
||||
// +build acceptance compute images
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/images"
|
||||
"github.com/rackspace/gophercloud/pagination"
|
||||
)
|
||||
|
||||
func TestListImages(t *testing.T) {
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute: client: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("ID\tRegion\tName\tStatus\tCreated")
|
||||
|
||||
pager := images.ListDetail(client, nil)
|
||||
count, pages := 0, 0
|
||||
pager.EachPage(func(page pagination.Page) (bool, error) {
|
||||
pages++
|
||||
images, err := images.ExtractImages(page)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
for _, i := range images {
|
||||
t.Logf("%s\t%s\t%s\t%s", i.ID, i.Name, i.Status, i.Created)
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
|
||||
t.Logf("--------\n%d images listed on %d pages.", count, pages)
|
||||
}
|
||||
74
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/keypairs_test.go
generated
vendored
74
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/keypairs_test.go
generated
vendored
@@ -1,74 +0,0 @@
|
||||
// +build acceptance
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/keypairs"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
|
||||
"code.google.com/p/go.crypto/ssh"
|
||||
)
|
||||
|
||||
const keyName = "gophercloud_test_key_pair"
|
||||
|
||||
func TestCreateServerWithKeyPair(t *testing.T) {
|
||||
client, err := newClient()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test that requires server creation in short mode.")
|
||||
}
|
||||
|
||||
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||
publicKey := privateKey.PublicKey
|
||||
pub, err := ssh.NewPublicKey(&publicKey)
|
||||
th.AssertNoErr(t, err)
|
||||
pubBytes := ssh.MarshalAuthorizedKey(pub)
|
||||
pk := string(pubBytes)
|
||||
|
||||
kp, err := keypairs.Create(client, keypairs.CreateOpts{
|
||||
Name: keyName,
|
||||
PublicKey: pk,
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Created key pair: %s\n", kp)
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
name := tools.RandomString("Gophercloud-", 8)
|
||||
t.Logf("Creating server [%s] with key pair.", name)
|
||||
|
||||
serverCreateOpts := servers.CreateOpts{
|
||||
Name: name,
|
||||
FlavorRef: choices.FlavorID,
|
||||
ImageRef: choices.ImageID,
|
||||
}
|
||||
|
||||
server, err := servers.Create(client, keypairs.CreateOptsExt{
|
||||
serverCreateOpts,
|
||||
keyName,
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
defer servers.Delete(client, server.ID)
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatalf("Unable to wait for server: %v", err)
|
||||
}
|
||||
|
||||
server, err = servers.Get(client, server.ID).Extract()
|
||||
t.Logf("Created server: %+v\n", server)
|
||||
th.AssertNoErr(t, err)
|
||||
th.AssertEquals(t, server.KeyName, keyName)
|
||||
|
||||
t.Logf("Deleting key pair [%s]...", kp.Name)
|
||||
err = keypairs.Delete(client, keyName).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Deleting server [%s]...", name)
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
// +build acceptance compute defsecrules
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
dsr "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/defsecrules"
|
||||
"github.com/rackspace/gophercloud/pagination"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func TestSecDefRules(t *testing.T) {
|
||||
client, err := newClient()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
id := createDefRule(t, client)
|
||||
|
||||
listDefRules(t, client)
|
||||
|
||||
getDefRule(t, client, id)
|
||||
|
||||
deleteDefRule(t, client, id)
|
||||
}
|
||||
|
||||
func createDefRule(t *testing.T, client *gophercloud.ServiceClient) string {
|
||||
opts := dsr.CreateOpts{
|
||||
FromPort: tools.RandomInt(80, 89),
|
||||
ToPort: tools.RandomInt(90, 99),
|
||||
IPProtocol: "TCP",
|
||||
CIDR: "0.0.0.0/0",
|
||||
}
|
||||
|
||||
rule, err := dsr.Create(client, opts).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Created default rule %s", rule.ID)
|
||||
|
||||
return rule.ID
|
||||
}
|
||||
|
||||
func listDefRules(t *testing.T, client *gophercloud.ServiceClient) {
|
||||
err := dsr.List(client).EachPage(func(page pagination.Page) (bool, error) {
|
||||
drList, err := dsr.ExtractDefaultRules(page)
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
for _, dr := range drList {
|
||||
t.Logf("Listing default rule %s: Name [%s] From Port [%s] To Port [%s] Protocol [%s]",
|
||||
dr.ID, dr.FromPort, dr.ToPort, dr.IPProtocol)
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
|
||||
th.AssertNoErr(t, err)
|
||||
}
|
||||
|
||||
func getDefRule(t *testing.T, client *gophercloud.ServiceClient, id string) {
|
||||
rule, err := dsr.Get(client, id).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Getting rule %s: %#v", id, rule)
|
||||
}
|
||||
|
||||
func deleteDefRule(t *testing.T, client *gophercloud.ServiceClient, id string) {
|
||||
err := dsr.Delete(client, id).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Deleted rule %s", id)
|
||||
}
|
||||
177
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/secgroup_test.go
generated
vendored
177
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/secgroup_test.go
generated
vendored
@@ -1,177 +0,0 @@
|
||||
// +build acceptance compute secgroups
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/secgroups"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
"github.com/rackspace/gophercloud/pagination"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func TestSecGroups(t *testing.T) {
|
||||
client, err := newClient()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
serverID, needsDeletion := findServer(t, client)
|
||||
|
||||
groupID := createSecGroup(t, client)
|
||||
|
||||
listSecGroups(t, client)
|
||||
|
||||
newName := tools.RandomString("secgroup_", 5)
|
||||
updateSecGroup(t, client, groupID, newName)
|
||||
|
||||
getSecGroup(t, client, groupID)
|
||||
|
||||
addRemoveRules(t, client, groupID)
|
||||
|
||||
addServerToSecGroup(t, client, serverID, newName)
|
||||
|
||||
removeServerFromSecGroup(t, client, serverID, newName)
|
||||
|
||||
if needsDeletion {
|
||||
servers.Delete(client, serverID)
|
||||
}
|
||||
|
||||
deleteSecGroup(t, client, groupID)
|
||||
}
|
||||
|
||||
func createSecGroup(t *testing.T, client *gophercloud.ServiceClient) string {
|
||||
opts := secgroups.CreateOpts{
|
||||
Name: tools.RandomString("secgroup_", 5),
|
||||
Description: "something",
|
||||
}
|
||||
|
||||
group, err := secgroups.Create(client, opts).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Created secgroup %s %s", group.ID, group.Name)
|
||||
|
||||
return group.ID
|
||||
}
|
||||
|
||||
func listSecGroups(t *testing.T, client *gophercloud.ServiceClient) {
|
||||
err := secgroups.List(client).EachPage(func(page pagination.Page) (bool, error) {
|
||||
secGrpList, err := secgroups.ExtractSecurityGroups(page)
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
for _, sg := range secGrpList {
|
||||
t.Logf("Listing secgroup %s: Name [%s] Desc [%s] TenantID [%s]", sg.ID,
|
||||
sg.Name, sg.Description, sg.TenantID)
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
|
||||
th.AssertNoErr(t, err)
|
||||
}
|
||||
|
||||
func updateSecGroup(t *testing.T, client *gophercloud.ServiceClient, id, newName string) {
|
||||
opts := secgroups.UpdateOpts{
|
||||
Name: newName,
|
||||
Description: tools.RandomString("dec_", 10),
|
||||
}
|
||||
group, err := secgroups.Update(client, id, opts).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Updated %s's name to %s", group.ID, group.Name)
|
||||
}
|
||||
|
||||
func getSecGroup(t *testing.T, client *gophercloud.ServiceClient, id string) {
|
||||
group, err := secgroups.Get(client, id).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Getting %s: %#v", id, group)
|
||||
}
|
||||
|
||||
func addRemoveRules(t *testing.T, client *gophercloud.ServiceClient, id string) {
|
||||
opts := secgroups.CreateRuleOpts{
|
||||
ParentGroupID: id,
|
||||
FromPort: 22,
|
||||
ToPort: 22,
|
||||
IPProtocol: "TCP",
|
||||
CIDR: "0.0.0.0/0",
|
||||
}
|
||||
|
||||
rule, err := secgroups.CreateRule(client, opts).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Adding rule %s to group %s", rule.ID, id)
|
||||
|
||||
err = secgroups.DeleteRule(client, rule.ID).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Deleted rule %s from group %s", rule.ID, id)
|
||||
}
|
||||
|
||||
func findServer(t *testing.T, client *gophercloud.ServiceClient) (string, bool) {
|
||||
var serverID string
|
||||
var needsDeletion bool
|
||||
|
||||
err := servers.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||
sList, err := servers.ExtractServers(page)
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
for _, s := range sList {
|
||||
serverID = s.ID
|
||||
needsDeletion = false
|
||||
|
||||
t.Logf("Found an existing server: ID [%s]", serverID)
|
||||
break
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
if serverID == "" {
|
||||
t.Log("No server found, creating one")
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
opts := &servers.CreateOpts{
|
||||
Name: tools.RandomString("secgroup_test_", 5),
|
||||
ImageRef: choices.ImageID,
|
||||
FlavorRef: choices.FlavorID,
|
||||
}
|
||||
|
||||
s, err := servers.Create(client, opts).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
serverID = s.ID
|
||||
|
||||
t.Logf("Created server %s, waiting for it to build", s.ID)
|
||||
err = servers.WaitForStatus(client, serverID, "ACTIVE", 300)
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
needsDeletion = true
|
||||
}
|
||||
|
||||
return serverID, needsDeletion
|
||||
}
|
||||
|
||||
func addServerToSecGroup(t *testing.T, client *gophercloud.ServiceClient, serverID, groupName string) {
|
||||
err := secgroups.AddServerToGroup(client, serverID, groupName).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Adding group %s to server %s", groupName, serverID)
|
||||
}
|
||||
|
||||
func removeServerFromSecGroup(t *testing.T, client *gophercloud.ServiceClient, serverID, groupName string) {
|
||||
err := secgroups.RemoveServerFromGroup(client, serverID, groupName).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Removing group %s from server %s", groupName, serverID)
|
||||
}
|
||||
|
||||
func deleteSecGroup(t *testing.T, client *gophercloud.ServiceClient, id string) {
|
||||
err := secgroups.Delete(client, id).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
t.Logf("Deleted group %s", id)
|
||||
}
|
||||
478
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/servers_test.go
generated
vendored
478
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/servers_test.go
generated
vendored
@@ -1,478 +0,0 @@
|
||||
// +build acceptance compute servers
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
"github.com/rackspace/gophercloud/openstack/networking/v2/networks"
|
||||
"github.com/rackspace/gophercloud/pagination"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func TestListServers(t *testing.T) {
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("ID\tRegion\tName\tStatus\tIPv4\tIPv6")
|
||||
|
||||
pager := servers.List(client, servers.ListOpts{})
|
||||
count, pages := 0, 0
|
||||
pager.EachPage(func(page pagination.Page) (bool, error) {
|
||||
pages++
|
||||
t.Logf("---")
|
||||
|
||||
servers, err := servers.ExtractServers(page)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
for _, s := range servers {
|
||||
t.Logf("%s\t%s\t%s\t%s\t%s\t\n", s.ID, s.Name, s.Status, s.AccessIPv4, s.AccessIPv6)
|
||||
count++
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
|
||||
t.Logf("--------\n%d servers listed on %d pages.\n", count, pages)
|
||||
}
|
||||
|
||||
func networkingClient() (*gophercloud.ServiceClient, error) {
|
||||
opts, err := openstack.AuthOptionsFromEnv()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
provider, err := openstack.AuthenticatedClient(opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return openstack.NewNetworkV2(provider, gophercloud.EndpointOpts{
|
||||
Region: os.Getenv("OS_REGION_NAME"),
|
||||
})
|
||||
}
|
||||
|
||||
func createServer(t *testing.T, client *gophercloud.ServiceClient, choices *ComputeChoices) (*servers.Server, error) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test that requires server creation in short mode.")
|
||||
}
|
||||
|
||||
var network networks.Network
|
||||
|
||||
networkingClient, err := networkingClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a networking client: %v", err)
|
||||
}
|
||||
|
||||
pager := networks.List(networkingClient, networks.ListOpts{
|
||||
Name: choices.NetworkName,
|
||||
Limit: 1,
|
||||
})
|
||||
pager.EachPage(func(page pagination.Page) (bool, error) {
|
||||
networks, err := networks.ExtractNetworks(page)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to extract networks: %v", err)
|
||||
return false, err
|
||||
}
|
||||
|
||||
if len(networks) == 0 {
|
||||
t.Fatalf("No networks to attach to server")
|
||||
return false, err
|
||||
}
|
||||
|
||||
network = networks[0]
|
||||
|
||||
return false, nil
|
||||
})
|
||||
|
||||
name := tools.RandomString("ACPTTEST", 16)
|
||||
t.Logf("Attempting to create server: %s\n", name)
|
||||
|
||||
pwd := tools.MakeNewPassword("")
|
||||
|
||||
server, err := servers.Create(client, servers.CreateOpts{
|
||||
Name: name,
|
||||
FlavorRef: choices.FlavorID,
|
||||
ImageRef: choices.ImageID,
|
||||
Networks: []servers.Network{
|
||||
servers.Network{UUID: network.ID},
|
||||
},
|
||||
AdminPass: pwd,
|
||||
}).Extract()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
|
||||
th.AssertEquals(t, pwd, server.AdminPass)
|
||||
|
||||
return server, err
|
||||
}
|
||||
|
||||
func TestCreateDestroyServer(t *testing.T) {
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
servers.Delete(client, server.ID)
|
||||
t.Logf("Server deleted.")
|
||||
}()
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatalf("Unable to wait for server: %v", err)
|
||||
}
|
||||
|
||||
pager := servers.ListAddresses(client, server.ID)
|
||||
pager.EachPage(func(page pagination.Page) (bool, error) {
|
||||
networks, err := servers.ExtractAddresses(page)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
for n, a := range networks {
|
||||
t.Logf("%s: %+v\n", n, a)
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
|
||||
pager = servers.ListAddressesByNetwork(client, server.ID, choices.NetworkName)
|
||||
pager.EachPage(func(page pagination.Page) (bool, error) {
|
||||
addresses, err := servers.ExtractNetworkAddresses(page)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
for _, a := range addresses {
|
||||
t.Logf("%+v\n", a)
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
}
|
||||
|
||||
func TestUpdateServer(t *testing.T) {
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
alternateName := tools.RandomString("ACPTTEST", 16)
|
||||
for alternateName == server.Name {
|
||||
alternateName = tools.RandomString("ACPTTEST", 16)
|
||||
}
|
||||
|
||||
t.Logf("Attempting to rename the server to %s.", alternateName)
|
||||
|
||||
updated, err := servers.Update(client, server.ID, servers.UpdateOpts{Name: alternateName}).Extract()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to rename server: %v", err)
|
||||
}
|
||||
|
||||
if updated.ID != server.ID {
|
||||
t.Errorf("Updated server ID [%s] didn't match original server ID [%s]!", updated.ID, server.ID)
|
||||
}
|
||||
|
||||
err = tools.WaitFor(func() (bool, error) {
|
||||
latest, err := servers.Get(client, updated.ID).Extract()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return latest.Name == alternateName, nil
|
||||
})
|
||||
}
|
||||
|
||||
func TestActionChangeAdminPassword(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
randomPassword := tools.MakeNewPassword(server.AdminPass)
|
||||
res := servers.ChangeAdminPassword(client, server.ID, randomPassword)
|
||||
if res.Err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, server, "PASSWORD"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestActionReboot(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
res := servers.Reboot(client, server.ID, "aldhjflaskhjf")
|
||||
if res.Err == nil {
|
||||
t.Fatal("Expected the SDK to provide an ArgumentError here")
|
||||
}
|
||||
|
||||
t.Logf("Attempting reboot of server %s", server.ID)
|
||||
res = servers.Reboot(client, server.ID, servers.OSReboot)
|
||||
if res.Err != nil {
|
||||
t.Fatalf("Unable to reboot server: %v", err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, server, "REBOOT"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestActionRebuild(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Logf("Attempting to rebuild server %s", server.ID)
|
||||
|
||||
rebuildOpts := servers.RebuildOpts{
|
||||
Name: tools.RandomString("ACPTTEST", 16),
|
||||
AdminPass: tools.MakeNewPassword(server.AdminPass),
|
||||
ImageID: choices.ImageID,
|
||||
}
|
||||
|
||||
rebuilt, err := servers.Rebuild(client, server.ID, rebuildOpts).Extract()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if rebuilt.ID != server.ID {
|
||||
t.Errorf("Expected rebuilt server ID of [%s]; got [%s]", server.ID, rebuilt.ID)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, rebuilt, "REBUILD"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, rebuilt, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func resizeServer(t *testing.T, client *gophercloud.ServiceClient, server *servers.Server, choices *ComputeChoices) {
|
||||
if err := waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Logf("Attempting to resize server [%s]", server.ID)
|
||||
|
||||
opts := &servers.ResizeOpts{
|
||||
FlavorRef: choices.FlavorIDResize,
|
||||
}
|
||||
if res := servers.Resize(client, server.ID, opts); res.Err != nil {
|
||||
t.Fatal(res.Err)
|
||||
}
|
||||
|
||||
if err := waitForStatus(client, server, "VERIFY_RESIZE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestActionResizeConfirm(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
resizeServer(t, client, server, choices)
|
||||
|
||||
t.Logf("Attempting to confirm resize for server %s", server.ID)
|
||||
|
||||
if res := servers.ConfirmResize(client, server.ID); res.Err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestActionResizeRevert(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
resizeServer(t, client, server, choices)
|
||||
|
||||
t.Logf("Attempting to revert resize for server %s", server.ID)
|
||||
|
||||
if res := servers.RevertResize(client, server.ID); res.Err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestServerMetadata(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
server, err := createServer(t, client, choices)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer servers.Delete(client, server.ID)
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
metadata, err := servers.UpdateMetadata(client, server.ID, servers.MetadataOpts{
|
||||
"foo": "bar",
|
||||
"this": "that",
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("UpdateMetadata result: %+v\n", metadata)
|
||||
|
||||
err = servers.DeleteMetadatum(client, server.ID, "foo").ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
metadata, err = servers.CreateMetadatum(client, server.ID, servers.MetadatumOpts{
|
||||
"foo": "baz",
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("CreateMetadatum result: %+v\n", metadata)
|
||||
|
||||
metadata, err = servers.Metadatum(client, server.ID, "foo").Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Metadatum result: %+v\n", metadata)
|
||||
th.AssertEquals(t, "baz", metadata["foo"])
|
||||
|
||||
metadata, err = servers.Metadata(client, server.ID).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Metadata result: %+v\n", metadata)
|
||||
|
||||
metadata, err = servers.ResetMetadata(client, server.ID, servers.MetadataOpts{}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("ResetMetadata result: %+v\n", metadata)
|
||||
th.AssertDeepEquals(t, map[string]string{}, metadata)
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
// +build acceptance compute servers
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/tenantnetworks"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func getNetworkID(t *testing.T, client *gophercloud.ServiceClient, networkName string) (string, error) {
|
||||
allPages, err := tenantnetworks.List(client).AllPages()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to list networks: %v", err)
|
||||
}
|
||||
|
||||
networkList, err := tenantnetworks.ExtractNetworks(allPages)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to list networks: %v", err)
|
||||
}
|
||||
|
||||
networkID := ""
|
||||
for _, network := range networkList {
|
||||
t.Logf("Network: %v", network)
|
||||
if network.Name == networkName {
|
||||
networkID = network.ID
|
||||
}
|
||||
}
|
||||
|
||||
t.Logf("Found network ID for %s: %s\n", networkName, networkID)
|
||||
|
||||
return networkID, nil
|
||||
}
|
||||
|
||||
func createNetworkServer(t *testing.T, client *gophercloud.ServiceClient, choices *ComputeChoices, networkID string) (*servers.Server, error) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test that requires server creation in short mode.")
|
||||
}
|
||||
|
||||
name := tools.RandomString("ACPTTEST", 16)
|
||||
t.Logf("Attempting to create server: %s\n", name)
|
||||
|
||||
pwd := tools.MakeNewPassword("")
|
||||
|
||||
networks := make([]servers.Network, 1)
|
||||
networks[0] = servers.Network{
|
||||
UUID: networkID,
|
||||
}
|
||||
|
||||
server, err := servers.Create(client, servers.CreateOpts{
|
||||
Name: name,
|
||||
FlavorRef: choices.FlavorID,
|
||||
ImageRef: choices.ImageID,
|
||||
AdminPass: pwd,
|
||||
Networks: networks,
|
||||
}).Extract()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
|
||||
th.AssertEquals(t, pwd, server.AdminPass)
|
||||
|
||||
return server, err
|
||||
}
|
||||
|
||||
func TestTenantNetworks(t *testing.T) {
|
||||
networkName := os.Getenv("OS_NETWORK_NAME")
|
||||
if networkName == "" {
|
||||
t.Fatalf("OS_NETWORK_NAME must be set")
|
||||
}
|
||||
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
client, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
networkID, err := getNetworkID(t, client, networkName)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to get network ID: %v", err)
|
||||
}
|
||||
|
||||
server, err := createNetworkServer(t, client, choices, networkID)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
servers.Delete(client, server.ID)
|
||||
t.Logf("Server deleted.")
|
||||
}()
|
||||
|
||||
if err = waitForStatus(client, server, "ACTIVE"); err != nil {
|
||||
t.Fatalf("Unable to wait for server: %v", err)
|
||||
}
|
||||
|
||||
allPages, err := tenantnetworks.List(client).AllPages()
|
||||
allNetworks, err := tenantnetworks.ExtractNetworks(allPages)
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Retrieved all %d networks: %+v", len(allNetworks), allNetworks)
|
||||
}
|
||||
125
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/volumeattach_test.go
generated
vendored
125
vendor/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/volumeattach_test.go
generated
vendored
@@ -1,125 +0,0 @@
|
||||
// +build acceptance compute servers
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/rackspace/gophercloud"
|
||||
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||
"github.com/rackspace/gophercloud/openstack"
|
||||
"github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach"
|
||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||
th "github.com/rackspace/gophercloud/testhelper"
|
||||
)
|
||||
|
||||
func newBlockClient(t *testing.T) (*gophercloud.ServiceClient, error) {
|
||||
ao, err := openstack.AuthOptionsFromEnv()
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
client, err := openstack.AuthenticatedClient(ao)
|
||||
th.AssertNoErr(t, err)
|
||||
|
||||
return openstack.NewBlockStorageV1(client, gophercloud.EndpointOpts{
|
||||
Region: os.Getenv("OS_REGION_NAME"),
|
||||
})
|
||||
}
|
||||
|
||||
func createVAServer(t *testing.T, computeClient *gophercloud.ServiceClient, choices *ComputeChoices) (*servers.Server, error) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test that requires server creation in short mode.")
|
||||
}
|
||||
|
||||
name := tools.RandomString("ACPTTEST", 16)
|
||||
t.Logf("Attempting to create server: %s\n", name)
|
||||
|
||||
pwd := tools.MakeNewPassword("")
|
||||
|
||||
server, err := servers.Create(computeClient, servers.CreateOpts{
|
||||
Name: name,
|
||||
FlavorRef: choices.FlavorID,
|
||||
ImageRef: choices.ImageID,
|
||||
AdminPass: pwd,
|
||||
}).Extract()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
|
||||
th.AssertEquals(t, pwd, server.AdminPass)
|
||||
|
||||
return server, err
|
||||
}
|
||||
|
||||
func createVAVolume(t *testing.T, blockClient *gophercloud.ServiceClient) (*volumes.Volume, error) {
|
||||
volume, err := volumes.Create(blockClient, &volumes.CreateOpts{
|
||||
Size: 1,
|
||||
Name: "gophercloud-test-volume",
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
defer func() {
|
||||
err = volumes.WaitForStatus(blockClient, volume.ID, "available", 60)
|
||||
th.AssertNoErr(t, err)
|
||||
}()
|
||||
|
||||
return volume, err
|
||||
}
|
||||
|
||||
func createVolumeAttachment(t *testing.T, computeClient *gophercloud.ServiceClient, blockClient *gophercloud.ServiceClient, serverId string, volumeId string) {
|
||||
va, err := volumeattach.Create(computeClient, serverId, &volumeattach.CreateOpts{
|
||||
VolumeID: volumeId,
|
||||
}).Extract()
|
||||
th.AssertNoErr(t, err)
|
||||
defer func() {
|
||||
err = volumes.WaitForStatus(blockClient, volumeId, "in-use", 60)
|
||||
th.AssertNoErr(t, err)
|
||||
err = volumeattach.Delete(computeClient, serverId, va.ID).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
err = volumes.WaitForStatus(blockClient, volumeId, "available", 60)
|
||||
th.AssertNoErr(t, err)
|
||||
}()
|
||||
}
|
||||
|
||||
func TestAttachVolume(t *testing.T) {
|
||||
choices, err := ComputeChoicesFromEnv()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
computeClient, err := newClient()
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a compute client: %v", err)
|
||||
}
|
||||
|
||||
blockClient, err := newBlockClient(t)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create a blockstorage client: %v", err)
|
||||
}
|
||||
|
||||
server, err := createVAServer(t, computeClient, choices)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create server: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
servers.Delete(computeClient, server.ID)
|
||||
t.Logf("Server deleted.")
|
||||
}()
|
||||
|
||||
if err = waitForStatus(computeClient, server, "ACTIVE"); err != nil {
|
||||
t.Fatalf("Unable to wait for server: %v", err)
|
||||
}
|
||||
|
||||
volume, err := createVAVolume(t, blockClient)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to create volume: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
err = volumes.Delete(blockClient, volume.ID).ExtractErr()
|
||||
th.AssertNoErr(t, err)
|
||||
t.Logf("Volume deleted.")
|
||||
}()
|
||||
|
||||
createVolumeAttachment(t, computeClient, blockClient, server.ID, volume.ID)
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user