api-site/firstapp/samples/gophercloud/block_storage.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)
}