From 0c34d6ca129fa6b44d95230bdc503c2532aacab8 Mon Sep 17 00:00:00 2001 From: js-g Date: Thu, 15 Oct 2020 15:28:38 -0400 Subject: [PATCH] feat (builder/oracle-oci): add regex search on base image name --- builder/oracle/oci/config.go | 1 + builder/oracle/oci/config.hcl2spec.go | 2 ++ builder/oracle/oci/driver_oci.go | 22 +++++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/builder/oracle/oci/config.go b/builder/oracle/oci/config.go index 748beb9d3..cc47c893e 100644 --- a/builder/oracle/oci/config.go +++ b/builder/oracle/oci/config.go @@ -39,6 +39,7 @@ type ListImagesRequest struct { // fields that can be specified under "base_image_filter" CompartmentId *string `mapstructure:"compartment_id"` DisplayName *string `mapstructure:"display_name"` + DisplayNameSearch *string `mapstructure:"display_name_search"` OperatingSystem *string `mapstructure:"operating_system"` OperatingSystemVersion *string `mapstructure:"operating_system_version"` Shape *string `mapstructure:"shape"` diff --git a/builder/oracle/oci/config.hcl2spec.go b/builder/oracle/oci/config.hcl2spec.go index b7dcf8ba4..678fc8376 100644 --- a/builder/oracle/oci/config.hcl2spec.go +++ b/builder/oracle/oci/config.hcl2spec.go @@ -235,6 +235,7 @@ func (*FlatCreateVNICDetails) HCL2Spec() map[string]hcldec.Spec { type FlatListImagesRequest struct { CompartmentId *string `mapstructure:"compartment_id" cty:"compartment_id" hcl:"compartment_id"` DisplayName *string `mapstructure:"display_name" cty:"display_name" hcl:"display_name"` + DisplayNameSearch *string `mapstructure:"display_name_search" cty:"display_name_search" hcl:"display_name_search"` OperatingSystem *string `mapstructure:"operating_system" cty:"operating_system" hcl:"operating_system"` OperatingSystemVersion *string `mapstructure:"operating_system_version" cty:"operating_system_version" hcl:"operating_system_version"` Shape *string `mapstructure:"shape" cty:"shape" hcl:"shape"` @@ -254,6 +255,7 @@ func (*FlatListImagesRequest) HCL2Spec() map[string]hcldec.Spec { s := map[string]hcldec.Spec{ "compartment_id": &hcldec.AttrSpec{Name: "compartment_id", Type: cty.String, Required: false}, "display_name": &hcldec.AttrSpec{Name: "display_name", Type: cty.String, Required: false}, + "display_name_search": &hcldec.AttrSpec{Name: "display_name_search", Type: cty.String, Required: false}, "operating_system": &hcldec.AttrSpec{Name: "operating_system", Type: cty.String, Required: false}, "operating_system_version": &hcldec.AttrSpec{Name: "operating_system_version", Type: cty.String, Required: false}, "shape": &hcldec.AttrSpec{Name: "shape", Type: cty.String, Required: false}, diff --git a/builder/oracle/oci/driver_oci.go b/builder/oracle/oci/driver_oci.go index b3a261ca7..0178741ea 100644 --- a/builder/oracle/oci/driver_oci.go +++ b/builder/oracle/oci/driver_oci.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "regexp" "time" core "github.com/oracle/oci-go-sdk/core" @@ -69,6 +70,7 @@ func (d *driverOCI) CreateInstance(ctx context.Context, publicKey string) (strin if d.cfg.BaseImageID != "" { imageId = &d.cfg.BaseImageID } else { + // Pull images and determine which image ID to use, if BaseImageId not specified response, err := d.computeClient.ListImages(ctx, core.ListImagesRequest{ CompartmentId: d.cfg.BaseImageFilter.CompartmentId, DisplayName: d.cfg.BaseImageFilter.DisplayName, @@ -85,7 +87,25 @@ func (d *driverOCI) CreateInstance(ctx context.Context, publicKey string) (strin if len(response.Items) == 0 { return "", errors.New("base_image_filter returned no images") } - imageId = response.Items[0].Id + if d.cfg.BaseImageFilter.DisplayNameSearch != nil { + // Return most recent image that matches regex + imageNameRegex, err := regexp.Compile(*d.cfg.BaseImageFilter.DisplayNameSearch) + if err != nil { + return "", err + } + for _, image := range response.Items { + if imageNameRegex.MatchString(*image.DisplayName) { + imageId = image.Id + break + } + } + if imageId == nil { + return "", errors.New("No image matched display_name_search criteria") + } + } else { + // If no regex provided, simply return most recent image pulled + imageId = response.Items[0].Id + } } // Create Source details which will be used to Launch Instance