Merge pull request #4939 from kazegusuri/update_gophercloud
Update github.com/rackspace/gophercloud to HEAD
This commit is contained in:
4
Godeps/Godeps.json
generated
4
Godeps/Godeps.json
generated
@@ -234,8 +234,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/rackspace/gophercloud",
|
"ImportPath": "github.com/rackspace/gophercloud",
|
||||||
"Comment": "v1.0.0-336-g2a6e319",
|
"Comment": "v1.0.0-490-g32d0a89",
|
||||||
"Rev": "2a6e3190447abe5d000f951595ead1cf98df72d8"
|
"Rev": "32d0a893a8ef70abe76dc5153e2925b39cbea7f7"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/russross/blackfriday",
|
"ImportPath": "github.com/russross/blackfriday",
|
||||||
|
1
Godeps/_workspace/src/github.com/rackspace/gophercloud/CONTRIBUTORS.md
generated
vendored
1
Godeps/_workspace/src/github.com/rackspace/gophercloud/CONTRIBUTORS.md
generated
vendored
@@ -10,3 +10,4 @@ Contributors
|
|||||||
| Ash Wilson | <ash.wilson@rackspace.com>
|
| Ash Wilson | <ash.wilson@rackspace.com>
|
||||||
| Jamie Hannaford | <jamie.hannaford@rackspace.com>
|
| Jamie Hannaford | <jamie.hannaford@rackspace.com>
|
||||||
| Don Schenck | don.schenck@rackspace.com>
|
| Don Schenck | don.schenck@rackspace.com>
|
||||||
|
| Joe Topjian | <joe@topjian.net>
|
||||||
|
107
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/floatingip_test.go
generated
vendored
Normal file
107
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/floatingip_test.go
generated
vendored
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
// +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)
|
||||||
|
|
||||||
|
}
|
125
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/volumeattach_test.go
generated
vendored
Normal file
125
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/compute/v2/volumeattach_test.go
generated
vendored
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
// +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)
|
||||||
|
|
||||||
|
}
|
116
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/firewall_test.go
generated
vendored
Normal file
116
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/firewall_test.go
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
// +build acceptance networking fwaas
|
||||||
|
|
||||||
|
package fwaas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
base "github.com/rackspace/gophercloud/acceptance/openstack/networking/v2"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func firewallSetup(t *testing.T) string {
|
||||||
|
base.Setup(t)
|
||||||
|
return createPolicy(t, &policies.CreateOpts{})
|
||||||
|
}
|
||||||
|
|
||||||
|
func firewallTeardown(t *testing.T, policyID string) {
|
||||||
|
defer base.Teardown()
|
||||||
|
deletePolicy(t, policyID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFirewall(t *testing.T) {
|
||||||
|
policyID := firewallSetup(t)
|
||||||
|
defer firewallTeardown(t, policyID)
|
||||||
|
|
||||||
|
firewallID := createFirewall(t, &firewalls.CreateOpts{
|
||||||
|
Name: "gophercloud test",
|
||||||
|
Description: "acceptance test",
|
||||||
|
PolicyID: policyID,
|
||||||
|
})
|
||||||
|
|
||||||
|
waitForFirewallToBeActive(t, firewallID)
|
||||||
|
|
||||||
|
listFirewalls(t)
|
||||||
|
|
||||||
|
updateFirewall(t, firewallID, &firewalls.UpdateOpts{
|
||||||
|
Description: "acceptance test updated",
|
||||||
|
})
|
||||||
|
|
||||||
|
waitForFirewallToBeActive(t, firewallID)
|
||||||
|
|
||||||
|
deleteFirewall(t, firewallID)
|
||||||
|
|
||||||
|
waitForFirewallToBeDeleted(t, firewallID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createFirewall(t *testing.T, opts *firewalls.CreateOpts) string {
|
||||||
|
f, err := firewalls.Create(base.Client, *opts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created firewall: %#v", opts)
|
||||||
|
return f.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func listFirewalls(t *testing.T) {
|
||||||
|
err := firewalls.List(base.Client, firewalls.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
firewallList, err := firewalls.ExtractFirewalls(page)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed to extract firewalls: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, r := range firewallList {
|
||||||
|
t.Logf("Listing firewalls: ID [%s]", r.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateFirewall(t *testing.T, firewallID string, opts *firewalls.UpdateOpts) {
|
||||||
|
f, err := firewalls.Update(base.Client, firewallID, *opts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Updated firewall ID [%s]", f.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getFirewall(t *testing.T, firewallID string) *firewalls.Firewall {
|
||||||
|
f, err := firewalls.Get(base.Client, firewallID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Getting firewall ID [%s]", f.ID)
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteFirewall(t *testing.T, firewallID string) {
|
||||||
|
res := firewalls.Delete(base.Client, firewallID)
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
t.Logf("Deleted firewall %s", firewallID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func waitForFirewallToBeActive(t *testing.T, firewallID string) {
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
fw := getFirewall(t, firewallID)
|
||||||
|
if fw.Status == "ACTIVE" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func waitForFirewallToBeDeleted(t *testing.T, firewallID string) {
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
err := firewalls.Get(base.Client, firewallID).Err
|
||||||
|
if err != nil {
|
||||||
|
httpStatus := err.(*gophercloud.UnexpectedResponseCodeError)
|
||||||
|
if httpStatus.Actual == 404 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
}
|
||||||
|
}
|
1
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/pkg.go
generated
vendored
Normal file
1
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/pkg.go
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package fwaas
|
107
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/policy_test.go
generated
vendored
Normal file
107
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/policy_test.go
generated
vendored
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
// +build acceptance networking fwaas
|
||||||
|
|
||||||
|
package fwaas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
base "github.com/rackspace/gophercloud/acceptance/openstack/networking/v2"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func firewallPolicySetup(t *testing.T) string {
|
||||||
|
base.Setup(t)
|
||||||
|
return createRule(t, &rules.CreateOpts{
|
||||||
|
Protocol: "tcp",
|
||||||
|
Action: "allow",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func firewallPolicyTeardown(t *testing.T, ruleID string) {
|
||||||
|
defer base.Teardown()
|
||||||
|
deleteRule(t, ruleID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFirewallPolicy(t *testing.T) {
|
||||||
|
ruleID := firewallPolicySetup(t)
|
||||||
|
defer firewallPolicyTeardown(t, ruleID)
|
||||||
|
|
||||||
|
policyID := createPolicy(t, &policies.CreateOpts{
|
||||||
|
Name: "gophercloud test",
|
||||||
|
Description: "acceptance test",
|
||||||
|
Rules: []string{
|
||||||
|
ruleID,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
listPolicies(t)
|
||||||
|
|
||||||
|
updatePolicy(t, policyID, &policies.UpdateOpts{
|
||||||
|
Description: "acceptance test updated",
|
||||||
|
})
|
||||||
|
|
||||||
|
getPolicy(t, policyID)
|
||||||
|
|
||||||
|
removeRuleFromPolicy(t, policyID, ruleID)
|
||||||
|
|
||||||
|
addRuleToPolicy(t, policyID, ruleID)
|
||||||
|
|
||||||
|
deletePolicy(t, policyID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createPolicy(t *testing.T, opts *policies.CreateOpts) string {
|
||||||
|
p, err := policies.Create(base.Client, *opts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created policy: %#v", opts)
|
||||||
|
return p.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func listPolicies(t *testing.T) {
|
||||||
|
err := policies.List(base.Client, policies.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
policyList, err := policies.ExtractPolicies(page)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed to extract policies: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range policyList {
|
||||||
|
t.Logf("Listing policies: ID [%s]", p.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updatePolicy(t *testing.T, policyID string, opts *policies.UpdateOpts) {
|
||||||
|
p, err := policies.Update(base.Client, policyID, *opts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Updated policy ID [%s]", p.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeRuleFromPolicy(t *testing.T, policyID string, ruleID string) {
|
||||||
|
err := policies.RemoveRule(base.Client, policyID, ruleID)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Removed rule [%s] from policy ID [%s]", ruleID, policyID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func addRuleToPolicy(t *testing.T, policyID string, ruleID string) {
|
||||||
|
err := policies.InsertRule(base.Client, policyID, ruleID, "", "")
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Inserted rule [%s] into policy ID [%s]", ruleID, policyID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPolicy(t *testing.T, policyID string) {
|
||||||
|
p, err := policies.Get(base.Client, policyID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Getting policy ID [%s]", p.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deletePolicy(t *testing.T, policyID string) {
|
||||||
|
res := policies.Delete(base.Client, policyID)
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
t.Logf("Deleted policy %s", policyID)
|
||||||
|
}
|
84
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/rule_test.go
generated
vendored
Normal file
84
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/networking/v2/extensions/fwaas/rule_test.go
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
// +build acceptance networking fwaas
|
||||||
|
|
||||||
|
package fwaas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
base "github.com/rackspace/gophercloud/acceptance/openstack/networking/v2"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFirewallRules(t *testing.T) {
|
||||||
|
base.Setup(t)
|
||||||
|
defer base.Teardown()
|
||||||
|
|
||||||
|
ruleID := createRule(t, &rules.CreateOpts{
|
||||||
|
Name: "gophercloud_test",
|
||||||
|
Description: "acceptance test",
|
||||||
|
Protocol: "tcp",
|
||||||
|
Action: "allow",
|
||||||
|
DestinationIPAddress: "192.168.0.0/24",
|
||||||
|
DestinationPort: "22",
|
||||||
|
})
|
||||||
|
|
||||||
|
listRules(t)
|
||||||
|
|
||||||
|
destinationIPAddress := "192.168.1.0/24"
|
||||||
|
destinationPort := ""
|
||||||
|
sourcePort := "1234"
|
||||||
|
|
||||||
|
updateRule(t, ruleID, &rules.UpdateOpts{
|
||||||
|
DestinationIPAddress: &destinationIPAddress,
|
||||||
|
DestinationPort: &destinationPort,
|
||||||
|
SourcePort: &sourcePort,
|
||||||
|
})
|
||||||
|
|
||||||
|
getRule(t, ruleID)
|
||||||
|
|
||||||
|
deleteRule(t, ruleID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createRule(t *testing.T, opts *rules.CreateOpts) string {
|
||||||
|
r, err := rules.Create(base.Client, *opts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created rule: %#v", opts)
|
||||||
|
return r.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func listRules(t *testing.T) {
|
||||||
|
err := rules.List(base.Client, rules.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
ruleList, err := rules.ExtractRules(page)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed to extract rules: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, r := range ruleList {
|
||||||
|
t.Logf("Listing rules: ID [%s]", r.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateRule(t *testing.T, ruleID string, opts *rules.UpdateOpts) {
|
||||||
|
r, err := rules.Update(base.Client, ruleID, *opts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Updated rule ID [%s]", r.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getRule(t *testing.T, ruleID string) {
|
||||||
|
r, err := rules.Get(base.Client, ruleID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Getting rule ID [%s]", r.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteRule(t *testing.T, ruleID string) {
|
||||||
|
res := rules.Delete(base.Client, ruleID)
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
t.Logf("Deleted rule %s", ruleID)
|
||||||
|
}
|
@@ -87,3 +87,51 @@ func TestContainers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListAllContainers(t *testing.T) {
|
||||||
|
// Create a new client to execute the HTTP requests. See common.go for newClient body.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
numContainers := 20
|
||||||
|
|
||||||
|
// Create a slice of random container names.
|
||||||
|
cNames := make([]string, numContainers)
|
||||||
|
for i := 0; i < numContainers; i++ {
|
||||||
|
cNames[i] = tools.RandomString("gophercloud-test-container-", 8)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create numContainers containers.
|
||||||
|
for i := 0; i < len(cNames); i++ {
|
||||||
|
res := containers.Create(client, cNames[i], nil)
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
}
|
||||||
|
// Delete the numContainers containers after function completion.
|
||||||
|
defer func() {
|
||||||
|
for i := 0; i < len(cNames); i++ {
|
||||||
|
res := containers.Delete(client, cNames[i])
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// List all the numContainer names that were just created. To just list those,
|
||||||
|
// the 'prefix' parameter is used.
|
||||||
|
allPages, err := containers.List(client, &containers.ListOpts{Full: true, Limit: 5, Prefix: "gophercloud-test-container-"}).AllPages()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
containerInfoList, err := containers.ExtractInfo(allPages)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
for _, n := range containerInfoList {
|
||||||
|
t.Logf("Container: Name [%s] Count [%d] Bytes [%d]",
|
||||||
|
n.Name, n.Count, n.Bytes)
|
||||||
|
}
|
||||||
|
th.AssertEquals(t, numContainers, len(containerInfoList))
|
||||||
|
|
||||||
|
// List the info for all the numContainer containers that were created.
|
||||||
|
allPages, err = containers.List(client, &containers.ListOpts{Full: false, Limit: 2, Prefix: "gophercloud-test-container-"}).AllPages()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
containerNamesList, err := containers.ExtractNames(allPages)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
for _, n := range containerNamesList {
|
||||||
|
t.Logf("Container: Name [%s]", n)
|
||||||
|
}
|
||||||
|
th.AssertEquals(t, numContainers, len(containerNamesList))
|
||||||
|
}
|
||||||
|
20
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/buildinfo_test.go
generated
vendored
Normal file
20
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/buildinfo_test.go
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/buildinfo"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBuildInfo(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
bi, err := buildinfo.Get(client).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("retrieved build info: %+v\n", bi)
|
||||||
|
}
|
44
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/common.go
generated
vendored
Normal file
44
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/common.go
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/openstack"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
var template = fmt.Sprintf(`
|
||||||
|
{
|
||||||
|
"heat_template_version": "2013-05-23",
|
||||||
|
"description": "Simple template to test heat commands",
|
||||||
|
"parameters": {},
|
||||||
|
"resources": {
|
||||||
|
"hello_world": {
|
||||||
|
"type":"OS::Nova::Server",
|
||||||
|
"properties": {
|
||||||
|
"flavor": "%s",
|
||||||
|
"image": "%s",
|
||||||
|
"user_data": "#!/bin/bash -xv\necho \"hello world\" > /root/hello-world.txt\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`, os.Getenv("OS_FLAVOR_ID"), os.Getenv("OS_IMAGE_ID"))
|
||||||
|
|
||||||
|
func newClient(t *testing.T) *gophercloud.ServiceClient {
|
||||||
|
ao, err := openstack.AuthOptionsFromEnv()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
client, err := openstack.AuthenticatedClient(ao)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
c, err := openstack.NewOrchestrationV1(client, gophercloud.EndpointOpts{
|
||||||
|
Region: os.Getenv("OS_REGION_NAME"),
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
return c
|
||||||
|
}
|
13
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/hello-compute.json
generated
vendored
Normal file
13
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/hello-compute.json
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"heat_template_version": "2013-05-23",
|
||||||
|
"resources": {
|
||||||
|
"compute_instance": {
|
||||||
|
"type": "OS::Nova::Server",
|
||||||
|
"properties": {
|
||||||
|
"flavor": "m1.small",
|
||||||
|
"image": "cirros-0.3.2-x86_64-disk",
|
||||||
|
"name": "Single Compute Instance"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
68
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stackevents_test.go
generated
vendored
Normal file
68
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stackevents_test.go
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stackevents"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStackEvents(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName := "postman_stack_2"
|
||||||
|
resourceName := "hello_world"
|
||||||
|
var eventID string
|
||||||
|
|
||||||
|
createOpts := stacks.CreateOpts{
|
||||||
|
Name: stackName,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
err = stackevents.List(client, stackName, stack.ID, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
events, err := stackevents.ExtractEvents(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("listed events: %+v\n", events)
|
||||||
|
eventID = events[0].ID
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
err = stackevents.ListResourceEvents(client, stackName, stack.ID, resourceName, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
resourceEvents, err := stackevents.ExtractEvents(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("listed resource events: %+v\n", resourceEvents)
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
event, err := stackevents.Get(client, stackName, stack.ID, resourceName, eventID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("retrieved event: %+v\n", event)
|
||||||
|
}
|
62
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stackresources_test.go
generated
vendored
Normal file
62
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stackresources_test.go
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stackresources"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStackResources(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName := "postman_stack_2"
|
||||||
|
|
||||||
|
createOpts := stacks.CreateOpts{
|
||||||
|
Name: stackName,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
resourceName := "hello_world"
|
||||||
|
resource, err := stackresources.Get(client, stackName, stack.ID, resourceName).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Got stack resource: %+v\n", resource)
|
||||||
|
|
||||||
|
metadata, err := stackresources.Metadata(client, stackName, stack.ID, resourceName).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Got stack resource metadata: %+v\n", metadata)
|
||||||
|
|
||||||
|
err = stackresources.List(client, stackName, stack.ID, stackresources.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
resources, err := stackresources.ExtractResources(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("resources: %+v\n", resources)
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
81
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stacks_test.go
generated
vendored
Normal file
81
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stacks_test.go
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStacks(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName1 := "gophercloud-test-stack-2"
|
||||||
|
createOpts := stacks.CreateOpts{
|
||||||
|
Name: stackName1,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName1, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName1)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
updateOpts := stacks.UpdateOpts{
|
||||||
|
Template: template,
|
||||||
|
Timeout: 20,
|
||||||
|
}
|
||||||
|
err = stacks.Update(client, stackName1, stack.ID, updateOpts).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "UPDATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Logf("Updated stack")
|
||||||
|
|
||||||
|
err = stacks.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
stackList, err := stacks.ExtractStacks(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
t.Logf("Got stack list: %+v\n", stackList)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Got stack: %+v\n", getStack)
|
||||||
|
|
||||||
|
abandonedStack, err := stacks.Abandon(client, stackName1, stack.ID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Abandonded stack %+v\n", abandonedStack)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
77
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stacktemplates_test.go
generated
vendored
Normal file
77
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/openstack/orchestration/v1/stacktemplates_test.go
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/openstack/orchestration/v1/stacktemplates"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStackTemplates(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName := "postman_stack_2"
|
||||||
|
|
||||||
|
createOpts := stacks.CreateOpts{
|
||||||
|
Name: stackName,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
tmpl, err := stacktemplates.Get(client, stackName, stack.ID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("retrieved template: %+v\n", tmpl)
|
||||||
|
|
||||||
|
validateOpts := stacktemplates.ValidateOpts{
|
||||||
|
Template: map[string]interface{}{
|
||||||
|
"heat_template_version": "2013-05-23",
|
||||||
|
"description": "Simple template to test heat commands",
|
||||||
|
"parameters": map[string]interface{}{
|
||||||
|
"flavor": map[string]interface{}{
|
||||||
|
"default": "m1.tiny",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"resources": map[string]interface{}{
|
||||||
|
"hello_world": map[string]interface{}{
|
||||||
|
"type": "OS::Nova::Server",
|
||||||
|
"properties": map[string]interface{}{
|
||||||
|
"key_name": "heat_key",
|
||||||
|
"flavor": map[string]interface{}{
|
||||||
|
"get_param": "flavor",
|
||||||
|
},
|
||||||
|
"image": "ad091b52-742f-469e-8f3c-fd81cadf0743",
|
||||||
|
"user_data": "#!/bin/bash -xv\necho \"hello world\" > /root/hello-world.txt\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
validatedTemplate, err := stacktemplates.Validate(client, validateOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("validated template: %+v\n", validatedTemplate)
|
||||||
|
}
|
130
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/compute/v2/volumeattach_test.go
generated
vendored
Normal file
130
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/compute/v2/volumeattach_test.go
generated
vendored
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
// +build acceptance compute servers
|
||||||
|
|
||||||
|
package v2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/acceptance/tools"
|
||||||
|
"github.com/rackspace/gophercloud/openstack"
|
||||||
|
osVolumes "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
|
||||||
|
osVolumeAttach "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach"
|
||||||
|
osServers "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/compute/v2/servers"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newBlockClient(t *testing.T) (*gophercloud.ServiceClient, error) {
|
||||||
|
ao, err := rackspace.AuthOptionsFromEnv()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
client, err := rackspace.AuthenticatedClient(ao)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
return openstack.NewBlockStorageV1(client, gophercloud.EndpointOpts{
|
||||||
|
Region: os.Getenv("RS_REGION_NAME"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func createVAServer(t *testing.T, computeClient *gophercloud.ServiceClient, choices *serverOpts) (*osServers.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, osServers.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, &osVolumes.CreateOpts{
|
||||||
|
Size: 80,
|
||||||
|
Name: "gophercloud-test-volume",
|
||||||
|
}).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
defer func() {
|
||||||
|
err = osVolumes.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, &osVolumeAttach.CreateOpts{
|
||||||
|
VolumeID: volumeID,
|
||||||
|
}).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
defer func() {
|
||||||
|
err = osVolumes.WaitForStatus(blockClient, volumeID, "in-use", 60)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
err = volumeattach.Delete(computeClient, serverID, va.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
err = osVolumes.WaitForStatus(blockClient, volumeID, "available", 60)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}()
|
||||||
|
t.Logf("Attached volume to server: %+v", va)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAttachVolume(t *testing.T) {
|
||||||
|
choices, err := optionsFromEnv()
|
||||||
|
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 = osServers.WaitForStatus(computeClient, server.ID, "ACTIVE", 300); 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)
|
||||||
|
|
||||||
|
}
|
@@ -36,11 +36,15 @@ func TestCDNObjects(t *testing.T) {
|
|||||||
raxCDNClient, err := createClient(t, true)
|
raxCDNClient, err := createClient(t, true)
|
||||||
th.AssertNoErr(t, err)
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
enableResult := raxCDNContainers.Enable(raxCDNClient, "gophercloud-test", raxCDNContainers.EnableOpts{CDNEnabled: true, TTL: 900})
|
enableHeader, err := raxCDNContainers.Enable(raxCDNClient, "gophercloud-test", raxCDNContainers.EnableOpts{CDNEnabled: true, TTL: 900}).Extract()
|
||||||
th.AssertNoErr(t, enableResult.Err)
|
th.AssertNoErr(t, err)
|
||||||
t.Logf("Headers from Enable CDN Container request: %+v\n", enableResult.Header)
|
t.Logf("Headers from Enable CDN Container request: %+v\n", enableHeader)
|
||||||
|
|
||||||
deleteResult := raxCDNObjects.Delete(raxCDNClient, "gophercloud-test", "test-object", nil)
|
objCDNURL, err := raxCDNObjects.CDNURL(raxCDNClient, "gophercloud-test", "test-object")
|
||||||
th.AssertNoErr(t, deleteResult.Err)
|
th.AssertNoErr(t, err)
|
||||||
t.Logf("Headers from Delete CDN Object request: %+v\n", deleteResult.Err)
|
t.Logf("%s CDN URL: %s\n", "test_object", objCDNURL)
|
||||||
|
|
||||||
|
deleteHeader, err := raxCDNObjects.Delete(raxCDNClient, "gophercloud-test", "test-object", nil).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Headers from Delete CDN Object request: %+v\n", deleteHeader)
|
||||||
}
|
}
|
||||||
|
20
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/buildinfo_test.go
generated
vendored
Normal file
20
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/buildinfo_test.go
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/buildinfo"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBuildInfo(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
bi, err := buildinfo.Get(client).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("retrieved build info: %+v\n", bi)
|
||||||
|
}
|
45
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/common.go
generated
vendored
Normal file
45
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/common.go
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
var template = fmt.Sprintf(`
|
||||||
|
{
|
||||||
|
"heat_template_version": "2013-05-23",
|
||||||
|
"description": "Simple template to test heat commands",
|
||||||
|
"parameters": {},
|
||||||
|
"resources": {
|
||||||
|
"hello_world": {
|
||||||
|
"type":"OS::Nova::Server",
|
||||||
|
"properties": {
|
||||||
|
"flavor": "%s",
|
||||||
|
"image": "%s",
|
||||||
|
"user_data": "#!/bin/bash -xv\necho \"hello world\" > /root/hello-world.txt\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`, os.Getenv("RS_FLAVOR_ID"), os.Getenv("RS_IMAGE_ID"))
|
||||||
|
|
||||||
|
func newClient(t *testing.T) *gophercloud.ServiceClient {
|
||||||
|
ao, err := rackspace.AuthOptionsFromEnv()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
client, err := rackspace.AuthenticatedClient(ao)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
c, err := rackspace.NewOrchestrationV1(client, gophercloud.EndpointOpts{
|
||||||
|
Region: os.Getenv("RS_REGION_NAME"),
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
return c
|
||||||
|
}
|
70
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stackevents_test.go
generated
vendored
Normal file
70
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stackevents_test.go
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
osStackEvents "github.com/rackspace/gophercloud/openstack/orchestration/v1/stackevents"
|
||||||
|
osStacks "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stackevents"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stacks"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStackEvents(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName := "postman_stack_2"
|
||||||
|
resourceName := "hello_world"
|
||||||
|
var eventID string
|
||||||
|
|
||||||
|
createOpts := osStacks.CreateOpts{
|
||||||
|
Name: stackName,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
err = stackevents.List(client, stackName, stack.ID, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
events, err := osStackEvents.ExtractEvents(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("listed events: %+v\n", events)
|
||||||
|
eventID = events[0].ID
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
err = stackevents.ListResourceEvents(client, stackName, stack.ID, resourceName, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
resourceEvents, err := osStackEvents.ExtractResourceEvents(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("listed resource events: %+v\n", resourceEvents)
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
event, err := stackevents.Get(client, stackName, stack.ID, resourceName, eventID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("retrieved event: %+v\n", event)
|
||||||
|
}
|
64
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stackresources_test.go
generated
vendored
Normal file
64
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stackresources_test.go
generated
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
osStackResources "github.com/rackspace/gophercloud/openstack/orchestration/v1/stackresources"
|
||||||
|
osStacks "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stackresources"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stacks"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStackResources(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName := "postman_stack_2"
|
||||||
|
|
||||||
|
createOpts := osStacks.CreateOpts{
|
||||||
|
Name: stackName,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
resourceName := "hello_world"
|
||||||
|
resource, err := stackresources.Get(client, stackName, stack.ID, resourceName).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Got stack resource: %+v\n", resource)
|
||||||
|
|
||||||
|
metadata, err := stackresources.Metadata(client, stackName, stack.ID, resourceName).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Got stack resource metadata: %+v\n", metadata)
|
||||||
|
|
||||||
|
err = stackresources.List(client, stackName, stack.ID, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
resources, err := osStackResources.ExtractResources(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("resources: %+v\n", resources)
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
82
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stacks_test.go
generated
vendored
Normal file
82
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stacks_test.go
generated
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
osStacks "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stacks"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStacks(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName1 := "gophercloud-test-stack-2"
|
||||||
|
createOpts := osStacks.CreateOpts{
|
||||||
|
Name: stackName1,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName1, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName1)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
updateOpts := osStacks.UpdateOpts{
|
||||||
|
Template: template,
|
||||||
|
Timeout: 20,
|
||||||
|
}
|
||||||
|
err = stacks.Update(client, stackName1, stack.ID, updateOpts).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "UPDATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Logf("Updated stack")
|
||||||
|
|
||||||
|
err = stacks.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
stackList, err := osStacks.ExtractStacks(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
t.Logf("Got stack list: %+v\n", stackList)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Got stack: %+v\n", getStack)
|
||||||
|
|
||||||
|
abandonedStack, err := stacks.Abandon(client, stackName1, stack.ID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Abandonded stack %+v\n", abandonedStack)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
79
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stacktemplates_test.go
generated
vendored
Normal file
79
Godeps/_workspace/src/github.com/rackspace/gophercloud/acceptance/rackspace/orchestration/v1/stacktemplates_test.go
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
// +build acceptance
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
osStacks "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
|
||||||
|
osStacktemplates "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacktemplates"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stacks"
|
||||||
|
"github.com/rackspace/gophercloud/rackspace/orchestration/v1/stacktemplates"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStackTemplates(t *testing.T) {
|
||||||
|
// Create a provider client for making the HTTP requests.
|
||||||
|
// See common.go in this directory for more information.
|
||||||
|
client := newClient(t)
|
||||||
|
|
||||||
|
stackName := "postman_stack_2"
|
||||||
|
|
||||||
|
createOpts := osStacks.CreateOpts{
|
||||||
|
Name: stackName,
|
||||||
|
Template: template,
|
||||||
|
Timeout: 5,
|
||||||
|
}
|
||||||
|
stack, err := stacks.Create(client, createOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Created stack: %+v\n", stack)
|
||||||
|
defer func() {
|
||||||
|
err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("Deleted stack (%s)", stackName)
|
||||||
|
}()
|
||||||
|
err = gophercloud.WaitFor(60, func() (bool, error) {
|
||||||
|
getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if getStack.Status == "CREATE_COMPLETE" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
tmpl, err := stacktemplates.Get(client, stackName, stack.ID).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("retrieved template: %+v\n", tmpl)
|
||||||
|
|
||||||
|
validateOpts := osStacktemplates.ValidateOpts{
|
||||||
|
Template: map[string]interface{}{
|
||||||
|
"heat_template_version": "2013-05-23",
|
||||||
|
"description": "Simple template to test heat commands",
|
||||||
|
"parameters": map[string]interface{}{
|
||||||
|
"flavor": map[string]interface{}{
|
||||||
|
"default": "m1.tiny",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"resources": map[string]interface{}{
|
||||||
|
"hello_world": map[string]interface{}{
|
||||||
|
"type": "OS::Nova::Server",
|
||||||
|
"properties": map[string]interface{}{
|
||||||
|
"key_name": "heat_key",
|
||||||
|
"flavor": map[string]interface{}{
|
||||||
|
"get_param": "flavor",
|
||||||
|
},
|
||||||
|
"image": "ad091b52-742f-469e-8f3c-fd81cadf0743",
|
||||||
|
"user_data": "#!/bin/bash -xv\necho \"hello world\" > /root/hello-world.txt\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
validatedTemplate, err := stacktemplates.Validate(client, validateOpts).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
t.Logf("validated template: %+v\n", validatedTemplate)
|
||||||
|
}
|
2
Godeps/_workspace/src/github.com/rackspace/gophercloud/auth_options.go
generated
vendored
2
Godeps/_workspace/src/github.com/rackspace/gophercloud/auth_options.go
generated
vendored
@@ -42,7 +42,5 @@ type AuthOptions struct {
|
|||||||
// re-authenticate automatically if/when your token expires. If you set it to
|
// re-authenticate automatically if/when your token expires. If you set it to
|
||||||
// false, it will not cache these settings, but re-authentication will not be
|
// false, it will not cache these settings, but re-authentication will not be
|
||||||
// possible. This setting defaults to false.
|
// possible. This setting defaults to false.
|
||||||
//
|
|
||||||
// This setting is speculative and is currently not respected!
|
|
||||||
AllowReauth bool
|
AllowReauth bool
|
||||||
}
|
}
|
||||||
|
@@ -3,8 +3,6 @@ package apiversions
|
|||||||
import (
|
import (
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// List lists all the Cinder API versions available to end-users.
|
// List lists all the Cinder API versions available to end-users.
|
||||||
@@ -18,11 +16,9 @@ func List(c *gophercloud.ServiceClient) pagination.Pager {
|
|||||||
// type from the result, call the Extract method on the GetResult.
|
// type from the result, call the Extract method on the GetResult.
|
||||||
func Get(client *gophercloud.ServiceClient, v string) GetResult {
|
func Get(client *gophercloud.ServiceClient, v string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, err := perigee.Request("GET", getURL(client, v), perigee.Options{
|
_, res.Err = client.Request("GET", getURL(client, v), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
res.Err = err
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
@@ -5,8 +5,6 @@ import (
|
|||||||
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateOptsBuilder allows extensions to add additional parameters to the
|
// CreateOptsBuilder allows extensions to add additional parameters to the
|
||||||
@@ -69,11 +67,10 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", createURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", createURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -81,8 +78,7 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
// Delete will delete the existing Snapshot with the provided ID.
|
// Delete will delete the existing Snapshot with the provided ID.
|
||||||
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(client, id), perigee.Options{
|
_, res.Err = client.Request("DELETE", deleteURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202, 204},
|
OkCodes: []int{202, 204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -92,10 +88,9 @@ func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
|||||||
// object from the response, call the Extract method on the GetResult.
|
// object from the response, call the Extract method on the GetResult.
|
||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(client, id), perigee.Options{
|
_, res.Err = client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -178,11 +173,10 @@ func UpdateMetadata(client *gophercloud.ServiceClient, id string, opts UpdateMet
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", updateMetadataURL(client, id), perigee.Options{
|
_, res.Err = client.Request("PUT", updateMetadataURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
@@ -45,7 +45,15 @@ func MockGetResponse(t *testing.T) {
|
|||||||
{
|
{
|
||||||
"volume": {
|
"volume": {
|
||||||
"display_name": "vol-001",
|
"display_name": "vol-001",
|
||||||
"id": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
|
"id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",
|
||||||
|
"attachments": [
|
||||||
|
{
|
||||||
|
"device": "/dev/vde",
|
||||||
|
"server_id": "a740d24b-dc5b-4d59-ac75-53971c2920ba",
|
||||||
|
"id": "d6da11e5-2ed3-413e-88d8-b772ba62193d",
|
||||||
|
"volume_id": "d6da11e5-2ed3-413e-88d8-b772ba62193d"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@@ -5,8 +5,6 @@ import (
|
|||||||
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateOptsBuilder allows extensions to add additional parameters to the
|
// CreateOptsBuilder allows extensions to add additional parameters to the
|
||||||
@@ -85,11 +83,10 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", createURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", createURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
ReqBody: &reqBody,
|
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -97,8 +94,7 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
// Delete will delete the existing Volume with the provided ID.
|
// Delete will delete the existing Volume with the provided ID.
|
||||||
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(client, id), perigee.Options{
|
_, res.Err = client.Request("DELETE", deleteURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202, 204},
|
OkCodes: []int{202, 204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -108,9 +104,8 @@ func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
|||||||
// from the response, call the Extract method on the GetResult.
|
// from the response, call the Extract method on the GetResult.
|
||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(client, id), perigee.Options{
|
_, res.Err = client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -157,6 +152,7 @@ func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pa
|
|||||||
createPage := func(r pagination.PageResult) pagination.Page {
|
createPage := func(r pagination.PageResult) pagination.Page {
|
||||||
return ListResult{pagination.SinglePageBase(r)}
|
return ListResult{pagination.SinglePageBase(r)}
|
||||||
}
|
}
|
||||||
|
|
||||||
return pagination.NewPager(client, url, createPage)
|
return pagination.NewPager(client, url, createPage)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,11 +203,10 @@ func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", updateURL(client, id), perigee.Options{
|
_, res.Err = client.Request("PUT", updateURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,32 @@ func TestList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListAll(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
MockListResponse(t)
|
||||||
|
|
||||||
|
allPages, err := List(client.ServiceClient(), &ListOpts{}).AllPages()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
actual, err := ExtractVolumes(allPages)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
expected := []Volume{
|
||||||
|
Volume{
|
||||||
|
ID: "289da7f8-6440-407c-9fb4-7db01ec49164",
|
||||||
|
Name: "vol-001",
|
||||||
|
},
|
||||||
|
Volume{
|
||||||
|
ID: "96c3bda7-c82a-4f50-be73-ca7621794835",
|
||||||
|
Name: "vol-002",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
th.CheckDeepEquals(t, expected, actual)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func TestGet(t *testing.T) {
|
func TestGet(t *testing.T) {
|
||||||
th.SetupHTTP()
|
th.SetupHTTP()
|
||||||
defer th.TeardownHTTP()
|
defer th.TeardownHTTP()
|
||||||
@@ -56,6 +82,7 @@ func TestGet(t *testing.T) {
|
|||||||
|
|
||||||
th.AssertEquals(t, v.Name, "vol-001")
|
th.AssertEquals(t, v.Name, "vol-001")
|
||||||
th.AssertEquals(t, v.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
|
th.AssertEquals(t, v.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
|
||||||
|
th.AssertEquals(t, v.Attachments[0]["device"], "/dev/vde")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreate(t *testing.T) {
|
func TestCreate(t *testing.T) {
|
||||||
|
@@ -16,7 +16,7 @@ type Volume struct {
|
|||||||
Name string `mapstructure:"display_name"`
|
Name string `mapstructure:"display_name"`
|
||||||
|
|
||||||
// Instances onto which the volume is attached.
|
// Instances onto which the volume is attached.
|
||||||
Attachments []string `mapstructure:"attachments"`
|
Attachments []map[string]interface{} `mapstructure:"attachments"`
|
||||||
|
|
||||||
// This parameter is no longer used.
|
// This parameter is no longer used.
|
||||||
AvailabilityZone string `mapstructure:"availability_zone"`
|
AvailabilityZone string `mapstructure:"availability_zone"`
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package volumetypes
|
package volumetypes
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -45,11 +44,11 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", createURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", createURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
MoreHeaders: client.AuthenticatedHeaders(),
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -57,7 +56,7 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
// Delete will delete the volume type with the provided ID.
|
// Delete will delete the volume type with the provided ID.
|
||||||
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(client, id), perigee.Options{
|
_, res.Err = client.Request("DELETE", deleteURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
MoreHeaders: client.AuthenticatedHeaders(),
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
@@ -68,10 +67,10 @@ func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
|||||||
// type from the result, call the Extract method on the GetResult.
|
// type from the result, call the Extract method on the GetResult.
|
||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, err := perigee.Request("GET", getURL(client, id), perigee.Options{
|
_, err := client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
MoreHeaders: client.AuthenticatedHeaders(),
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
})
|
})
|
||||||
res.Err = err
|
res.Err = err
|
||||||
return res
|
return res
|
||||||
|
16
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/cdn/v1/base/requests.go
generated
vendored
16
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/cdn/v1/base/requests.go
generated
vendored
@@ -1,18 +1,13 @@
|
|||||||
package base
|
package base
|
||||||
|
|
||||||
import (
|
import "github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud"
|
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Get retrieves the home document, allowing the user to discover the
|
// Get retrieves the home document, allowing the user to discover the
|
||||||
// entire API.
|
// entire API.
|
||||||
func Get(c *gophercloud.ServiceClient) GetResult {
|
func Get(c *gophercloud.ServiceClient) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(c), perigee.Options{
|
_, res.Err = c.Request("GET", getURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -21,10 +16,9 @@ func Get(c *gophercloud.ServiceClient) GetResult {
|
|||||||
// Ping retrieves a ping to the server.
|
// Ping retrieves a ping to the server.
|
||||||
func Ping(c *gophercloud.ServiceClient) PingResult {
|
func Ping(c *gophercloud.ServiceClient) PingResult {
|
||||||
var res PingResult
|
var res PingResult
|
||||||
_, res.Err = perigee.Request("GET", pingURL(c), perigee.Options{
|
_, res.Err = c.Request("GET", pingURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
OmitAccept: true,
|
MoreHeaders: map[string]string{"Accept": ""},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package flavors
|
package flavors
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -18,9 +17,8 @@ func List(c *gophercloud.ServiceClient) pagination.Pager {
|
|||||||
// Get retrieves a specific flavor based on its unique ID.
|
// Get retrieves a specific flavor based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", getURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,7 +3,6 @@ package serviceassets
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -44,8 +43,7 @@ func Delete(c *gophercloud.ServiceClient, idOrURL string, opts DeleteOptsBuilder
|
|||||||
}
|
}
|
||||||
|
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", url, perigee.Options{
|
_, res.Err = c.Request("DELETE", url, gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -178,12 +177,11 @@ func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
resp, err := perigee.Request("POST", createURL(c), perigee.Options{
|
resp, err := c.Request("POST", createURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
res.Header = resp.HttpResponse.Header
|
res.Header = resp.Header
|
||||||
res.Err = err
|
res.Err = err
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -201,9 +199,8 @@ func Get(c *gophercloud.ServiceClient, idOrURL string) GetResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", url, perigee.Options{
|
_, res.Err = c.Request("GET", url, gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -359,13 +356,12 @@ func Update(c *gophercloud.ServiceClient, idOrURL string, opts UpdateOpts) Updat
|
|||||||
reqBody[i] = patch.ToCDNServiceUpdateMap()
|
reqBody[i] = patch.ToCDNServiceUpdateMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := perigee.Request("PATCH", url, perigee.Options{
|
resp, err := c.Request("PATCH", url, gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
var result UpdateResult
|
var result UpdateResult
|
||||||
result.Header = resp.HttpResponse.Header
|
result.Header = resp.Header
|
||||||
result.Err = err
|
result.Err = err
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@@ -383,8 +379,7 @@ func Delete(c *gophercloud.ServiceClient, idOrURL string) DeleteResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", url, perigee.Options{
|
_, res.Err = c.Request("DELETE", url, gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
22
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/client.go
generated
vendored
22
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/client.go
generated
vendored
@@ -68,7 +68,7 @@ func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOp
|
|||||||
&utils.Version{ID: v30, Priority: 30, Suffix: "/v3/"},
|
&utils.Version{ID: v30, Priority: 30, Suffix: "/v3/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
chosen, endpoint, err := utils.ChooseVersion(client.IdentityBase, client.IdentityEndpoint, versions)
|
chosen, endpoint, err := utils.ChooseVersion(client, versions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -107,6 +107,11 @@ func v2auth(client *gophercloud.ProviderClient, endpoint string, options gopherc
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.AllowReauth {
|
||||||
|
client.ReauthFunc = func() error {
|
||||||
|
return AuthenticateV2(client, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
client.TokenID = token.ID
|
client.TokenID = token.ID
|
||||||
client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) {
|
client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) {
|
||||||
return V2EndpointURL(catalog, opts)
|
return V2EndpointURL(catalog, opts)
|
||||||
@@ -133,6 +138,11 @@ func v3auth(client *gophercloud.ProviderClient, endpoint string, options gopherc
|
|||||||
}
|
}
|
||||||
client.TokenID = token.ID
|
client.TokenID = token.ID
|
||||||
|
|
||||||
|
if options.AllowReauth {
|
||||||
|
client.ReauthFunc = func() error {
|
||||||
|
return AuthenticateV3(client, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) {
|
client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) {
|
||||||
return V3EndpointURL(v3Client, opts)
|
return V3EndpointURL(v3Client, opts)
|
||||||
}
|
}
|
||||||
@@ -214,3 +224,13 @@ func NewCDNV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (
|
|||||||
}
|
}
|
||||||
return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
|
return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewOrchestrationV1 creates a ServiceClient that may be used to access the v1 orchestration service.
|
||||||
|
func NewOrchestrationV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
|
||||||
|
eo.ApplyDefaults("orchestration")
|
||||||
|
url, err := client.EndpointLocator(eo)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
|
||||||
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package extensions
|
package extensions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -9,9 +8,8 @@ import (
|
|||||||
// Get retrieves information for a specific extension using its alias.
|
// Get retrieves information for a specific extension using its alias.
|
||||||
func Get(c *gophercloud.ServiceClient, alias string) GetResult {
|
func Get(c *gophercloud.ServiceClient, alias string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", ExtensionURL(c, alias), perigee.Options{
|
_, res.Err = c.Request("GET", ExtensionURL(c, alias), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -6,8 +6,6 @@ import (
|
|||||||
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// SourceType represents the type of medium being used to create the volume.
|
// SourceType represents the type of medium being used to create the volume.
|
||||||
@@ -101,10 +99,9 @@ func Create(client *gophercloud.ServiceClient, opts servers.CreateOptsBuilder) s
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", createURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", createURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: reqBody,
|
||||||
ReqBody: reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 202},
|
OkCodes: []int{200, 202},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,8 +3,6 @@ package defsecrules
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -75,10 +73,9 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", rootURL(client), perigee.Options{
|
_, result.Err = client.Request("POST", rootURL(client), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -89,9 +86,8 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("GET", resourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("GET", resourceURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -102,8 +98,7 @@ func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
|||||||
func Delete(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
func Delete(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
||||||
var result gophercloud.ErrResult
|
var result gophercloud.ErrResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("DELETE", resourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("DELETE", resourceURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
3
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/doc.go
generated
vendored
Normal file
3
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/doc.go
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Package floatingip provides the ability to manage floating ips through
|
||||||
|
// nova-network
|
||||||
|
package floatingip
|
174
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/fixtures.go
generated
vendored
Normal file
174
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/fixtures.go
generated
vendored
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
// +build fixtures
|
||||||
|
|
||||||
|
package floatingip
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
"github.com/rackspace/gophercloud/testhelper/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListOutput is a sample response to a List call.
|
||||||
|
const ListOutput = `
|
||||||
|
{
|
||||||
|
"floating_ips": [
|
||||||
|
{
|
||||||
|
"fixed_ip": null,
|
||||||
|
"id": 1,
|
||||||
|
"instance_id": null,
|
||||||
|
"ip": "10.10.10.1",
|
||||||
|
"pool": "nova"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fixed_ip": "166.78.185.201",
|
||||||
|
"id": 2,
|
||||||
|
"instance_id": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
"ip": "10.10.10.2",
|
||||||
|
"pool": "nova"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// GetOutput is a sample response to a Get call.
|
||||||
|
const GetOutput = `
|
||||||
|
{
|
||||||
|
"floating_ip": {
|
||||||
|
"fixed_ip": "166.78.185.201",
|
||||||
|
"id": 2,
|
||||||
|
"instance_id": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
"ip": "10.10.10.2",
|
||||||
|
"pool": "nova"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// CreateOutput is a sample response to a Post call
|
||||||
|
const CreateOutput = `
|
||||||
|
{
|
||||||
|
"floating_ip": {
|
||||||
|
"fixed_ip": null,
|
||||||
|
"id": 1,
|
||||||
|
"instance_id": null,
|
||||||
|
"ip": "10.10.10.1",
|
||||||
|
"pool": "nova"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// FirstFloatingIP is the first result in ListOutput.
|
||||||
|
var FirstFloatingIP = FloatingIP{
|
||||||
|
ID: "1",
|
||||||
|
IP: "10.10.10.1",
|
||||||
|
Pool: "nova",
|
||||||
|
}
|
||||||
|
|
||||||
|
// SecondFloatingIP is the first result in ListOutput.
|
||||||
|
var SecondFloatingIP = FloatingIP{
|
||||||
|
FixedIP: "166.78.185.201",
|
||||||
|
ID: "2",
|
||||||
|
InstanceID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
IP: "10.10.10.2",
|
||||||
|
Pool: "nova",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExpectedFloatingIPsSlice is the slice of results that should be parsed
|
||||||
|
// from ListOutput, in the expected order.
|
||||||
|
var ExpectedFloatingIPsSlice = []FloatingIP{FirstFloatingIP, SecondFloatingIP}
|
||||||
|
|
||||||
|
// CreatedFloatingIP is the parsed result from CreateOutput.
|
||||||
|
var CreatedFloatingIP = FloatingIP{
|
||||||
|
ID: "1",
|
||||||
|
IP: "10.10.10.1",
|
||||||
|
Pool: "nova",
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleListSuccessfully configures the test server to respond to a List request.
|
||||||
|
func HandleListSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/os-floating-ips", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
fmt.Fprintf(w, ListOutput)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleGetSuccessfully configures the test server to respond to a Get request
|
||||||
|
// for an existing floating ip
|
||||||
|
func HandleGetSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/os-floating-ips/2", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
fmt.Fprintf(w, GetOutput)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleCreateSuccessfully configures the test server to respond to a Create request
|
||||||
|
// for a new floating ip
|
||||||
|
func HandleCreateSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/os-floating-ips", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"pool": "nova"
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
fmt.Fprintf(w, CreateOutput)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleDeleteSuccessfully configures the test server to respond to a Delete request for a
|
||||||
|
// an existing floating ip
|
||||||
|
func HandleDeleteSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/os-floating-ips/1", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "DELETE")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusAccepted)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleAssociateSuccessfully configures the test server to respond to a Post request
|
||||||
|
// to associate an allocated floating IP
|
||||||
|
func HandleAssociateSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/servers/4d8c3732-a248-40ed-bebc-539a6ffd25c0/action", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"addFloatingIp": {
|
||||||
|
"address": "10.10.10.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusAccepted)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleDisassociateSuccessfully configures the test server to respond to a Post request
|
||||||
|
// to disassociate an allocated floating IP
|
||||||
|
func HandleDisassociateSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/servers/4d8c3732-a248-40ed-bebc-539a6ffd25c0/action", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"removeFloatingIp": {
|
||||||
|
"address": "10.10.10.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusAccepted)
|
||||||
|
})
|
||||||
|
}
|
105
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/requests.go
generated
vendored
Normal file
105
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/requests.go
generated
vendored
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
package floatingip
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// List returns a Pager that allows you to iterate over a collection of FloatingIPs.
|
||||||
|
func List(client *gophercloud.ServiceClient) pagination.Pager {
|
||||||
|
return pagination.NewPager(client, listURL(client), func(r pagination.PageResult) pagination.Page {
|
||||||
|
return FloatingIPsPage{pagination.SinglePageBase(r)}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOptsBuilder describes struct types that can be accepted by the Create call. Notable, the
|
||||||
|
// CreateOpts struct in this package does.
|
||||||
|
type CreateOptsBuilder interface {
|
||||||
|
ToFloatingIPCreateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOpts specifies a Floating IP allocation request
|
||||||
|
type CreateOpts struct {
|
||||||
|
// Pool is the pool of floating IPs to allocate one from
|
||||||
|
Pool string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFloatingIPCreateMap constructs a request body from CreateOpts.
|
||||||
|
func (opts CreateOpts) ToFloatingIPCreateMap() (map[string]interface{}, error) {
|
||||||
|
if opts.Pool == "" {
|
||||||
|
return nil, errors.New("Missing field required for floating IP creation: Pool")
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"pool": opts.Pool}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create requests the creation of a new floating IP
|
||||||
|
func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
||||||
|
var res CreateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToFloatingIPCreateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
_, res.Err = client.Request("POST", createURL(client), gophercloud.RequestOpts{
|
||||||
|
JSONBody: reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns data about a previously created FloatingIP.
|
||||||
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
|
var res GetResult
|
||||||
|
_, res.Err = client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete requests the deletion of a previous allocated FloatingIP.
|
||||||
|
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
|
var res DeleteResult
|
||||||
|
_, res.Err = client.Request("DELETE", deleteURL(client, id), gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{202},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// association / disassociation
|
||||||
|
|
||||||
|
// Associate pairs an allocated floating IP with an instance
|
||||||
|
func Associate(client *gophercloud.ServiceClient, serverId, fip string) AssociateResult {
|
||||||
|
var res AssociateResult
|
||||||
|
|
||||||
|
addFloatingIp := make(map[string]interface{})
|
||||||
|
addFloatingIp["address"] = fip
|
||||||
|
reqBody := map[string]interface{}{"addFloatingIp": addFloatingIp}
|
||||||
|
|
||||||
|
_, res.Err = client.Request("POST", associateURL(client, serverId), gophercloud.RequestOpts{
|
||||||
|
JSONBody: reqBody,
|
||||||
|
OkCodes: []int{202},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disassociate decouples an allocated floating IP from an instance
|
||||||
|
func Disassociate(client *gophercloud.ServiceClient, serverId, fip string) DisassociateResult {
|
||||||
|
var res DisassociateResult
|
||||||
|
|
||||||
|
removeFloatingIp := make(map[string]interface{})
|
||||||
|
removeFloatingIp["address"] = fip
|
||||||
|
reqBody := map[string]interface{}{"removeFloatingIp": removeFloatingIp}
|
||||||
|
|
||||||
|
_, res.Err = client.Request("POST", disassociateURL(client, serverId), gophercloud.RequestOpts{
|
||||||
|
JSONBody: reqBody,
|
||||||
|
OkCodes: []int{202},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
80
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/requests_test.go
generated
vendored
Normal file
80
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/requests_test.go
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package floatingip
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
"github.com/rackspace/gophercloud/testhelper/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestList(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleListSuccessfully(t)
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
count++
|
||||||
|
actual, err := ExtractFloatingIPs(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, ExpectedFloatingIPsSlice, actual)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckEquals(t, 1, count)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleCreateSuccessfully(t)
|
||||||
|
|
||||||
|
actual, err := Create(client.ServiceClient(), CreateOpts{
|
||||||
|
Pool: "nova",
|
||||||
|
}).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, &CreatedFloatingIP, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleGetSuccessfully(t)
|
||||||
|
|
||||||
|
actual, err := Get(client.ServiceClient(), "2").Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, &SecondFloatingIP, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDelete(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleDeleteSuccessfully(t)
|
||||||
|
|
||||||
|
err := Delete(client.ServiceClient(), "1").ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAssociate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleAssociateSuccessfully(t)
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
fip := "10.10.10.2"
|
||||||
|
|
||||||
|
err := Associate(client.ServiceClient(), serverId, fip).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDisassociate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleDisassociateSuccessfully(t)
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
fip := "10.10.10.2"
|
||||||
|
|
||||||
|
err := Disassociate(client.ServiceClient(), serverId, fip).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
99
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/results.go
generated
vendored
Normal file
99
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/results.go
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
package floatingip
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A FloatingIP is an IP that can be associated with an instance
|
||||||
|
type FloatingIP struct {
|
||||||
|
// ID is a unique ID of the Floating IP
|
||||||
|
ID string `mapstructure:"id"`
|
||||||
|
|
||||||
|
// FixedIP is the IP of the instance related to the Floating IP
|
||||||
|
FixedIP string `mapstructure:"fixed_ip,omitempty"`
|
||||||
|
|
||||||
|
// InstanceID is the ID of the instance that is using the Floating IP
|
||||||
|
InstanceID string `mapstructure:"instance_id"`
|
||||||
|
|
||||||
|
// IP is the actual Floating IP
|
||||||
|
IP string `mapstructure:"ip"`
|
||||||
|
|
||||||
|
// Pool is the pool of floating IPs that this floating IP belongs to
|
||||||
|
Pool string `mapstructure:"pool"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// FloatingIPsPage stores a single, only page of FloatingIPs
|
||||||
|
// results from a List call.
|
||||||
|
type FloatingIPsPage struct {
|
||||||
|
pagination.SinglePageBase
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty determines whether or not a FloatingIPsPage is empty.
|
||||||
|
func (page FloatingIPsPage) IsEmpty() (bool, error) {
|
||||||
|
va, err := ExtractFloatingIPs(page)
|
||||||
|
return len(va) == 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractFloatingIPs interprets a page of results as a slice of
|
||||||
|
// FloatingIPs.
|
||||||
|
func ExtractFloatingIPs(page pagination.Page) ([]FloatingIP, error) {
|
||||||
|
casted := page.(FloatingIPsPage).Body
|
||||||
|
var response struct {
|
||||||
|
FloatingIPs []FloatingIP `mapstructure:"floating_ips"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.WeakDecode(casted, &response)
|
||||||
|
|
||||||
|
return response.FloatingIPs, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type FloatingIPResult struct {
|
||||||
|
gophercloud.Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract is a method that attempts to interpret any FloatingIP resource
|
||||||
|
// response as a FloatingIP struct.
|
||||||
|
func (r FloatingIPResult) Extract() (*FloatingIP, error) {
|
||||||
|
if r.Err != nil {
|
||||||
|
return nil, r.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
var res struct {
|
||||||
|
FloatingIP *FloatingIP `json:"floating_ip" mapstructure:"floating_ip"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.WeakDecode(r.Body, &res)
|
||||||
|
return res.FloatingIP, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateResult is the response from a Create operation. Call its Extract method to interpret it
|
||||||
|
// as a FloatingIP.
|
||||||
|
type CreateResult struct {
|
||||||
|
FloatingIPResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResult is the response from a Get operation. Call its Extract method to interpret it
|
||||||
|
// as a FloatingIP.
|
||||||
|
type GetResult struct {
|
||||||
|
FloatingIPResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResult is the response from a Delete operation. Call its Extract method to determine if
|
||||||
|
// the call succeeded or failed.
|
||||||
|
type DeleteResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssociateResult is the response from a Delete operation. Call its Extract method to determine if
|
||||||
|
// the call succeeded or failed.
|
||||||
|
type AssociateResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisassociateResult is the response from a Delete operation. Call its Extract method to determine if
|
||||||
|
// the call succeeded or failed.
|
||||||
|
type DisassociateResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
37
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/urls.go
generated
vendored
Normal file
37
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/urls.go
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package floatingip
|
||||||
|
|
||||||
|
import "github.com/rackspace/gophercloud"
|
||||||
|
|
||||||
|
const resourcePath = "os-floating-ips"
|
||||||
|
|
||||||
|
func resourceURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return c.ServiceURL(resourcePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func listURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return resourceURL(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return resourceURL(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL(resourcePath, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return getURL(c, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func serverURL(c *gophercloud.ServiceClient, serverId string) string {
|
||||||
|
return c.ServiceURL("servers/" + serverId + "/action")
|
||||||
|
}
|
||||||
|
|
||||||
|
func associateURL(c *gophercloud.ServiceClient, serverId string) string {
|
||||||
|
return serverURL(c, serverId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func disassociateURL(c *gophercloud.ServiceClient, serverId string) string {
|
||||||
|
return serverURL(c, serverId)
|
||||||
|
}
|
60
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/urls_test.go
generated
vendored
Normal file
60
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/floatingip/urls_test.go
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package floatingip
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
"github.com/rackspace/gophercloud/testhelper/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestListURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"os-floating-ips", listURL(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"os-floating-ips", createURL(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
id := "1"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"os-floating-ips/"+id, getURL(c, id))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
id := "1"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"os-floating-ips/"+id, deleteURL(c, id))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAssociateURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"servers/"+serverId+"/action", associateURL(c, serverId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDisassociateURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"servers/"+serverId+"/action", disassociateURL(c, serverId))
|
||||||
|
}
|
@@ -3,7 +3,6 @@ package keypairs
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
@@ -82,10 +81,9 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", createURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", createURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: reqBody,
|
||||||
ReqBody: reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -94,9 +92,8 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
// Get returns public data about a previously uploaded KeyPair.
|
// Get returns public data about a previously uploaded KeyPair.
|
||||||
func Get(client *gophercloud.ServiceClient, name string) GetResult {
|
func Get(client *gophercloud.ServiceClient, name string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(client, name), perigee.Options{
|
_, res.Err = client.Request("GET", getURL(client, name), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -105,8 +102,7 @@ func Get(client *gophercloud.ServiceClient, name string) GetResult {
|
|||||||
// Delete requests the deletion of a previous stored KeyPair from the server.
|
// Delete requests the deletion of a previous stored KeyPair from the server.
|
||||||
func Delete(client *gophercloud.ServiceClient, name string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, name string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(client, name), perigee.Options{
|
_, res.Err = client.Request("DELETE", deleteURL(client, name), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -38,7 +38,7 @@ func mockListGroupsResponse(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func mockListGroupsByServerResponse(t *testing.T, serverID string) {
|
func mockListGroupsByServerResponse(t *testing.T, serverID string) {
|
||||||
url := fmt.Sprintf("%s/servers/%s%s", rootPath, serverID, rootPath)
|
url := fmt.Sprintf("/servers/%s%s", serverID, rootPath)
|
||||||
th.Mux.HandleFunc(url, func(w http.ResponseWriter, r *http.Request) {
|
th.Mux.HandleFunc(url, func(w http.ResponseWriter, r *http.Request) {
|
||||||
th.TestMethod(t, r, "GET")
|
th.TestMethod(t, r, "GET")
|
||||||
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
@@ -3,8 +3,6 @@ package secgroups
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -80,10 +78,9 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", rootURL(client), perigee.Options{
|
_, result.Err = client.Request("POST", rootURL(client), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -126,10 +123,9 @@ func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
_, result.Err = perigee.Request("PUT", resourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("PUT", resourceURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -140,9 +136,8 @@ func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder
|
|||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("GET", resourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("GET", resourceURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -153,8 +148,7 @@ func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
|||||||
func Delete(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
func Delete(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
||||||
var result gophercloud.ErrResult
|
var result gophercloud.ErrResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("DELETE", resourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("DELETE", resourceURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -222,7 +216,7 @@ func (opts CreateRuleOpts) ToRuleCreateMap() (map[string]interface{}, error) {
|
|||||||
rule["cidr"] = opts.CIDR
|
rule["cidr"] = opts.CIDR
|
||||||
}
|
}
|
||||||
if opts.FromGroupID != "" {
|
if opts.FromGroupID != "" {
|
||||||
rule["from_group_id"] = opts.FromGroupID
|
rule["group_id"] = opts.FromGroupID
|
||||||
}
|
}
|
||||||
|
|
||||||
return map[string]interface{}{"security_group_rule": rule}, nil
|
return map[string]interface{}{"security_group_rule": rule}, nil
|
||||||
@@ -240,10 +234,9 @@ func CreateRule(client *gophercloud.ServiceClient, opts CreateRuleOptsBuilder) C
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", rootRuleURL(client), perigee.Options{
|
_, result.Err = client.Request("POST", rootRuleURL(client), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -254,8 +247,7 @@ func CreateRule(client *gophercloud.ServiceClient, opts CreateRuleOptsBuilder) C
|
|||||||
func DeleteRule(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
func DeleteRule(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
||||||
var result gophercloud.ErrResult
|
var result gophercloud.ErrResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("DELETE", resourceRuleURL(client, id), perigee.Options{
|
_, result.Err = client.Request("DELETE", resourceRuleURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -273,10 +265,9 @@ func actionMap(prefix, groupName string) map[string]map[string]string {
|
|||||||
func AddServerToGroup(client *gophercloud.ServiceClient, serverID, groupName string) gophercloud.ErrResult {
|
func AddServerToGroup(client *gophercloud.ServiceClient, serverID, groupName string) gophercloud.ErrResult {
|
||||||
var result gophercloud.ErrResult
|
var result gophercloud.ErrResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", serverActionURL(client, serverID), perigee.Options{
|
_, result.Err = client.Request("POST", serverActionURL(client, serverID), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: actionMap("add", groupName),
|
JSONBody: actionMap("add", groupName),
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -287,10 +278,9 @@ func AddServerToGroup(client *gophercloud.ServiceClient, serverID, groupName str
|
|||||||
func RemoveServerFromGroup(client *gophercloud.ServiceClient, serverID, groupName string) gophercloud.ErrResult {
|
func RemoveServerFromGroup(client *gophercloud.ServiceClient, serverID, groupName string) gophercloud.ErrResult {
|
||||||
var result gophercloud.ErrResult
|
var result gophercloud.ErrResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", serverActionURL(client, serverID), perigee.Options{
|
_, result.Err = client.Request("POST", serverActionURL(client, serverID), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: actionMap("remove", groupName),
|
JSONBody: actionMap("remove", groupName),
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@ func rootURL(c *gophercloud.ServiceClient) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func listByServerURL(c *gophercloud.ServiceClient, serverID string) string {
|
func listByServerURL(c *gophercloud.ServiceClient, serverID string) string {
|
||||||
return c.ServiceURL(secgrouppath, "servers", serverID, secgrouppath)
|
return c.ServiceURL("servers", serverID, secgrouppath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func rootRuleURL(c *gophercloud.ServiceClient) string {
|
func rootRuleURL(c *gophercloud.ServiceClient) string {
|
||||||
|
@@ -1,9 +1,6 @@
|
|||||||
package startstop
|
package startstop
|
||||||
|
|
||||||
import (
|
import "github.com/rackspace/gophercloud"
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
|
||||||
)
|
|
||||||
|
|
||||||
func actionURL(client *gophercloud.ServiceClient, id string) string {
|
func actionURL(client *gophercloud.ServiceClient, id string) string {
|
||||||
return client.ServiceURL("servers", id, "action")
|
return client.ServiceURL("servers", id, "action")
|
||||||
@@ -15,9 +12,8 @@ func Start(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
|||||||
|
|
||||||
reqBody := map[string]interface{}{"os-start": nil}
|
reqBody := map[string]interface{}{"os-start": nil}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: reqBody,
|
||||||
ReqBody: reqBody,
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -30,9 +26,8 @@ func Stop(client *gophercloud.ServiceClient, id string) gophercloud.ErrResult {
|
|||||||
|
|
||||||
reqBody := map[string]interface{}{"os-stop": nil}
|
reqBody := map[string]interface{}{"os-stop": nil}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: reqBody,
|
||||||
ReqBody: reqBody,
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
3
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/doc.go
generated
vendored
Normal file
3
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/doc.go
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Package volumeattach provides the ability to attach and detach volumes
|
||||||
|
// to instances
|
||||||
|
package volumeattach
|
138
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/fixtures.go
generated
vendored
Normal file
138
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/fixtures.go
generated
vendored
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
// +build fixtures
|
||||||
|
|
||||||
|
package volumeattach
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
"github.com/rackspace/gophercloud/testhelper/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListOutput is a sample response to a List call.
|
||||||
|
const ListOutput = `
|
||||||
|
{
|
||||||
|
"volumeAttachments": [
|
||||||
|
{
|
||||||
|
"device": "/dev/vdd",
|
||||||
|
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
|
||||||
|
"serverId": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"device": "/dev/vdc",
|
||||||
|
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
"serverId": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// GetOutput is a sample response to a Get call.
|
||||||
|
const GetOutput = `
|
||||||
|
{
|
||||||
|
"volumeAttachment": {
|
||||||
|
"device": "/dev/vdc",
|
||||||
|
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
"serverId": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// CreateOutput is a sample response to a Create call.
|
||||||
|
const CreateOutput = `
|
||||||
|
{
|
||||||
|
"volumeAttachment": {
|
||||||
|
"device": "/dev/vdc",
|
||||||
|
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
"serverId": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// FirstVolumeAttachment is the first result in ListOutput.
|
||||||
|
var FirstVolumeAttachment = VolumeAttachment{
|
||||||
|
Device: "/dev/vdd",
|
||||||
|
ID: "a26887c6-c47b-4654-abb5-dfadf7d3f803",
|
||||||
|
ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f803",
|
||||||
|
}
|
||||||
|
|
||||||
|
// SecondVolumeAttachment is the first result in ListOutput.
|
||||||
|
var SecondVolumeAttachment = VolumeAttachment{
|
||||||
|
Device: "/dev/vdc",
|
||||||
|
ID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExpectedVolumeAttachmentSlide is the slice of results that should be parsed
|
||||||
|
// from ListOutput, in the expected order.
|
||||||
|
var ExpectedVolumeAttachmentSlice = []VolumeAttachment{FirstVolumeAttachment, SecondVolumeAttachment}
|
||||||
|
|
||||||
|
// CreatedVolumeAttachment is the parsed result from CreatedOutput.
|
||||||
|
var CreatedVolumeAttachment = VolumeAttachment{
|
||||||
|
Device: "/dev/vdc",
|
||||||
|
ID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
|
||||||
|
VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleListSuccessfully configures the test server to respond to a List request.
|
||||||
|
func HandleListSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/servers/4d8c3732-a248-40ed-bebc-539a6ffd25c0/os-volume_attachments", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
fmt.Fprintf(w, ListOutput)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleGetSuccessfully configures the test server to respond to a Get request
|
||||||
|
// for an existing attachment
|
||||||
|
func HandleGetSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/servers/4d8c3732-a248-40ed-bebc-539a6ffd25c0/os-volume_attachments/a26887c6-c47b-4654-abb5-dfadf7d3f804", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
fmt.Fprintf(w, GetOutput)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleCreateSuccessfully configures the test server to respond to a Create request
|
||||||
|
// for a new attachment
|
||||||
|
func HandleCreateSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/servers/4d8c3732-a248-40ed-bebc-539a6ffd25c0/os-volume_attachments", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"volumeAttachment": {
|
||||||
|
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
"device": "/dev/vdc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
fmt.Fprintf(w, CreateOutput)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleDeleteSuccessfully configures the test server to respond to a Delete request for a
|
||||||
|
// an existing attachment
|
||||||
|
func HandleDeleteSuccessfully(t *testing.T) {
|
||||||
|
th.Mux.HandleFunc("/servers/4d8c3732-a248-40ed-bebc-539a6ffd25c0/os-volume_attachments/a26887c6-c47b-4654-abb5-dfadf7d3f804", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "DELETE")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusAccepted)
|
||||||
|
})
|
||||||
|
}
|
82
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/requests.go
generated
vendored
Normal file
82
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/requests.go
generated
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package volumeattach
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// List returns a Pager that allows you to iterate over a collection of VolumeAttachments.
|
||||||
|
func List(client *gophercloud.ServiceClient, serverId string) pagination.Pager {
|
||||||
|
return pagination.NewPager(client, listURL(client, serverId), func(r pagination.PageResult) pagination.Page {
|
||||||
|
return VolumeAttachmentsPage{pagination.SinglePageBase(r)}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOptsBuilder describes struct types that can be accepted by the Create call. Notable, the
|
||||||
|
// CreateOpts struct in this package does.
|
||||||
|
type CreateOptsBuilder interface {
|
||||||
|
ToVolumeAttachmentCreateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOpts specifies volume attachment creation or import parameters.
|
||||||
|
type CreateOpts struct {
|
||||||
|
// Device is the device that the volume will attach to the instance as. Omit for "auto"
|
||||||
|
Device string
|
||||||
|
|
||||||
|
// VolumeID is the ID of the volume to attach to the instance
|
||||||
|
VolumeID string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToVolumeAttachmentCreateMap constructs a request body from CreateOpts.
|
||||||
|
func (opts CreateOpts) ToVolumeAttachmentCreateMap() (map[string]interface{}, error) {
|
||||||
|
if opts.VolumeID == "" {
|
||||||
|
return nil, errors.New("Missing field required for volume attachment creation: VolumeID")
|
||||||
|
}
|
||||||
|
|
||||||
|
volumeAttachment := make(map[string]interface{})
|
||||||
|
volumeAttachment["volumeId"] = opts.VolumeID
|
||||||
|
if opts.Device != "" {
|
||||||
|
volumeAttachment["device"] = opts.Device
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"volumeAttachment": volumeAttachment}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create requests the creation of a new volume attachment on the server
|
||||||
|
func Create(client *gophercloud.ServiceClient, serverId string, opts CreateOptsBuilder) CreateResult {
|
||||||
|
var res CreateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToVolumeAttachmentCreateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
_, res.Err = client.Request("POST", createURL(client, serverId), gophercloud.RequestOpts{
|
||||||
|
JSONBody: reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns public data about a previously created VolumeAttachment.
|
||||||
|
func Get(client *gophercloud.ServiceClient, serverId, aId string) GetResult {
|
||||||
|
var res GetResult
|
||||||
|
_, res.Err = client.Request("GET", getURL(client, serverId, aId), gophercloud.RequestOpts{
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete requests the deletion of a previous stored VolumeAttachment from the server.
|
||||||
|
func Delete(client *gophercloud.ServiceClient, serverId, aId string) DeleteResult {
|
||||||
|
var res DeleteResult
|
||||||
|
_, res.Err = client.Request("DELETE", deleteURL(client, serverId, aId), gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{202},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
65
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/requests_test.go
generated
vendored
Normal file
65
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/requests_test.go
generated
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package volumeattach
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
"github.com/rackspace/gophercloud/testhelper/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestList(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleListSuccessfully(t)
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
err := List(client.ServiceClient(), serverId).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
count++
|
||||||
|
actual, err := ExtractVolumeAttachments(page)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, ExpectedVolumeAttachmentSlice, actual)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckEquals(t, 1, count)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleCreateSuccessfully(t)
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
actual, err := Create(client.ServiceClient(), serverId, CreateOpts{
|
||||||
|
Device: "/dev/vdc",
|
||||||
|
VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
|
||||||
|
}).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, &CreatedVolumeAttachment, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleGetSuccessfully(t)
|
||||||
|
aId := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
actual, err := Get(client.ServiceClient(), serverId, aId).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, &SecondVolumeAttachment, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDelete(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleDeleteSuccessfully(t)
|
||||||
|
aId := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
err := Delete(client.ServiceClient(), serverId, aId).ExtractErr()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
84
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/results.go
generated
vendored
Normal file
84
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/results.go
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package volumeattach
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// VolumeAttach controls the attachment of a volume to an instance.
|
||||||
|
type VolumeAttachment struct {
|
||||||
|
// ID is a unique id of the attachment
|
||||||
|
ID string `mapstructure:"id"`
|
||||||
|
|
||||||
|
// Device is what device the volume is attached as
|
||||||
|
Device string `mapstructure:"device"`
|
||||||
|
|
||||||
|
// VolumeID is the ID of the attached volume
|
||||||
|
VolumeID string `mapstructure:"volumeId"`
|
||||||
|
|
||||||
|
// ServerID is the ID of the instance that has the volume attached
|
||||||
|
ServerID string `mapstructure:"serverId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VolumeAttachmentsPage stores a single, only page of VolumeAttachments
|
||||||
|
// results from a List call.
|
||||||
|
type VolumeAttachmentsPage struct {
|
||||||
|
pagination.SinglePageBase
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty determines whether or not a VolumeAttachmentsPage is empty.
|
||||||
|
func (page VolumeAttachmentsPage) IsEmpty() (bool, error) {
|
||||||
|
va, err := ExtractVolumeAttachments(page)
|
||||||
|
return len(va) == 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractVolumeAttachments interprets a page of results as a slice of
|
||||||
|
// VolumeAttachments.
|
||||||
|
func ExtractVolumeAttachments(page pagination.Page) ([]VolumeAttachment, error) {
|
||||||
|
casted := page.(VolumeAttachmentsPage).Body
|
||||||
|
var response struct {
|
||||||
|
VolumeAttachments []VolumeAttachment `mapstructure:"volumeAttachments"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.WeakDecode(casted, &response)
|
||||||
|
|
||||||
|
return response.VolumeAttachments, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type VolumeAttachmentResult struct {
|
||||||
|
gophercloud.Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract is a method that attempts to interpret any VolumeAttachment resource
|
||||||
|
// response as a VolumeAttachment struct.
|
||||||
|
func (r VolumeAttachmentResult) Extract() (*VolumeAttachment, error) {
|
||||||
|
if r.Err != nil {
|
||||||
|
return nil, r.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
var res struct {
|
||||||
|
VolumeAttachment *VolumeAttachment `json:"volumeAttachment" mapstructure:"volumeAttachment"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(r.Body, &res)
|
||||||
|
return res.VolumeAttachment, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateResult is the response from a Create operation. Call its Extract method to interpret it
|
||||||
|
// as a VolumeAttachment.
|
||||||
|
type CreateResult struct {
|
||||||
|
VolumeAttachmentResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResult is the response from a Get operation. Call its Extract method to interpret it
|
||||||
|
// as a VolumeAttachment.
|
||||||
|
type GetResult struct {
|
||||||
|
VolumeAttachmentResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResult is the response from a Delete operation. Call its Extract method to determine if
|
||||||
|
// the call succeeded or failed.
|
||||||
|
type DeleteResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
25
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/urls.go
generated
vendored
Normal file
25
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/urls.go
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package volumeattach
|
||||||
|
|
||||||
|
import "github.com/rackspace/gophercloud"
|
||||||
|
|
||||||
|
const resourcePath = "os-volume_attachments"
|
||||||
|
|
||||||
|
func resourceURL(c *gophercloud.ServiceClient, serverId string) string {
|
||||||
|
return c.ServiceURL("servers", serverId, resourcePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func listURL(c *gophercloud.ServiceClient, serverId string) string {
|
||||||
|
return resourceURL(c, serverId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createURL(c *gophercloud.ServiceClient, serverId string) string {
|
||||||
|
return resourceURL(c, serverId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getURL(c *gophercloud.ServiceClient, serverId, aId string) string {
|
||||||
|
return c.ServiceURL("servers", serverId, resourcePath, aId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteURL(c *gophercloud.ServiceClient, serverId, aId string) string {
|
||||||
|
return getURL(c, serverId, aId)
|
||||||
|
}
|
46
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/urls_test.go
generated
vendored
Normal file
46
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/urls_test.go
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package volumeattach
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
"github.com/rackspace/gophercloud/testhelper/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestListURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"servers/"+serverId+"/os-volume_attachments", listURL(c, serverId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"servers/"+serverId+"/os-volume_attachments", createURL(c, serverId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
aId := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"servers/"+serverId+"/os-volume_attachments/"+aId, getURL(c, serverId, aId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeleteURL(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
c := client.ServiceClient()
|
||||||
|
serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
|
||||||
|
aId := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
|
||||||
|
|
||||||
|
th.CheckEquals(t, c.Endpoint+"servers/"+serverId+"/os-volume_attachments/"+aId, deleteURL(c, serverId, aId))
|
||||||
|
}
|
@@ -1,7 +1,6 @@
|
|||||||
package flavors
|
package flavors
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -64,9 +63,8 @@ func ListDetail(client *gophercloud.ServiceClient, opts ListOptsBuilder) paginat
|
|||||||
// Use ExtractFlavor to convert its result into a Flavor.
|
// Use ExtractFlavor to convert its result into a Flavor.
|
||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var gr GetResult
|
var gr GetResult
|
||||||
gr.Err = perigee.Get(getURL(client, id), perigee.Options{
|
_, gr.Err = client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &gr.Body,
|
JSONResponse: &gr.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return gr
|
return gr
|
||||||
}
|
}
|
||||||
|
@@ -3,8 +3,6 @@ package images
|
|||||||
import (
|
import (
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ListOptsBuilder allows extensions to add additional parameters to the
|
// ListOptsBuilder allows extensions to add additional parameters to the
|
||||||
@@ -22,7 +20,7 @@ type ListOpts struct {
|
|||||||
// UUID of the Image at which to set a marker.
|
// UUID of the Image at which to set a marker.
|
||||||
Marker string `q:"marker"`
|
Marker string `q:"marker"`
|
||||||
// The name of the Image.
|
// The name of the Image.
|
||||||
Name string `q:"name:"`
|
Name string `q:"name"`
|
||||||
// The name of the Server (in URL format).
|
// The name of the Server (in URL format).
|
||||||
Server string `q:"server"`
|
Server string `q:"server"`
|
||||||
// The current status of the Image.
|
// The current status of the Image.
|
||||||
@@ -62,9 +60,8 @@ func ListDetail(client *gophercloud.ServiceClient, opts ListOptsBuilder) paginat
|
|||||||
// Use ExtractImage() to interpret the result as an openstack Image.
|
// Use ExtractImage() to interpret the result as an openstack Image.
|
||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
_, result.Err = perigee.Request("GET", getURL(client, id), perigee.Options{
|
_, result.Err = client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONResponse: &result.Body,
|
||||||
Results: &result.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
|
@@ -285,6 +285,11 @@ var (
|
|||||||
Created: "2014-09-25T13:10:02Z",
|
Created: "2014-09-25T13:10:02Z",
|
||||||
TenantID: "fcad67a6189847c4aecfa3c81a05783b",
|
TenantID: "fcad67a6189847c4aecfa3c81a05783b",
|
||||||
Metadata: map[string]interface{}{},
|
Metadata: map[string]interface{}{},
|
||||||
|
SecurityGroups: []map[string]interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"name": "default",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServerDerp is a Server struct that should correspond to the second server in ServerListBody.
|
// ServerDerp is a Server struct that should correspond to the second server in ServerListBody.
|
||||||
@@ -336,6 +341,11 @@ var (
|
|||||||
Created: "2014-09-25T13:04:41Z",
|
Created: "2014-09-25T13:04:41Z",
|
||||||
TenantID: "fcad67a6189847c4aecfa3c81a05783b",
|
TenantID: "fcad67a6189847c4aecfa3c81a05783b",
|
||||||
Metadata: map[string]interface{}{},
|
Metadata: map[string]interface{}{},
|
||||||
|
SecurityGroups: []map[string]interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"name": "default",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -5,7 +5,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -217,10 +216,9 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", listURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", listURL(client), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
ReqBody: reqBody,
|
JSONBody: reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -229,8 +227,7 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
// Delete requests that a server previously provisioned be removed from your account.
|
// Delete requests that a server previously provisioned be removed from your account.
|
||||||
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(client, id), perigee.Options{
|
_, res.Err = client.Request("DELETE", deleteURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -239,9 +236,8 @@ func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
|||||||
// Get requests details on a single server, by ID.
|
// Get requests details on a single server, by ID.
|
||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
_, result.Err = perigee.Request("GET", getURL(client, id), perigee.Options{
|
_, result.Err = client.Request("GET", getURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200, 203},
|
OkCodes: []int{200, 203},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -284,10 +280,9 @@ func (opts UpdateOpts) ToServerUpdateMap() map[string]interface{} {
|
|||||||
// Update requests that various attributes of the indicated server be changed.
|
// Update requests that various attributes of the indicated server be changed.
|
||||||
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
||||||
var result UpdateResult
|
var result UpdateResult
|
||||||
_, result.Err = perigee.Request("PUT", updateURL(client, id), perigee.Options{
|
_, result.Err = client.Request("PUT", updateURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: opts.ToServerUpdateMap(),
|
JSONBody: opts.ToServerUpdateMap(),
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@@ -304,9 +299,8 @@ func ChangeAdminPassword(client *gophercloud.ServiceClient, id, newPassword stri
|
|||||||
|
|
||||||
var res ActionResult
|
var res ActionResult
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: req,
|
JSONBody: req,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -373,13 +367,12 @@ func Reboot(client *gophercloud.ServiceClient, id string, how RebootMethod) Acti
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: struct {
|
JSONBody: struct {
|
||||||
C map[string]string `json:"reboot"`
|
C map[string]string `json:"reboot"`
|
||||||
}{
|
}{
|
||||||
map[string]string{"type": string(how)},
|
map[string]string{"type": string(how)},
|
||||||
},
|
},
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -475,10 +468,9 @@ func Rebuild(client *gophercloud.ServiceClient, id string, opts RebuildOptsBuild
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, result.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -522,9 +514,8 @@ func Resize(client *gophercloud.ServiceClient, id string, opts ResizeOptsBuilder
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: reqBody,
|
JSONBody: reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -536,9 +527,8 @@ func Resize(client *gophercloud.ServiceClient, id string, opts ResizeOptsBuilder
|
|||||||
func ConfirmResize(client *gophercloud.ServiceClient, id string) ActionResult {
|
func ConfirmResize(client *gophercloud.ServiceClient, id string) ActionResult {
|
||||||
var res ActionResult
|
var res ActionResult
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: map[string]interface{}{"confirmResize": nil},
|
JSONBody: map[string]interface{}{"confirmResize": nil},
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -550,9 +540,8 @@ func ConfirmResize(client *gophercloud.ServiceClient, id string) ActionResult {
|
|||||||
func RevertResize(client *gophercloud.ServiceClient, id string) ActionResult {
|
func RevertResize(client *gophercloud.ServiceClient, id string) ActionResult {
|
||||||
var res ActionResult
|
var res ActionResult
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: map[string]interface{}{"revertResize": nil},
|
JSONBody: map[string]interface{}{"revertResize": nil},
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{202},
|
OkCodes: []int{202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -597,10 +586,9 @@ func Rescue(client *gophercloud.ServiceClient, id string, opts RescueOptsBuilder
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
_, result.Err = perigee.Request("POST", actionURL(client, id), perigee.Options{
|
_, result.Err = client.Request("POST", actionURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: &reqBody,
|
JSONBody: &reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -637,10 +625,9 @@ func ResetMetadata(client *gophercloud.ServiceClient, id string, opts ResetMetad
|
|||||||
res.Err = err
|
res.Err = err
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
_, res.Err = perigee.Request("PUT", metadataURL(client, id), perigee.Options{
|
_, res.Err = client.Request("PUT", metadataURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: metadata,
|
JSONBody: metadata,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -648,9 +635,8 @@ func ResetMetadata(client *gophercloud.ServiceClient, id string, opts ResetMetad
|
|||||||
// Metadata requests all the metadata for the given server ID.
|
// Metadata requests all the metadata for the given server ID.
|
||||||
func Metadata(client *gophercloud.ServiceClient, id string) GetMetadataResult {
|
func Metadata(client *gophercloud.ServiceClient, id string) GetMetadataResult {
|
||||||
var res GetMetadataResult
|
var res GetMetadataResult
|
||||||
_, res.Err = perigee.Request("GET", metadataURL(client, id), perigee.Options{
|
_, res.Err = client.Request("GET", metadataURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -671,10 +657,9 @@ func UpdateMetadata(client *gophercloud.ServiceClient, id string, opts UpdateMet
|
|||||||
res.Err = err
|
res.Err = err
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
_, res.Err = perigee.Request("POST", metadataURL(client, id), perigee.Options{
|
_, res.Err = client.Request("POST", metadataURL(client, id), gophercloud.RequestOpts{
|
||||||
ReqBody: metadata,
|
JSONBody: metadata,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -710,10 +695,9 @@ func CreateMetadatum(client *gophercloud.ServiceClient, id string, opts Metadatu
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", metadatumURL(client, id, key), perigee.Options{
|
_, res.Err = client.Request("PUT", metadatumURL(client, id, key), gophercloud.RequestOpts{
|
||||||
ReqBody: metadatum,
|
JSONBody: metadatum,
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -721,9 +705,8 @@ func CreateMetadatum(client *gophercloud.ServiceClient, id string, opts Metadatu
|
|||||||
// Metadatum requests the key-value pair with the given key for the given server ID.
|
// Metadatum requests the key-value pair with the given key for the given server ID.
|
||||||
func Metadatum(client *gophercloud.ServiceClient, id, key string) GetMetadatumResult {
|
func Metadatum(client *gophercloud.ServiceClient, id, key string) GetMetadatumResult {
|
||||||
var res GetMetadatumResult
|
var res GetMetadatumResult
|
||||||
_, res.Err = perigee.Request("GET", metadatumURL(client, id, key), perigee.Options{
|
_, res.Err = client.Request("GET", metadatumURL(client, id, key), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -731,9 +714,8 @@ func Metadatum(client *gophercloud.ServiceClient, id, key string) GetMetadatumRe
|
|||||||
// DeleteMetadatum will delete the key-value pair with the given key for the given server ID.
|
// DeleteMetadatum will delete the key-value pair with the given key for the given server ID.
|
||||||
func DeleteMetadatum(client *gophercloud.ServiceClient, id, key string) DeleteMetadatumResult {
|
func DeleteMetadatum(client *gophercloud.ServiceClient, id, key string) DeleteMetadatumResult {
|
||||||
var res DeleteMetadatumResult
|
var res DeleteMetadatumResult
|
||||||
_, res.Err = perigee.Request("DELETE", metadatumURL(client, id, key), perigee.Options{
|
_, res.Err = client.Request("DELETE", metadatumURL(client, id, key), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
@@ -39,6 +39,19 @@ func TestListServers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListAllServers(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
HandleServerListSuccessfully(t)
|
||||||
|
|
||||||
|
allPages, err := List(client.ServiceClient(), ListOpts{}).AllPages()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
actual, err := ExtractServers(allPages)
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
th.CheckDeepEquals(t, ServerHerp, actual[0])
|
||||||
|
th.CheckDeepEquals(t, ServerDerp, actual[1])
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateServer(t *testing.T) {
|
func TestCreateServer(t *testing.T) {
|
||||||
th.SetupHTTP()
|
th.SetupHTTP()
|
||||||
defer th.TeardownHTTP()
|
defer th.TeardownHTTP()
|
||||||
|
@@ -139,6 +139,9 @@ type Server struct {
|
|||||||
// AdminPass will generally be empty (""). However, it will contain the administrative password chosen when provisioning a new server without a set AdminPass setting in the first place.
|
// AdminPass will generally be empty (""). However, it will contain the administrative password chosen when provisioning a new server without a set AdminPass setting in the first place.
|
||||||
// Note that this is the ONLY time this field will be valid.
|
// Note that this is the ONLY time this field will be valid.
|
||||||
AdminPass string `json:"adminPass" mapstructure:"adminPass"`
|
AdminPass string `json:"adminPass" mapstructure:"adminPass"`
|
||||||
|
|
||||||
|
// SecurityGroups includes the security groups that this instance has applied to it
|
||||||
|
SecurityGroups []map[string]interface{} `json:"security_groups" mapstructure:"security_groups"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServerPage abstracts the raw results of making a List() request against the API.
|
// ServerPage abstracts the raw results of making a List() request against the API.
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package roles
|
package roles
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -21,8 +20,7 @@ func List(client *gophercloud.ServiceClient) pagination.Pager {
|
|||||||
func AddUserRole(client *gophercloud.ServiceClient, tenantID, userID, roleID string) UserRoleResult {
|
func AddUserRole(client *gophercloud.ServiceClient, tenantID, userID, roleID string) UserRoleResult {
|
||||||
var result UserRoleResult
|
var result UserRoleResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("PUT", userRoleURL(client, tenantID, userID, roleID), perigee.Options{
|
_, result.Err = client.Request("PUT", userRoleURL(client, tenantID, userID, roleID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -35,8 +33,7 @@ func AddUserRole(client *gophercloud.ServiceClient, tenantID, userID, roleID str
|
|||||||
func DeleteUserRole(client *gophercloud.ServiceClient, tenantID, userID, roleID string) UserRoleResult {
|
func DeleteUserRole(client *gophercloud.ServiceClient, tenantID, userID, roleID string) UserRoleResult {
|
||||||
var result UserRoleResult
|
var result UserRoleResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("DELETE", userRoleURL(client, tenantID, userID, roleID), perigee.Options{
|
_, result.Err = client.Request("DELETE", userRoleURL(client, tenantID, userID, roleID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,9 +1,6 @@
|
|||||||
package tokens
|
package tokens
|
||||||
|
|
||||||
import (
|
import "github.com/rackspace/gophercloud"
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuthOptionsBuilder describes any argument that may be passed to the Create call.
|
// AuthOptionsBuilder describes any argument that may be passed to the Create call.
|
||||||
type AuthOptionsBuilder interface {
|
type AuthOptionsBuilder interface {
|
||||||
@@ -78,9 +75,9 @@ func Create(client *gophercloud.ServiceClient, auth AuthOptionsBuilder) CreateRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
var result CreateResult
|
var result CreateResult
|
||||||
_, result.Err = perigee.Request("POST", CreateURL(client), perigee.Options{
|
_, result.Err = client.Request("POST", CreateURL(client), gophercloud.RequestOpts{
|
||||||
ReqBody: &request,
|
JSONBody: &request,
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
OkCodes: []int{200, 203},
|
OkCodes: []int{200, 203},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
|
@@ -3,7 +3,6 @@ package users
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -91,10 +90,9 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", rootURL(client), perigee.Options{
|
_, res.Err = client.Request("POST", rootURL(client), gophercloud.RequestOpts{
|
||||||
Results: &res.Body,
|
JSONResponse: &res.Body,
|
||||||
ReqBody: reqBody,
|
JSONBody: reqBody,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -105,9 +103,8 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateRes
|
|||||||
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
func Get(client *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("GET", ResourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("GET", ResourceURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -149,10 +146,9 @@ func (opts UpdateOpts) ToUserUpdateMap() map[string]interface{} {
|
|||||||
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
||||||
var result UpdateResult
|
var result UpdateResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("PUT", ResourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("PUT", ResourceURL(client, id), gophercloud.RequestOpts{
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
ReqBody: opts.ToUserUpdateMap(),
|
JSONBody: opts.ToUserUpdateMap(),
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -163,8 +159,7 @@ func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder
|
|||||||
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var result DeleteResult
|
var result DeleteResult
|
||||||
|
|
||||||
_, result.Err = perigee.Request("DELETE", ResourceURL(client, id), perigee.Options{
|
_, result.Err = client.Request("DELETE", ResourceURL(client, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -57,10 +56,9 @@ func Create(client *gophercloud.ServiceClient, opts EndpointOpts) CreateResult {
|
|||||||
reqBody.Endpoint.Region = gophercloud.MaybeString(opts.Region)
|
reqBody.Endpoint.Region = gophercloud.MaybeString(opts.Region)
|
||||||
|
|
||||||
var result CreateResult
|
var result CreateResult
|
||||||
_, result.Err = perigee.Request("POST", listURL(client), perigee.Options{
|
_, result.Err = client.Request("POST", listURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &result.Body,
|
||||||
Results: &result.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -113,10 +111,9 @@ func Update(client *gophercloud.ServiceClient, endpointID string, opts EndpointO
|
|||||||
reqBody.Endpoint.ServiceID = gophercloud.MaybeString(opts.ServiceID)
|
reqBody.Endpoint.ServiceID = gophercloud.MaybeString(opts.ServiceID)
|
||||||
|
|
||||||
var result UpdateResult
|
var result UpdateResult
|
||||||
_, result.Err = perigee.Request("PATCH", endpointURL(client, endpointID), perigee.Options{
|
_, result.Err = client.Request("PATCH", endpointURL(client, endpointID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &result.Body,
|
||||||
Results: &result.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -125,8 +122,7 @@ func Update(client *gophercloud.ServiceClient, endpointID string, opts EndpointO
|
|||||||
// Delete removes an endpoint from the service catalog.
|
// Delete removes an endpoint from the service catalog.
|
||||||
func Delete(client *gophercloud.ServiceClient, endpointID string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, endpointID string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", endpointURL(client, endpointID), perigee.Options{
|
_, res.Err = client.Request("DELETE", endpointURL(client, endpointID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package services
|
package services
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -19,10 +18,9 @@ func Create(client *gophercloud.ServiceClient, serviceType string) CreateResult
|
|||||||
req := request{Type: serviceType}
|
req := request{Type: serviceType}
|
||||||
|
|
||||||
var result CreateResult
|
var result CreateResult
|
||||||
_, result.Err = perigee.Request("POST", listURL(client), perigee.Options{
|
_, result.Err = client.Request("POST", listURL(client), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: &req,
|
||||||
ReqBody: &req,
|
JSONResponse: &result.Body,
|
||||||
Results: &result.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -53,9 +51,8 @@ func List(client *gophercloud.ServiceClient, opts ListOpts) pagination.Pager {
|
|||||||
// Get returns additional information about a service, given its ID.
|
// Get returns additional information about a service, given its ID.
|
||||||
func Get(client *gophercloud.ServiceClient, serviceID string) GetResult {
|
func Get(client *gophercloud.ServiceClient, serviceID string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
_, result.Err = perigee.Request("GET", serviceURL(client, serviceID), perigee.Options{
|
_, result.Err = client.Request("GET", serviceURL(client, serviceID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONResponse: &result.Body,
|
||||||
Results: &result.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -70,10 +67,9 @@ func Update(client *gophercloud.ServiceClient, serviceID string, serviceType str
|
|||||||
req := request{Type: serviceType}
|
req := request{Type: serviceType}
|
||||||
|
|
||||||
var result UpdateResult
|
var result UpdateResult
|
||||||
_, result.Err = perigee.Request("PATCH", serviceURL(client, serviceID), perigee.Options{
|
_, result.Err = client.Request("PATCH", serviceURL(client, serviceID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
JSONBody: &req,
|
||||||
ReqBody: &req,
|
JSONResponse: &result.Body,
|
||||||
Results: &result.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -83,8 +79,7 @@ func Update(client *gophercloud.ServiceClient, serviceID string, serviceType str
|
|||||||
// It either deletes all associated endpoints, or fails until all endpoints are deleted.
|
// It either deletes all associated endpoints, or fails until all endpoints are deleted.
|
||||||
func Delete(client *gophercloud.ServiceClient, serviceID string) DeleteResult {
|
func Delete(client *gophercloud.ServiceClient, serviceID string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", serviceURL(client, serviceID), perigee.Options{
|
_, res.Err = client.Request("DELETE", serviceURL(client, serviceID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: client.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
package tokens
|
package tokens
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
"net/http"
|
||||||
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -233,38 +234,38 @@ func Create(c *gophercloud.ServiceClient, options gophercloud.AuthOptions, scope
|
|||||||
}
|
}
|
||||||
|
|
||||||
var result CreateResult
|
var result CreateResult
|
||||||
var response *perigee.Response
|
var response *http.Response
|
||||||
response, result.Err = perigee.Request("POST", tokenURL(c), perigee.Options{
|
response, result.Err = c.Request("POST", tokenURL(c), gophercloud.RequestOpts{
|
||||||
ReqBody: &req,
|
JSONBody: &req,
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
if result.Err != nil {
|
if result.Err != nil {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
result.Header = response.HttpResponse.Header
|
result.Header = response.Header
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get validates and retrieves information about another token.
|
// Get validates and retrieves information about another token.
|
||||||
func Get(c *gophercloud.ServiceClient, token string) GetResult {
|
func Get(c *gophercloud.ServiceClient, token string) GetResult {
|
||||||
var result GetResult
|
var result GetResult
|
||||||
var response *perigee.Response
|
var response *http.Response
|
||||||
response, result.Err = perigee.Request("GET", tokenURL(c), perigee.Options{
|
response, result.Err = c.Request("GET", tokenURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: subjectTokenHeaders(c, token),
|
MoreHeaders: subjectTokenHeaders(c, token),
|
||||||
Results: &result.Body,
|
JSONResponse: &result.Body,
|
||||||
OkCodes: []int{200, 203},
|
OkCodes: []int{200, 203},
|
||||||
})
|
})
|
||||||
if result.Err != nil {
|
if result.Err != nil {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
result.Header = response.HttpResponse.Header
|
result.Header = response.Header
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate determines if a specified token is valid or not.
|
// Validate determines if a specified token is valid or not.
|
||||||
func Validate(c *gophercloud.ServiceClient, token string) (bool, error) {
|
func Validate(c *gophercloud.ServiceClient, token string) (bool, error) {
|
||||||
response, err := perigee.Request("HEAD", tokenURL(c), perigee.Options{
|
response, err := c.Request("HEAD", tokenURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: subjectTokenHeaders(c, token),
|
MoreHeaders: subjectTokenHeaders(c, token),
|
||||||
OkCodes: []int{204, 404},
|
OkCodes: []int{204, 404},
|
||||||
})
|
})
|
||||||
@@ -278,7 +279,7 @@ func Validate(c *gophercloud.ServiceClient, token string) (bool, error) {
|
|||||||
// Revoke immediately makes specified token invalid.
|
// Revoke immediately makes specified token invalid.
|
||||||
func Revoke(c *gophercloud.ServiceClient, token string) RevokeResult {
|
func Revoke(c *gophercloud.ServiceClient, token string) RevokeResult {
|
||||||
var res RevokeResult
|
var res RevokeResult
|
||||||
_, res.Err = perigee.Request("DELETE", tokenURL(c), perigee.Options{
|
_, res.Err = c.Request("DELETE", tokenURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: subjectTokenHeaders(c, token),
|
MoreHeaders: subjectTokenHeaders(c, token),
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
|
3
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/doc.go
generated
vendored
Normal file
3
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/doc.go
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Package fwaas provides information and interaction with the Firewall
|
||||||
|
// as a Service extension for the OpenStack Networking service.
|
||||||
|
package fwaas
|
11
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/errors.go
generated
vendored
Normal file
11
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/errors.go
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package firewalls
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func err(str string) error {
|
||||||
|
return fmt.Errorf("%s", str)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
errPolicyRequired = err("A policy ID is required")
|
||||||
|
)
|
227
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/requests.go
generated
vendored
Normal file
227
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/requests.go
generated
vendored
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
package firewalls
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AdminState gives users a solid type to work with for create and update
|
||||||
|
// operations. It is recommended that users use the `Up` and `Down` enums.
|
||||||
|
type AdminState *bool
|
||||||
|
|
||||||
|
// Shared gives users a solid type to work with for create and update
|
||||||
|
// operations. It is recommended that users use the `Yes` and `No` enums.
|
||||||
|
type Shared *bool
|
||||||
|
|
||||||
|
// Convenience vars for AdminStateUp and Shared values.
|
||||||
|
var (
|
||||||
|
iTrue = true
|
||||||
|
iFalse = false
|
||||||
|
Up AdminState = &iTrue
|
||||||
|
Down AdminState = &iFalse
|
||||||
|
Yes Shared = &iTrue
|
||||||
|
No Shared = &iFalse
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListOptsBuilder allows extensions to add additional parameters to the
|
||||||
|
// List request.
|
||||||
|
type ListOptsBuilder interface {
|
||||||
|
ToFirewallListQuery() (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOpts allows the filtering and sorting of paginated collections through
|
||||||
|
// the API. Filtering is achieved by passing in struct field values that map to
|
||||||
|
// the firewall attributes you want to see returned. SortKey allows you to sort
|
||||||
|
// by a particular firewall attribute. SortDir sets the direction, and is either
|
||||||
|
// `asc' or `desc'. Marker and Limit are used for pagination.
|
||||||
|
type ListOpts struct {
|
||||||
|
TenantID string `q:"tenant_id"`
|
||||||
|
Name string `q:"name"`
|
||||||
|
Description string `q:"description"`
|
||||||
|
AdminStateUp bool `q:"admin_state_up"`
|
||||||
|
Shared bool `q:"shared"`
|
||||||
|
PolicyID string `q:"firewall_policy_id"`
|
||||||
|
ID string `q:"id"`
|
||||||
|
Limit int `q:"limit"`
|
||||||
|
Marker string `q:"marker"`
|
||||||
|
SortKey string `q:"sort_key"`
|
||||||
|
SortDir string `q:"sort_dir"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFirewallListQuery formats a ListOpts into a query string.
|
||||||
|
func (opts ListOpts) ToFirewallListQuery() (string, error) {
|
||||||
|
q, err := gophercloud.BuildQueryString(opts)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return q.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns a Pager which allows you to iterate over a collection of
|
||||||
|
// firewalls. It accepts a ListOpts struct, which allows you to filter
|
||||||
|
// and sort the returned collection for greater efficiency.
|
||||||
|
//
|
||||||
|
// Default policy settings return only those firewalls that are owned by the
|
||||||
|
// tenant who submits the request, unless an admin user submits the request.
|
||||||
|
func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
||||||
|
url := rootURL(c)
|
||||||
|
|
||||||
|
if opts != nil {
|
||||||
|
query, err := opts.ToFirewallListQuery()
|
||||||
|
if err != nil {
|
||||||
|
return pagination.Pager{Err: err}
|
||||||
|
}
|
||||||
|
url += query
|
||||||
|
}
|
||||||
|
|
||||||
|
return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page {
|
||||||
|
return FirewallPage{pagination.LinkedPageBase{PageResult: r}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOptsBuilder is the interface options structs have to satisfy in order
|
||||||
|
// to be used in the main Create operation in this package. Since many
|
||||||
|
// extensions decorate or modify the common logic, it is useful for them to
|
||||||
|
// satisfy a basic interface in order for them to be used.
|
||||||
|
type CreateOptsBuilder interface {
|
||||||
|
ToFirewallCreateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOpts contains all the values needed to create a new firewall.
|
||||||
|
type CreateOpts struct {
|
||||||
|
// Only required if the caller has an admin role and wants to create a firewall
|
||||||
|
// for another tenant.
|
||||||
|
TenantID string
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
AdminStateUp *bool
|
||||||
|
Shared *bool
|
||||||
|
PolicyID string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFirewallCreateMap casts a CreateOpts struct to a map.
|
||||||
|
func (opts CreateOpts) ToFirewallCreateMap() (map[string]interface{}, error) {
|
||||||
|
if opts.PolicyID == "" {
|
||||||
|
return nil, errPolicyRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
f := make(map[string]interface{})
|
||||||
|
|
||||||
|
if opts.TenantID != "" {
|
||||||
|
f["tenant_id"] = opts.TenantID
|
||||||
|
}
|
||||||
|
if opts.Name != "" {
|
||||||
|
f["name"] = opts.Name
|
||||||
|
}
|
||||||
|
if opts.Description != "" {
|
||||||
|
f["description"] = opts.Description
|
||||||
|
}
|
||||||
|
if opts.Shared != nil {
|
||||||
|
f["shared"] = *opts.Shared
|
||||||
|
}
|
||||||
|
if opts.AdminStateUp != nil {
|
||||||
|
f["admin_state_up"] = *opts.AdminStateUp
|
||||||
|
}
|
||||||
|
if opts.PolicyID != "" {
|
||||||
|
f["firewall_policy_id"] = opts.PolicyID
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"firewall": f}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create accepts a CreateOpts struct and uses the values to create a new firewall
|
||||||
|
func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
||||||
|
var res CreateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToFirewallCreateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{201},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves a particular firewall based on its unique ID.
|
||||||
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
|
var res GetResult
|
||||||
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOptsBuilder is the interface options structs have to satisfy in order
|
||||||
|
// to be used in the main Update operation in this package. Since many
|
||||||
|
// extensions decorate or modify the common logic, it is useful for them to
|
||||||
|
// satisfy a basic interface in order for them to be used.
|
||||||
|
type UpdateOptsBuilder interface {
|
||||||
|
ToFirewallUpdateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOpts contains the values used when updating a firewall.
|
||||||
|
type UpdateOpts struct {
|
||||||
|
// Name of the firewall.
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
AdminStateUp *bool
|
||||||
|
Shared *bool
|
||||||
|
PolicyID string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFirewallUpdateMap casts a CreateOpts struct to a map.
|
||||||
|
func (opts UpdateOpts) ToFirewallUpdateMap() (map[string]interface{}, error) {
|
||||||
|
f := make(map[string]interface{})
|
||||||
|
|
||||||
|
if opts.Name != "" {
|
||||||
|
f["name"] = opts.Name
|
||||||
|
}
|
||||||
|
if opts.Description != "" {
|
||||||
|
f["description"] = opts.Description
|
||||||
|
}
|
||||||
|
if opts.Shared != nil {
|
||||||
|
f["shared"] = *opts.Shared
|
||||||
|
}
|
||||||
|
if opts.AdminStateUp != nil {
|
||||||
|
f["admin_state_up"] = *opts.AdminStateUp
|
||||||
|
}
|
||||||
|
if opts.PolicyID != "" {
|
||||||
|
f["firewall_policy_id"] = opts.PolicyID
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"firewall": f}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update allows firewalls to be updated.
|
||||||
|
func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
||||||
|
var res UpdateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToFirewallUpdateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send request to API
|
||||||
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete will permanently delete a particular firewall based on its unique ID.
|
||||||
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
|
var res DeleteResult
|
||||||
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{204},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
246
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/requests_test.go
generated
vendored
Normal file
246
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/requests_test.go
generated
vendored
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
package firewalls
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
fake "github.com/rackspace/gophercloud/openstack/networking/v2/common"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestURLs(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.AssertEquals(t, th.Endpoint()+"v2.0/fw/firewalls", rootURL(fake.ServiceClient()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestList(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewalls", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewalls":[
|
||||||
|
{
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"name": "fw1",
|
||||||
|
"admin_state_up": false,
|
||||||
|
"tenant_id": "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
"firewall_policy_id": "34be8c83-4d42-4dca-a74e-b77fffb8e28a",
|
||||||
|
"id": "fb5b5315-64f6-4ea3-8e58-981cc37c6f61",
|
||||||
|
"description": "OpenStack firewall 1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"status": "PENDING_UPDATE",
|
||||||
|
"name": "fw2",
|
||||||
|
"admin_state_up": true,
|
||||||
|
"tenant_id": "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
"firewall_policy_id": "34be8c83-4d42-4dca-a74e-b77fffb8e299",
|
||||||
|
"id": "fb5b5315-64f6-4ea3-8e58-981cc37c6f99",
|
||||||
|
"description": "OpenStack firewall 2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
count++
|
||||||
|
actual, err := ExtractFirewalls(page)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed to extract members: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []Firewall{
|
||||||
|
Firewall{
|
||||||
|
Status: "ACTIVE",
|
||||||
|
Name: "fw1",
|
||||||
|
AdminStateUp: false,
|
||||||
|
TenantID: "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
PolicyID: "34be8c83-4d42-4dca-a74e-b77fffb8e28a",
|
||||||
|
ID: "fb5b5315-64f6-4ea3-8e58-981cc37c6f61",
|
||||||
|
Description: "OpenStack firewall 1",
|
||||||
|
},
|
||||||
|
Firewall{
|
||||||
|
Status: "PENDING_UPDATE",
|
||||||
|
Name: "fw2",
|
||||||
|
AdminStateUp: true,
|
||||||
|
TenantID: "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
PolicyID: "34be8c83-4d42-4dca-a74e-b77fffb8e299",
|
||||||
|
ID: "fb5b5315-64f6-4ea3-8e58-981cc37c6f99",
|
||||||
|
Description: "OpenStack firewall 2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
th.CheckDeepEquals(t, expected, actual)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if count != 1 {
|
||||||
|
t.Errorf("Expected 1 page, got %d", count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewalls", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"firewall":{
|
||||||
|
"name": "fw",
|
||||||
|
"description": "OpenStack firewall",
|
||||||
|
"admin_state_up": true,
|
||||||
|
"firewall_policy_id": "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c",
|
||||||
|
"tenant_id": "b4eedccc6fb74fa8a7ad6b08382b852b"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall":{
|
||||||
|
"status": "PENDING_CREATE",
|
||||||
|
"name": "fw",
|
||||||
|
"description": "OpenStack firewall",
|
||||||
|
"admin_state_up": true,
|
||||||
|
"tenant_id": "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
"firewall_policy_id": "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
options := CreateOpts{
|
||||||
|
TenantID: "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
Name: "fw",
|
||||||
|
Description: "OpenStack firewall",
|
||||||
|
AdminStateUp: Up,
|
||||||
|
PolicyID: "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c",
|
||||||
|
}
|
||||||
|
_, err := Create(fake.ServiceClient(), options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewalls/fb5b5315-64f6-4ea3-8e58-981cc37c6f61", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall": {
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"name": "fw",
|
||||||
|
"admin_state_up": true,
|
||||||
|
"tenant_id": "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
"firewall_policy_id": "34be8c83-4d42-4dca-a74e-b77fffb8e28a",
|
||||||
|
"id": "fb5b5315-64f6-4ea3-8e58-981cc37c6f61",
|
||||||
|
"description": "OpenStack firewall"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
fw, err := Get(fake.ServiceClient(), "fb5b5315-64f6-4ea3-8e58-981cc37c6f61").Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
th.AssertEquals(t, "ACTIVE", fw.Status)
|
||||||
|
th.AssertEquals(t, "fw", fw.Name)
|
||||||
|
th.AssertEquals(t, "OpenStack firewall", fw.Description)
|
||||||
|
th.AssertEquals(t, true, fw.AdminStateUp)
|
||||||
|
th.AssertEquals(t, "34be8c83-4d42-4dca-a74e-b77fffb8e28a", fw.PolicyID)
|
||||||
|
th.AssertEquals(t, "fb5b5315-64f6-4ea3-8e58-981cc37c6f61", fw.ID)
|
||||||
|
th.AssertEquals(t, "b4eedccc6fb74fa8a7ad6b08382b852b", fw.TenantID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUpdate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewalls/ea5b5315-64f6-4ea3-8e58-981cc37c6576", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "PUT")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"firewall":{
|
||||||
|
"name": "fw",
|
||||||
|
"description": "updated fw",
|
||||||
|
"admin_state_up":false,
|
||||||
|
"firewall_policy_id": "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall": {
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"name": "fw",
|
||||||
|
"admin_state_up": false,
|
||||||
|
"tenant_id": "b4eedccc6fb74fa8a7ad6b08382b852b",
|
||||||
|
"firewall_policy_id": "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c"
|
||||||
|
"id": "ea5b5315-64f6-4ea3-8e58-981cc37c6576",
|
||||||
|
"description": "OpenStack firewall",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
options := UpdateOpts{
|
||||||
|
Name: "fw",
|
||||||
|
Description: "updated fw",
|
||||||
|
AdminStateUp: Down,
|
||||||
|
PolicyID: "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c",
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := Update(fake.ServiceClient(), "ea5b5315-64f6-4ea3-8e58-981cc37c6576", options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDelete(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewalls/4ec89087-d057-4e2c-911f-60a3b47ee304", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "DELETE")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
}
|
101
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/results.go
generated
vendored
Normal file
101
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/results.go
generated
vendored
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package firewalls
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Firewall struct {
|
||||||
|
ID string `json:"id" mapstructure:"id"`
|
||||||
|
Name string `json:"name" mapstructure:"name"`
|
||||||
|
Description string `json:"description" mapstructure:"description"`
|
||||||
|
AdminStateUp bool `json:"admin_state_up" mapstructure:"admin_state_up"`
|
||||||
|
Status string `json:"status" mapstructure:"status"`
|
||||||
|
PolicyID string `json:"firewall_policy_id" mapstructure:"firewall_policy_id"`
|
||||||
|
TenantID string `json:"tenant_id" mapstructure:"tenant_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type commonResult struct {
|
||||||
|
gophercloud.Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract is a function that accepts a result and extracts a firewall.
|
||||||
|
func (r commonResult) Extract() (*Firewall, error) {
|
||||||
|
if r.Err != nil {
|
||||||
|
return nil, r.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
var res struct {
|
||||||
|
Firewall *Firewall `json:"firewall"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(r.Body, &res)
|
||||||
|
|
||||||
|
return res.Firewall, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// FirewallPage is the page returned by a pager when traversing over a
|
||||||
|
// collection of firewalls.
|
||||||
|
type FirewallPage struct {
|
||||||
|
pagination.LinkedPageBase
|
||||||
|
}
|
||||||
|
|
||||||
|
// NextPageURL is invoked when a paginated collection of firewalls has reached
|
||||||
|
// the end of a page and the pager seeks to traverse over a new one. In order
|
||||||
|
// to do this, it needs to construct the next page's URL.
|
||||||
|
func (p FirewallPage) NextPageURL() (string, error) {
|
||||||
|
type resp struct {
|
||||||
|
Links []gophercloud.Link `mapstructure:"firewalls_links"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var r resp
|
||||||
|
err := mapstructure.Decode(p.Body, &r)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return gophercloud.ExtractNextURL(r.Links)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty checks whether a FirewallPage struct is empty.
|
||||||
|
func (p FirewallPage) IsEmpty() (bool, error) {
|
||||||
|
is, err := ExtractFirewalls(p)
|
||||||
|
if err != nil {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return len(is) == 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractFirewalls accepts a Page struct, specifically a RouterPage struct,
|
||||||
|
// and extracts the elements into a slice of Router structs. In other words,
|
||||||
|
// a generic collection is mapped into a relevant slice.
|
||||||
|
func ExtractFirewalls(page pagination.Page) ([]Firewall, error) {
|
||||||
|
var resp struct {
|
||||||
|
Firewalls []Firewall `mapstructure:"firewalls" json:"firewalls"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(page.(FirewallPage).Body, &resp)
|
||||||
|
|
||||||
|
return resp.Firewalls, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResult represents the result of a get operation.
|
||||||
|
type GetResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResult represents the result of an update operation.
|
||||||
|
type UpdateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResult represents the result of a delete operation.
|
||||||
|
type DeleteResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateResult represents the result of a create operation.
|
||||||
|
type CreateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
16
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/urls.go
generated
vendored
Normal file
16
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls/urls.go
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package firewalls
|
||||||
|
|
||||||
|
import "github.com/rackspace/gophercloud"
|
||||||
|
|
||||||
|
const (
|
||||||
|
rootPath = "fw"
|
||||||
|
resourcePath = "firewalls"
|
||||||
|
)
|
||||||
|
|
||||||
|
func rootURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath, id)
|
||||||
|
}
|
258
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/requests.go
generated
vendored
Normal file
258
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/requests.go
generated
vendored
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
package policies
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Binary gives users a solid type to work with for create and update
|
||||||
|
// operations. It is recommended that users use the `Yes` and `No` enums
|
||||||
|
type Binary *bool
|
||||||
|
|
||||||
|
// Convenience vars for Audited and Shared values.
|
||||||
|
var (
|
||||||
|
iTrue = true
|
||||||
|
iFalse = false
|
||||||
|
Yes Binary = &iTrue
|
||||||
|
No Binary = &iFalse
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListOptsBuilder allows extensions to add additional parameters to the
|
||||||
|
// List request.
|
||||||
|
type ListOptsBuilder interface {
|
||||||
|
ToPolicyListQuery() (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOpts allows the filtering and sorting of paginated collections through
|
||||||
|
// the API. Filtering is achieved by passing in struct field values that map to
|
||||||
|
// the firewall policy attributes you want to see returned. SortKey allows you
|
||||||
|
// to sort by a particular firewall policy attribute. SortDir sets the direction,
|
||||||
|
// and is either `asc' or `desc'. Marker and Limit are used for pagination.
|
||||||
|
type ListOpts struct {
|
||||||
|
TenantID string `q:"tenant_id"`
|
||||||
|
Name string `q:"name"`
|
||||||
|
Description string `q:"description"`
|
||||||
|
Shared bool `q:"shared"`
|
||||||
|
Audited bool `q:"audited"`
|
||||||
|
ID string `q:"id"`
|
||||||
|
Limit int `q:"limit"`
|
||||||
|
Marker string `q:"marker"`
|
||||||
|
SortKey string `q:"sort_key"`
|
||||||
|
SortDir string `q:"sort_dir"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToPolicyListQuery formats a ListOpts into a query string.
|
||||||
|
func (opts ListOpts) ToPolicyListQuery() (string, error) {
|
||||||
|
q, err := gophercloud.BuildQueryString(opts)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return q.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns a Pager which allows you to iterate over a collection of
|
||||||
|
// firewall policies. It accepts a ListOpts struct, which allows you to filter
|
||||||
|
// and sort the returned collection for greater efficiency.
|
||||||
|
//
|
||||||
|
// Default policy settings return only those firewall policies that are owned by the
|
||||||
|
// tenant who submits the request, unless an admin user submits the request.
|
||||||
|
func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
||||||
|
url := rootURL(c)
|
||||||
|
|
||||||
|
if opts != nil {
|
||||||
|
query, err := opts.ToPolicyListQuery()
|
||||||
|
if err != nil {
|
||||||
|
return pagination.Pager{Err: err}
|
||||||
|
}
|
||||||
|
url += query
|
||||||
|
}
|
||||||
|
|
||||||
|
return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page {
|
||||||
|
return PolicyPage{pagination.LinkedPageBase{PageResult: r}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOptsBuilder is the interface options structs have to satisfy in order
|
||||||
|
// to be used in the main Create operation in this package. Since many
|
||||||
|
// extensions decorate or modify the common logic, it is useful for them to
|
||||||
|
// satisfy a basic interface in order for them to be used.
|
||||||
|
type CreateOptsBuilder interface {
|
||||||
|
ToPolicyCreateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOpts contains all the values needed to create a new firewall policy.
|
||||||
|
type CreateOpts struct {
|
||||||
|
// Only required if the caller has an admin role and wants to create a firewall policy
|
||||||
|
// for another tenant.
|
||||||
|
TenantID string
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
Shared *bool
|
||||||
|
Audited *bool
|
||||||
|
Rules []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToPolicyCreateMap casts a CreateOpts struct to a map.
|
||||||
|
func (opts CreateOpts) ToPolicyCreateMap() (map[string]interface{}, error) {
|
||||||
|
p := make(map[string]interface{})
|
||||||
|
|
||||||
|
if opts.TenantID != "" {
|
||||||
|
p["tenant_id"] = opts.TenantID
|
||||||
|
}
|
||||||
|
if opts.Name != "" {
|
||||||
|
p["name"] = opts.Name
|
||||||
|
}
|
||||||
|
if opts.Description != "" {
|
||||||
|
p["description"] = opts.Description
|
||||||
|
}
|
||||||
|
if opts.Shared != nil {
|
||||||
|
p["shared"] = *opts.Shared
|
||||||
|
}
|
||||||
|
if opts.Audited != nil {
|
||||||
|
p["audited"] = *opts.Audited
|
||||||
|
}
|
||||||
|
if opts.Rules != nil {
|
||||||
|
p["firewall_rules"] = opts.Rules
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"firewall_policy": p}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create accepts a CreateOpts struct and uses the values to create a new firewall policy
|
||||||
|
func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
||||||
|
var res CreateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToPolicyCreateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{201},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves a particular firewall policy based on its unique ID.
|
||||||
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
|
var res GetResult
|
||||||
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOptsBuilder is the interface options structs have to satisfy in order
|
||||||
|
// to be used in the main Update operation in this package. Since many
|
||||||
|
// extensions decorate or modify the common logic, it is useful for them to
|
||||||
|
// satisfy a basic interface in order for them to be used.
|
||||||
|
type UpdateOptsBuilder interface {
|
||||||
|
ToPolicyUpdateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOpts contains the values used when updating a firewall policy.
|
||||||
|
type UpdateOpts struct {
|
||||||
|
// Name of the firewall policy.
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
Shared *bool
|
||||||
|
Audited *bool
|
||||||
|
Rules []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToPolicyUpdateMap casts a CreateOpts struct to a map.
|
||||||
|
func (opts UpdateOpts) ToPolicyUpdateMap() (map[string]interface{}, error) {
|
||||||
|
p := make(map[string]interface{})
|
||||||
|
|
||||||
|
if opts.Name != "" {
|
||||||
|
p["name"] = opts.Name
|
||||||
|
}
|
||||||
|
if opts.Description != "" {
|
||||||
|
p["description"] = opts.Description
|
||||||
|
}
|
||||||
|
if opts.Shared != nil {
|
||||||
|
p["shared"] = *opts.Shared
|
||||||
|
}
|
||||||
|
if opts.Audited != nil {
|
||||||
|
p["audited"] = *opts.Audited
|
||||||
|
}
|
||||||
|
if opts.Rules != nil {
|
||||||
|
p["firewall_rules"] = opts.Rules
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"firewall_policy": p}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update allows firewall policies to be updated.
|
||||||
|
func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
||||||
|
var res UpdateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToPolicyUpdateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send request to API
|
||||||
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete will permanently delete a particular firewall policy based on its unique ID.
|
||||||
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
|
var res DeleteResult
|
||||||
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{204},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertRule(c *gophercloud.ServiceClient, policyID, ruleID, beforeID, afterID string) error {
|
||||||
|
type request struct {
|
||||||
|
RuleId string `json:"firewall_rule_id"`
|
||||||
|
Before string `json:"insert_before,omitempty"`
|
||||||
|
After string `json:"insert_after,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
reqBody := request{
|
||||||
|
RuleId: ruleID,
|
||||||
|
Before: beforeID,
|
||||||
|
After: afterID,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send request to API
|
||||||
|
var res commonResult
|
||||||
|
_, res.Err = c.Request("PUT", insertURL(c, policyID), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
func RemoveRule(c *gophercloud.ServiceClient, policyID, ruleID string) error {
|
||||||
|
type request struct {
|
||||||
|
RuleId string `json:"firewall_rule_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
reqBody := request{
|
||||||
|
RuleId: ruleID,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send request to API
|
||||||
|
var res commonResult
|
||||||
|
_, res.Err = c.Request("PUT", removeURL(c, policyID), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res.Err
|
||||||
|
}
|
279
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/requests_test.go
generated
vendored
Normal file
279
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/requests_test.go
generated
vendored
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
package policies
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
fake "github.com/rackspace/gophercloud/openstack/networking/v2/common"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestURLs(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.AssertEquals(t, th.Endpoint()+"v2.0/fw/firewall_policies", rootURL(fake.ServiceClient()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestList(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_policies", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_policies": [
|
||||||
|
{
|
||||||
|
"name": "policy1",
|
||||||
|
"firewall_rules": [
|
||||||
|
"75452b36-268e-4e75-aaf4-f0e7ed50bc97",
|
||||||
|
"c9e77ca0-1bc8-497d-904d-948107873dc6"
|
||||||
|
],
|
||||||
|
"tenant_id": "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
"audited": true,
|
||||||
|
"shared": false,
|
||||||
|
"id": "f2b08c1e-aa81-4668-8ae1-1401bcb0576c",
|
||||||
|
"description": "Firewall policy 1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "policy2",
|
||||||
|
"firewall_rules": [
|
||||||
|
"03d2a6ad-633f-431a-8463-4370d06a22c8"
|
||||||
|
],
|
||||||
|
"tenant_id": "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
"audited": false,
|
||||||
|
"shared": true,
|
||||||
|
"id": "c854fab5-bdaf-4a86-9359-78de93e5df01",
|
||||||
|
"description": "Firewall policy 2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
count++
|
||||||
|
actual, err := ExtractPolicies(page)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed to extract members: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []Policy{
|
||||||
|
Policy{
|
||||||
|
Name: "policy1",
|
||||||
|
Rules: []string{
|
||||||
|
"75452b36-268e-4e75-aaf4-f0e7ed50bc97",
|
||||||
|
"c9e77ca0-1bc8-497d-904d-948107873dc6",
|
||||||
|
},
|
||||||
|
TenantID: "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
Audited: true,
|
||||||
|
Shared: false,
|
||||||
|
ID: "f2b08c1e-aa81-4668-8ae1-1401bcb0576c",
|
||||||
|
Description: "Firewall policy 1",
|
||||||
|
},
|
||||||
|
Policy{
|
||||||
|
Name: "policy2",
|
||||||
|
Rules: []string{
|
||||||
|
"03d2a6ad-633f-431a-8463-4370d06a22c8",
|
||||||
|
},
|
||||||
|
TenantID: "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
Audited: false,
|
||||||
|
Shared: true,
|
||||||
|
ID: "c854fab5-bdaf-4a86-9359-78de93e5df01",
|
||||||
|
Description: "Firewall policy 2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
th.CheckDeepEquals(t, expected, actual)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if count != 1 {
|
||||||
|
t.Errorf("Expected 1 page, got %d", count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_policies", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"firewall_policy":{
|
||||||
|
"name": "policy",
|
||||||
|
"firewall_rules": [
|
||||||
|
"98a58c87-76be-ae7c-a74e-b77fffb88d95",
|
||||||
|
"11a58c87-76be-ae7c-a74e-b77fffb88a32"
|
||||||
|
],
|
||||||
|
"description": "Firewall policy",
|
||||||
|
"tenant_id": "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
"audited": true,
|
||||||
|
"shared": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_policy":{
|
||||||
|
"name": "policy",
|
||||||
|
"firewall_rules": [
|
||||||
|
"98a58c87-76be-ae7c-a74e-b77fffb88d95",
|
||||||
|
"11a58c87-76be-ae7c-a74e-b77fffb88a32"
|
||||||
|
],
|
||||||
|
"tenant_id": "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
"audited": false,
|
||||||
|
"id": "f2b08c1e-aa81-4668-8ae1-1401bcb0576c",
|
||||||
|
"description": "Firewall policy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
options := CreateOpts{
|
||||||
|
TenantID: "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
Name: "policy",
|
||||||
|
Description: "Firewall policy",
|
||||||
|
Shared: No,
|
||||||
|
Audited: Yes,
|
||||||
|
Rules: []string{
|
||||||
|
"98a58c87-76be-ae7c-a74e-b77fffb88d95",
|
||||||
|
"11a58c87-76be-ae7c-a74e-b77fffb88a32",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := Create(fake.ServiceClient(), options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_policies/bcab5315-64f6-4ea3-8e58-981cc37c6f61", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_policy":{
|
||||||
|
"name": "www",
|
||||||
|
"firewall_rules": [
|
||||||
|
"75452b36-268e-4e75-aaf4-f0e7ed50bc97",
|
||||||
|
"c9e77ca0-1bc8-497d-904d-948107873dc6",
|
||||||
|
"03d2a6ad-633f-431a-8463-4370d06a22c8"
|
||||||
|
],
|
||||||
|
"tenant_id": "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
"audited": false,
|
||||||
|
"id": "f2b08c1e-aa81-4668-8ae1-1401bcb0576c",
|
||||||
|
"description": "Firewall policy web"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
policy, err := Get(fake.ServiceClient(), "bcab5315-64f6-4ea3-8e58-981cc37c6f61").Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
th.AssertEquals(t, "www", policy.Name)
|
||||||
|
th.AssertEquals(t, "f2b08c1e-aa81-4668-8ae1-1401bcb0576c", policy.ID)
|
||||||
|
th.AssertEquals(t, "Firewall policy web", policy.Description)
|
||||||
|
th.AssertEquals(t, 3, len(policy.Rules))
|
||||||
|
th.AssertEquals(t, "75452b36-268e-4e75-aaf4-f0e7ed50bc97", policy.Rules[0])
|
||||||
|
th.AssertEquals(t, "c9e77ca0-1bc8-497d-904d-948107873dc6", policy.Rules[1])
|
||||||
|
th.AssertEquals(t, "03d2a6ad-633f-431a-8463-4370d06a22c8", policy.Rules[2])
|
||||||
|
th.AssertEquals(t, "9145d91459d248b1b02fdaca97c6a75d", policy.TenantID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUpdate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_policies/f2b08c1e-aa81-4668-8ae1-1401bcb0576c", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "PUT")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"firewall_policy":{
|
||||||
|
"name": "policy",
|
||||||
|
"firewall_rules": [
|
||||||
|
"98a58c87-76be-ae7c-a74e-b77fffb88d95",
|
||||||
|
"11a58c87-76be-ae7c-a74e-b77fffb88a32"
|
||||||
|
],
|
||||||
|
"description": "Firewall policy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_policy":{
|
||||||
|
"name": "policy",
|
||||||
|
"firewall_rules": [
|
||||||
|
"75452b36-268e-4e75-aaf4-f0e7ed50bc97",
|
||||||
|
"c9e77ca0-1bc8-497d-904d-948107873dc6",
|
||||||
|
"03d2a6ad-633f-431a-8463-4370d06a22c8"
|
||||||
|
],
|
||||||
|
"tenant_id": "9145d91459d248b1b02fdaca97c6a75d",
|
||||||
|
"audited": false,
|
||||||
|
"id": "f2b08c1e-aa81-4668-8ae1-1401bcb0576c",
|
||||||
|
"description": "Firewall policy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
options := UpdateOpts{
|
||||||
|
Name: "policy",
|
||||||
|
Description: "Firewall policy",
|
||||||
|
Rules: []string{
|
||||||
|
"98a58c87-76be-ae7c-a74e-b77fffb88d95",
|
||||||
|
"11a58c87-76be-ae7c-a74e-b77fffb88a32",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := Update(fake.ServiceClient(), "f2b08c1e-aa81-4668-8ae1-1401bcb0576c", options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDelete(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_policies/4ec89077-d057-4a2b-911f-60a3b47ee304", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "DELETE")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
res := Delete(fake.ServiceClient(), "4ec89077-d057-4a2b-911f-60a3b47ee304")
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
}
|
101
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/results.go
generated
vendored
Normal file
101
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/results.go
generated
vendored
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package policies
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Policy struct {
|
||||||
|
ID string `json:"id" mapstructure:"id"`
|
||||||
|
Name string `json:"name" mapstructure:"name"`
|
||||||
|
Description string `json:"description" mapstructure:"description"`
|
||||||
|
TenantID string `json:"tenant_id" mapstructure:"tenant_id"`
|
||||||
|
Audited bool `json:"audited" mapstructure:"audited"`
|
||||||
|
Shared bool `json:"shared" mapstructure:"shared"`
|
||||||
|
Rules []string `json:"firewall_rules,omitempty" mapstructure:"firewall_rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type commonResult struct {
|
||||||
|
gophercloud.Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract is a function that accepts a result and extracts a firewall policy.
|
||||||
|
func (r commonResult) Extract() (*Policy, error) {
|
||||||
|
if r.Err != nil {
|
||||||
|
return nil, r.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
var res struct {
|
||||||
|
Policy *Policy `json:"firewall_policy" mapstructure:"firewall_policy"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(r.Body, &res)
|
||||||
|
|
||||||
|
return res.Policy, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// PolicyPage is the page returned by a pager when traversing over a
|
||||||
|
// collection of firewall policies.
|
||||||
|
type PolicyPage struct {
|
||||||
|
pagination.LinkedPageBase
|
||||||
|
}
|
||||||
|
|
||||||
|
// NextPageURL is invoked when a paginated collection of firewall policies has
|
||||||
|
// reached the end of a page and the pager seeks to traverse over a new one.
|
||||||
|
// In order to do this, it needs to construct the next page's URL.
|
||||||
|
func (p PolicyPage) NextPageURL() (string, error) {
|
||||||
|
type resp struct {
|
||||||
|
Links []gophercloud.Link `mapstructure:"firewall_policies_links"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var r resp
|
||||||
|
err := mapstructure.Decode(p.Body, &r)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return gophercloud.ExtractNextURL(r.Links)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty checks whether a PolicyPage struct is empty.
|
||||||
|
func (p PolicyPage) IsEmpty() (bool, error) {
|
||||||
|
is, err := ExtractPolicies(p)
|
||||||
|
if err != nil {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return len(is) == 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractPolicies accepts a Page struct, specifically a RouterPage struct,
|
||||||
|
// and extracts the elements into a slice of Router structs. In other words,
|
||||||
|
// a generic collection is mapped into a relevant slice.
|
||||||
|
func ExtractPolicies(page pagination.Page) ([]Policy, error) {
|
||||||
|
var resp struct {
|
||||||
|
Policies []Policy `mapstructure:"firewall_policies" json:"firewall_policies"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(page.(PolicyPage).Body, &resp)
|
||||||
|
|
||||||
|
return resp.Policies, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResult represents the result of a get operation.
|
||||||
|
type GetResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResult represents the result of an update operation.
|
||||||
|
type UpdateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResult represents the result of a delete operation.
|
||||||
|
type DeleteResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateResult represents the result of a create operation.
|
||||||
|
type CreateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
26
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/urls.go
generated
vendored
Normal file
26
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/policies/urls.go
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package policies
|
||||||
|
|
||||||
|
import "github.com/rackspace/gophercloud"
|
||||||
|
|
||||||
|
const (
|
||||||
|
rootPath = "fw"
|
||||||
|
resourcePath = "firewall_policies"
|
||||||
|
insertPath = "insert_rule"
|
||||||
|
removePath = "remove_rule"
|
||||||
|
)
|
||||||
|
|
||||||
|
func rootURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func insertURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath, id, insertPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath, id, removePath)
|
||||||
|
}
|
12
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/errors.go
generated
vendored
Normal file
12
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/errors.go
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package rules
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func err(str string) error {
|
||||||
|
return fmt.Errorf("%s", str)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
errProtocolRequired = err("A protocol is required (tcp, udp, icmp or any)")
|
||||||
|
errActionRequired = err("An action is required (allow or deny)")
|
||||||
|
)
|
296
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/requests.go
generated
vendored
Normal file
296
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/requests.go
generated
vendored
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
package rules
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Binary gives users a solid type to work with for create and update
|
||||||
|
// operations. It is recommended that users use the `Yes` and `No` enums
|
||||||
|
type Binary *bool
|
||||||
|
|
||||||
|
// Convenience vars for Enabled and Shared values.
|
||||||
|
var (
|
||||||
|
iTrue = true
|
||||||
|
iFalse = false
|
||||||
|
Yes Binary = &iTrue
|
||||||
|
No Binary = &iFalse
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListOptsBuilder allows extensions to add additional parameters to the
|
||||||
|
// List request.
|
||||||
|
type ListOptsBuilder interface {
|
||||||
|
ToRuleListQuery() (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOpts allows the filtering and sorting of paginated collections through
|
||||||
|
// the API. Filtering is achieved by passing in struct field values that map to
|
||||||
|
// the Firewall rule attributes you want to see returned. SortKey allows you to
|
||||||
|
// sort by a particular firewall rule attribute. SortDir sets the direction, and is
|
||||||
|
// either `asc' or `desc'. Marker and Limit are used for pagination.
|
||||||
|
type ListOpts struct {
|
||||||
|
TenantID string `q:"tenant_id"`
|
||||||
|
Name string `q:"name"`
|
||||||
|
Description string `q:"description"`
|
||||||
|
Protocol string `q:"protocol"`
|
||||||
|
Action string `q:"action"`
|
||||||
|
IPVersion int `q:"ip_version"`
|
||||||
|
SourceIPAddress string `q:"source_ip_address"`
|
||||||
|
DestinationIPAddress string `q:"destination_ip_address"`
|
||||||
|
SourcePort string `q:"source_port"`
|
||||||
|
DestinationPort string `q:"destination_port"`
|
||||||
|
Enabled bool `q:"enabled"`
|
||||||
|
ID string `q:"id"`
|
||||||
|
Limit int `q:"limit"`
|
||||||
|
Marker string `q:"marker"`
|
||||||
|
SortKey string `q:"sort_key"`
|
||||||
|
SortDir string `q:"sort_dir"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToRuleListQuery formats a ListOpts into a query string.
|
||||||
|
func (opts ListOpts) ToRuleListQuery() (string, error) {
|
||||||
|
q, err := gophercloud.BuildQueryString(opts)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return q.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns a Pager which allows you to iterate over a collection of
|
||||||
|
// firewall rules. It accepts a ListOpts struct, which allows you to filter
|
||||||
|
// and sort the returned collection for greater efficiency.
|
||||||
|
//
|
||||||
|
// Default policy settings return only those firewall rules that are owned by the
|
||||||
|
// tenant who submits the request, unless an admin user submits the request.
|
||||||
|
func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
||||||
|
url := rootURL(c)
|
||||||
|
|
||||||
|
if opts != nil {
|
||||||
|
query, err := opts.ToRuleListQuery()
|
||||||
|
if err != nil {
|
||||||
|
return pagination.Pager{Err: err}
|
||||||
|
}
|
||||||
|
url += query
|
||||||
|
}
|
||||||
|
|
||||||
|
return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page {
|
||||||
|
return RulePage{pagination.LinkedPageBase{PageResult: r}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOptsBuilder is the interface options structs have to satisfy in order
|
||||||
|
// to be used in the main Create operation in this package. Since many
|
||||||
|
// extensions decorate or modify the common logic, it is useful for them to
|
||||||
|
// satisfy a basic interface in order for them to be used.
|
||||||
|
type CreateOptsBuilder interface {
|
||||||
|
ToRuleCreateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOpts contains all the values needed to create a new firewall rule.
|
||||||
|
type CreateOpts struct {
|
||||||
|
// Mandatory for create
|
||||||
|
Protocol string
|
||||||
|
Action string
|
||||||
|
// Optional
|
||||||
|
TenantID string
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
IPVersion int
|
||||||
|
SourceIPAddress string
|
||||||
|
DestinationIPAddress string
|
||||||
|
SourcePort string
|
||||||
|
DestinationPort string
|
||||||
|
Shared *bool
|
||||||
|
Enabled *bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToRuleCreateMap casts a CreateOpts struct to a map.
|
||||||
|
func (opts CreateOpts) ToRuleCreateMap() (map[string]interface{}, error) {
|
||||||
|
if opts.Protocol == "" {
|
||||||
|
return nil, errProtocolRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
if opts.Action == "" {
|
||||||
|
return nil, errActionRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
r := make(map[string]interface{})
|
||||||
|
|
||||||
|
r["protocol"] = opts.Protocol
|
||||||
|
r["action"] = opts.Action
|
||||||
|
|
||||||
|
if opts.TenantID != "" {
|
||||||
|
r["tenant_id"] = opts.TenantID
|
||||||
|
}
|
||||||
|
if opts.Name != "" {
|
||||||
|
r["name"] = opts.Name
|
||||||
|
}
|
||||||
|
if opts.Description != "" {
|
||||||
|
r["description"] = opts.Description
|
||||||
|
}
|
||||||
|
if opts.IPVersion != 0 {
|
||||||
|
r["ip_version"] = opts.IPVersion
|
||||||
|
}
|
||||||
|
if opts.SourceIPAddress != "" {
|
||||||
|
r["source_ip_address"] = opts.SourceIPAddress
|
||||||
|
}
|
||||||
|
if opts.DestinationIPAddress != "" {
|
||||||
|
r["destination_ip_address"] = opts.DestinationIPAddress
|
||||||
|
}
|
||||||
|
if opts.SourcePort != "" {
|
||||||
|
r["source_port"] = opts.SourcePort
|
||||||
|
}
|
||||||
|
if opts.DestinationPort != "" {
|
||||||
|
r["destination_port"] = opts.DestinationPort
|
||||||
|
}
|
||||||
|
if opts.Shared != nil {
|
||||||
|
r["shared"] = *opts.Shared
|
||||||
|
}
|
||||||
|
if opts.Enabled != nil {
|
||||||
|
r["enabled"] = *opts.Enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"firewall_rule": r}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create accepts a CreateOpts struct and uses the values to create a new firewall rule
|
||||||
|
func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
||||||
|
var res CreateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToRuleCreateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{201},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves a particular firewall rule based on its unique ID.
|
||||||
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
|
var res GetResult
|
||||||
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOptsBuilder is the interface options structs have to satisfy in order
|
||||||
|
// to be used in the main Update operation in this package. Since many
|
||||||
|
// extensions decorate or modify the common logic, it is useful for them to
|
||||||
|
// satisfy a basic interface in order for them to be used.
|
||||||
|
type UpdateOptsBuilder interface {
|
||||||
|
ToRuleUpdateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOpts contains the values used when updating a firewall rule.
|
||||||
|
// Optional
|
||||||
|
type UpdateOpts struct {
|
||||||
|
Protocol string
|
||||||
|
Action string
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
IPVersion int
|
||||||
|
SourceIPAddress *string
|
||||||
|
DestinationIPAddress *string
|
||||||
|
SourcePort *string
|
||||||
|
DestinationPort *string
|
||||||
|
Shared *bool
|
||||||
|
Enabled *bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToRuleUpdateMap casts a UpdateOpts struct to a map.
|
||||||
|
func (opts UpdateOpts) ToRuleUpdateMap() (map[string]interface{}, error) {
|
||||||
|
r := make(map[string]interface{})
|
||||||
|
|
||||||
|
if opts.Protocol != "" {
|
||||||
|
r["protocol"] = opts.Protocol
|
||||||
|
}
|
||||||
|
if opts.Action != "" {
|
||||||
|
r["action"] = opts.Action
|
||||||
|
}
|
||||||
|
if opts.Name != "" {
|
||||||
|
r["name"] = opts.Name
|
||||||
|
}
|
||||||
|
if opts.Description != "" {
|
||||||
|
r["description"] = opts.Description
|
||||||
|
}
|
||||||
|
if opts.IPVersion != 0 {
|
||||||
|
r["ip_version"] = opts.IPVersion
|
||||||
|
}
|
||||||
|
if opts.SourceIPAddress != nil {
|
||||||
|
s := *opts.SourceIPAddress
|
||||||
|
if s == "" {
|
||||||
|
r["source_ip_address"] = nil
|
||||||
|
} else {
|
||||||
|
r["source_ip_address"] = s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if opts.DestinationIPAddress != nil {
|
||||||
|
s := *opts.DestinationIPAddress
|
||||||
|
if s == "" {
|
||||||
|
r["destination_ip_address"] = nil
|
||||||
|
} else {
|
||||||
|
r["destination_ip_address"] = s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if opts.SourcePort != nil {
|
||||||
|
s := *opts.SourcePort
|
||||||
|
if s == "" {
|
||||||
|
r["source_port"] = nil
|
||||||
|
} else {
|
||||||
|
r["source_port"] = s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if opts.DestinationPort != nil {
|
||||||
|
s := *opts.DestinationPort
|
||||||
|
if s == "" {
|
||||||
|
r["destination_port"] = nil
|
||||||
|
} else {
|
||||||
|
r["destination_port"] = s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if opts.Shared != nil {
|
||||||
|
r["shared"] = *opts.Shared
|
||||||
|
}
|
||||||
|
if opts.Enabled != nil {
|
||||||
|
r["enabled"] = *opts.Enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]interface{}{"firewall_rule": r}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update allows firewall policies to be updated.
|
||||||
|
func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
|
||||||
|
var res UpdateResult
|
||||||
|
|
||||||
|
reqBody, err := opts.ToRuleUpdateMap()
|
||||||
|
if err != nil {
|
||||||
|
res.Err = err
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send request to API
|
||||||
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
JSONBody: &reqBody,
|
||||||
|
JSONResponse: &res.Body,
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete will permanently delete a particular firewall rule based on its unique ID.
|
||||||
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
|
var res DeleteResult
|
||||||
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{204},
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
328
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/requests_test.go
generated
vendored
Normal file
328
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/requests_test.go
generated
vendored
Normal file
@@ -0,0 +1,328 @@
|
|||||||
|
package rules
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
fake "github.com/rackspace/gophercloud/openstack/networking/v2/common"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
th "github.com/rackspace/gophercloud/testhelper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestURLs(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.AssertEquals(t, th.Endpoint()+"v2.0/fw/firewall_rules", rootURL(fake.ServiceClient()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestList(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_rules", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_rules": [
|
||||||
|
{
|
||||||
|
"protocol": "tcp",
|
||||||
|
"description": "ssh rule",
|
||||||
|
"source_port": null,
|
||||||
|
"source_ip_address": null,
|
||||||
|
"destination_ip_address": "192.168.1.0/24",
|
||||||
|
"firewall_policy_id": "e2a5fb51-698c-4898-87e8-f1eee6b50919",
|
||||||
|
"position": 2,
|
||||||
|
"destination_port": "22",
|
||||||
|
"id": "f03bd950-6c56-4f5e-a307-45967078f507",
|
||||||
|
"name": "ssh_form_any",
|
||||||
|
"tenant_id": "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
"enabled": true,
|
||||||
|
"action": "allow",
|
||||||
|
"ip_version": 4,
|
||||||
|
"shared": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"protocol": "udp",
|
||||||
|
"description": "udp rule",
|
||||||
|
"source_port": null,
|
||||||
|
"source_ip_address": null,
|
||||||
|
"destination_ip_address": null,
|
||||||
|
"firewall_policy_id": "98d7fb51-698c-4123-87e8-f1eee6b5ab7e",
|
||||||
|
"position": 1,
|
||||||
|
"destination_port": null,
|
||||||
|
"id": "ab7bd950-6c56-4f5e-a307-45967078f890",
|
||||||
|
"name": "deny_all_udp",
|
||||||
|
"tenant_id": "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
"enabled": true,
|
||||||
|
"action": "deny",
|
||||||
|
"ip_version": 4,
|
||||||
|
"shared": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
|
||||||
|
count++
|
||||||
|
actual, err := ExtractRules(page)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Failed to extract members: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []Rule{
|
||||||
|
Rule{
|
||||||
|
Protocol: "tcp",
|
||||||
|
Description: "ssh rule",
|
||||||
|
SourcePort: "",
|
||||||
|
SourceIPAddress: "",
|
||||||
|
DestinationIPAddress: "192.168.1.0/24",
|
||||||
|
PolicyID: "e2a5fb51-698c-4898-87e8-f1eee6b50919",
|
||||||
|
Position: 2,
|
||||||
|
DestinationPort: "22",
|
||||||
|
ID: "f03bd950-6c56-4f5e-a307-45967078f507",
|
||||||
|
Name: "ssh_form_any",
|
||||||
|
TenantID: "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
Enabled: true,
|
||||||
|
Action: "allow",
|
||||||
|
IPVersion: 4,
|
||||||
|
Shared: false,
|
||||||
|
},
|
||||||
|
Rule{
|
||||||
|
Protocol: "udp",
|
||||||
|
Description: "udp rule",
|
||||||
|
SourcePort: "",
|
||||||
|
SourceIPAddress: "",
|
||||||
|
DestinationIPAddress: "",
|
||||||
|
PolicyID: "98d7fb51-698c-4123-87e8-f1eee6b5ab7e",
|
||||||
|
Position: 1,
|
||||||
|
DestinationPort: "",
|
||||||
|
ID: "ab7bd950-6c56-4f5e-a307-45967078f890",
|
||||||
|
Name: "deny_all_udp",
|
||||||
|
TenantID: "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
Enabled: true,
|
||||||
|
Action: "deny",
|
||||||
|
IPVersion: 4,
|
||||||
|
Shared: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
th.CheckDeepEquals(t, expected, actual)
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if count != 1 {
|
||||||
|
t.Errorf("Expected 1 page, got %d", count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_rules", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"firewall_rule": {
|
||||||
|
"protocol": "tcp",
|
||||||
|
"description": "ssh rule",
|
||||||
|
"destination_ip_address": "192.168.1.0/24",
|
||||||
|
"destination_port": "22",
|
||||||
|
"name": "ssh_form_any",
|
||||||
|
"action": "allow",
|
||||||
|
"tenant_id": "80cf934d6ffb4ef5b244f1c512ad1e61"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_rule":{
|
||||||
|
"protocol": "tcp",
|
||||||
|
"description": "ssh rule",
|
||||||
|
"source_port": null,
|
||||||
|
"source_ip_address": null,
|
||||||
|
"destination_ip_address": "192.168.1.0/24",
|
||||||
|
"firewall_policy_id": "e2a5fb51-698c-4898-87e8-f1eee6b50919",
|
||||||
|
"position": 2,
|
||||||
|
"destination_port": "22",
|
||||||
|
"id": "f03bd950-6c56-4f5e-a307-45967078f507",
|
||||||
|
"name": "ssh_form_any",
|
||||||
|
"tenant_id": "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
"enabled": true,
|
||||||
|
"action": "allow",
|
||||||
|
"ip_version": 4,
|
||||||
|
"shared": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
options := CreateOpts{
|
||||||
|
TenantID: "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
Protocol: "tcp",
|
||||||
|
Description: "ssh rule",
|
||||||
|
DestinationIPAddress: "192.168.1.0/24",
|
||||||
|
DestinationPort: "22",
|
||||||
|
Name: "ssh_form_any",
|
||||||
|
Action: "allow",
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := Create(fake.ServiceClient(), options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_rules/f03bd950-6c56-4f5e-a307-45967078f507", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "GET")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_rule":{
|
||||||
|
"protocol": "tcp",
|
||||||
|
"description": "ssh rule",
|
||||||
|
"source_port": null,
|
||||||
|
"source_ip_address": null,
|
||||||
|
"destination_ip_address": "192.168.1.0/24",
|
||||||
|
"firewall_policy_id": "e2a5fb51-698c-4898-87e8-f1eee6b50919",
|
||||||
|
"position": 2,
|
||||||
|
"destination_port": "22",
|
||||||
|
"id": "f03bd950-6c56-4f5e-a307-45967078f507",
|
||||||
|
"name": "ssh_form_any",
|
||||||
|
"tenant_id": "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
"enabled": true,
|
||||||
|
"action": "allow",
|
||||||
|
"ip_version": 4,
|
||||||
|
"shared": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
rule, err := Get(fake.ServiceClient(), "f03bd950-6c56-4f5e-a307-45967078f507").Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
th.AssertEquals(t, "tcp", rule.Protocol)
|
||||||
|
th.AssertEquals(t, "ssh rule", rule.Description)
|
||||||
|
th.AssertEquals(t, "192.168.1.0/24", rule.DestinationIPAddress)
|
||||||
|
th.AssertEquals(t, "e2a5fb51-698c-4898-87e8-f1eee6b50919", rule.PolicyID)
|
||||||
|
th.AssertEquals(t, 2, rule.Position)
|
||||||
|
th.AssertEquals(t, "22", rule.DestinationPort)
|
||||||
|
th.AssertEquals(t, "f03bd950-6c56-4f5e-a307-45967078f507", rule.ID)
|
||||||
|
th.AssertEquals(t, "ssh_form_any", rule.Name)
|
||||||
|
th.AssertEquals(t, "80cf934d6ffb4ef5b244f1c512ad1e61", rule.TenantID)
|
||||||
|
th.AssertEquals(t, true, rule.Enabled)
|
||||||
|
th.AssertEquals(t, "allow", rule.Action)
|
||||||
|
th.AssertEquals(t, 4, rule.IPVersion)
|
||||||
|
th.AssertEquals(t, false, rule.Shared)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUpdate(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_rules/f03bd950-6c56-4f5e-a307-45967078f507", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "PUT")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"firewall_rule":{
|
||||||
|
"protocol": "tcp",
|
||||||
|
"description": "ssh rule",
|
||||||
|
"destination_ip_address": "192.168.1.0/24",
|
||||||
|
"destination_port": "22",
|
||||||
|
"source_ip_address": null,
|
||||||
|
"source_port": null,
|
||||||
|
"name": "ssh_form_any",
|
||||||
|
"action": "allow",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"firewall_rule":{
|
||||||
|
"protocol": "tcp",
|
||||||
|
"description": "ssh rule",
|
||||||
|
"source_port": null,
|
||||||
|
"source_ip_address": null,
|
||||||
|
"destination_ip_address": "192.168.1.0/24",
|
||||||
|
"firewall_policy_id": "e2a5fb51-698c-4898-87e8-f1eee6b50919",
|
||||||
|
"position": 2,
|
||||||
|
"destination_port": "22",
|
||||||
|
"id": "f03bd950-6c56-4f5e-a307-45967078f507",
|
||||||
|
"name": "ssh_form_any",
|
||||||
|
"tenant_id": "80cf934d6ffb4ef5b244f1c512ad1e61",
|
||||||
|
"enabled": false,
|
||||||
|
"action": "allow",
|
||||||
|
"ip_version": 4,
|
||||||
|
"shared": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
destinationIPAddress := "192.168.1.0/24"
|
||||||
|
destinationPort := "22"
|
||||||
|
empty := ""
|
||||||
|
|
||||||
|
options := UpdateOpts{
|
||||||
|
Protocol: "tcp",
|
||||||
|
Description: "ssh rule",
|
||||||
|
DestinationIPAddress: &destinationIPAddress,
|
||||||
|
DestinationPort: &destinationPort,
|
||||||
|
Name: "ssh_form_any",
|
||||||
|
SourceIPAddress: &empty,
|
||||||
|
SourcePort: &empty,
|
||||||
|
Action: "allow",
|
||||||
|
Enabled: No,
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := Update(fake.ServiceClient(), "f03bd950-6c56-4f5e-a307-45967078f507", options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDelete(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/fw/firewall_rules/4ec89077-d057-4a2b-911f-60a3b47ee304", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "DELETE")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
|
||||||
|
res := Delete(fake.ServiceClient(), "4ec89077-d057-4a2b-911f-60a3b47ee304")
|
||||||
|
th.AssertNoErr(t, res.Err)
|
||||||
|
}
|
110
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/results.go
generated
vendored
Normal file
110
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/results.go
generated
vendored
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
package rules
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
"github.com/rackspace/gophercloud"
|
||||||
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Rule represents a firewall rule
|
||||||
|
type Rule struct {
|
||||||
|
ID string `json:"id" mapstructure:"id"`
|
||||||
|
Name string `json:"name,omitempty" mapstructure:"name"`
|
||||||
|
Description string `json:"description,omitempty" mapstructure:"description"`
|
||||||
|
Protocol string `json:"protocol" mapstructure:"protocol"`
|
||||||
|
Action string `json:"action" mapstructure:"action"`
|
||||||
|
IPVersion int `json:"ip_version,omitempty" mapstructure:"ip_version"`
|
||||||
|
SourceIPAddress string `json:"source_ip_address,omitempty" mapstructure:"source_ip_address"`
|
||||||
|
DestinationIPAddress string `json:"destination_ip_address,omitempty" mapstructure:"destination_ip_address"`
|
||||||
|
SourcePort string `json:"source_port,omitempty" mapstructure:"source_port"`
|
||||||
|
DestinationPort string `json:"destination_port,omitempty" mapstructure:"destination_port"`
|
||||||
|
Shared bool `json:"shared,omitempty" mapstructure:"shared"`
|
||||||
|
Enabled bool `json:"enabled,omitempty" mapstructure:"enabled"`
|
||||||
|
PolicyID string `json:"firewall_policy_id" mapstructure:"firewall_policy_id"`
|
||||||
|
Position int `json:"position" mapstructure:"position"`
|
||||||
|
TenantID string `json:"tenant_id" mapstructure:"tenant_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RulePage is the page returned by a pager when traversing over a
|
||||||
|
// collection of firewall rules.
|
||||||
|
type RulePage struct {
|
||||||
|
pagination.LinkedPageBase
|
||||||
|
}
|
||||||
|
|
||||||
|
// NextPageURL is invoked when a paginated collection of firewall rules has
|
||||||
|
// reached the end of a page and the pager seeks to traverse over a new one.
|
||||||
|
// In order to do this, it needs to construct the next page's URL.
|
||||||
|
func (p RulePage) NextPageURL() (string, error) {
|
||||||
|
type resp struct {
|
||||||
|
Links []gophercloud.Link `mapstructure:"firewall_rules_links"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var r resp
|
||||||
|
err := mapstructure.Decode(p.Body, &r)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return gophercloud.ExtractNextURL(r.Links)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty checks whether a RulePage struct is empty.
|
||||||
|
func (p RulePage) IsEmpty() (bool, error) {
|
||||||
|
is, err := ExtractRules(p)
|
||||||
|
if err != nil {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return len(is) == 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractRules accepts a Page struct, specifically a RouterPage struct,
|
||||||
|
// and extracts the elements into a slice of Router structs. In other words,
|
||||||
|
// a generic collection is mapped into a relevant slice.
|
||||||
|
func ExtractRules(page pagination.Page) ([]Rule, error) {
|
||||||
|
var resp struct {
|
||||||
|
Rules []Rule `mapstructure:"firewall_rules" json:"firewall_rules"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(page.(RulePage).Body, &resp)
|
||||||
|
|
||||||
|
return resp.Rules, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type commonResult struct {
|
||||||
|
gophercloud.Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract is a function that accepts a result and extracts a firewall rule.
|
||||||
|
func (r commonResult) Extract() (*Rule, error) {
|
||||||
|
if r.Err != nil {
|
||||||
|
return nil, r.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
var res struct {
|
||||||
|
Rule *Rule `json:"firewall_rule" mapstructure:"firewall_rule"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := mapstructure.Decode(r.Body, &res)
|
||||||
|
|
||||||
|
return res.Rule, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResult represents the result of a get operation.
|
||||||
|
type GetResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResult represents the result of an update operation.
|
||||||
|
type UpdateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResult represents the result of a delete operation.
|
||||||
|
type DeleteResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateResult represents the result of a create operation.
|
||||||
|
type CreateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
16
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/urls.go
generated
vendored
Normal file
16
Godeps/_workspace/src/github.com/rackspace/gophercloud/openstack/networking/v2/extensions/fwaas/rules/urls.go
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package rules
|
||||||
|
|
||||||
|
import "github.com/rackspace/gophercloud"
|
||||||
|
|
||||||
|
const (
|
||||||
|
rootPath = "fw"
|
||||||
|
resourcePath = "firewall_rules"
|
||||||
|
)
|
||||||
|
|
||||||
|
func rootURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL(rootPath, resourcePath, id)
|
||||||
|
}
|
@@ -3,7 +3,6 @@ package floatingips
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -53,7 +52,6 @@ type CreateOpts struct {
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
errFloatingNetworkIDRequired = fmt.Errorf("A NetworkID is required")
|
errFloatingNetworkIDRequired = fmt.Errorf("A NetworkID is required")
|
||||||
errPortIDRequired = fmt.Errorf("A PortID is required")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create accepts a CreateOpts struct and uses the values provided to create a
|
// Create accepts a CreateOpts struct and uses the values provided to create a
|
||||||
@@ -88,16 +86,12 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
res.Err = errFloatingNetworkIDRequired
|
res.Err = errFloatingNetworkIDRequired
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
if opts.PortID == "" {
|
|
||||||
res.Err = errPortIDRequired
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define structures
|
// Define structures
|
||||||
type floatingIP struct {
|
type floatingIP struct {
|
||||||
FloatingNetworkID string `json:"floating_network_id"`
|
FloatingNetworkID string `json:"floating_network_id"`
|
||||||
FloatingIP string `json:"floating_ip_address,omitempty"`
|
FloatingIP string `json:"floating_ip_address,omitempty"`
|
||||||
PortID string `json:"port_id"`
|
PortID string `json:"port_id,omitempty"`
|
||||||
FixedIP string `json:"fixed_ip_address,omitempty"`
|
FixedIP string `json:"fixed_ip_address,omitempty"`
|
||||||
TenantID string `json:"tenant_id,omitempty"`
|
TenantID string `json:"tenant_id,omitempty"`
|
||||||
}
|
}
|
||||||
@@ -114,10 +108,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -127,9 +120,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular floating IP resource based on its unique ID.
|
// Get retrieves a particular floating IP resource based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -167,10 +159,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
var res UpdateResult
|
var res UpdateResult
|
||||||
_, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -182,8 +173,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
// internal ports.
|
// internal ports.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -170,6 +170,55 @@ func TestCreate(t *testing.T) {
|
|||||||
th.AssertEquals(t, "10.0.0.3", ip.FixedIP)
|
th.AssertEquals(t, "10.0.0.3", ip.FixedIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCreateEmptyPort(t *testing.T) {
|
||||||
|
th.SetupHTTP()
|
||||||
|
defer th.TeardownHTTP()
|
||||||
|
|
||||||
|
th.Mux.HandleFunc("/v2.0/floatingips", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
th.TestMethod(t, r, "POST")
|
||||||
|
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
|
||||||
|
th.TestHeader(t, r, "Content-Type", "application/json")
|
||||||
|
th.TestHeader(t, r, "Accept", "application/json")
|
||||||
|
th.TestJSONRequest(t, r, `
|
||||||
|
{
|
||||||
|
"floatingip": {
|
||||||
|
"floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, `
|
||||||
|
{
|
||||||
|
"floatingip": {
|
||||||
|
"router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
|
||||||
|
"tenant_id": "4969c491a3c74ee4af974e6d800c62de",
|
||||||
|
"floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
|
||||||
|
"fixed_ip_address": "10.0.0.3",
|
||||||
|
"floating_ip_address": "",
|
||||||
|
"id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
options := CreateOpts{
|
||||||
|
FloatingNetworkID: "376da547-b977-4cfe-9cba-275c80debf57",
|
||||||
|
}
|
||||||
|
|
||||||
|
ip, err := Create(fake.ServiceClient(), options).Extract()
|
||||||
|
th.AssertNoErr(t, err)
|
||||||
|
|
||||||
|
th.AssertEquals(t, "2f245a7b-796b-4f26-9cf9-9e82d248fda7", ip.ID)
|
||||||
|
th.AssertEquals(t, "4969c491a3c74ee4af974e6d800c62de", ip.TenantID)
|
||||||
|
th.AssertEquals(t, "376da547-b977-4cfe-9cba-275c80debf57", ip.FloatingNetworkID)
|
||||||
|
th.AssertEquals(t, "", ip.FloatingIP)
|
||||||
|
th.AssertEquals(t, "", ip.PortID)
|
||||||
|
th.AssertEquals(t, "10.0.0.3", ip.FixedIP)
|
||||||
|
}
|
||||||
|
|
||||||
func TestGet(t *testing.T) {
|
func TestGet(t *testing.T) {
|
||||||
th.SetupHTTP()
|
th.SetupHTTP()
|
||||||
defer th.TeardownHTTP()
|
defer th.TeardownHTTP()
|
||||||
|
@@ -3,7 +3,6 @@ package routers
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -82,10 +81,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var res CreateResult
|
var res CreateResult
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -94,9 +92,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular router based on its unique ID.
|
// Get retrieves a particular router based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -136,10 +133,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
var res UpdateResult
|
var res UpdateResult
|
||||||
_, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -149,8 +145,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
// Delete will permanently delete a particular router based on its unique ID.
|
// Delete will permanently delete a particular router based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -202,10 +197,9 @@ func AddInterface(c *gophercloud.ServiceClient, id string, opts InterfaceOpts) I
|
|||||||
|
|
||||||
body := request{SubnetID: opts.SubnetID, PortID: opts.PortID}
|
body := request{SubnetID: opts.SubnetID, PortID: opts.PortID}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", addInterfaceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", addInterfaceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &body,
|
||||||
ReqBody: &body,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -235,10 +229,9 @@ func RemoveInterface(c *gophercloud.ServiceClient, id string, opts InterfaceOpts
|
|||||||
|
|
||||||
body := request{SubnetID: opts.SubnetID, PortID: opts.PortID}
|
body := request{SubnetID: opts.SubnetID, PortID: opts.PortID}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", removeInterfaceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", removeInterfaceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &body,
|
||||||
ReqBody: &body,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package members
|
package members
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -80,10 +79,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
var res CreateResult
|
var res CreateResult
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -92,9 +90,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular pool member based on its unique ID.
|
// Get retrieves a particular pool member based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -119,10 +116,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
var res UpdateResult
|
var res UpdateResult
|
||||||
_, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -131,8 +127,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
// Delete will permanently delete a particular member based on its unique ID.
|
// Delete will permanently delete a particular member based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,7 +3,6 @@ package monitors
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -177,10 +176,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
AdminStateUp: opts.AdminStateUp,
|
AdminStateUp: opts.AdminStateUp,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -190,9 +188,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular health monitor based on its unique ID.
|
// Get retrieves a particular health monitor based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -261,10 +258,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
AdminStateUp: opts.AdminStateUp,
|
AdminStateUp: opts.AdminStateUp,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 202},
|
OkCodes: []int{200, 202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -274,8 +270,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
// Delete will permanently delete a particular monitor based on its unique ID.
|
// Delete will permanently delete a particular monitor based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package pools
|
package pools
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -100,10 +99,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
var res CreateResult
|
var res CreateResult
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -112,9 +110,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular pool based on its unique ID.
|
// Get retrieves a particular pool based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -148,10 +145,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
var res UpdateResult
|
var res UpdateResult
|
||||||
_, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -160,8 +156,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
// Delete will permanently delete a particular pool based on its unique ID.
|
// Delete will permanently delete a particular pool based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -183,10 +178,9 @@ func AssociateMonitor(c *gophercloud.ServiceClient, poolID, monitorID string) As
|
|||||||
reqBody := request{hm{ID: monitorID}}
|
reqBody := request{hm{ID: monitorID}}
|
||||||
|
|
||||||
var res AssociateResult
|
var res AssociateResult
|
||||||
_, res.Err = perigee.Request("POST", associateURL(c, poolID), perigee.Options{
|
_, res.Err = c.Request("POST", associateURL(c, poolID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -197,8 +191,7 @@ func AssociateMonitor(c *gophercloud.ServiceClient, poolID, monitorID string) As
|
|||||||
// check for the health of the members of the pool.
|
// check for the health of the members of the pool.
|
||||||
func DisassociateMonitor(c *gophercloud.ServiceClient, poolID, monitorID string) AssociateResult {
|
func DisassociateMonitor(c *gophercloud.ServiceClient, poolID, monitorID string) AssociateResult {
|
||||||
var res AssociateResult
|
var res AssociateResult
|
||||||
_, res.Err = perigee.Request("DELETE", disassociateURL(c, poolID, monitorID), perigee.Options{
|
_, res.Err = c.Request("DELETE", disassociateURL(c, poolID, monitorID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,7 +3,6 @@ package vips
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -179,10 +178,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
reqBody.VirtualIP.Persistence = opts.Persistence
|
reqBody.VirtualIP.Persistence = opts.Persistence
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -192,9 +190,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular virtual IP based on its unique ID.
|
// Get retrieves a particular virtual IP based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -252,10 +249,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
}
|
}
|
||||||
|
|
||||||
var res UpdateResult
|
var res UpdateResult
|
||||||
_, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 202},
|
OkCodes: []int{200, 202},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -265,8 +261,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResu
|
|||||||
// Delete will permanently delete a particular virtual IP based on its unique ID.
|
// Delete will permanently delete a particular virtual IP based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,7 +3,6 @@ package groups
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -75,10 +74,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
Description: opts.Description,
|
Description: opts.Description,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -88,9 +86,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular security group based on its unique ID.
|
// Get retrieves a particular security group based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -99,8 +96,7 @@ func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
|||||||
// Delete will permanently delete a particular security group based on its unique ID.
|
// Delete will permanently delete a particular security group based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,7 +3,6 @@ package rules
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@@ -151,10 +150,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
RemoteIPPrefix: opts.RemoteIPPrefix,
|
RemoteIPPrefix: opts.RemoteIPPrefix,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -164,9 +162,8 @@ func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
|
|||||||
// Get retrieves a particular security group based on its unique ID.
|
// Get retrieves a particular security group based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -175,8 +172,7 @@ func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
|||||||
// Delete will permanently delete a particular security group based on its unique ID.
|
// Delete will permanently delete a particular security group based on its unique ID.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", resourceURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,8 +3,6 @@ package networks
|
|||||||
import (
|
import (
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AdminState gives users a solid type to work with for create and update
|
// AdminState gives users a solid type to work with for create and update
|
||||||
@@ -81,9 +79,8 @@ func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
|||||||
// Get retrieves a specific network based on its unique ID.
|
// Get retrieves a specific network based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", getURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -138,10 +135,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
_, res.Err = perigee.Request("POST", createURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", createURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -188,10 +184,9 @@ func Update(c *gophercloud.ServiceClient, networkID string, opts UpdateOptsBuild
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send request to API
|
// Send request to API
|
||||||
_, res.Err = perigee.Request("PUT", updateURL(c, networkID), perigee.Options{
|
_, res.Err = c.Request("PUT", updateURL(c, networkID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -201,8 +196,7 @@ func Update(c *gophercloud.ServiceClient, networkID string, opts UpdateOptsBuild
|
|||||||
// Delete accepts a unique ID and deletes the network associated with it.
|
// Delete accepts a unique ID and deletes the network associated with it.
|
||||||
func Delete(c *gophercloud.ServiceClient, networkID string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, networkID string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(c, networkID), perigee.Options{
|
_, res.Err = c.Request("DELETE", deleteURL(c, networkID), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,8 +3,6 @@ package ports
|
|||||||
import (
|
import (
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AdminState gives users a solid type to work with for create and update
|
// AdminState gives users a solid type to work with for create and update
|
||||||
@@ -81,9 +79,8 @@ func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
|||||||
// Get retrieves a specific port based on its unique ID.
|
// Get retrieves a specific port based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", getURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -159,10 +156,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Response
|
// Response
|
||||||
_, res.Err = perigee.Request("POST", createURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", createURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -224,10 +220,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) Upd
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", updateURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", updateURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -236,8 +231,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) Upd
|
|||||||
// Delete accepts a unique ID and deletes the port associated with it.
|
// Delete accepts a unique ID and deletes the port associated with it.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", deleteURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -3,8 +3,6 @@ package subnets
|
|||||||
import (
|
import (
|
||||||
"github.com/rackspace/gophercloud"
|
"github.com/rackspace/gophercloud"
|
||||||
"github.com/rackspace/gophercloud/pagination"
|
"github.com/rackspace/gophercloud/pagination"
|
||||||
|
|
||||||
"github.com/racker/perigee"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AdminState gives users a solid type to work with for create and update
|
// AdminState gives users a solid type to work with for create and update
|
||||||
@@ -80,9 +78,8 @@ func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
|||||||
// Get retrieves a specific subnet based on its unique ID.
|
// Get retrieves a specific subnet based on its unique ID.
|
||||||
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
func Get(c *gophercloud.ServiceClient, id string) GetResult {
|
||||||
var res GetResult
|
var res GetResult
|
||||||
_, res.Err = perigee.Request("GET", getURL(c, id), perigee.Options{
|
_, res.Err = c.Request("GET", getURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200},
|
OkCodes: []int{200},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
@@ -174,10 +171,9 @@ func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("POST", createURL(c), perigee.Options{
|
_, res.Err = c.Request("POST", createURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{201},
|
OkCodes: []int{201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -233,10 +229,9 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) Upd
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
_, res.Err = perigee.Request("PUT", updateURL(c, id), perigee.Options{
|
_, res.Err = c.Request("PUT", updateURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
JSONBody: &reqBody,
|
||||||
ReqBody: &reqBody,
|
JSONResponse: &res.Body,
|
||||||
Results: &res.Body,
|
|
||||||
OkCodes: []int{200, 201},
|
OkCodes: []int{200, 201},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -246,8 +241,7 @@ func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) Upd
|
|||||||
// Delete accepts a unique ID and deletes the subnet associated with it.
|
// Delete accepts a unique ID and deletes the subnet associated with it.
|
||||||
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
|
||||||
var res DeleteResult
|
var res DeleteResult
|
||||||
_, res.Err = perigee.Request("DELETE", deleteURL(c, id), perigee.Options{
|
_, res.Err = c.Request("DELETE", deleteURL(c, id), gophercloud.RequestOpts{
|
||||||
MoreHeaders: c.AuthenticatedHeaders(),
|
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
return res
|
return res
|
||||||
|
@@ -1,9 +1,6 @@
|
|||||||
package accounts
|
package accounts
|
||||||
|
|
||||||
import (
|
import "github.com/rackspace/gophercloud"
|
||||||
"github.com/racker/perigee"
|
|
||||||
"github.com/rackspace/gophercloud"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetOptsBuilder allows extensions to add additional headers to the Get
|
// GetOptsBuilder allows extensions to add additional headers to the Get
|
||||||
// request.
|
// request.
|
||||||
@@ -42,11 +39,11 @@ func Get(c *gophercloud.ServiceClient, opts GetOptsBuilder) GetResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := perigee.Request("HEAD", getURL(c), perigee.Options{
|
resp, err := c.Request("HEAD", getURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: h,
|
MoreHeaders: h,
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
res.Header = resp.HttpResponse.Header
|
res.Header = resp.Header
|
||||||
res.Err = err
|
res.Err = err
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -83,7 +80,7 @@ func (opts UpdateOpts) ToAccountUpdateMap() (map[string]string, error) {
|
|||||||
// To extract the headers returned, call the Extract method on the UpdateResult.
|
// To extract the headers returned, call the Extract method on the UpdateResult.
|
||||||
func Update(c *gophercloud.ServiceClient, opts UpdateOptsBuilder) UpdateResult {
|
func Update(c *gophercloud.ServiceClient, opts UpdateOptsBuilder) UpdateResult {
|
||||||
var res UpdateResult
|
var res UpdateResult
|
||||||
h := c.AuthenticatedHeaders()
|
h := make(map[string]string)
|
||||||
|
|
||||||
if opts != nil {
|
if opts != nil {
|
||||||
headers, err := opts.ToAccountUpdateMap()
|
headers, err := opts.ToAccountUpdateMap()
|
||||||
@@ -96,11 +93,11 @@ func Update(c *gophercloud.ServiceClient, opts UpdateOptsBuilder) UpdateResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := perigee.Request("POST", updateURL(c), perigee.Options{
|
resp, err := c.Request("POST", updateURL(c), gophercloud.RequestOpts{
|
||||||
MoreHeaders: h,
|
MoreHeaders: h,
|
||||||
OkCodes: []int{204},
|
OkCodes: []int{204},
|
||||||
})
|
})
|
||||||
res.Header = resp.HttpResponse.Header
|
res.Header = resp.Header
|
||||||
res.Err = err
|
res.Err = err
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
@@ -54,6 +54,14 @@ func HandleListContainerInfoSuccessfully(t *testing.T) {
|
|||||||
"bytes": 14,
|
"bytes": 14,
|
||||||
"name": "marktwain"
|
"name": "marktwain"
|
||||||
}
|
}
|
||||||
|
]`)
|
||||||
|
case "janeausten":
|
||||||
|
fmt.Fprintf(w, `[
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"bytes": 14,
|
||||||
|
"name": "marktwain"
|
||||||
|
}
|
||||||
]`)
|
]`)
|
||||||
case "marktwain":
|
case "marktwain":
|
||||||
fmt.Fprintf(w, `[]`)
|
fmt.Fprintf(w, `[]`)
|
||||||
@@ -77,6 +85,8 @@ func HandleListContainerNamesSuccessfully(t *testing.T) {
|
|||||||
switch marker {
|
switch marker {
|
||||||
case "":
|
case "":
|
||||||
fmt.Fprintf(w, "janeausten\nmarktwain\n")
|
fmt.Fprintf(w, "janeausten\nmarktwain\n")
|
||||||
|
case "janeausten":
|
||||||
|
fmt.Fprintf(w, "marktwain\n")
|
||||||
case "marktwain":
|
case "marktwain":
|
||||||
fmt.Fprintf(w, ``)
|
fmt.Fprintf(w, ``)
|
||||||
default:
|
default:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user