main.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gophercloud/gophercloud"
  6. "github.com/gophercloud/gophercloud/openstack"
  7. "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
  8. )
  9. func main() {
  10. // First you need auth token from Keystone
  11. // Option 1: Pass in the values yourself
  12. opts := gophercloud.AuthOptions{
  13. IdentityEndpoint: "http://controller:5000/v3", // Replace the controller with a controller IP
  14. DomainName: "mephi",
  15. TenantName: "test",
  16. Username: "test",
  17. Password: "test",
  18. }
  19. // Option 2: Use a utility function to retrieve all your environment variables
  20. // For testing purpose you can use demo.openrc file from current directory
  21. // The variables that you need:
  22. // OS_AUTH_URL=http://controller:5000/v3
  23. // OS_USERNAME=test
  24. // OS_PASSWORD=test
  25. // OS_TENANT_NAME=test --- It is project name
  26. // OS_DOMAIN_NAME=mephi
  27. // opts, err := openstack.AuthOptionsFromEnv()
  28. // The ProviderClient is the top-level client that all of your OpenStack services derive from.
  29. // The provider contains all of the authentication details that allow your Go code to access the API -
  30. // such as the base URL and token ID.
  31. provider, err := openstack.AuthenticatedClient(opts)
  32. if err != nil {
  33. panic(err)
  34. }
  35. fmt.Printf("TokenID: %s\n\n", provider.TokenID)
  36. // Create compute client
  37. // Instead of "Moscow" you can use os.Getenv("OS_REGION_NAME")
  38. client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
  39. Region: "Moscow",
  40. })
  41. demo_project := "6d89e46c693f4405a7b643110201b2f0" // demo project ID
  42. fmt.Println("List of all servers in project before creating the new one:")
  43. listAllServers(client, demo_project)
  44. // Create server
  45. fmt.Println("Creating new server...")
  46. serverID := createServer(client, 60)
  47. fmt.Println("List of all servers in project after creating the new one:")
  48. listAllServers(client, demo_project)
  49. // Delete server
  50. deleteServer(client, serverID, 15)
  51. fmt.Println("List of all servers in project after deleting the new one:")
  52. listAllServers(client, demo_project)
  53. }
  54. func listAllServers(client *gophercloud.ServiceClient, projectID string) {
  55. listOpts := servers.ListOpts{
  56. TenantID: projectID, // Project ID
  57. }
  58. allPages, err := servers.List(client, listOpts).AllPages()
  59. if err != nil {
  60. panic(err)
  61. }
  62. allServers, err := servers.ExtractServers(allPages)
  63. if err != nil {
  64. panic(err)
  65. }
  66. fmt.Printf("%-15s :: %-36s :: %s\n", "Name", "ID", "Status")
  67. for _, server := range allServers {
  68. fmt.Printf("%-15s :: %s :: %s\n", server.Name, server.ID, server.Status)
  69. }
  70. fmt.Println("")
  71. }
  72. func createServer(client *gophercloud.ServiceClient, timeout int) string {
  73. // Create network option
  74. vlan50 := servers.Network{UUID: "621580cf-bb53-4957-a504-8c2ce6b5cece"} // UUID of a network to attach to the newly provisioned server
  75. // The main options for creating an instance
  76. // See other options in CreateOpts struct in github.com/gophercloud/gophercloud/openstack/compute/v2/servers/requests.go
  77. createOpts := servers.CreateOpts{
  78. Name: "test_api_server",
  79. ImageRef: "7ab831ff-f0b1-4836-867e-6001852ffd3f", // Ubuntu LXD image ID
  80. FlavorRef: "efef0c7b-6d63-4482-8a95-edeca914963d", // Ubuntu flavor ID
  81. AvailabilityZone: "LXD",
  82. Networks: []servers.Network{vlan50},
  83. }
  84. server, err := servers.Create(client, createOpts).Extract()
  85. if err != nil {
  86. panic(err)
  87. }
  88. // Wait for successful creating
  89. // Possible values of status are: ACTIVE, BUILD, REBUILD, RESIZE, VERIFY_RESIZE or MIGRATING.
  90. // The last value is timeout
  91. servers.WaitForStatus(client, server.ID, "ACTIVE", timeout)
  92. // Set root password after successful creating of server
  93. servers.ChangeAdminPassword(client, server.ID, "777")
  94. fmt.Printf("Created server with ID %s\n\n", server.ID)
  95. return server.ID
  96. }
  97. func deleteServer(client *gophercloud.ServiceClient, serverID string, timeout int) {
  98. err := servers.Delete(client, serverID).ExtractErr()
  99. if err != nil {
  100. panic(err)
  101. }
  102. // Wait for successful deleting
  103. for i := 0; i < timeout; i++ {
  104. _, err := servers.Get(client, serverID).Extract()
  105. if err == nil {
  106. fmt.Println("Waiting for deleting...")
  107. time.Sleep(time.Second)
  108. continue
  109. }
  110. switch err.(type) {
  111. case gophercloud.ErrDefault404:
  112. fmt.Printf("Deleted server with ID %s\n\n", serverID)
  113. return
  114. default:
  115. panic(err)
  116. }
  117. }
  118. fmt.Printf("Error: server with ID %s was not deleted after %i seconds of waiting\n\n", serverID, timeout)
  119. }