github.com/mponton/terratest@v0.44.0/modules/oci/compute.go (about)

     1  package oci
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sort"
     7  
     8  	"github.com/mponton/terratest/modules/logger"
     9  	"github.com/mponton/terratest/modules/testing"
    10  	"github.com/oracle/oci-go-sdk/common"
    11  	"github.com/oracle/oci-go-sdk/core"
    12  )
    13  
    14  // DeleteImage deletes a custom image with given OCID.
    15  func DeleteImage(t testing.TestingT, ocid string) {
    16  	err := DeleteImageE(t, ocid)
    17  	if err != nil {
    18  		t.Fatal(err)
    19  	}
    20  }
    21  
    22  // DeleteImageE deletes a custom image with given OCID.
    23  func DeleteImageE(t testing.TestingT, ocid string) error {
    24  	logger.Logf(t, "Deleting image with OCID %s", ocid)
    25  
    26  	configProvider := common.DefaultConfigProvider()
    27  	client, err := core.NewComputeClientWithConfigurationProvider(configProvider)
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	request := core.DeleteImageRequest{ImageId: &ocid}
    33  	_, err = client.DeleteImage(context.Background(), request)
    34  	return err
    35  }
    36  
    37  // GetMostRecentImageID gets the OCID of the most recent image in the given compartment that has the given OS name and version.
    38  func GetMostRecentImageID(t testing.TestingT, compartmentID string, osName string, osVersion string) string {
    39  	ocid, err := GetMostRecentImageIDE(t, compartmentID, osName, osVersion)
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	return ocid
    44  }
    45  
    46  // GetMostRecentImageIDE gets the OCID of the most recent image in the given compartment that has the given OS name and version.
    47  func GetMostRecentImageIDE(t testing.TestingT, compartmentID string, osName string, osVersion string) (string, error) {
    48  	configProvider := common.DefaultConfigProvider()
    49  	client, err := core.NewComputeClientWithConfigurationProvider(configProvider)
    50  	if err != nil {
    51  		return "", err
    52  	}
    53  
    54  	request := core.ListImagesRequest{
    55  		CompartmentId:          &compartmentID,
    56  		OperatingSystem:        &osName,
    57  		OperatingSystemVersion: &osVersion,
    58  	}
    59  	response, err := client.ListImages(context.Background(), request)
    60  	if err != nil {
    61  		return "", err
    62  	}
    63  
    64  	if len(response.Items) == 0 {
    65  		return "", fmt.Errorf("No %s %s images found in the %s compartment", osName, osVersion, compartmentID)
    66  	}
    67  
    68  	mostRecentImage := mostRecentImage(response.Items)
    69  	return *mostRecentImage.Id, nil
    70  }
    71  
    72  // Image sorting code borrowed from: https://github.com/hashicorp/packer/blob/7f4112ba229309cfc0ebaa10ded2abdfaf1b22c8/builder/amazon/common/step_source_ami_info.go
    73  type imageSort []core.Image
    74  
    75  func (a imageSort) Len() int      { return len(a) }
    76  func (a imageSort) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
    77  func (a imageSort) Less(i, j int) bool {
    78  	iTime := a[i].TimeCreated.Unix()
    79  	jTime := a[j].TimeCreated.Unix()
    80  	return iTime < jTime
    81  }
    82  
    83  // mostRecentImage returns the most recent image out of a slice of images.
    84  func mostRecentImage(images []core.Image) core.Image {
    85  	sortedImages := images
    86  	sort.Sort(imageSort(sortedImages))
    87  	return sortedImages[len(sortedImages)-1]
    88  }