123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- package main
- import (
- "fmt"
- "time"
- "github.com/gophercloud/gophercloud"
- "github.com/gophercloud/gophercloud/openstack"
- "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
- )
- func main() {
- // First you need auth token from Keystone
- // Option 1: Pass in the values yourself
- opts := gophercloud.AuthOptions{
- IdentityEndpoint: "http://controller:5000/v3", // Replace the controller with a controller IP
- DomainName: "mephi",
- TenantName: "test",
- Username: "test",
- Password: "test",
- }
- // Option 2: Use a utility function to retrieve all your environment variables
- // For testing purpose you can use demo.openrc file from current directory
- // The variables that you need:
- // OS_AUTH_URL=http://controller:5000/v3
- // OS_USERNAME=test
- // OS_PASSWORD=test
- // OS_TENANT_NAME=test --- It is project name
- // OS_DOMAIN_NAME=mephi
- // opts, err := openstack.AuthOptionsFromEnv()
- // The ProviderClient is the top-level client that all of your OpenStack services derive from.
- // The provider contains all of the authentication details that allow your Go code to access the API -
- // such as the base URL and token ID.
- provider, err := openstack.AuthenticatedClient(opts)
- if err != nil {
- panic(err)
- }
- fmt.Printf("TokenID: %s\n\n", provider.TokenID)
- // Create compute client
- // Instead of "Moscow" you can use os.Getenv("OS_REGION_NAME")
- client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
- Region: "Moscow",
- })
- demo_project := "6d89e46c693f4405a7b643110201b2f0" // demo project ID
- fmt.Println("List of all servers in project before creating the new one:")
- listAllServers(client, demo_project)
- // Create server
- fmt.Println("Creating new server...")
- serverID := createServer(client, 60)
- fmt.Println("List of all servers in project after creating the new one:")
- listAllServers(client, demo_project)
- // Delete server
- deleteServer(client, serverID, 15)
- fmt.Println("List of all servers in project after deleting the new one:")
- listAllServers(client, demo_project)
- }
- func listAllServers(client *gophercloud.ServiceClient, projectID string) {
- listOpts := servers.ListOpts{
- TenantID: projectID, // Project ID
- }
- allPages, err := servers.List(client, listOpts).AllPages()
- if err != nil {
- panic(err)
- }
- allServers, err := servers.ExtractServers(allPages)
- if err != nil {
- panic(err)
- }
- fmt.Printf("%-15s :: %-36s :: %s\n", "Name", "ID", "Status")
- for _, server := range allServers {
- fmt.Printf("%-15s :: %s :: %s\n", server.Name, server.ID, server.Status)
- }
- fmt.Println("")
- }
- func createServer(client *gophercloud.ServiceClient, timeout int) string {
- // Create network option
- vlan50 := servers.Network{UUID: "621580cf-bb53-4957-a504-8c2ce6b5cece"} // UUID of a network to attach to the newly provisioned server
- // The main options for creating an instance
- // See other options in CreateOpts struct in github.com/gophercloud/gophercloud/openstack/compute/v2/servers/requests.go
- createOpts := servers.CreateOpts{
- Name: "test_api_server",
- ImageRef: "7ab831ff-f0b1-4836-867e-6001852ffd3f", // Ubuntu LXD image ID
- FlavorRef: "efef0c7b-6d63-4482-8a95-edeca914963d", // Ubuntu flavor ID
- AvailabilityZone: "LXD",
- Networks: []servers.Network{vlan50},
- }
- server, err := servers.Create(client, createOpts).Extract()
- if err != nil {
- panic(err)
- }
- // Wait for successful creating
- // Possible values of status are: ACTIVE, BUILD, REBUILD, RESIZE, VERIFY_RESIZE or MIGRATING.
- // The last value is timeout
- servers.WaitForStatus(client, server.ID, "ACTIVE", timeout)
- // Set root password after successful creating of server
- servers.ChangeAdminPassword(client, server.ID, "777")
- fmt.Printf("Created server with ID %s\n\n", server.ID)
- return server.ID
- }
- func deleteServer(client *gophercloud.ServiceClient, serverID string, timeout int) {
- err := servers.Delete(client, serverID).ExtractErr()
- if err != nil {
- panic(err)
- }
- // Wait for successful deleting
- for i := 0; i < timeout; i++ {
- _, err := servers.Get(client, serverID).Extract()
- if err == nil {
- fmt.Println("Waiting for deleting...")
- time.Sleep(time.Second)
- continue
- }
- switch err.(type) {
- case gophercloud.ErrDefault404:
- fmt.Printf("Deleted server with ID %s\n\n", serverID)
- return
- default:
- panic(err)
- }
- }
- fmt.Printf("Error: server with ID %s was not deleted after %i seconds of waiting\n\n", serverID, timeout)
- }
|