From 3e19f0c1379dd0af6b8b56bdbede4db14e33ac2d Mon Sep 17 00:00:00 2001 From: Alberto Fanjul Date: Tue, 28 Jul 2026 17:17:31 +0200 Subject: [PATCH] feat(aws): Support instance creation from AMI id Signed-off-by: Alberto Fanjul --- cmd/mapt/cmd/aws/hosts/fedora.go | 2 + cmd/mapt/cmd/aws/hosts/rhel.go | 2 + cmd/mapt/cmd/aws/hosts/rhelai.go | 2 + cmd/mapt/cmd/aws/hosts/windows.go | 2 + cmd/mapt/cmd/aws/services/kind.go | 2 + cmd/mapt/cmd/aws/services/snc.go | 2 + pkg/provider/aws/action/fedora/fedora.go | 19 +++++-- pkg/provider/aws/action/kind/kind.go | 16 ++++-- pkg/provider/aws/action/rhel-ai/rhelai.go | 24 ++++++--- pkg/provider/aws/action/rhel/rhel.go | 19 +++++-- pkg/provider/aws/action/snc/snc.go | 26 ++++++--- pkg/provider/aws/action/windows/windows.go | 63 ++++++++++++---------- pkg/provider/aws/services/ec2/ami/ami.go | 13 ++++- pkg/target/host/rhelai/api.go | 1 + pkg/target/service/kind/api.go | 1 + pkg/target/service/snc/api.go | 1 + 16 files changed, 137 insertions(+), 58 deletions(-) diff --git a/cmd/mapt/cmd/aws/hosts/fedora.go b/cmd/mapt/cmd/aws/hosts/fedora.go index e02518d76..155bcf0dc 100644 --- a/cmd/mapt/cmd/aws/hosts/fedora.go +++ b/cmd/mapt/cmd/aws/hosts/fedora.go @@ -64,6 +64,7 @@ func getFedoraCreate() *cobra.Command { Prefix: "main", Version: viper.GetString(fedoraVersion), Arch: viper.GetString(params.LinuxArch), + AMIID: viper.GetString(params.AMIIDName), ComputeRequest: params.ComputeRequestArgs(), Spot: params.SpotArgs(), Timeout: viper.GetString(params.Timeout), @@ -76,6 +77,7 @@ func getFedoraCreate() *cobra.Command { flagSet.StringToStringP(params.Tags, "", nil, params.TagsDesc) flagSet.StringP(fedoraVersion, "", fedoraVersionDefault, fedoraVersionDesc) flagSet.StringP(params.LinuxArch, "", params.LinuxArchDefault, params.LinuxArchDesc) + flagSet.StringP(params.AMIIDName, "", "", params.AMIIDDesc) flagSet.Bool(airgap, false, airgapDesc) flagSet.StringP(params.Timeout, "", "", params.TimeoutDesc) params.AddComputeRequestFlags(flagSet) diff --git a/cmd/mapt/cmd/aws/hosts/rhel.go b/cmd/mapt/cmd/aws/hosts/rhel.go index e02056135..165f21f08 100644 --- a/cmd/mapt/cmd/aws/hosts/rhel.go +++ b/cmd/mapt/cmd/aws/hosts/rhel.go @@ -60,6 +60,7 @@ func getRHELCreate() *cobra.Command { Prefix: "main", Version: viper.GetString(params.RhelVersion), Arch: viper.GetString(params.LinuxArch), + AMIID: viper.GetString(params.AMIIDName), ComputeRequest: params.ComputeRequestArgs(), SubsUsername: viper.GetString(params.SubsUsername), SubsUserpass: viper.GetString(params.SubsUserpass), @@ -76,6 +77,7 @@ func getRHELCreate() *cobra.Command { flagSet.StringToStringP(params.Tags, "", nil, params.TagsDesc) flagSet.StringP(params.RhelVersion, "", params.RhelVersionDefault, params.RhelVersionDesc) flagSet.StringP(params.LinuxArch, "", params.LinuxArchDefault, params.LinuxArchDesc) + flagSet.StringP(params.AMIIDName, "", "", params.AMIIDDesc) flagSet.StringP(params.SubsUsername, "", "", params.SubsUsernameDesc) flagSet.StringP(params.SubsUserpass, "", "", params.SubsUserpassDesc) flagSet.Bool(airgap, false, airgapDesc) diff --git a/cmd/mapt/cmd/aws/hosts/rhelai.go b/cmd/mapt/cmd/aws/hosts/rhelai.go index a52921697..7541b7ab2 100644 --- a/cmd/mapt/cmd/aws/hosts/rhelai.go +++ b/cmd/mapt/cmd/aws/hosts/rhelai.go @@ -64,6 +64,7 @@ func getRHELAICreate() *cobra.Command { Version: viper.GetString(params.RhelAIVersion), Accelerator: viper.GetString(params.RhelAIAccelerator), CustomImage: viper.GetString(params.RhelAICustomImage), + AMIID: viper.GetString(params.AMIIDName), ComputeRequest: params.ComputeRequestArgs(), Spot: params.SpotArgs(), Timeout: viper.GetString(params.Timeout), @@ -83,6 +84,7 @@ func getRHELAICreate() *cobra.Command { flagSet.StringP(params.RhelAIVersion, "", params.RhelAIVersionDefault, params.RhelAIVersionDesc) flagSet.StringP(params.RhelAIAccelerator, "", params.RhelAIAccelearatorDefault, params.RhelAIAccelearatorDesc) flagSet.StringP(params.RhelAICustomImage, "", "", params.RhelAICustomImageDesc) + flagSet.StringP(params.AMIIDName, "", "", params.AMIIDDesc) flagSet.StringP(params.RhelAIModel, "", "", params.RhelAIModelDesc) flagSet.StringP(params.RhelAIHFToken, "", "", params.RhelAIHFTokenDesc) flagSet.StringP(params.RhelAIAPIKey, "", "", params.RhelAIAPIKeyDesc) diff --git a/cmd/mapt/cmd/aws/hosts/windows.go b/cmd/mapt/cmd/aws/hosts/windows.go index 6cce4c08d..39af0b8ee 100644 --- a/cmd/mapt/cmd/aws/hosts/windows.go +++ b/cmd/mapt/cmd/aws/hosts/windows.go @@ -76,6 +76,7 @@ func getWindowsCreate() *cobra.Command { AMIOwner: viper.GetString(amiOwner), AMILang: viper.GetString(amiLang), AMIKeepCopy: viper.IsSet(amiKeepCopy), + AMIID: viper.GetString(params.AMIIDName), ComputeRequest: params.ComputeRequestArgs(), Spot: params.SpotArgs(), Airgap: viper.IsSet(airgap), @@ -91,6 +92,7 @@ func getWindowsCreate() *cobra.Command { flagSet.StringP(amiUsername, "", amiUsernameDefault, amiUsernameDesc) flagSet.StringP(amiOwner, "", amiOwnerDefault, amiOwnerDesc) flagSet.StringP(amiLang, "", amiLangDefault, amiLangDesc) + flagSet.StringP(params.AMIIDName, "", "", params.AMIIDDesc) flagSet.Bool(airgap, false, airgapDesc) flagSet.StringP(params.Timeout, "", "", params.TimeoutDesc) flagSet.Bool(amiKeepCopy, false, amiKeepCopyDesc) diff --git a/cmd/mapt/cmd/aws/services/kind.go b/cmd/mapt/cmd/aws/services/kind.go index 75e36ed59..0aa191e70 100644 --- a/cmd/mapt/cmd/aws/services/kind.go +++ b/cmd/mapt/cmd/aws/services/kind.go @@ -67,6 +67,7 @@ func createKind() *cobra.Command { Spot: params.SpotArgs(), Version: viper.GetString(params.KindK8SVersion), Arch: viper.GetString(params.LinuxArch), + AMIID: viper.GetString(params.AMIIDName), Timeout: viper.GetString(params.Timeout), ServiceEndpoints: params.NetworkServiceEndpoints(), ExtraPortMappings: extraPortMappings}); err != nil { @@ -79,6 +80,7 @@ func createKind() *cobra.Command { flagSet.StringP(params.ConnectionDetailsOutput, "", "", params.ConnectionDetailsOutputDesc) flagSet.StringP(params.KindK8SVersion, "", params.KindK8SVersionDefault, params.KindK8SVersionDesc) flagSet.StringP(params.LinuxArch, "", params.LinuxArchDefault, params.LinuxArchDesc) + flagSet.StringP(params.AMIIDName, "", "", params.AMIIDDesc) flagSet.StringP(params.KindExtraPortMappings, "", "", params.KindExtraPortMappingsDesc) flagSet.StringP(params.Timeout, "", "", params.TimeoutDesc) flagSet.StringToStringP(params.Tags, "", nil, params.TagsDesc) diff --git a/cmd/mapt/cmd/aws/services/snc.go b/cmd/mapt/cmd/aws/services/snc.go index 8019e1a7b..6ef4bff0d 100644 --- a/cmd/mapt/cmd/aws/services/snc.go +++ b/cmd/mapt/cmd/aws/services/snc.go @@ -94,6 +94,7 @@ func createSNC() *cobra.Command { Version: viper.GetString(ocpVersion), DisableClusterReadiness: viper.IsSet(disableClusterReadiness), Arch: viper.GetString(params.LinuxArch), + AMIID: viper.GetString(params.AMIIDName), PullSecretFile: viper.GetString(pullSecretFile), Timeout: viper.GetString(params.Timeout), ServiceEndpoints: params.NetworkServiceEndpoints(), @@ -110,6 +111,7 @@ func createSNC() *cobra.Command { flagSet.StringP(ocpVersion, "", ocpDefaultVersion, ocpVersionDesc) flagSet.Bool(disableClusterReadiness, false, disableClusterReadinessDesc) flagSet.StringP(params.LinuxArch, "", params.LinuxArchDefault, params.LinuxArchDesc) + flagSet.StringP(params.AMIIDName, "", "", params.AMIIDDesc) flagSet.StringP(pullSecretFile, "", "", pullSecretFileDesc) flagSet.StringP(params.Timeout, "", "", params.TimeoutDesc) flagSet.StringToStringP(params.Tags, "", nil, params.TagsDesc) diff --git a/pkg/provider/aws/action/fedora/fedora.go b/pkg/provider/aws/action/fedora/fedora.go index be6924f45..0b8599a95 100644 --- a/pkg/provider/aws/action/fedora/fedora.go +++ b/pkg/provider/aws/action/fedora/fedora.go @@ -36,6 +36,7 @@ type FedoraArgs struct { Prefix string Version string Arch string + AMIID string ComputeRequest *cr.ComputeRequestArgs Spot *spotTypes.SpotArgs Airgap bool @@ -49,6 +50,7 @@ type fedoraRequest struct { prefix *string version *string arch *string + amiID *string spot bool timeout *string serviceEndpoints []string @@ -87,6 +89,7 @@ func Create(mCtxArgs *mc.ContextArgs, args *FedoraArgs) (err error) { prefix: &prefix, version: &args.Version, arch: &args.Arch, + amiID: &args.AMIID, timeout: &args.Timeout, serviceEndpoints: args.ServiceEndpoints, airgap: &args.Airgap, @@ -184,11 +187,17 @@ func (r *fedoraRequest) deploy(ctx *pulumi.Context) error { return err } // Get AMI - ami, err := amiSVC.GetAMIByName(ctx, - fmt.Sprintf(amiRegex[*r.arch], *r.version), - []string{amiOwner}, - map[string]string{ - "architecture": *r.arch}) + var ami *ec2.LookupAmiResult + var err error + if len(*r.amiID) > 0 { + ami, err = amiSVC.GetAMIByID(ctx, *r.amiID) + } else { + ami, err = amiSVC.GetAMIByName(ctx, + fmt.Sprintf(amiRegex[*r.arch], *r.version), + []string{amiOwner}, + map[string]string{ + "architecture": *r.arch}) + } if err != nil { return err } diff --git a/pkg/provider/aws/action/kind/kind.go b/pkg/provider/aws/action/kind/kind.go index 988c21a26..9a61dac2f 100644 --- a/pkg/provider/aws/action/kind/kind.go +++ b/pkg/provider/aws/action/kind/kind.go @@ -32,6 +32,7 @@ type kindRequest struct { prefix *string version *string arch *string + amiID *string spot bool timeout *string serviceEndpoints []string @@ -64,6 +65,7 @@ func Create(mCtxArgs *mc.ContextArgs, args *utilKind.KindArgs) (kr *utilKind.Kin prefix: &prefix, version: &args.Version, arch: &args.Arch, + amiID: &args.AMIID, timeout: &args.Timeout, serviceEndpoints: args.ServiceEndpoints, extraPortMappings: args.ExtraPortMappings, @@ -138,10 +140,16 @@ func (r *kindRequest) deploy(ctx *pulumi.Context) error { pulumi.Float64(*r.allocationData.SpotPrice)) } // Get AMI - ami, err := amiSVC.GetAMIByName(ctx, - amiName(r.arch), - []string{amiOwner}, - map[string]string{"architecture": *r.arch}) + var ami *ec2.LookupAmiResult + var err error + if len(*r.amiID) > 0 { + ami, err = amiSVC.GetAMIByID(ctx, *r.amiID) + } else { + ami, err = amiSVC.GetAMIByName(ctx, + amiName(r.arch), + []string{amiOwner}, + map[string]string{"architecture": *r.arch}) + } if err != nil { return err } diff --git a/pkg/provider/aws/action/rhel-ai/rhelai.go b/pkg/provider/aws/action/rhel-ai/rhelai.go index f458b7e5c..4ef3a6413 100644 --- a/pkg/provider/aws/action/rhel-ai/rhelai.go +++ b/pkg/provider/aws/action/rhel-ai/rhelai.go @@ -37,6 +37,7 @@ type rhelAIRequest struct { prefix *string amiName *string arch *string + amiID *string spot bool timeout *string serviceEndpoints []string @@ -79,6 +80,7 @@ func Create(mCtxArgs *mc.ContextArgs, args *apiRHELAI.RHELAIArgs) (err error) { prefix: &prefix, amiName: &amiName, arch: &args.Arch, + amiID: &args.AMIID, timeout: &args.Timeout, serviceEndpoints: args.ServiceEndpoints, diskSize: args.ComputeRequest.DiskSize, @@ -101,8 +103,10 @@ func Create(mCtxArgs *mc.ContextArgs, args *apiRHELAI.RHELAIArgs) (err error) { if err != nil { return err } - if err = checkAMIExists(mCtx.Context(), &amiName, r.allocationData.Region, &amiArch); err != nil { - return err + if len(args.AMIID) == 0 { + if err = checkAMIExists(mCtx.Context(), &amiName, r.allocationData.Region, &amiArch); err != nil { + return err + } } return r.createMachine() } @@ -211,11 +215,17 @@ func (r *rhelAIRequest) deploy(ctx *pulumi.Context) error { return err } // Get AMI - ami, err := amiSVC.GetAMIByName(ctx, - *r.amiName, - []string{amiOwner}, - map[string]string{ - "architecture": amiArch}) + var ami *ec2.LookupAmiResult + var err error + if len(*r.amiID) > 0 { + ami, err = amiSVC.GetAMIByID(ctx, *r.amiID) + } else { + ami, err = amiSVC.GetAMIByName(ctx, + *r.amiName, + []string{amiOwner}, + map[string]string{ + "architecture": amiArch}) + } if err != nil { return err } diff --git a/pkg/provider/aws/action/rhel/rhel.go b/pkg/provider/aws/action/rhel/rhel.go index 76240a9d8..604b4adbd 100644 --- a/pkg/provider/aws/action/rhel/rhel.go +++ b/pkg/provider/aws/action/rhel/rhel.go @@ -35,6 +35,7 @@ type RHELArgs struct { Prefix string Version string Arch string + AMIID string ComputeRequest *cr.ComputeRequestArgs SubsUsername string SubsUserpass string @@ -51,6 +52,7 @@ type rhelRequest struct { prefix *string version *string arch *string + amiID *string spot bool subsUsername *string subsUserpass *string @@ -92,6 +94,7 @@ func Create(mCtxArgs *mc.ContextArgs, args *RHELArgs) (err error) { prefix: &prefix, version: &args.Version, arch: &args.Arch, + amiID: &args.AMIID, timeout: &args.Timeout, subsUsername: &args.SubsUsername, subsUserpass: &args.SubsUserpass, @@ -188,11 +191,17 @@ func (r *rhelRequest) deploy(ctx *pulumi.Context) error { return err } // Get AMI - ami, err := amiSVC.GetAMIByName(ctx, - fmt.Sprintf(amiRegex, *r.version, *r.arch), - nil, - map[string]string{ - "architecture": *r.arch}) + var ami *ec2.LookupAmiResult + var err error + if len(*r.amiID) > 0 { + ami, err = amiSVC.GetAMIByID(ctx, *r.amiID) + } else { + ami, err = amiSVC.GetAMIByName(ctx, + fmt.Sprintf(amiRegex, *r.version, *r.arch), + nil, + map[string]string{ + "architecture": *r.arch}) + } if err != nil { return err } diff --git a/pkg/provider/aws/action/snc/snc.go b/pkg/provider/aws/action/snc/snc.go index e702344f7..cf682a36b 100644 --- a/pkg/provider/aws/action/snc/snc.go +++ b/pkg/provider/aws/action/snc/snc.go @@ -40,6 +40,7 @@ type openshiftSNCRequest struct { version *string disableClusterReadiness bool arch *string + amiID *string spot bool timeout *string pullSecretFile *string @@ -84,6 +85,7 @@ func Create(mCtxArgs *mc.ContextArgs, args *apiSNC.SNCArgs) (_ *apiSNC.SNCResult version: &args.Version, disableClusterReadiness: args.DisableClusterReadiness, arch: &args.Arch, + amiID: &args.AMIID, pullSecretFile: &args.PullSecretFile, timeout: &args.Timeout, serviceEndpoints: args.ServiceEndpoints, @@ -105,9 +107,11 @@ func Create(mCtxArgs *mc.ContextArgs, args *apiSNC.SNCArgs) (_ *apiSNC.SNCResult return nil, err } // check if AMI exists - amiName := amiName(&args.Version, &args.Arch) - if err = checkAMIExists(mCtx.Context(), &amiName, r.allocationData.Region, &args.Arch); err != nil { - return nil, err + if len(args.AMIID) == 0 { + amiName := amiName(&args.Version, &args.Arch) + if err = checkAMIExists(mCtx.Context(), &amiName, r.allocationData.Region, &args.Arch); err != nil { + return nil, err + } } return r.createCluster() } @@ -169,11 +173,17 @@ func (r *openshiftSNCRequest) deploy(ctx *pulumi.Context) error { return err } // Get AMI - ami, err := amiSVC.GetAMIByName(ctx, - fmt.Sprintf("%s*", amiName(r.version, r.arch)), - []string{"self", amiOwner}, - map[string]string{ - "architecture": *r.arch}) + var ami *ec2.LookupAmiResult + var err error + if len(*r.amiID) > 0 { + ami, err = amiSVC.GetAMIByID(ctx, *r.amiID) + } else { + ami, err = amiSVC.GetAMIByName(ctx, + fmt.Sprintf("%s*", amiName(r.version, r.arch)), + []string{"self", amiOwner}, + map[string]string{ + "architecture": *r.arch}) + } if err != nil { return err } diff --git a/pkg/provider/aws/action/windows/windows.go b/pkg/provider/aws/action/windows/windows.go index 385922bbf..e9c69c618 100644 --- a/pkg/provider/aws/action/windows/windows.go +++ b/pkg/provider/aws/action/windows/windows.go @@ -45,6 +45,7 @@ type WindowsServerArgs struct { AMIOwner string AMILang string AMIKeepCopy bool + AMIID string // Machine params ComputeRequest *cr.ComputeRequestArgs Spot *spotTypes.SpotArgs @@ -63,6 +64,7 @@ type windowsServerRequest struct { amiOwner *string amiLang *string amiKeepCopy *bool + amiID *string spot bool timeout *string @@ -113,6 +115,7 @@ func Create(mCtxArgs *mc.ContextArgs, args *WindowsServerArgs) (err error) { amiOwner: &args.AMIOwner, amiKeepCopy: &args.AMIKeepCopy, amiLang: &args.AMILang, + amiID: &args.AMIID, timeout: &args.Timeout, serviceEndpoints: args.ServiceEndpoints, airgap: &args.Airgap, @@ -133,30 +136,32 @@ func Create(mCtxArgs *mc.ContextArgs, args *WindowsServerArgs) (err error) { if err != nil { return err } - isAMIOffered, _, err := data.IsAMIOffered( - mCtx.Context(), - data.ImageRequest{ - Name: r.amiName, - Region: r.allocationData.Region}) - if err != nil { - return err - } - // If it is not offered need to create a copy on the target region - if !isAMIOffered { - acr := amiCopy.CopyAMIRequest{ - MCtx: mCtx, - Prefix: *r.prefix, - ID: awsWindowsDedicatedID, - AMISourceName: r.amiName, - AMISourceArch: nil, - AMITargetRegion: r.allocationData.Region, - AMIKeepCopy: *r.amiKeepCopy, - FastLaunch: amiFastLaunch, - MaxParallel: int32(amiFastLaunchMaxParallel), - } - if err := acr.Create(); err != nil { + if len(*r.amiID) == 0 { + isAMIOffered, _, err := data.IsAMIOffered( + mCtx.Context(), + data.ImageRequest{ + Name: r.amiName, + Region: r.allocationData.Region}) + if err != nil { return err } + // If it is not offered need to create a copy on the target region + if !isAMIOffered { + acr := amiCopy.CopyAMIRequest{ + MCtx: mCtx, + Prefix: *r.prefix, + ID: awsWindowsDedicatedID, + AMISourceName: r.amiName, + AMISourceArch: nil, + AMITargetRegion: r.allocationData.Region, + AMIKeepCopy: *r.amiKeepCopy, + FastLaunch: amiFastLaunch, + MaxParallel: int32(amiFastLaunchMaxParallel), + } + if err := acr.Create(); err != nil { + return err + } + } } // if not only host the mac machine will be created if !*r.airgap { @@ -240,11 +245,15 @@ func (r *windowsServerRequest) deploy(ctx *pulumi.Context) error { return err } // Get AMI ref - // ami, err := amiSVC.GetAMIByName(ctx, r.AMIName, r.AMIOwner, nil) - ami, err := amiSVC.GetAMIByName(ctx, - fmt.Sprintf("%s*", *r.amiName), - []string{*r.amiOwner}, nil) - + var ami *ec2.LookupAmiResult + var err error + if len(*r.amiID) > 0 { + ami, err = amiSVC.GetAMIByID(ctx, *r.amiID) + } else { + ami, err = amiSVC.GetAMIByName(ctx, + fmt.Sprintf("%s*", *r.amiName), + []string{*r.amiOwner}, nil) + } if err != nil { return err } diff --git a/pkg/provider/aws/services/ec2/ami/ami.go b/pkg/provider/aws/services/ec2/ami/ami.go index f968819c6..1fea065c1 100644 --- a/pkg/provider/aws/services/ec2/ami/ami.go +++ b/pkg/provider/aws/services/ec2/ami/ami.go @@ -20,8 +20,17 @@ const ( redhatOwnerID string = "309956199498" ) -// Looks for the AMI ID on the current Region based on name -// it only allows images from AWS and self +func GetAMIByID(ctx *pulumi.Context, amiID string) (*ec2.LookupAmiResult, error) { + return ec2.LookupAmi(ctx, &ec2.LookupAmiArgs{ + Filters: []ec2.GetAmiFilter{ + { + Name: "image-id", + Values: []string{amiID}, + }, + }, + }) +} + func GetAMIByName(ctx *pulumi.Context, imageName string, owner []string, filters map[string]string) (*ec2.LookupAmiResult, error) { mostRecent := true diff --git a/pkg/target/host/rhelai/api.go b/pkg/target/host/rhelai/api.go index d979be619..1a56fcc10 100644 --- a/pkg/target/host/rhelai/api.go +++ b/pkg/target/host/rhelai/api.go @@ -12,6 +12,7 @@ type RHELAIArgs struct { CustomImage string Marketplace bool Arch string + AMIID string ComputeRequest *cr.ComputeRequestArgs Spot *spotTypes.SpotArgs ServiceEndpoints []string diff --git a/pkg/target/service/kind/api.go b/pkg/target/service/kind/api.go index 10aecda93..8d609b9a8 100644 --- a/pkg/target/service/kind/api.go +++ b/pkg/target/service/kind/api.go @@ -37,6 +37,7 @@ type KindArgs struct { ComputeRequest *cr.ComputeRequestArgs Version string Arch string + AMIID string HostingPlace string Spot *spotTypes.SpotArgs Timeout string diff --git a/pkg/target/service/snc/api.go b/pkg/target/service/snc/api.go index c3de13b36..acd4e174c 100644 --- a/pkg/target/service/snc/api.go +++ b/pkg/target/service/snc/api.go @@ -46,6 +46,7 @@ type SNCArgs struct { Version string DisableClusterReadiness bool Arch string + AMIID string PullSecretFile string Spot *spotTypes.SpotArgs Timeout string