|
Packit Service |
509fd4 |
// +build integration
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
package openstacktest
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
import (
|
|
Packit Service |
509fd4 |
"fmt"
|
|
Packit Service |
509fd4 |
"os"
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
"github.com/gophercloud/gophercloud"
|
|
Packit Service |
509fd4 |
"github.com/gophercloud/gophercloud/openstack"
|
|
Packit Service |
509fd4 |
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
|
Packit Service |
15f37d |
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/imagedata"
|
|
Packit Service |
15f37d |
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
|
|
Packit Service |
509fd4 |
)
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
15f37d |
const WaitTimeout = 30 * 60 // 30 minutes in seconds
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
func UploadImageToOpenStack(p *gophercloud.ProviderClient, imagePath string, imageName string) (*images.Image, error) {
|
|
Packit Service |
509fd4 |
client, err := openstack.NewImageServiceV2(p, gophercloud.EndpointOpts{
|
|
Packit Service |
509fd4 |
Region: os.Getenv("OS_REGION_NAME"),
|
|
Packit Service |
509fd4 |
})
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return nil, fmt.Errorf("Error creating ImageService client: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// create a new image which gives us the ID
|
|
Packit Service |
509fd4 |
image, err := images.Create(client, images.CreateOpts{
|
|
Packit Service |
15f37d |
Name: imageName,
|
|
Packit Service |
15f37d |
DiskFormat: "qcow2",
|
|
Packit Service |
509fd4 |
ContainerFormat: "bare",
|
|
Packit Service |
509fd4 |
}).Extract()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return image, fmt.Errorf("Creating image failed: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// then upload the actual binary data
|
|
Packit Service |
509fd4 |
imageData, err := os.Open(imagePath)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return image, fmt.Errorf("Error opening %s: %v", imagePath, err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
defer imageData.Close()
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
err = imagedata.Upload(client, image.ID, imageData).ExtractErr()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return image, fmt.Errorf("Upload to OpenStack failed: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// wait for the status to change from Queued to Active
|
|
Packit Service |
509fd4 |
err = gophercloud.WaitFor(WaitTimeout, func() (bool, error) {
|
|
Packit Service |
509fd4 |
actual, err := images.Get(client, image.ID).Extract()
|
|
Packit Service |
509fd4 |
return actual.Status == images.ImageStatusActive, err
|
|
Packit Service |
509fd4 |
})
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return image, fmt.Errorf("Waiting for image to become Active failed: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
return image, nil
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
func DeleteImageFromOpenStack(p *gophercloud.ProviderClient, imageUUID string) error {
|
|
Packit Service |
509fd4 |
client, err := openstack.NewImageServiceV2(p, gophercloud.EndpointOpts{
|
|
Packit Service |
509fd4 |
Region: os.Getenv("OS_REGION_NAME"),
|
|
Packit Service |
509fd4 |
})
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Error creating ImageService client: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
err = images.Delete(client, imageUUID).ExtractErr()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("cannot delete the image: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
return nil
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
func WithBootedImageInOpenStack(p *gophercloud.ProviderClient, imageID, userData string, f func(address string) error) (retErr error) {
|
|
Packit Service |
509fd4 |
client, err := openstack.NewComputeV2(p, gophercloud.EndpointOpts{
|
|
Packit Service |
509fd4 |
Region: os.Getenv("OS_REGION_NAME"),
|
|
Packit Service |
509fd4 |
})
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Error creating Compute client: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
server, err := servers.Create(client, servers.CreateOpts{
|
|
Packit Service |
509fd4 |
Name: "osbuild-composer-vm-for-" + imageID,
|
|
Packit Service |
509fd4 |
FlavorRef: "77b8cf27-be16-40d9-95b1-81db4522be1e", // ci.m1.medium.ephemeral
|
|
Packit Service |
15f37d |
Networks: []servers.Network{ // provider_net_cci_2
|
|
Packit Service |
509fd4 |
servers.Network{UUID: "74e8faa7-87ba-41b2-a000-438013194814"},
|
|
Packit Service |
509fd4 |
},
|
|
Packit Service |
15f37d |
ImageRef: imageID,
|
|
Packit Service |
509fd4 |
UserData: []byte(userData),
|
|
Packit Service |
509fd4 |
}).Extract()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Cannot create instance: %v", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// cleanup
|
|
Packit Service |
15f37d |
defer func() {
|
|
Packit Service |
509fd4 |
err := servers.ForceDelete(client, server.ID).ExtractErr()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
fmt.Printf("Force deleting instance %s failed: %v", server.ID, err)
|
|
Packit Service |
509fd4 |
return
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
}()
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// wait for the status to become Active
|
|
Packit Service |
509fd4 |
err = servers.WaitForStatus(client, server.ID, "ACTIVE", WaitTimeout)
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Waiting for instance %s to become Active failed: %v", server.ID, err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// get server details again to refresh the IP addresses
|
|
Packit Service |
509fd4 |
server, err = servers.Get(client, server.ID).Extract()
|
|
Packit Service |
509fd4 |
if err != nil {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Cannot get instance details: %v\n", err)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
// server.AccessIPv4 is empty so list all addresses and
|
|
Packit Service |
509fd4 |
// get the first fixed one. ssh should be equally happy with v4 or v6
|
|
Packit Service |
509fd4 |
var fixedIP string
|
|
Packit Service |
509fd4 |
for _, networkAddresses := range server.Addresses["provider_net_cci_2"].([]interface{}) {
|
|
Packit Service |
509fd4 |
address := networkAddresses.(map[string]interface{})
|
|
Packit Service |
509fd4 |
if address["OS-EXT-IPS:type"] == "fixed" {
|
|
Packit Service |
509fd4 |
fixedIP = address["addr"].(string)
|
|
Packit Service |
509fd4 |
break
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
if fixedIP == "" {
|
|
Packit Service |
509fd4 |
return fmt.Errorf("Cannot find IP address for instance %s", server.ID)
|
|
Packit Service |
509fd4 |
}
|
|
Packit Service |
509fd4 |
|
|
Packit Service |
509fd4 |
return f(fixedIP)
|
|
Packit Service |
509fd4 |
}
|