Repository: osbuild/osbuild-composer
Pull request #3035 (2022-09-30 07:50:01)

packer: remove Fedora 35
Our workers already run on Fedora 36 so there's no need to build F35 anymore.

Signed-off-by: Ondřej Budai <ondrej@budai.cz>

<!--
Thanks for proposing a change to osbuild-composer!

Please don't remove the above check list. These are things that each pull
request must have before it is merged. It helps maintainers to not forget
anything.

If the reason for ticking any of the boxes is ambiguous, please add a short
note explaining why.

In addition, if this pull request fixes a downstream issue, please refer to
test/README.md and add these additional items:

- [ ] 1st commit of any `rhbz#` related PR contains bug reproducer; CI reports FAIL or
- [ ] PR contains automated tests for new functionality and
- [ ] QE has approved reproducer/new tests and
- [ ] Subsequent commits provide bug fixes without modifying the reproducer; CI reports PASS and
- [ ] QE approves this PR; RHBZ status is set to `MODIFIED + Verified=Tested`

Information regarding our GitLab pipeline (Schutzbot):

CI will not be ran automatically if WIP label is applied or the PR is in DRAFT state, instead only
a link will be provided to the pipeline which can then be triggered manually if desired. To run the
CI automatically either switch the PR to ready or apply WIP+test label.

Outside contributors need manual approval from one of the osbuild-composer maintainers.

Schutzbot will only be triggered if all Tests jobs in GitHub workflow succeed.
-->



Patch:
diff --git a/cmd/osbuild-worker/jobimpl-osbuild.go b/cmd/osbuild-worker/jobimpl-osbuild.go
index d87b0f33a..de8d0622e 100644
--- a/cmd/osbuild-worker/jobimpl-osbuild.go
+++ b/cmd/osbuild-worker/jobimpl-osbuild.go
@@ -170,6 +170,9 @@ func validateResult(result *worker.OSBuildJobResult, jobID string) {
 	logWithId := logrus.WithField("jobId", jobID)
 	if result.JobError != nil {
 		logWithId.Errorf("osbuild job failed: %s", result.JobError.Reason)
+		if result.JobError.Details != nil {
+			logWithId.Errorf("failure details : %v", result.JobError.Details)
+		}
 		return
 	}
 	// if the job failed, but the JobError is
diff --git a/go.mod b/go.mod
index 57d2a2d10..ce744142c 100644
--- a/go.mod
+++ b/go.mod
@@ -14,7 +14,7 @@ require (
 	github.com/Azure/go-autorest/autorest v0.11.28
 	github.com/Azure/go-autorest/autorest/azure/auth v0.5.11
 	github.com/BurntSushi/toml v1.2.0
-	github.com/aws/aws-sdk-go v1.44.104
+	github.com/aws/aws-sdk-go v1.44.108
 	github.com/containers/common v0.49.1
 	github.com/containers/image/v5 v5.22.0
 	github.com/coreos/go-semver v0.3.0
@@ -48,7 +48,7 @@ require (
 	golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1
 	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f
 	golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10
-	google.golang.org/api v0.97.0
+	google.golang.org/api v0.98.0
 	google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006
 	gopkg.in/ini.v1 v1.67.0
 )
diff --git a/go.sum b/go.sum
index 25b8444ab..1c73a5d64 100644
--- a/go.sum
+++ b/go.sum
@@ -266,8 +266,8 @@ github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi
 github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
 github.com/aws/aws-sdk-go v1.44.44/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
-github.com/aws/aws-sdk-go v1.44.104 h1:NiPYL60aOSH0TsAzQngx/aBdxC12TXhgw07DQFh76GU=
-github.com/aws/aws-sdk-go v1.44.104/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/aws/aws-sdk-go v1.44.108 h1:L8N9GmP9UYDNqBtJO6OC4zSuEkQxAR770VkbRXAUmRk=
+github.com/aws/aws-sdk-go v1.44.108/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
 github.com/aws/aws-sdk-go-v2 v1.16.5/go.mod h1:Wh7MEsmEApyL5hrWzpDkba4gwAPc5/piwLVLFnCxp48=
 github.com/aws/aws-sdk-go-v2/config v1.15.11/go.mod h1:mD5tNFciV7YHNjPpFYqJ6KGpoSfY107oZULvTHIxtbI=
 github.com/aws/aws-sdk-go-v2/credentials v1.12.6/go.mod h1:mQgnRmBPF2S/M01W4T4Obp3ZaZB6o1s/R8cOUda9vtI=
@@ -2375,8 +2375,9 @@ google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOI
 google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
 google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=
 google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.97.0 h1:x/vEL1XDF/2V4xzdNgFPaKHluRESo2aTsL7QzHnBtGQ=
 google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.98.0 h1:yxZrcxXESimy6r6mdL5Q6EnZwmewDJK2dVg3g75s5Dg=
+google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
diff --git a/internal/store/store.go b/internal/store/store.go
index 5634ab5f5..400ddfd25 100644
--- a/internal/store/store.go
+++ b/internal/store/store.go
@@ -31,6 +31,14 @@ const StoreDBName = "state"
 
 // A Store contains all the persistent state of osbuild-composer, and is serialized
 // on every change, and deserialized on start.
+//
+// blueprints contain the most recent blueprint, using the name as the key
+//
+// blueprintsCommits contains the order of the commits to a blueprint name as a string of hashes
+// with the most recent one last.
+//
+// blueprintsChanges contains the blueprint change, using the blueprint name string and
+// the hash string from blueprintsCommits
 type Store struct {
 	blueprints        map[string]blueprint.Blueprint
 	workspace         map[string]blueprint.Blueprint
@@ -294,30 +302,37 @@ func (s *Store) TagBlueprint(name string) error {
 			return errors.New("Unknown blueprint")
 		}
 
-		if len(s.blueprintsCommits[name]) == 0 {
+		_, ok = s.blueprintsCommits[name]
+		if !ok || len(s.blueprintsCommits[name]) == 0 {
 			return errors.New("No commits for blueprint")
 		}
 
+		_, ok = s.blueprintsChanges[name]
+		if !ok {
+			return errors.New("No changes for blueprint")
+		}
+
 		latest := s.blueprintsCommits[name][len(s.blueprintsCommits[name])-1]
 		// If the most recent commit already has a revision, don't bump it
 		if s.blueprintsChanges[name][latest].Revision != nil {
 			return nil
 		}
 
-		// Get the latest revision for this blueprint
+		// Get the latest revision for this blueprint (or 0 if there is none)
+		// blueprintsCommits has the most recent commit at the end, so start there
 		var revision int
-		var change blueprint.Change
 		for i := len(s.blueprintsCommits[name]) - 1; i >= 0; i-- {
 			commit := s.blueprintsCommits[name][i]
-			change = s.blueprintsChanges[name][commit]
+			change := s.blueprintsChanges[name][commit]
 			if change.Revision != nil && *change.Revision > revision {
 				revision = *change.Revision
 				break
 			}
 		}
 
-		// Bump the revision (if there was none it will start at 1)
+		// Bump the revision (if there was none it will start at 1) of the latest commit
 		revision++
+		change := s.blueprintsChanges[name][latest]
 		change.Revision = &revision
 		s.blueprintsChanges[name][latest] = change
 		return nil
diff --git a/templates/packer/ansible/inventory/fedora-35-aarch64/group_vars/all.yml b/templates/packer/ansible/inventory/fedora-35-aarch64/group_vars/all.yml
deleted file mode 100644
index 04147ed09..000000000
--- a/templates/packer/ansible/inventory/fedora-35-aarch64/group_vars/all.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-# this is just a template!
-# the actual content is generated by build/appsre-build-worker-packer.sh
-rpmrepo_distribution: distro
-osbuild_commit: abcdef
diff --git a/templates/packer/ansible/inventory/fedora-35-x86_64/group_vars/all.yml b/templates/packer/ansible/inventory/fedora-35-x86_64/group_vars/all.yml
deleted file mode 100644
index 04147ed09..000000000
--- a/templates/packer/ansible/inventory/fedora-35-x86_64/group_vars/all.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-# this is just a template!
-# the actual content is generated by build/appsre-build-worker-packer.sh
-rpmrepo_distribution: distro
-osbuild_commit: abcdef
diff --git a/templates/packer/worker.pkr.hcl b/templates/packer/worker.pkr.hcl
index 1b4b319eb..8ff61bf66 100644
--- a/templates/packer/worker.pkr.hcl
+++ b/templates/packer/worker.pkr.hcl
@@ -93,80 +93,6 @@ build {
     }
   }
 
-  source "amazon-ebs.image_builder"  {
-    name = "fedora-35-x86_64"
-
-    # Use a static Fedora 35 Cloud Base Image.
-    source_ami = "ami-08b4ee602f76bff79"
-    ssh_username = "fedora"
-    instance_type = "c6a.large"
-
-    # Set a name for the resulting AMI.
-    ami_name = "${var.image_name}-fedora-35-x86_64"
-
-    # Apply tags to the resulting AMI/EBS snapshot.
-    tags = {
-      AppCode = "IMGB-001"
-      Name = "${var.image_name}-fedora-35-x86_64"
-      composer_commit = "${var.composer_commit}"
-      os = "fedora"
-      os_version = "35"
-      arch = "x86_64"
-    }
-
-    # Ensure that the EBS snapshot used for the AMI meets our requirements.
-    launch_block_device_mappings {
-      delete_on_termination = "true"
-      device_name           = "/dev/sda1"
-      volume_size           = 5
-      volume_type           = "gp2"
-    }
-
-    # go doesn't like modern Fedora crypto policies
-    # see https://github.com/hashicorp/packer/issues/10074
-    user_data = <<EOF
-#!/bin/bash
-update-crypto-policies --set LEGACY
-EOF
-  }
-
-  source "amazon-ebs.image_builder"  {
-    name = "fedora-35-aarch64"
-
-    # Use a static Fedora 35 Cloud Base Image.
-    source_ami = "ami-068c123e1c1ca0d49"
-    ssh_username = "fedora"
-    instance_type = "c6g.large"
-
-    # Set a name for the resulting AMI.
-    ami_name = "${var.image_name}-fedora-35-aarch64"
-
-    # Apply tags to the resulting AMI/EBS snapshot.
-    tags = {
-      AppCode = "IMGB-001"
-      Name = "${var.image_name}-fedora-35-aarch64"
-      composer_commit = "${var.composer_commit}"
-      os = "fedora"
-      os_version = "35"
-      arch = "aarch64"
-    }
-
-    # Ensure that the EBS snapshot used for the AMI meets our requirements.
-    launch_block_device_mappings {
-      delete_on_termination = "true"
-      device_name           = "/dev/sda1"
-      volume_size           = 5
-      volume_type           = "gp2"
-    }
-
-    # go doesn't like modern Fedora crypto policies
-    # see https://github.com/hashicorp/packer/issues/10074
-    user_data = <<EOF
-#!/bin/bash
-update-crypto-policies --set LEGACY
-EOF
-  }
-
   source "amazon-ebs.image_builder"  {
     name = "fedora-36-x86_64"
 
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
index f420acd07..cddbe1bb0 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
@@ -2551,6 +2551,27 @@ var awsPartition = partition{
 				}: endpoint{
 					Hostname: "appmesh.ca-central-1.api.aws",
 				},
+				endpointKey{
+					Region:  "ca-central-1",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.ca-central-1.amazonaws.com",
+				},
+				endpointKey{
+					Region:  "ca-central-1",
+					Variant: fipsVariant | dualStackVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.ca-central-1.api.aws",
+				},
+				endpointKey{
+					Region: "ca-central-1-fips",
+				}: endpoint{
+					Hostname: "appmesh-fips.ca-central-1.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "ca-central-1",
+					},
+					Deprecated: boxedTrue,
+				},
 				endpointKey{
 					Region: "eu-central-1",
 				}: endpoint{},
@@ -2632,6 +2653,27 @@ var awsPartition = partition{
 				}: endpoint{
 					Hostname: "appmesh.us-east-1.api.aws",
 				},
+				endpointKey{
+					Region:  "us-east-1",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-east-1.amazonaws.com",
+				},
+				endpointKey{
+					Region:  "us-east-1",
+					Variant: fipsVariant | dualStackVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-east-1.api.aws",
+				},
+				endpointKey{
+					Region: "us-east-1-fips",
+				}: endpoint{
+					Hostname: "appmesh-fips.us-east-1.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "us-east-1",
+					},
+					Deprecated: boxedTrue,
+				},
 				endpointKey{
 					Region: "us-east-2",
 				}: endpoint{},
@@ -2641,6 +2683,27 @@ var awsPartition = partition{
 				}: endpoint{
 					Hostname: "appmesh.us-east-2.api.aws",
 				},
+				endpointKey{
+					Region:  "us-east-2",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-east-2.amazonaws.com",
+				},
+				endpointKey{
+					Region:  "us-east-2",
+					Variant: fipsVariant | dualStackVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-east-2.api.aws",
+				},
+				endpointKey{
+					Region: "us-east-2-fips",
+				}: endpoint{
+					Hostname: "appmesh-fips.us-east-2.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "us-east-2",
+					},
+					Deprecated: boxedTrue,
+				},
 				endpointKey{
 					Region: "us-west-1",
 				}: endpoint{},
@@ -2650,6 +2713,27 @@ var awsPartition = partition{
 				}: endpoint{
 					Hostname: "appmesh.us-west-1.api.aws",
 				},
+				endpointKey{
+					Region:  "us-west-1",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-west-1.amazonaws.com",
+				},
+				endpointKey{
+					Region:  "us-west-1",
+					Variant: fipsVariant | dualStackVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-west-1.api.aws",
+				},
+				endpointKey{
+					Region: "us-west-1-fips",
+				}: endpoint{
+					Hostname: "appmesh-fips.us-west-1.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "us-west-1",
+					},
+					Deprecated: boxedTrue,
+				},
 				endpointKey{
 					Region: "us-west-2",
 				}: endpoint{},
@@ -2659,6 +2743,27 @@ var awsPartition = partition{
 				}: endpoint{
 					Hostname: "appmesh.us-west-2.api.aws",
 				},
+				endpointKey{
+					Region:  "us-west-2",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-west-2.amazonaws.com",
+				},
+				endpointKey{
+					Region:  "us-west-2",
+					Variant: fipsVariant | dualStackVariant,
+				}: endpoint{
+					Hostname: "appmesh-fips.us-west-2.api.aws",
+				},
+				endpointKey{
+					Region: "us-west-2-fips",
+				}: endpoint{
+					Hostname: "appmesh-fips.us-west-2.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "us-west-2",
+					},
+					Deprecated: boxedTrue,
+				},
 			},
 		},
 		"apprunner": service{
@@ -9517,15 +9622,51 @@ var awsPartition = partition{
 				endpointKey{
 					Region: "ap-northeast-1",
 				}: endpoint{},
+				endpointKey{
+					Region: "ap-northeast-2",
+				}: endpoint{},
+				endpointKey{
+					Region: "ap-south-1",
+				}: endpoint{},
 				endpointKey{
 					Region: "ap-southeast-1",
 				}: endpoint{},
+				endpointKey{
+					Region: "ap-southeast-2",
+				}: endpoint{},
+				endpointKey{
+					Region: "ca-central-1",
+				}: endpoint{},
+				endpointKey{
+					Region:  "ca-central-1",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "emr-serverless-fips.ca-central-1.amazonaws.com",
+				},
 				endpointKey{
 					Region: "eu-central-1",
 				}: endpoint{},
+				endpointKey{
+					Region: "eu-north-1",
+				}: endpoint{},
 				endpointKey{
 					Region: "eu-west-1",
 				}: endpoint{},
+				endpointKey{
+					Region: "eu-west-2",
+				}: endpoint{},
+				endpointKey{
+					Region: "eu-west-3",
+				}: endpoint{},
+				endpointKey{
+					Region: "fips-ca-central-1",
+				}: endpoint{
+					Hostname: "emr-serverless-fips.ca-central-1.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "ca-central-1",
+					},
+					Deprecated: boxedTrue,
+				},
 				endpointKey{
 					Region: "fips-us-east-1",
 				}: endpoint{
@@ -9544,6 +9685,15 @@ var awsPartition = partition{
 					},
 					Deprecated: boxedTrue,
 				},
+				endpointKey{
+					Region: "fips-us-west-1",
+				}: endpoint{
+					Hostname: "emr-serverless-fips.us-west-1.amazonaws.com",
+					CredentialScope: credentialScope{
+						Region: "us-west-1",
+					},
+					Deprecated: boxedTrue,
+				},
 				endpointKey{
 					Region: "fips-us-west-2",
 				}: endpoint{
@@ -9553,6 +9703,9 @@ var awsPartition = partition{
 					},
 					Deprecated: boxedTrue,
 				},
+				endpointKey{
+					Region: "sa-east-1",
+				}: endpoint{},
 				endpointKey{
 					Region: "us-east-1",
 				}: endpoint{},
@@ -9571,6 +9724,15 @@ var awsPartition = partition{
 				}: endpoint{
 					Hostname: "emr-serverless-fips.us-east-2.amazonaws.com",
 				},
+				endpointKey{
+					Region: "us-west-1",
+				}: endpoint{},
+				endpointKey{
+					Region:  "us-west-1",
+					Variant: fipsVariant,
+				}: endpoint{
+					Hostname: "emr-serverless-fips.us-west-1.amazonaws.com",
+				},
 				endpointKey{
 					Region: "us-west-2",
 				}: endpoint{},
@@ -12379,6 +12541,16 @@ var awsPartition = partition{
 				},
 			},
 		},
+		"iotfleetwise": service{
+			Endpoints: serviceEndpoints{
+				endpointKey{
+					Region: "eu-central-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "us-east-1",
+				}: endpoint{},
+			},
+		},
 		"iotsecuredtunneling": service{
 			Defaults: endpointDefaults{
 				defaultKey{}: endpoint{},
@@ -12739,6 +12911,18 @@ var awsPartition = partition{
 		},
 		"ivschat": service{
 			Endpoints: serviceEndpoints{
+				endpointKey{
+					Region: "ap-northeast-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "ap-northeast-2",
+				}: endpoint{},
+				endpointKey{
+					Region: "ap-south-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "eu-central-1",
+				}: endpoint{},
 				endpointKey{
 					Region: "eu-west-1",
 				}: endpoint{},
@@ -15491,6 +15675,31 @@ var awsPartition = partition{
 				}: endpoint{},
 			},
 		},
+		"migrationhub-orchestrator": service{
+			Endpoints: serviceEndpoints{
+				endpointKey{
+					Region: "ap-northeast-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "ap-southeast-2",
+				}: endpoint{},
+				endpointKey{
+					Region: "eu-central-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "eu-west-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "eu-west-2",
+				}: endpoint{},
+				endpointKey{
+					Region: "us-east-1",
+				}: endpoint{},
+				endpointKey{
+					Region: "us-west-2",
+				}: endpoint{},
+			},
+		},
 		"migrationhub-strategy": service{
 			Endpoints: serviceEndpoints{
 				endpointKey{
@@ -33643,6 +33852,13 @@ var awsisobPartition = partition{
 				}: endpoint{},
 			},
 		},
+		"resource-groups": service{
+			Endpoints: serviceEndpoints{
+				endpointKey{
+					Region: "us-isob-east-1",
+				}: endpoint{},
+			},
+		},
 		"route53": service{
 			PartitionEndpoint: "aws-iso-b-global",
 			IsRegionalized:    boxedFalse,
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go
index aba2334c8..5b66e4f42 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/version.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go
@@ -5,4 +5,4 @@ package aws
 const SDKName = "aws-sdk-go"
 
 // SDKVersion is the version of this SDK
-const SDKVersion = "1.44.104"
+const SDKVersion = "1.44.108"
diff --git a/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go b/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go
index d26bcc020..0cd8a5948 100644
--- a/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go
+++ b/vendor/github.com/aws/aws-sdk-go/service/ec2/api.go
@@ -107861,6 +107861,10 @@ type FleetLaunchTemplateOverrides struct {
 	// The Availability Zone in which to launch the instances.
 	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`
 
+	// The ID of the AMI. An AMI is required to launch an instance. The AMI ID must
+	// be specified here or in the launch template.
+	ImageId *string `locationName:"imageId" type:"string"`
+
 	// The attributes for the instance types. When you specify instance attributes,
 	// Amazon EC2 will identify instance types with those attributes.
 	//
@@ -107932,6 +107936,12 @@ func (s *FleetLaunchTemplateOverrides) SetAvailabilityZone(v string) *FleetLaunc
 	return s
 }
 
+// SetImageId sets the ImageId field's value.
+func (s *FleetLaunchTemplateOverrides) SetImageId(v string) *FleetLaunchTemplateOverrides {
+	s.ImageId = &v
+	return s
+}
+
 // SetInstanceRequirements sets the InstanceRequirements field's value.
 func (s *FleetLaunchTemplateOverrides) SetInstanceRequirements(v *InstanceRequirements) *FleetLaunchTemplateOverrides {
 	s.InstanceRequirements = v
@@ -107981,6 +107991,10 @@ type FleetLaunchTemplateOverridesRequest struct {
 	// The Availability Zone in which to launch the instances.
 	AvailabilityZone *string `type:"string"`
 
+	// The ID of the AMI. An AMI is required to launch an instance. The AMI ID must
+	// be specified here or in the launch template.
+	ImageId *string `type:"string"`
+
 	// The attributes for the instance types. When you specify instance attributes,
 	// Amazon EC2 will identify instance types with those attributes.
 	//
@@ -108069,6 +108083,12 @@ func (s *FleetLaunchTemplateOverridesRequest) SetAvailabilityZone(v string) *Fle
 	return s
 }
 
+// SetImageId sets the ImageId field's value.
+func (s *FleetLaunchTemplateOverridesRequest) SetImageId(v string) *FleetLaunchTemplateOverridesRequest {
+	s.ImageId = &v
+	return s
+}
+
 // SetInstanceRequirements sets the InstanceRequirements field's value.
 func (s *FleetLaunchTemplateOverridesRequest) SetInstanceRequirements(v *InstanceRequirementsRequest) *FleetLaunchTemplateOverridesRequest {
 	s.InstanceRequirements = v
@@ -170022,6 +170042,9 @@ const (
 
 	// InstanceTypeP4de24xlarge is a InstanceType enum value
 	InstanceTypeP4de24xlarge = "p4de.24xlarge"
+
+	// InstanceTypeU3tb156xlarge is a InstanceType enum value
+	InstanceTypeU3tb156xlarge = "u-3tb1.56xlarge"
 )
 
 // InstanceType_Values returns all elements of the InstanceType enum
@@ -170595,6 +170618,7 @@ func InstanceType_Values() []string {
 		InstanceTypeR6a48xlarge,
 		InstanceTypeR6aMetal,
 		InstanceTypeP4de24xlarge,
+		InstanceTypeU3tb156xlarge,
 	}
 }
 
diff --git a/vendor/google.golang.org/api/internal/version.go b/vendor/google.golang.org/api/internal/version.go
index ce0e80c4e..ab476d113 100644
--- a/vendor/google.golang.org/api/internal/version.go
+++ b/vendor/google.golang.org/api/internal/version.go
@@ -5,4 +5,4 @@
 package internal
 
 // Version is the current tagged release of the library.
-const Version = "0.97.0"
+const Version = "0.98.0"
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 263c3b4a8..eeb0d1f1c 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -73,7 +73,7 @@ github.com/Microsoft/go-winio/pkg/guid
 github.com/VividCortex/ewma
 # github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
 github.com/acarl005/stripansi
-# github.com/aws/aws-sdk-go v1.44.104
+# github.com/aws/aws-sdk-go v1.44.108
 ## explicit
 github.com/aws/aws-sdk-go/aws
 github.com/aws/aws-sdk-go/aws/arn
@@ -721,7 +721,7 @@ golang.org/x/tools/internal/typeparams
 # golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f
 golang.org/x/xerrors
 golang.org/x/xerrors/internal
-# google.golang.org/api v0.97.0
+# google.golang.org/api v0.98.0
 ## explicit
 google.golang.org/api/googleapi
 google.golang.org/api/googleapi/transport


Test patch:
diff --git a/internal/store/store_test.go b/internal/store/store_test.go
index 8736551ce..96cd2fceb 100644
--- a/internal/store/store_test.go
+++ b/internal/store/store_test.go
@@ -23,8 +23,9 @@ type storeTest struct {
 	myStore          *Store
 	myCustomizations blueprint.Customizations
 	myBP             blueprint.Blueprint
-	CommitHash       string
-	myChange         blueprint.Change
+	myBPv3           blueprint.Blueprint
+	CommitHash       []string
+	myChange         []blueprint.Change
 	myTarget         *target.Target
 	mySources        map[string]osbuild.Source
 	myCompose        Compose
@@ -90,13 +91,34 @@ func (suite *storeTest) SetupSuite() {
 			{Name: "test3"}},
 		Customizations: &suite.myCustomizations,
 	}
-	suite.CommitHash = "firstCommit"
-	suite.myChange = blueprint.Change{
-		Commit:    "firstCommit",
-		Message:   "firstCommitMessage",
-		Revision:  nil,
-		Timestamp: "now",
-		Blueprint: suite.myBP,
+	suite.myBPv3 = blueprint.Blueprint{
+		Name:        "testBP",
+		Description: "Testing tagging testBP blueprint",
+		Version:     "3.0.0",
+		Packages: []blueprint.Package{
+			{Name: "test4", Version: "*"}},
+		Modules: []blueprint.Package{
+			{Name: "test5", Version: "*"}},
+		Groups: []blueprint.Group{
+			{Name: "test6"}},
+		Customizations: &suite.myCustomizations,
+	}
+	suite.CommitHash = []string{"firstCommit", "secondCommit"}
+	suite.myChange = []blueprint.Change{
+		blueprint.Change{
+			Commit:    "firstCommit",
+			Message:   "firstCommitMessage",
+			Revision:  nil,
+			Timestamp: "now",
+			Blueprint: suite.myBP,
+		},
+		blueprint.Change{
+			Commit:    "secondCommit",
+			Message:   "secondCommitMessage",
+			Revision:  nil,
+			Timestamp: "now",
+			Blueprint: suite.myBPv3,
+		},
 	}
 	suite.myTarget = &target.Target{
 		Uuid:      uuid.New(),
@@ -190,17 +212,18 @@ func (suite *storeTest) TestGetBlueprintChanges() {
 
 func (suite *storeTest) TestGetBlueprintChange() {
 	Commit := make(map[string]blueprint.Change)
-	Commit[suite.CommitHash] = suite.myChange
-	suite.myStore.blueprintsCommits["testBP"] = []string{suite.CommitHash}
+	Commit[suite.CommitHash[0]] = suite.myChange[0]
+	Commit[suite.CommitHash[1]] = suite.myChange[1]
+	suite.myStore.blueprintsCommits["testBP"] = suite.CommitHash
 	suite.myStore.blueprintsChanges["testBP"] = Commit
 
-	actualChange, err := suite.myStore.GetBlueprintChange("testBP", suite.CommitHash)
+	actualChange, err := suite.myStore.GetBlueprintChange("testBP", suite.CommitHash[0])
 	suite.NoError(err)
-	expectedChange := suite.myChange
+	expectedChange := suite.myChange[0]
 	suite.Equal(&expectedChange, actualChange)
 
 	//Try to get non existing BP
-	actualChange, err = suite.myStore.GetBlueprintChange("Non_existing_BP", suite.CommitHash)
+	actualChange, err = suite.myStore.GetBlueprintChange("Non_existing_BP", suite.CommitHash[0])
 	suite.Nil(actualChange)
 	suite.EqualError(err, "Unknown blueprint")
 
@@ -212,20 +235,44 @@ func (suite *storeTest) TestGetBlueprintChange() {
 
 func (suite *storeTest) TestTagBlueprint() {
 	Commit := make(map[string]blueprint.Change)
-	Commit[suite.CommitHash] = suite.myChange
-	suite.myStore.blueprints["testBP"] = suite.myBP
-	suite.myStore.blueprintsCommits["testBP"] = []string{suite.CommitHash}
+	Commit[suite.CommitHash[0]] = suite.myChange[0]
+	Commit[suite.CommitHash[1]] = suite.myChange[1]
+	suite.myStore.blueprintsCommits["testBP"] = suite.CommitHash
 	suite.myStore.blueprintsChanges["testBP"] = Commit
+	suite.myStore.blueprints["testBP"] = suite.myBPv3
+
+	//Check that the blueprint changes have no revisions
+	suite.Nil(suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[0]].Revision)
+	suite.Nil(suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[1]].Revision)
 
-	//Check that the blueprints change has no revision
-	suite.Nil(suite.myStore.blueprintsChanges["testBP"][suite.CommitHash].Revision)
+	// This should tag the most recent commit
 	suite.NoError(suite.myStore.TagBlueprint("testBP"))
-	//The blueprints change should have a revision now
-	actualRevision := suite.myStore.blueprintsChanges["testBP"][suite.CommitHash].Revision
+
+	actualRevision := suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[0]].Revision
+	suite.Nil(actualRevision)
+
+	actualRevision = suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[1]].Revision
+	suite.Require().NotNil(actualRevision)
 	suite.Equal(1, *actualRevision)
+
+	// Check the blueprints to make sure they have not been changed
+	actualBP := suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[0]].Blueprint
+	suite.Equal(suite.myBP, actualBP)
+
+	actualBP = suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[1]].Blueprint
+	suite.Equal(suite.myBPv3, actualBP)
+	suite.Equal(suite.myBPv3, suite.myStore.blueprints["testBP"])
+
 	//Try to tag it again (should not change)
 	suite.NoError(suite.myStore.TagBlueprint("testBP"))
+
+	actualRevision = suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[0]].Revision
+	suite.Nil(actualRevision)
+
+	actualRevision = suite.myStore.blueprintsChanges["testBP"][suite.CommitHash[1]].Revision
+	suite.Require().NotNil(actualRevision)
 	suite.Equal(1, *actualRevision)
+
 	//Try to tag a non existing BNP
 	suite.EqualError(suite.myStore.TagBlueprint("Non_existing_BP"), "Unknown blueprint")
 	//Remove commits from a blueprint and try to tag it