
Update URLs for recent OpenDev change. Change-Id: I0f7e48f054da0eeb12593c5756e5f5f47a577f4f
136 lines
3.5 KiB
Go
136 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/gophercloud/gophercloud"
|
|
"github.com/gophercloud/gophercloud/openstack"
|
|
"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes"
|
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
|
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups"
|
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
|
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
|
"github.com/gophercloud/gophercloud/pagination"
|
|
)
|
|
|
|
func main() {
|
|
|
|
// step-1
|
|
authOpts, err := openstack.AuthOptionsFromEnv()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
provider, err := openstack.AuthenticatedClient(authOpts)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
var regionName = os.Getenv("OS_REGION_NAME")
|
|
volumeClient, err := openstack.NewBlockStorageV1(provider, gophercloud.EndpointOpts{
|
|
Region: regionName,
|
|
})
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
// step-2
|
|
volumeOpts := volumes.CreateOpts{Size: 1, Name: "test"}
|
|
volume, err := volumes.Create(volumeClient, volumeOpts).Extract()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
// step-3
|
|
_ = volumes.List(volumeClient, nil).EachPage(func(page pagination.Page) (bool, error) {
|
|
volumeList, _ := volumes.ExtractVolumes(page)
|
|
for _, vol := range volumeList {
|
|
fmt.Println(vol)
|
|
}
|
|
return true, nil
|
|
})
|
|
|
|
// step-4
|
|
computeClient, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
|
|
Region: regionName,
|
|
Type: "computev21",
|
|
})
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
securityGroupName := "database"
|
|
databaseSecurityGroup, _ := secgroups.Create(computeClient, secgroups.CreateOpts{
|
|
Name: securityGroupName,
|
|
Description: "for database service",
|
|
}).Extract()
|
|
secgroups.CreateRule(computeClient, secgroups.CreateRuleOpts{
|
|
ParentGroupID: databaseSecurityGroup.ID,
|
|
FromPort: 22,
|
|
ToPort: 22,
|
|
IPProtocol: "TCP",
|
|
CIDR: "0.0.0.0/0",
|
|
}).Extract()
|
|
secgroups.CreateRule(computeClient, secgroups.CreateRuleOpts{
|
|
ParentGroupID: databaseSecurityGroup.ID,
|
|
FromPort: 3306,
|
|
ToPort: 3306,
|
|
IPProtocol: "TCP",
|
|
CIDR: "0.0.0.0/0",
|
|
}).Extract()
|
|
|
|
userData := `#!/usr/bin/env bash
|
|
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
|
|
-i faafo -i messaging -r api -r worker -r demo`
|
|
|
|
imageID := "41ba40fd-e801-4639-a842-e3a2e5a2ebdd"
|
|
flavorID := "3"
|
|
networkID := "aba7a6f8-6ec9-4666-8c42-ac2d00707010"
|
|
|
|
serverOpts := servers.CreateOpts{
|
|
Name: "app-database",
|
|
ImageRef: imageID,
|
|
FlavorRef: flavorID,
|
|
Networks: []servers.Network{servers.Network{UUID: networkID}},
|
|
SecurityGroups: []string{securityGroupName},
|
|
UserData: []byte(userData),
|
|
}
|
|
|
|
server, err := servers.Create(computeClient, keypairs.CreateOptsExt{
|
|
CreateOptsBuilder: serverOpts,
|
|
KeyName: "demokey",
|
|
}).Extract()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
servers.WaitForStatus(computeClient, server.ID, "ACTIVE", 300)
|
|
|
|
// step-5
|
|
volumeAttachOptions := volumeattach.CreateOpts{
|
|
VolumeID: volume.ID,
|
|
}
|
|
|
|
volumeAttach, err := volumeattach.Create(computeClient, server.ID, volumeAttachOptions).Extract()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
volumes.WaitForStatus(volumeClient, volumeAttach.ID, "available", 60)
|
|
|
|
// step-6
|
|
err = volumeattach.Delete(computeClient, server.ID, volume.ID).ExtractErr()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
volumes.WaitForStatus(volumeClient, volume.ID, "available", 60)
|
|
volumes.Delete(volumeClient, volume.ID)
|
|
}
|