Repository: osbuild/osbuild-composer
Pull request #3613 (2023-08-10 15:38:15)

test: update edge-ami test to support aarch64
This PR is to support edge-ami for aarch64 test. It fixed `VpcLimitExceeded` and added available instance checking before deployment.


Patch:
diff --git a/internal/blueprint/blueprint.go b/internal/blueprint/blueprint.go
index 6ca5c6a3b..460220dd9 100644
--- a/internal/blueprint/blueprint.go
+++ b/internal/blueprint/blueprint.go
@@ -185,29 +185,42 @@ func (b *Blueprint) CryptPasswords() error {
 }
 
 func Convert(bp Blueprint) iblueprint.Blueprint {
-	pkgs := make([]iblueprint.Package, len(bp.Packages))
-	for idx := range bp.Packages {
-		pkgs[idx] = iblueprint.Package(bp.Packages[idx])
+	var pkgs []iblueprint.Package
+	if len(bp.Packages) > 0 {
+		pkgs = make([]iblueprint.Package, len(bp.Packages))
+		for idx := range bp.Packages {
+			pkgs[idx] = iblueprint.Package(bp.Packages[idx])
+		}
 	}
 
-	modules := make([]iblueprint.Package, len(bp.Modules))
-	for idx := range bp.Modules {
-		modules[idx] = iblueprint.Package(bp.Modules[idx])
+	var modules []iblueprint.Package
+	if len(bp.Modules) > 0 {
+		modules = make([]iblueprint.Package, len(bp.Modules))
+		for idx := range bp.Modules {
+			modules[idx] = iblueprint.Package(bp.Modules[idx])
+		}
 	}
 
-	groups := make([]iblueprint.Group, len(bp.Groups))
-	for idx := range bp.Groups {
-		groups[idx] = iblueprint.Group(bp.Groups[idx])
+	var groups []iblueprint.Group
+	if len(bp.Groups) > 0 {
+		groups = make([]iblueprint.Group, len(bp.Groups))
+		for idx := range bp.Groups {
+			groups[idx] = iblueprint.Group(bp.Groups[idx])
+		}
 	}
 
-	containers := make([]iblueprint.Container, len(bp.Containers))
-	for idx := range bp.Containers {
-		containers[idx] = iblueprint.Container(bp.Containers[idx])
+	var containers []iblueprint.Container
+
+	if len(bp.Containers) > 0 {
+		containers = make([]iblueprint.Container, len(bp.Containers))
+		for idx := range bp.Containers {
+			containers[idx] = iblueprint.Container(bp.Containers[idx])
+		}
 	}
 
-	customizations := iblueprint.Customizations{}
+	var customizations *iblueprint.Customizations
 	if c := bp.Customizations; c != nil {
-		customizations = iblueprint.Customizations{
+		customizations = &iblueprint.Customizations{
 			Hostname:           c.Hostname,
 			InstallationDevice: c.InstallationDevice,
 		}
@@ -331,7 +344,7 @@ func Convert(bp Blueprint) iblueprint.Blueprint {
 		Modules:        modules,
 		Groups:         groups,
 		Containers:     containers,
-		Customizations: &customizations,
+		Customizations: customizations,
 		Distro:         bp.Distro,
 	}
 
diff --git a/schutzbot/terraform b/schutzbot/terraform
index f25efd328..d2b0998af 100644
--- a/schutzbot/terraform
+++ b/schutzbot/terraform
@@ -1,1 +1,1 @@
-c4fbedd79d6668774ac9034df1cd280eafcf62c7
+b372111bf2df22bd8586ce95b84fa6e1bffa045d


Test patch:
diff --git a/internal/blueprint/blueprint_convert_test.go b/internal/blueprint/blueprint_convert_test.go
new file mode 100644
index 000000000..e767d83c7
--- /dev/null
+++ b/internal/blueprint/blueprint_convert_test.go
@@ -0,0 +1,332 @@
+package blueprint
+
+import (
+	"testing"
+
+	iblueprint "github.com/osbuild/images/pkg/blueprint"
+	"github.com/stretchr/testify/assert"
+
+	"github.com/osbuild/osbuild-composer/internal/common"
+)
+
+func TestConvert(t *testing.T) {
+	tests := []struct {
+		name     string
+		src      Blueprint
+		expected iblueprint.Blueprint
+	}{
+		{
+			name:     "empty",
+			src:      Blueprint{},
+			expected: iblueprint.Blueprint{},
+		},
+		{
+			name: "everything",
+			src: Blueprint{
+				Name:        "name",
+				Description: "desc",
+				Version:     "version",
+				Packages: []Package{
+					{
+						Name:    "package-name",
+						Version: "package-version",
+					},
+				},
+				Modules: []Package{
+					{
+						Name:    "module-name",
+						Version: "module-version",
+					},
+				},
+				Groups: []Group{
+					{
+						Name: "group-name",
+					},
+				},
+				Containers: []Container{
+					{
+						Source:    "source",
+						Name:      "name",
+						TLSVerify: common.ToPtr(true),
+					},
+				},
+				Customizations: &Customizations{
+					Hostname: common.ToPtr("hostname"),
+					Kernel: &KernelCustomization{
+						Name:   "kernel-name",
+						Append: "kernel-append",
+					},
+					SSHKey: []SSHKeyCustomization{
+						{
+							User: "ssh-user",
+							Key:  "ssh-key",
+						},
+					},
+					User: []UserCustomization{
+						{
+							Name:        "user-name",
+							Description: common.ToPtr("user-desc"),
+							Password:    common.ToPtr("user-password"),
+							Key:         common.ToPtr("user-key"),
+							Home:        common.ToPtr("/home/user"),
+							Shell:       common.ToPtr("fish"),
+							Groups:      []string{"wheel"},
+							UID:         common.ToPtr(42),
+							GID:         common.ToPtr(2023),
+						},
+					},
+					Group: []GroupCustomization{
+						{
+							Name: "group",
+							GID:  common.ToPtr(7),
+						},
+					},
+					Timezone: &TimezoneCustomization{
+						Timezone:   common.ToPtr("timezone"),
+						NTPServers: []string{"ntp-server"},
+					},
+					Locale: &LocaleCustomization{
+						Languages: []string{"language"},
+						Keyboard:  common.ToPtr("keyboard"),
+					},
+					Firewall: &FirewallCustomization{
+						Ports: []string{"80"},
+						Services: &FirewallServicesCustomization{
+							Enabled:  []string{"ssh"},
+							Disabled: []string{"ntp"},
+						},
+						Zones: []FirewallZoneCustomization{
+							{
+								Name:    common.ToPtr("name"),
+								Sources: []string{"src"},
+							},
+						},
+					},
+					Services: &ServicesCustomization{
+						Enabled:  []string{"osbuild-composer.service"},
+						Disabled: []string{"lorax-composer.service"},
+					},
+					Filesystem: []FilesystemCustomization{
+						{
+							Mountpoint: "/usr",
+							MinSize:    1024,
+						},
+					},
+					InstallationDevice: "/dev/sda",
+					FDO: &FDOCustomization{
+						ManufacturingServerURL: "http://manufacturing.fdo",
+						DiunPubKeyInsecure:     "insecure-pubkey",
+						DiunPubKeyHash:         "hash-pubkey",
+						DiunPubKeyRootCerts:    "root-certs",
+					},
+					OpenSCAP: &OpenSCAPCustomization{
+						DataStream: "stream",
+						ProfileID:  "profile",
+						Tailoring: &OpenSCAPTailoringCustomizations{
+							Selected:   []string{"cloth"},
+							Unselected: []string{"leather"},
+						},
+					},
+					Ignition: &IgnitionCustomization{
+						Embedded: &EmbeddedIgnitionCustomization{
+							Config: "ignition-config",
+						},
+						FirstBoot: &FirstBootIgnitionCustomization{
+							ProvisioningURL: "http://provisioning.edge",
+						},
+					},
+					Directories: []DirectoryCustomization{
+						{
+							Path:          "/dir",
+							User:          common.ToPtr("dir-user"),
+							Group:         common.ToPtr("dir-group"),
+							Mode:          "0777",
+							EnsureParents: true,
+						},
+					},
+					Files: []FileCustomization{
+						{
+							Path:  "/file",
+							User:  common.ToPtr("file-user`"),
+							Group: common.ToPtr("file-group"),
+							Mode:  "0755",
+							Data:  "literal easter egg",
+						},
+					},
+					Repositories: []RepositoryCustomization{
+						{
+							Id:           "repoid",
+							BaseURLs:     []string{"http://baseurl"},
+							GPGKeys:      []string{"repo-gpgkey"},
+							Metalink:     "http://metalink",
+							Mirrorlist:   "http://mirrorlist",
+							Name:         "reponame",
+							Priority:     common.ToPtr(987),
+							Enabled:      common.ToPtr(true),
+							GPGCheck:     common.ToPtr(true),
+							RepoGPGCheck: common.ToPtr(true),
+							SSLVerify:    common.ToPtr(true),
+							Filename:     "repofile",
+						},
+					},
+				},
+				Distro: "distro",
+			},
+			expected: iblueprint.Blueprint{
+				Name:        "name",
+				Description: "desc",
+				Version:     "version",
+				Packages: []iblueprint.Package{
+					{
+						Name:    "package-name",
+						Version: "package-version",
+					},
+				},
+				Modules: []iblueprint.Package{
+					{
+						Name:    "module-name",
+						Version: "module-version",
+					},
+				},
+				Groups: []iblueprint.Group{
+					{
+						Name: "group-name",
+					},
+				},
+				Containers: []iblueprint.Container{
+					{
+						Source:    "source",
+						Name:      "name",
+						TLSVerify: common.ToPtr(true),
+					},
+				},
+				Customizations: &iblueprint.Customizations{
+					Hostname: common.ToPtr("hostname"),
+					Kernel: &iblueprint.KernelCustomization{
+						Name:   "kernel-name",
+						Append: "kernel-append",
+					},
+					SSHKey: []iblueprint.SSHKeyCustomization{
+						{
+							User: "ssh-user",
+							Key:  "ssh-key",
+						},
+					},
+					User: []iblueprint.UserCustomization{
+						{
+							Name:        "user-name",
+							Description: common.ToPtr("user-desc"),
+							Password:    common.ToPtr("user-password"),
+							Key:         common.ToPtr("user-key"),
+							Home:        common.ToPtr("/home/user"),
+							Shell:       common.ToPtr("fish"),
+							Groups:      []string{"wheel"},
+							UID:         common.ToPtr(42),
+							GID:         common.ToPtr(2023),
+						},
+					},
+					Group: []iblueprint.GroupCustomization{
+						{
+							Name: "group",
+							GID:  common.ToPtr(7),
+						},
+					},
+					Timezone: &iblueprint.TimezoneCustomization{
+						Timezone:   common.ToPtr("timezone"),
+						NTPServers: []string{"ntp-server"},
+					},
+					Locale: &iblueprint.LocaleCustomization{
+						Languages: []string{"language"},
+						Keyboard:  common.ToPtr("keyboard"),
+					},
+					Firewall: &iblueprint.FirewallCustomization{
+						Ports: []string{"80"},
+						Services: &iblueprint.FirewallServicesCustomization{
+							Enabled:  []string{"ssh"},
+							Disabled: []string{"ntp"},
+						},
+						Zones: []iblueprint.FirewallZoneCustomization{
+							{
+								Name:    common.ToPtr("name"),
+								Sources: []string{"src"},
+							},
+						},
+					},
+					Services: &iblueprint.ServicesCustomization{
+						Enabled:  []string{"osbuild-composer.service"},
+						Disabled: []string{"lorax-composer.service"},
+					},
+					Filesystem: []iblueprint.FilesystemCustomization{
+						{
+							Mountpoint: "/usr",
+							MinSize:    1024,
+						},
+					},
+					InstallationDevice: "/dev/sda",
+					FDO: &iblueprint.FDOCustomization{
+						ManufacturingServerURL: "http://manufacturing.fdo",
+						DiunPubKeyInsecure:     "insecure-pubkey",
+						DiunPubKeyHash:         "hash-pubkey",
+						DiunPubKeyRootCerts:    "root-certs",
+					},
+					OpenSCAP: &iblueprint.OpenSCAPCustomization{
+						DataStream: "stream",
+						ProfileID:  "profile",
+						Tailoring: &iblueprint.OpenSCAPTailoringCustomizations{
+							Selected:   []string{"cloth"},
+							Unselected: []string{"leather"},
+						},
+					},
+					Ignition: &iblueprint.IgnitionCustomization{
+						Embedded: &iblueprint.EmbeddedIgnitionCustomization{
+							Config: "ignition-config",
+						},
+						FirstBoot: &iblueprint.FirstBootIgnitionCustomization{
+							ProvisioningURL: "http://provisioning.edge",
+						},
+					},
+					Directories: []iblueprint.DirectoryCustomization{
+						{
+							Path:          "/dir",
+							User:          common.ToPtr("dir-user"),
+							Group:         common.ToPtr("dir-group"),
+							Mode:          "0777",
+							EnsureParents: true,
+						},
+					},
+					Files: []iblueprint.FileCustomization{
+						{
+							Path:  "/file",
+							User:  common.ToPtr("file-user`"),
+							Group: common.ToPtr("file-group"),
+							Mode:  "0755",
+							Data:  "literal easter egg",
+						},
+					},
+					Repositories: []iblueprint.RepositoryCustomization{
+						{
+							Id:           "repoid",
+							BaseURLs:     []string{"http://baseurl"},
+							GPGKeys:      []string{"repo-gpgkey"},
+							Metalink:     "http://metalink",
+							Mirrorlist:   "http://mirrorlist",
+							Name:         "reponame",
+							Priority:     common.ToPtr(987),
+							Enabled:      common.ToPtr(true),
+							GPGCheck:     common.ToPtr(true),
+							RepoGPGCheck: common.ToPtr(true),
+							SSLVerify:    common.ToPtr(true),
+							Filename:     "repofile",
+						},
+					},
+				},
+				Distro: "distro",
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			assert.Equal(t, tt.expected, Convert(tt.src))
+		})
+	}
+}
diff --git a/test/cases/ostree-ami-image.sh b/test/cases/ostree-ami-image.sh
index b6b27101b..da8db1254 100755
--- a/test/cases/ostree-ami-image.sh
+++ b/test/cases/ostree-ami-image.sh
@@ -4,10 +4,9 @@ set -euo pipefail
 # Provision the software under test.
 /usr/libexec/osbuild-composer-test/provision.sh none
 
-source /usr/libexec/tests/osbuild-composer/shared_lib.sh
-
 # Get OS data.
-source /etc/os-release
+source /usr/libexec/osbuild-composer-test/set-env-variables.sh
+source /usr/libexec/tests/osbuild-composer/shared_lib.sh
 ARCH=$(uname -m)
 
 # Start libvirtd and test it.
@@ -63,7 +62,7 @@ CONTAINER_FILENAME=container.tar
 AMI_IMAGE_TYPE=edge-ami
 AMI_IMAGE_FILENAME=image.raw
 OSTREE_OSNAME=redhat
-BUCKET_NAME="test-bucket-${TEST_UUID}"
+BUCKET_NAME="composer-ci-${TEST_UUID}"
 BUCKET_URL="s3://${BUCKET_NAME}"
 OBJECT_URL="http://${BUCKET_NAME}.s3.${AWS_DEFAULT_REGION}.amazonaws.com"
 
@@ -195,7 +194,7 @@ clean_up () {
 
     # Remove prod repo
     sudo rm -rf "$PROD_REPO"
-    
+
     # Remomve tmp dir.
     sudo rm -rf "$TEMPDIR"
 
@@ -204,40 +203,18 @@ clean_up () {
 
     # Deregister edge AMI image
     aws ec2 deregister-image --image-id "${AMI_ID}"
-    
+
     # Remove snapshot
     aws ec2 delete-snapshot --snapshot-id "${SNAPSHOT_ID}"
-    
+
     # Delete Key Pair
     aws ec2 delete-key-pair --key-name "${AMI_KEY_NAME}"
-    
+
     # Terminate running instance
     aws ec2 terminate-instances --instance-ids "${INSTANCE_ID}"
-    
-    # Clean up local folder
-    sudo rm -rf "${CONTAINERS_FILE}" "${IMPORT_SNAPSHOT_INFO}" "${IMPORT_SNAPSHOT_TASK}" "${AMI_FILENAME}" "${REGISTERED_AMI_ID}" "${INSTANCE_OUT_INFO}" "${MARKET_OPTIONS}" "${IGW_OUTPUT}" "${RT_OUTPUT}" "${SG_OUTPUT}" "${SUBNET_OUTPUT}" "${VPC_OUTPUT}"
-    
+
     # Remove bucket content and bucket itself quietly
     aws s3 rb "${BUCKET_URL}" --force > /dev/null
-    
-    # Remove subnet
-    aws ec2 delete-subnet --subnet-id "${SUBN_ID}"
-    
-    # Remove Security Groups
-    aws ec2 delete-security-group --group-id "${SEC_GROUP_ID}"
-    
-    # Remove Route Table
-    aws ec2 delete-route-table --route-table-id "${RT_ID}"
-    
-    # Detach Internet gateway from VPC
-    aws ec2 detach-internet-gateway --internet-gateway-id "${IGW_ID}" --vpc-id "${VPC_ID}"
-    
-    # Remove Internet gateway
-    aws ec2 delete-internet-gateway --internet-gateway-id "${IGW_ID}"
-    
-    # Delete VPC
-    aws ec2 delete-vpc --vpc-id "${VPC_ID}"
-
 }
 
 # Test result checking
@@ -252,42 +229,71 @@ check_result () {
     fi
 }
 
-# AWS EC2 AMI tagging function
-tag_ec2_ami () {
-    ami_id=$1
-    
-    greenprint "Add custom tags to EC2 ami"
-    aws ec2 create-tags \
-      --resources "${ami_id}" --tags Key=Project,Value=rhel-edge
-    aws ec2 create-tags \
-      --resources "${ami_id}" --tags Key=ImageType,Value=edge-ami
-    aws ec2 create-tags \
-      --resources "${ami_id}" --tags Key=BuildBy,Value=osbuild-composer
-
-}
-
-# AWS EC2 instance tagging function
-tag_ec2_instance () {
-    instance_id=$1
-
-    aws ec2 create-tags \
-      --resources "${instance_id}" --tags Key=Project,Value=rhel-edge
-}
+# Configure AWS EC2 network
+add_vpc () {
+    # Network setup
+    greenprint "VPC Network setup."
+
+    # Create VPC
+    VPC_OUTPUT=vpc_output.json
+    aws ec2 create-vpc --tag-specification 'ResourceType=vpc,Tags=[{Key=Name,Value=kite-ci}]' --cidr-block 172.32.0.0/16 --region="${AWS_DEFAULT_REGION}" | tee "${VPC_OUTPUT}" > /dev/null
+    VPC_ID=$(jq -r '.Vpc.VpcId' < "${VPC_OUTPUT}")
+    rm -f "$VPC_OUTPUT"
+
+    # Create VPC Internet Gateway
+    IGW_OUTPUT=igw_output.json
+    aws ec2 create-internet-gateway --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=kite-ci}]' | tee "${IGW_OUTPUT}" > /dev/null
+    IGW_ID=$(jq -r '.InternetGateway.InternetGatewayId' < "${IGW_OUTPUT}")
+    rm -f "$IGW_OUTPUT"
+
+    # Attach internet gateway
+    aws ec2 attach-internet-gateway --vpc-id "${VPC_ID}" --internet-gateway-id "${IGW_ID}"
+
+    # Add default route in route table for all vpc subnets
+    # Create route table
+    RT_OUTPUT=route_table_out.json
+    aws ec2 create-route-table --vpc-id "${VPC_ID}" --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=kite-ci}]' | tee "${RT_OUTPUT}" > /dev/null
+    RT_ID=$(jq -r '.RouteTable.RouteTableId' < "${RT_OUTPUT}")
+    aws ec2 create-route --route-table-id "${RT_ID}" --destination-cidr-block 0.0.0.0/0 --gateway-id "${IGW_ID}"
+    rm -f "$RT_OUTPUT"
+
+    ALL_ZONES=( "us-east-1a" "us-east-1b" "us-east-1c" "us-east-1d" "us-east-1e" "us-east-1f" )
+    LENGTH=${#ALL_ZONES[@]}
+    for (( j=0; j<LENGTH; j++ ))
+    do
+        # Create Subnet for VPC
+        SUBNET_OUTPUT=sub_net_output.json
+        aws ec2 create-subnet --vpc-id "${VPC_ID}" --cidr-block "172.32.3${j}.0/24" --availability-zone "${ALL_ZONES[$j]}" --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=kite-ci}]' | tee "${SUBNET_OUTPUT}"
+        SUBN_ID=$(jq -r '.Subnet.SubnetId' < "${SUBNET_OUTPUT}")
+        rm -f "$SUBNET_OUTPUT"
+        # Associate route table to subnet
+        aws ec2 associate-route-table --route-table-id "${RT_ID}" --subnet-id "${SUBN_ID}"
+    done
 
-tag_describe_resource () {
-    res_id=$1
-    aws ec2 describe-tags \
-    --filters "Name=resource-id,Values=${res_id}"
+    # Security Group setup
+    SG_OUTPUT=sec_group.json
+    aws ec2 create-security-group --group-name kite-ci-sg --description "kite ci edge-ami security group" --vpc-id "${VPC_ID}" --tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=kite-ci}]' | tee "${SG_OUTPUT}"
+    SEC_GROUP_ID=$(jq -r '.GroupId' < "${SG_OUTPUT}")
+    # Allow inbound ssh connections
+    aws ec2 authorize-security-group-ingress --group-id "${SEC_GROUP_ID}" --protocol tcp --port 22 --cidr 0.0.0.0/0 --tag-specifications 'ResourceType=security-group-rule,Tags=[{Key=Name,Value=kite-ci}]'
+    rm -f "$SG_OUTPUT"
 }
 
 # Get instance type
 get_instance_type () {
     arch=$1
-    
+
     if [[ $arch == x86_64 ]]; then
         allInstanceTypes=("t2.medium" \
             "t3.medium" \
             "m6a.large")
+    elif [[ $arch == aarch64 ]]; then
+        allInstanceTypes=("t4g.medium" \
+            "c7g.medium" \
+            "m6g.medium")
+    else
+        echo "Not supported Architecture"
+        exit 1
     fi
     RND_LINE=$((RANDOM % 3))
     echo "${allInstanceTypes[$RND_LINE]}"
@@ -334,10 +340,15 @@ groups = []
 [[packages]]
 name = "python3"
 version = "*"
+EOF
 
+# Red Hat does not provide realtime kernel package for ARM
+if [[ "${ARCH}" != aarch64 ]]; then
+    tee -a "$BLUEPRINT_FILE" > /dev/null << EOF
 [customizations.kernel]
 name = "kernel-rt"
 EOF
+fi
 
 greenprint "📄 container blueprint"
 cat "$BLUEPRINT_FILE"
@@ -468,7 +479,7 @@ EOF
 sudo chmod +r "${IGNITION_CONFIG_SAMPLE_PATH}" "${IGNITION_CONFIG_PATH}"
 
 # Start AWS cli installation 
-curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
+curl "https://awscli.amazonaws.com/awscli-exe-linux-${ARCH}.zip" -o "awscliv2.zip"
 unzip awscliv2.zip > /dev/null
 sudo ./aws/install --update
 aws --version
@@ -536,6 +547,8 @@ sudo chmod +r "${AMI_FILENAME}"
 # Upload ami to AWS S3 bucket
 greenprint "📂 Upload raw ami to S3 bucket"
 aws s3 cp --quiet "${AMI_FILENAME}" "${BUCKET_URL}/" --acl public-read
+
+# Clean compose and blueprints
 greenprint "🧹 Clean up edge-ami compose and blueprint"
 sudo composer-cli compose delete "${COMPOSE_ID}" > /dev/null
 sudo composer-cli blueprints delete ami > /dev/null
@@ -554,20 +567,21 @@ EOF
 # Import the image as an EBS snapshot into EC2
 IMPORT_SNAPSHOT_INFO=output_snapshot_info.json
 aws ec2 import-snapshot --description "RHEL edge ami snapshot" --disk-container file://"${CONTAINERS_FILE}" > "${IMPORT_SNAPSHOT_INFO}"
-IMPORT_TASK_ID=$(cat "${IMPORT_SNAPSHOT_INFO}" | jq -r '.ImportTaskId')
+IMPORT_TASK_ID=$(jq -r '.ImportTaskId' < "${IMPORT_SNAPSHOT_INFO}")
+rm -f "$IMPORT_SNAPSHOT_INFO" "$CONTAINERS_FILE"
 
 # Monitor snapshot status
 greenprint "Check import status of the snapshot"
 IMPORT_SNAPSHOT_TASK=output_snapshot_task.json
 while true; do
     aws ec2 describe-import-snapshot-tasks --import-task-ids "${IMPORT_TASK_ID}" | tee "${IMPORT_SNAPSHOT_TASK}" > /dev/null
-    IMPORT_STATUS=$(cat "${IMPORT_SNAPSHOT_TASK}" | jq -r '.ImportSnapshotTasks[].SnapshotTaskDetail.Status')
+    IMPORT_STATUS=$(jq -r '.ImportSnapshotTasks[].SnapshotTaskDetail.Status' < "${IMPORT_SNAPSHOT_TASK}")
 
     # Has the snapshot finished?
     if [[ $IMPORT_STATUS != active ]]; then
         break
     fi
-    
+
     # Wait 5 seconds and try again.
     sleep 5
 done
@@ -579,62 +593,21 @@ else
   greenprint "Snapshot imported successfully."
 fi
 
+SNAPSHOT_ID=$(jq -r '.ImportSnapshotTasks[].SnapshotTaskDetail.SnapshotId' < "${IMPORT_SNAPSHOT_TASK}")
+aws ec2 create-tags --resources "${SNAPSHOT_ID}" --tags Key=Name,Value=composer-ci
+rm -f "$IMPORT_SNAPSHOT_TASK"
+
 # Import  keypair
 greenprint "Share ssh public key with AWS"
 AMI_KEY_NAME="edge-ami-key-${TEST_UUID}"
 # Clean previous configured keypair
-aws ec2 delete-key-pair --key-name "${AMI_KEY_NAME}"
-aws ec2 import-key-pair --key-name "${AMI_KEY_NAME}" --public-key-material fileb://"${SSH_KEY}".pub
-
-# Network setup
-greenprint "VPC Network setup."
-
-# Create VPC
-VPC_OUTPUT=vpc_output.json
-aws ec2 create-vpc --cidr-block 172.32.0.0/16 --region="${AWS_DEFAULT_REGION}" | tee "${VPC_OUTPUT}" > /dev/null
-VPC_ID=$(cat "${VPC_OUTPUT}" | jq -r '.Vpc.VpcId')
-
-# Create VPC Internet Gateway
-IGW_OUTPUT=igw_output.json
-aws ec2 create-internet-gateway | tee "${IGW_OUTPUT}" > /dev/null
-IGW_ID=$(cat "${IGW_OUTPUT}" | jq -r '.InternetGateway.InternetGatewayId')
-
-# Attach internet gateway 
-aws ec2 attach-internet-gateway --vpc-id "${VPC_ID}" --internet-gateway-id "${IGW_ID}"
-
-# Create Subnet for VPC
-SUBNET_OUTPUT=sub_net_output.json
-aws ec2 create-subnet --vpc-id "${VPC_ID}" --cidr-block 172.32.32.0/24 | tee "${SUBNET_OUTPUT}"
-SUBN_ID=$(cat "${SUBNET_OUTPUT}" | jq -r '.Subnet.SubnetId')
-
-# Add default route in route table for all vpc subnets
-# Create route table
-RT_OUTPUT=route_table_out.json
-aws ec2 create-route-table --vpc-id "${VPC_ID}" | tee "${RT_OUTPUT}" > /dev/null
-RT_ID=$(cat "${RT_OUTPUT}" | jq -r '.RouteTable.RouteTableId')
-aws ec2 create-route --route-table-id "${RT_ID}" --destination-cidr-block 0.0.0.0/0 --gateway-id "${IGW_ID}"
-# Associate route table to subnet
-aws ec2 associate-route-table --route-table-id "${RT_ID}" --subnet-id "${SUBN_ID}"
-
-# Security Group setup
-SG_OUTPUT=sec_group.json
-aws ec2 create-security-group --group-name mysecuritygroup --description "edge-ami security group" --vpc-id "${VPC_ID}" | tee "${SG_OUTPUT}"
-SEC_GROUP_ID=$(cat "${SG_OUTPUT}" | jq -r '.GroupId')
-# Allow inbound ssh connections
-aws ec2 authorize-security-group-ingress --group-id "${SEC_GROUP_ID}" --protocol tcp --port 22 --cidr 0.0.0.0/0
+aws ec2 import-key-pair --key-name "${AMI_KEY_NAME}" --public-key-material fileb://"${SSH_KEY}".pub --tag-specification 'ResourceType=key-pair,Tags=[{Key=Name,Value=composer-ci}]'
 
-# Create instance market options
-MARKET_OPTIONS=spot-options.json
-tee "${MARKET_OPTIONS}" > /dev/null << EOF
-{
-  "MarketType": "spot",
-  "SpotOptions": {
-    "MaxPrice": "0.1",
-    "SpotInstanceType": "one-time",
-    "InstanceInterruptionBehavior": "terminate"
-  }
-}
-EOF
+# Create ec2 network
+EXISTED_VPC=$(aws ec2 describe-vpcs --filters="Name=tag:Name,Values=kite-ci" --output json --query "Vpcs")
+if [[ "$EXISTED_VPC" == "[]" ]]; then
+    add_vpc
+fi
 
 ##################################################################
 ##
@@ -645,11 +618,17 @@ EOF
 greenprint "Register AMI, create image from snapshot."
 REGISTERED_AMI_NAME="edge_ami-${TEST_UUID}"
 REGISTERED_AMI_ID=output_ami_id.json
-SNAPSHOT_ID=$(cat "${IMPORT_SNAPSHOT_TASK}" | jq -r '.ImportSnapshotTasks[].SnapshotTaskDetail.SnapshotId')
+
+if [[ "${ARCH}" == x86_64 ]]; then
+    IMG_ARCH="${ARCH}"
+elif [[ "${ARCH}" == aarch64 ]]; then
+    IMG_ARCH=arm64
+fi
+
 aws ec2 register-image \
     --name "${REGISTERED_AMI_NAME}" \
     --root-device-name /dev/xvda \
-    --architecture "${ARCH}" \
+    --architecture "${IMG_ARCH}" \
     --ena-support \
     --sriov-net-support simple \
     --virtualization-type hvm \
@@ -657,26 +636,54 @@ aws ec2 register-image \
     --boot-mode uefi-preferred \
     --output json > "${REGISTERED_AMI_ID}"
 
-AMI_ID=$(cat "${REGISTERED_AMI_ID}" | jq -r '.ImageId')
-tag_ec2_ami "${AMI_ID}"
-tag_describe_resource "${AMI_ID}"
+AMI_ID=$(jq -r '.ImageId' < "${REGISTERED_AMI_ID}")
+aws ec2 create-tags --resources "${AMI_ID}" --tags Key=Name,Value=composer-ci
+rm -f "$REGISTERED_AMI_ID"
+
+# Create instance market options
+MARKET_OPTIONS=spot-options.json
+tee "${MARKET_OPTIONS}" > /dev/null << EOF
+{
+  "MarketType": "spot",
+  "SpotOptions": {
+    "MaxPrice": "0.1",
+    "SpotInstanceType": "one-time",
+    "InstanceInterruptionBehavior": "terminate"
+  }
+}
+EOF
 
 # Launch Instance
 greenprint "💻 Launch instance from AMI"
-for LOOP_COUNTER in $(seq 0 9); do
+for _ in $(seq 0 9); do
+    RESULTS=0
     INSTANCE_OUT_INFO=instance_output_info.json
     INSTANCE_TYPE=$(get_instance_type "${ARCH}")
+
+    ZONE_LIST=$(aws ec2 describe-instance-type-offerings --location-type availability-zone --filters="Name=instance-type,Values=${INSTANCE_TYPE}" --query "InstanceTypeOfferings")
+    if [[ "$ZONE_LIST" == "[]" ]]; then
+        greenprint "No available $INSTANCE_TYPE in this region"
+        break
+    else
+        ZONE_NAME=$(echo "$ZONE_LIST" | jq -r ".[0].Location")
+    fi
+    SUBNET_ID=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=kite-ci" "Name=availabilityZone,Values=${ZONE_NAME}" | jq -r ".Subnets[0].SubnetId")
+    SEC_GROUP_ID=$(aws ec2 describe-security-groups --filters="Name=tag:Name,Values=kite-ci" --output json | jq -r ".SecurityGroups[0].GroupId")
+
     aws ec2 run-instances \
         --image-id "${AMI_ID}" \
         --count 1 \
         --instance-type "${INSTANCE_TYPE}" \
+        --placement AvailabilityZone="${ZONE_NAME}" \
+        --tag-specification 'ResourceType=instance,Tags=[{Key=Name,Value=composer-ci}]' \
         --instance-market-options file://"${MARKET_OPTIONS}" \
         --key-name "${AMI_KEY_NAME}" \
         --security-group-ids "${SEC_GROUP_ID}" \
-        --subnet-id "${SUBN_ID}" \
+        --subnet-id "${SUBNET_ID}" \
         --associate-public-ip-address > "${INSTANCE_OUT_INFO}" 2>&1 || :
     if ! grep -iqE 'unsupported|InsufficientInstanceCapacity' "${INSTANCE_OUT_INFO}"; then
         echo "Instance type supported!"
+        RESULTS=1
         break
     fi
     sleep 30
@@ -688,13 +695,12 @@ sleep 5
 
 # get instance public ip
 INSTANCE_ID=$(jq -r '.Instances[].InstanceId' "${INSTANCE_OUT_INFO}")
-tag_ec2_instance "${INSTANCE_ID}"
-tag_describe_resource "${INSTANCE_ID}"
 PUBLIC_GUEST_ADDRESS=$(aws ec2 describe-instances --instance-ids "${INSTANCE_ID}" --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)
+rm -f "$MARKET_OPTIONS" "$INSTANCE_OUT_INFO"
 
 # Check for ssh ready to go.
 greenprint "🛃 Checking for SSH is ready to go"
-for LOOP_COUNTER in $(seq 0 30); do
+for _ in $(seq 0 30); do
     RESULTS=$(wait_for_ssh_up "${PUBLIC_GUEST_ADDRESS}")
     if [[ $RESULTS == 1 ]]; then
         echo "SSH is ready now! 🥳"
@@ -727,7 +733,6 @@ EOF
 # Test IoT/Edge OS
 sudo ansible-playbook -v -i "${TEMPDIR}"/inventory \
     -e image_type="${OSTREE_OSNAME}" \
-    -e skip_rollback_test="true" \
     -e ignition="true" \
     -e edge_type=edge-ami-image \
     -e ostree_commit="${INSTALL_HASH}" \
@@ -768,10 +773,15 @@ description = "Administrator account"
 password = "\$6\$GRmb7S0p8vsYmXzH\$o0E020S.9JQGaHkszoog4ha4AQVs3sk8q0DvLjSMxoxHBKnB2FBXGQ/OkwZQfW/76ktHd0NX5nls2LPxPuUdl."
 home = "/home/admin/"
 groups = ["wheel"]
+EOF
 
+# Red Hat does not provide realtime kernel package for ARM
+if [[ "${ARCH}" != aarch64 ]]; then
+    tee -a "$BLUEPRINT_FILE" > /dev/null << EOF
 [customizations.kernel]
 name = "kernel-rt"
 EOF
+fi
 
 greenprint "📄 upgrade blueprint"
 cat "$BLUEPRINT_FILE"
@@ -849,8 +859,7 @@ sleep 10
 
 # Check for ssh ready to go.
 greenprint "🛃 Checking for SSH is ready to go"
-# shellcheck disable=SC2034  # Unused variables left for readability
-for LOOP_COUNTER in $(seq 0 30); do
+for _ in $(seq 0 30); do
     RESULTS=$(wait_for_ssh_up "${PUBLIC_GUEST_ADDRESS}")
     if [[ $RESULTS == 1 ]]; then
         echo "SSH is ready now! 🥳"
@@ -891,4 +900,3 @@ check_result
 clean_up
 
 exit 0
-
diff --git a/test/cases/ostree-simplified-installer.sh b/test/cases/ostree-simplified-installer.sh
index 031c43b67..db8185e2e 100755
--- a/test/cases/ostree-simplified-installer.sh
+++ b/test/cases/ostree-simplified-installer.sh
@@ -14,7 +14,8 @@ source /usr/libexec/tests/osbuild-composer/shared_lib.sh
 sudo systemctl enable --now firewalld
 sudo pip3 install yq==v3.2.1
 # Install fdo packages (This cannot be done in the setup.sh because fdo-admin-cli is not available on fedora)
-sudo dnf install -y fdo-admin-cli
+# Install fdo-client and fdo-init to workaround bug https://bugzilla.redhat.com/show_bug.cgi?id=2230537
+sudo dnf install -y fdo-admin-cli fdo-client fdo-init
 # Start fdo-aio to have /etc/fdo/aio folder
 sudo systemctl enable --now fdo-aio
 # Wait until config file serviceinfo_api_server.yml exists
@@ -137,6 +138,9 @@ case "${ID}-${VERSION_ID}" in
         SYSROOT_RO="true"
         ANSIBLE_USER=fdouser
         FDO_USER_ONBOARDING="true"
+        # workaround selinux bug https://bugzilla.redhat.com/show_bug.cgi?id=2026795
+        sudo setenforce 0
+        getenforce
         ;;
     "centos-8")
         OSTREE_REF="centos/8/${ARCH}/edge"
@@ -152,6 +156,9 @@ case "${ID}-${VERSION_ID}" in
         SYSROOT_RO="true"
         ANSIBLE_USER=fdouser
         FDO_USER_ONBOARDING="true"
+        # workaround selinux bug https://bugzilla.redhat.com/show_bug.cgi?id=2026795
+        sudo setenforce 0
+        getenforce
         ;;
     *)
         redprint "unsupported distro: ${ID}-${VERSION_ID}"
@@ -580,6 +587,14 @@ manufacturing_server_url="http://${FDO_SERVER_ADDRESS}:8080"
 diun_pub_key_insecure="true"
 EOF
 
+# workaround selinux bug https://bugzilla.redhat.com/show_bug.cgi?id=2026795
+if [[ "$VERSION_ID" == "9.3" || "$VERSION_ID" == "9" ]]; then
+    tee -a "$BLUEPRINT_FILE" > /dev/null << EOF
+[customizations.kernel]
+append = "enforcing=0"
+EOF
+fi
+
 greenprint "📄 installer blueprint"
 cat "$BLUEPRINT_FILE"
 
@@ -702,6 +717,7 @@ EOF
 sudo ansible-playbook -v -i "${TEMPDIR}"/inventory \
     -e image_type=redhat \
     -e ostree_commit="${INSTALL_HASH}" \
+    -e skip_rollback_test="true" \
     -e edge_type=edge-simplified-installer \
     -e fdo_credential="true" \
     -e sysroot_ro="$SYSROOT_RO" \
@@ -740,6 +756,14 @@ manufacturing_server_url="http://${FDO_SERVER_ADDRESS}:8080"
 diun_pub_key_hash="${DIUN_PUB_KEY_HASH}"
 EOF
 
+# workaround selinux bug https://bugzilla.redhat.com/show_bug.cgi?id=2026795
+if [[ "$VERSION_ID" == "9.3" || "$VERSION_ID" == "9" ]]; then
+    tee -a "$BLUEPRINT_FILE" > /dev/null << EOF
+[customizations.kernel]
+append = "enforcing=0"
+EOF
+fi
+
 greenprint "📄 fdosshkey blueprint"
 cat "$BLUEPRINT_FILE"
 
@@ -1001,6 +1025,7 @@ EOF
 sudo ansible-playbook -v -i "${TEMPDIR}"/inventory \
     -e image_type=redhat \
     -e ostree_commit="${REBASE_HASH}" \
+    -e skip_rollback_test="true" \
     -e edge_type=edge-simplified-installer \
     -e fdo_credential="true" \
     -e sysroot_ro="$SYSROOT_RO" \
@@ -1047,6 +1072,14 @@ diun_pub_key_root_certs="""
 ${DIUN_PUB_KEY_ROOT_CERTS}"""
 EOF
 
+# workaround selinux bug https://bugzilla.redhat.com/show_bug.cgi?id=2026795
+if [[ "$VERSION_ID" == "9.3" || "$VERSION_ID" == "9" ]]; then
+    tee -a "$BLUEPRINT_FILE" > /dev/null << EOF
+[customizations.kernel]
+append = "enforcing=0"
+EOF
+fi
+
 greenprint "📄 fdosshkey blueprint"
 cat "$BLUEPRINT_FILE"
 
@@ -1295,7 +1328,7 @@ sudo ansible-playbook -v -i "${TEMPDIR}"/inventory \
     -e ostree_commit="${UPGRADE_HASH}" \
     -e skip_rollback_test="true" \
     -e edge_type=edge-simplified-installer \
-    -e fdo_credential="false" \
+    -e fdo_credential="true" \
     -e sysroot_ro="$SYSROOT_RO" \
     /usr/share/tests/osbuild-composer/ansible/check_ostree.yaml || RESULTS=0
 
diff --git a/test/data/ansible/check_ostree.yaml b/test/data/ansible/check_ostree.yaml
index cfac7aeb6..f7f5ab344 100644
--- a/test/data/ansible/check_ostree.yaml
+++ b/test/data/ansible/check_ostree.yaml
@@ -99,7 +99,7 @@
     - name: wait for FDO onboarding
       block:
         - wait_for:
-            path:  "/etc/device-credentials"
+            path: "/etc/device-credentials"
             delay: 10
             timeout: 600
             state: present
@@ -747,8 +747,9 @@
     - name: check fdo-client-linuxapp logs
       command: journalctl -u fdo-client-linuxapp
       register: result_fdo_client_linuxapp_journalctl
+      when: fdo_credential == "true"
 
-    - debug: 
+    - debug:
         var: result_fdo_client_linuxapp_journalctl
 
     # case: check rollback function if boot error found
@@ -843,8 +844,9 @@
     - name: check fdo-client-linuxapp logs
       command: journalctl -u fdo-client-linuxapp
       register: result_fdo_client_linuxapp_journalctl
+      when: fdo_credential == "true"
 
-    - debug: 
+    - debug:
         var: result_fdo_client_linuxapp_journalctl
 
     - name: wait for FDO re-encryption
@@ -866,8 +868,9 @@
     - name: check fdo-client-linuxapp logs
       command: journalctl -u fdo-client-linuxapp
       register: result_fdo_client_linuxapp_journalctl
+      when: fdo_credential == "true"
 
-    - debug: 
+    - debug:
         var: result_fdo_client_linuxapp_journalctl
 
     # case: check greenboot* services log again
diff --git a/test/data/repositories/centos-stream-9.json b/test/data/repositories/centos-stream-9.json
index c1d060ba0..4d1ae80e5 100644
--- a/test/data/repositories/centos-stream-9.json
+++ b/test/data/repositories/centos-stream-9.json
@@ -44,19 +44,19 @@
   "x86_64": [
     {
       "name": "AppStream",
-      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/cs9-x86_64-appstream-20230301/",
+      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/cs9-x86_64-appstream-20230809/",
       "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n",
       "check_gpg": true
     },
     {
       "name": "BaseOS",
-      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/cs9-x86_64-baseos-20230301/",
+      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/cs9-x86_64-baseos-20230809/",
       "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n",
       "check_gpg": true
     },
     {
       "name": "RT",
-      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/cs9-x86_64-rt-20230301/",
+      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/cs9-x86_64-rt-20230809/",
       "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFzMWxkBEADHrskpBgN9OphmhRkc7P/YrsAGSvvl7kfu+e9KAaU6f5MeAVyn\nrIoM43syyGkgFyWgjZM8/rur7EMPY2yt+2q/1ZfLVCRn9856JqTIq0XRpDUe4nKQ\n8BlA7wDVZoSDxUZkSuTIyExbDf0cpw89Tcf62Mxmi8jh74vRlPy1PgjWL5494b3X\n5fxDidH4bqPZyxTBqPrUFuo+EfUVEqiGF94Ppq6ZUvrBGOVo1V1+Ifm9CGEK597c\naevcGc1RFlgxIgN84UpuDjPR9/zSndwJ7XsXYvZ6HXcKGagRKsfYDWGPkA5cOL/e\nf+yObOnC43yPUvpggQ4KaNJ6+SMTZOKikM8yciyBwLqwrjo8FlJgkv8Vfag/2UR7\nJINbyqHHoLUhQ2m6HXSwK4YjtwidF9EUkaBZWrrskYR3IRZLXlWqeOi/+ezYOW0m\nvufrkcvsh+TKlVVnuwmEPjJ8mwUSpsLdfPJo1DHsd8FS03SCKPaXFdD7ePfEjiYk\nnHpQaKE01aWVSLUiygn7F7rYemGqV9Vt7tBw5pz0vqSC72a5E3zFzIIuHx6aANry\nGat3aqU3qtBXOrA/dPkX9cWE+UR5wo/A2UdKJZLlGhM2WRJ3ltmGT48V9CeS6N9Y\nm4CKdzvg7EWjlTlFrd/8WJ2KoqOE9leDPeXRPncubJfJ6LLIHyG09h9kKQARAQAB\ntDpDZW50T1MgKENlbnRPUyBPZmZpY2lhbCBTaWduaW5nIEtleSkgPHNlY3VyaXR5\nQGNlbnRvcy5vcmc+iQI3BBMBAgAhBQJczFsZAhsDBgsJCAcDAgYVCAIJCgsDFgIB\nAh4BAheAAAoJEAW1VbOEg8ZdjOsP/2ygSxH9jqffOU9SKyJDlraL2gIutqZ3B8pl\nGy/Qnb9QD1EJVb4ZxOEhcY2W9VJfIpnf3yBuAto7zvKe/G1nxH4Bt6WTJQCkUjcs\nN3qPWsx1VslsAEz7bXGiHym6Ay4xF28bQ9XYIokIQXd0T2rD3/lNGxNtORZ2bKjD\nvOzYzvh2idUIY1DgGWJ11gtHFIA9CvHcW+SMPEhkcKZJAO51ayFBqTSSpiorVwTq\na0cB+cgmCQOI4/MY+kIvzoexfG7xhkUqe0wxmph9RQQxlTbNQDCdaxSgwbF2T+gw\nbyaDvkS4xtR6Soj7BKjKAmcnf5fn4C5Or0KLUqMzBtDMbfQQihn62iZJN6ZZ/4dg\nq4HTqyVpyuzMXsFpJ9L/FqH2DJ4exGGpBv00ba/Zauy7GsqOc5PnNBsYaHCply0X\n407DRx51t9YwYI/ttValuehq9+gRJpOTTKp6AjZn/a5Yt3h6jDgpNfM/EyLFIY9z\nV6CXqQQ/8JRvaik/JsGCf+eeLZOw4koIjZGEAg04iuyNTjhx0e/QHEVcYAqNLhXG\nrCTTbCn3NSUO9qxEXC+K/1m1kaXoCGA0UWlVGZ1JSifbbMx0yxq/brpEZPUYm+32\no8XfbocBWljFUJ+6aljTvZ3LQLKTSPW7TFO+GXycAOmCGhlXh2tlc6iTc41PACqy\nyy+mHmSv\n=kkH7\n-----END PGP PUBLIC KEY BLOCK-----\n",
       "check_gpg": true
     },
diff --git a/test/data/repositories/rhel-93.json b/test/data/repositories/rhel-93.json
index 6de6ee92a..080d2bbda 100644
--- a/test/data/repositories/rhel-93.json
+++ b/test/data/repositories/rhel-93.json
@@ -38,17 +38,17 @@
   "x86_64": [
     {
       "name": "baseos",
-      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-baseos-n9.3-20230615/",
+      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-baseos-n9.3-20230809/",
       "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGIpIp4BEAC/o5e1WzLIsS6/JOQCs4XYATYTcf6B6ALzcP05G0W3uRpUQSrL\nFRKNrU8ZCelm/B+XSh2ljJNeklp2WLxYENDOsftDXGoyLr2hEkI5OyK267IHhFNJ\ng+BN+T5Cjh4ZiiWij6o9F7x2ZpxISE9M4iI80rwSv1KOnGSw5j2zD2EwoMjTVyVE\n/t3s5XJxnDclB7ZqL+cgjv0mWUY/4+b/OoRTkhq7b8QILuZp75Y64pkrndgakm1T\n8mAGXV02mEzpNj9DyAJdUqa11PIhMJMxxHOGHJ8CcHZ2NJL2e7yJf4orTj+cMhP5\nLzJcVlaXnQYu8Zkqa0V6J1Qdj8ZXL72QsmyicRYXAtK9Jm5pvBHuYU2m6Ja7dBEB\nVkhe7lTKhAjkZC5ErPmANNS9kPdtXCOpwN1lOnmD2m04hks3kpH9OTX7RkTFUSws\neARAfRID6RLfi59B9lmAbekecnsMIFMx7qR7ZKyQb3GOuZwNYOaYFevuxusSwCHv\n4FtLDIhk+Fge+EbPdEva+VLJeMOb02gC4V/cX/oFoPkxM1A5LHjkuAM+aFLAiIRd\nNp/tAPWk1k6yc+FqkcDqOttbP4ciiXb9JPtmzTCbJD8lgH0rGp8ufyMXC9x7/dqX\nTjsiGzyvlMnrkKB4GL4DqRFl8LAR02A3846DD8CAcaxoXggL2bJCU2rgUQARAQAB\ntDVSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5IDMpIDxzZWN1cml0eUByZWRo\nYXQuY29tPokCUgQTAQgAPBYhBH5GJCWMQGU11W1vE1BU5KRaY0CzBQJiKSKeAhsD\nBQsJCAcCAyICAQYVCgkICwIEFgIDAQIeBwIXgAAKCRBQVOSkWmNAsyBfEACuTN/X\nYR+QyzeRw0pXcTvMqzNE4DKKr97hSQEwZH1/v1PEPs5O3psuVUm2iam7bqYwG+ry\nEskAgMHi8AJmY0lioQD5/LTSLTrM8UyQnU3g17DHau1NHIFTGyaW4a7xviU4C2+k\nc6X0u1CPHI1U4Q8prpNcfLsldaNYlsVZtUtYSHKPAUcswXWliW7QYjZ5tMSbu8jR\nOMOc3mZuf0fcVFNu8+XSpN7qLhRNcPv+FCNmk/wkaQfH4Pv+jVsOgHqkV3aLqJeN\nkNUnpyEKYkNqo7mNfNVWOcl+Z1KKKwSkIi3vg8maC7rODsy6IX+Y96M93sqYDQom\naaWue2gvw6thEoH4SaCrCL78mj2YFpeg1Oew4QwVcBnt68KOPfL9YyoOicNs4Vuu\nfb/vjU2ONPZAeepIKA8QxCETiryCcP43daqThvIgdbUIiWne3gae6eSj0EuUPoYe\nH5g2Lw0qdwbHIOxqp2kvN96Ii7s1DK3VyhMt/GSPCxRnDRJ8oQKJ2W/I1IT5VtiU\nzMjjq5JcYzRPzHDxfVzT9CLeU/0XQ+2OOUAiZKZ0dzSyyVn8xbpviT7iadvjlQX3\nCINaPB+d2Kxa6uFWh+ZYOLLAgZ9B8NKutUHpXN66YSfe79xFBSFWKkJ8cSIMk13/\nIfs7ApKlKCCRDpwoDqx/sjIaj1cpOfLHYjnefg==\n=UZd/\n-----END PGP PUBLIC KEY BLOCK-----\n"
     },
     {
       "name": "appstream",
-      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-appstream-n9.3-20230615/",
+      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-appstream-n9.3-20230809/",
       "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGIpIp4BEAC/o5e1WzLIsS6/JOQCs4XYATYTcf6B6ALzcP05G0W3uRpUQSrL\nFRKNrU8ZCelm/B+XSh2ljJNeklp2WLxYENDOsftDXGoyLr2hEkI5OyK267IHhFNJ\ng+BN+T5Cjh4ZiiWij6o9F7x2ZpxISE9M4iI80rwSv1KOnGSw5j2zD2EwoMjTVyVE\n/t3s5XJxnDclB7ZqL+cgjv0mWUY/4+b/OoRTkhq7b8QILuZp75Y64pkrndgakm1T\n8mAGXV02mEzpNj9DyAJdUqa11PIhMJMxxHOGHJ8CcHZ2NJL2e7yJf4orTj+cMhP5\nLzJcVlaXnQYu8Zkqa0V6J1Qdj8ZXL72QsmyicRYXAtK9Jm5pvBHuYU2m6Ja7dBEB\nVkhe7lTKhAjkZC5ErPmANNS9kPdtXCOpwN1lOnmD2m04hks3kpH9OTX7RkTFUSws\neARAfRID6RLfi59B9lmAbekecnsMIFMx7qR7ZKyQb3GOuZwNYOaYFevuxusSwCHv\n4FtLDIhk+Fge+EbPdEva+VLJeMOb02gC4V/cX/oFoPkxM1A5LHjkuAM+aFLAiIRd\nNp/tAPWk1k6yc+FqkcDqOttbP4ciiXb9JPtmzTCbJD8lgH0rGp8ufyMXC9x7/dqX\nTjsiGzyvlMnrkKB4GL4DqRFl8LAR02A3846DD8CAcaxoXggL2bJCU2rgUQARAQAB\ntDVSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5IDMpIDxzZWN1cml0eUByZWRo\nYXQuY29tPokCUgQTAQgAPBYhBH5GJCWMQGU11W1vE1BU5KRaY0CzBQJiKSKeAhsD\nBQsJCAcCAyICAQYVCgkICwIEFgIDAQIeBwIXgAAKCRBQVOSkWmNAsyBfEACuTN/X\nYR+QyzeRw0pXcTvMqzNE4DKKr97hSQEwZH1/v1PEPs5O3psuVUm2iam7bqYwG+ry\nEskAgMHi8AJmY0lioQD5/LTSLTrM8UyQnU3g17DHau1NHIFTGyaW4a7xviU4C2+k\nc6X0u1CPHI1U4Q8prpNcfLsldaNYlsVZtUtYSHKPAUcswXWliW7QYjZ5tMSbu8jR\nOMOc3mZuf0fcVFNu8+XSpN7qLhRNcPv+FCNmk/wkaQfH4Pv+jVsOgHqkV3aLqJeN\nkNUnpyEKYkNqo7mNfNVWOcl+Z1KKKwSkIi3vg8maC7rODsy6IX+Y96M93sqYDQom\naaWue2gvw6thEoH4SaCrCL78mj2YFpeg1Oew4QwVcBnt68KOPfL9YyoOicNs4Vuu\nfb/vjU2ONPZAeepIKA8QxCETiryCcP43daqThvIgdbUIiWne3gae6eSj0EuUPoYe\nH5g2Lw0qdwbHIOxqp2kvN96Ii7s1DK3VyhMt/GSPCxRnDRJ8oQKJ2W/I1IT5VtiU\nzMjjq5JcYzRPzHDxfVzT9CLeU/0XQ+2OOUAiZKZ0dzSyyVn8xbpviT7iadvjlQX3\nCINaPB+d2Kxa6uFWh+ZYOLLAgZ9B8NKutUHpXN66YSfe79xFBSFWKkJ8cSIMk13/\nIfs7ApKlKCCRDpwoDqx/sjIaj1cpOfLHYjnefg==\n=UZd/\n-----END PGP PUBLIC KEY BLOCK-----\n"
     },
     {
       "name": "rt",
-      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-rt-n9.3-20230615/",
+      "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-rt-n9.3-20230809/",
       "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGIpIp4BEAC/o5e1WzLIsS6/JOQCs4XYATYTcf6B6ALzcP05G0W3uRpUQSrL\nFRKNrU8ZCelm/B+XSh2ljJNeklp2WLxYENDOsftDXGoyLr2hEkI5OyK267IHhFNJ\ng+BN+T5Cjh4ZiiWij6o9F7x2ZpxISE9M4iI80rwSv1KOnGSw5j2zD2EwoMjTVyVE\n/t3s5XJxnDclB7ZqL+cgjv0mWUY/4+b/OoRTkhq7b8QILuZp75Y64pkrndgakm1T\n8mAGXV02mEzpNj9DyAJdUqa11PIhMJMxxHOGHJ8CcHZ2NJL2e7yJf4orTj+cMhP5\nLzJcVlaXnQYu8Zkqa0V6J1Qdj8ZXL72QsmyicRYXAtK9Jm5pvBHuYU2m6Ja7dBEB\nVkhe7lTKhAjkZC5ErPmANNS9kPdtXCOpwN1lOnmD2m04hks3kpH9OTX7RkTFUSws\neARAfRID6RLfi59B9lmAbekecnsMIFMx7qR7ZKyQb3GOuZwNYOaYFevuxusSwCHv\n4FtLDIhk+Fge+EbPdEva+VLJeMOb02gC4V/cX/oFoPkxM1A5LHjkuAM+aFLAiIRd\nNp/tAPWk1k6yc+FqkcDqOttbP4ciiXb9JPtmzTCbJD8lgH0rGp8ufyMXC9x7/dqX\nTjsiGzyvlMnrkKB4GL4DqRFl8LAR02A3846DD8CAcaxoXggL2bJCU2rgUQARAQAB\ntDVSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5IDMpIDxzZWN1cml0eUByZWRo\nYXQuY29tPokCUgQTAQgAPBYhBH5GJCWMQGU11W1vE1BU5KRaY0CzBQJiKSKeAhsD\nBQsJCAcCAyICAQYVCgkICwIEFgIDAQIeBwIXgAAKCRBQVOSkWmNAsyBfEACuTN/X\nYR+QyzeRw0pXcTvMqzNE4DKKr97hSQEwZH1/v1PEPs5O3psuVUm2iam7bqYwG+ry\nEskAgMHi8AJmY0lioQD5/LTSLTrM8UyQnU3g17DHau1NHIFTGyaW4a7xviU4C2+k\nc6X0u1CPHI1U4Q8prpNcfLsldaNYlsVZtUtYSHKPAUcswXWliW7QYjZ5tMSbu8jR\nOMOc3mZuf0fcVFNu8+XSpN7qLhRNcPv+FCNmk/wkaQfH4Pv+jVsOgHqkV3aLqJeN\nkNUnpyEKYkNqo7mNfNVWOcl+Z1KKKwSkIi3vg8maC7rODsy6IX+Y96M93sqYDQom\naaWue2gvw6thEoH4SaCrCL78mj2YFpeg1Oew4QwVcBnt68KOPfL9YyoOicNs4Vuu\nfb/vjU2ONPZAeepIKA8QxCETiryCcP43daqThvIgdbUIiWne3gae6eSj0EuUPoYe\nH5g2Lw0qdwbHIOxqp2kvN96Ii7s1DK3VyhMt/GSPCxRnDRJ8oQKJ2W/I1IT5VtiU\nzMjjq5JcYzRPzHDxfVzT9CLeU/0XQ+2OOUAiZKZ0dzSyyVn8xbpviT7iadvjlQX3\nCINaPB+d2Kxa6uFWh+ZYOLLAgZ9B8NKutUHpXN66YSfe79xFBSFWKkJ8cSIMk13/\nIfs7ApKlKCCRDpwoDqx/sjIaj1cpOfLHYjnefg==\n=UZd/\n-----END PGP PUBLIC KEY BLOCK-----\n"
     },
     {