Repository: osbuild/osbuild-composer
Pull request #1146 (2021-01-05 22:54:23)

Docker-compose and Dockerfile for worker container
Adding *osbuild-composer-worker* Dockerfile (`Dockerfile-worker`) and a `docker-compose.yml` file that makes it straightforward to set up a multi-container environment.  This is a lot faster than building RPMs and installing them in VMs for when you need to do quick compile-debug cycles.

## SSL cert generation script

The biggest change to existing tools is the SSL certificate generation script: I've moved the cert generation parts from `tools/provisioning.sh` into a new file (`tools/gen-certs.sh`).  The original workflow that uses this script should be unaffected, but having the cert generation separate makes it easy to quickly create certificates and keys in any directory using the `openssl.cnf` file from any location.

## HACKING.md

I added a section to HACKING.md that explains how to get the Docker setup up and running.  The docker-compose.yml file points to the Dockerfiles directly, so running `docker-compose up` the first time will build the images as well.

## File location

I added the new docker files to the `distribution` directory because that's where the `Dockerfile-ubi` file is kept.  I was thinking it might be more appropriate to put these in the `containers` directory instead.  Any thoughts on this?

You might also notice an `.env` file that defines the project name.  For those unfamiliar with docker-compose, this affects the names of the containers, networks, and volumes that are created.  In our case, naming the project `osbuild` makes the containers have the names `osbuild_composer_1` and `osbuild_worker_1` and the network gets named `osbuild_net`.

## Other

Added `python-dnf` to the *osbuild-composer* Dockerfile (`Dockerfile-ubi`), since it's required by the `dnf-json` script.

achilleas-k: Added the gen-certs.sh to the spec file for the test package.  I think this is ready now.

Patch:
diff --git a/HACKING.md b/HACKING.md
index eaaa27b27..123a1af65 100644
--- a/HACKING.md
+++ b/HACKING.md
@@ -1,5 +1,7 @@
 # Hacking on osbuild-composer
 
+## Virtual Machine
+
 *osbuild-composer* cannot be run from the source tree, but has to be installed
 onto a system. We recommend doing this by building rpms, with:
 
@@ -42,3 +44,65 @@ For a quick compile and debug cycle, we recommend iterating code using thorough
 unit tests before going through the full workflow described above.
 
 [1]: https://wiki.qemu.org/Documentation/Networking#User_Networking_.28SLIRP.29
+
+## Containers
+
+*osbuild-composer* and *osbuild-composer-worker* can be run using Docker
+containers. Building and starting containers is generally faster than building
+RPMs and installing them in a VM, so this method is more convenient for
+developing and testing changes quickly. However, using this method has several
+downsides:
+- It doesn't build the RPMs so the `.spec` file isn't tested.
+- The environment is quite different from production (e.g., installation paths,
+  privileges and permissions).
+- The setup is not complete for all required services, so some functionality
+  isn't available for testing this way (e.g., Koji Hub and all its dependent
+  services).
+
+The containers are a good way to quickly test small changes, but before
+submitting a Pull Request, it's recommended to run through all the tests using
+the [Virtual Machine](#virtual-machine) setup described above.
+
+### Configuration
+
+Each service (*composer* and *worker*) requires a configuration file and a set
+of certificates. The storage location for these is shared between the
+containers for simplicity. By default it's configured to be at
+`./containers/config`, but this can be changed in the
+[`./distribution/.env`](./distribution/.env) file by modifying the value of the
+`$CONTAIN£R_CONFIG_DIR` variable (both absolute and relative paths work).
+
+Use the [`tools/gen-certs.sh`](./tools/gen-certs.sh) script to
+generate the certificates (using the test OpenSSL config file):
+
+    ./tools/gen-certs.sh ./test/data/x509/openssl.cnf ./containers/config  ./containers/config/ca
+
+Note that the two arguments `./containers/config` and `./containers/config/ca`
+should be the same location as the `$CONTAINER_CONFIG_DIR` described above
+
+The services also require a config file each which they expect to be in the
+same directory. The following test files can be copied into it:
+
+    cp ./test/data/composer/osbuild-composer.toml ./test/data/composer/osbuild-worker.toml ./containers/config/
+
+The `$CONTAINER_CONFIG_DIR` (default `containers/config`) directory will be mounted inside both containers (see
+the [`docker-composer.yml`](./distribution/docker-compose.yml) file).
+
+### Build and run
+
+To build the containers, change into the `distribution/` directory and run:
+
+    docker-compose build
+
+To start the containers, change into the `distribution/` directory and run:
+
+    docker-compose up
+
+You can send requests to the *osbuild-composer* container directly using the
+generated certificate and client key. For example, from the project root, run:
+
+    curl -k --cert ./containers/config/client-crt.pem --key ./containers/config/client-key.pem https://172.30.0.10:9196/api/composer-koji/v1/status
+
+To rebuild the containers after a change, add the `--build` flag to the `docker-compose` command:
+
+    docker-compose up --build
diff --git a/distribution/.env b/distribution/.env
new file mode 100644
index 000000000..4e3c577af
--- /dev/null
+++ b/distribution/.env
@@ -0,0 +1,2 @@
+COMPOSE_PROJECT_NAME=osbuild
+CONTAINER_CONFIG_DIR=../containers/config
diff --git a/distribution/Dockerfile-ubi b/distribution/Dockerfile-ubi
index 8a3bf0cf8..234ee2f20 100644
--- a/distribution/Dockerfile-ubi
+++ b/distribution/Dockerfile-ubi
@@ -4,7 +4,7 @@ ENV GOFLAGS=-mod=vendor
 RUN go install ./cmd/osbuild-composer/
 
 FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
-RUN microdnf install python3
+RUN microdnf install python3 python3-dnf
 RUN mkdir -p "/usr/libexec/osbuild-composer"
 RUN mkdir -p "/etc/osbuild-composer/"
 RUN mkdir -p "/run/osbuild-composer/"
diff --git a/distribution/Dockerfile-worker b/distribution/Dockerfile-worker
new file mode 100644
index 000000000..ee02a91de
--- /dev/null
+++ b/distribution/Dockerfile-worker
@@ -0,0 +1,15 @@
+FROM registry.access.redhat.com/ubi8/go-toolset:latest AS builder
+COPY . .
+ENV GOFLAGS=-mod=vendor
+RUN go install ./cmd/osbuild-worker
+
+FROM fedora
+RUN dnf install -y qemu-img osbuild osbuild-ostree
+RUN mkdir -p "/usr/libexec/osbuild-composer"
+RUN mkdir -p "/etc/osbuild-composer/"
+RUN mkdir -p "/run/osbuild-composer/"
+RUN mkdir -p "/var/cache/osbuild-composer/"
+RUN mkdir -p "/var/lib/osbuild-composer/"
+COPY --from=builder /opt/app-root/src/go/bin/osbuild-worker /usr/libexec/osbuild-composer/
+
+ENTRYPOINT ["/usr/libexec/osbuild-composer/osbuild-worker"]
diff --git a/distribution/docker-compose.yml b/distribution/docker-compose.yml
new file mode 100644
index 000000000..79cf838f6
--- /dev/null
+++ b/distribution/docker-compose.yml
@@ -0,0 +1,40 @@
+version: '2.4'
+services:
+  composer:
+    image: local/osbuild-composer
+    build:
+      context: ..
+      dockerfile: ./distribution/Dockerfile-ubi
+    volumes:
+      - ${CONTAINER_CONFIG_DIR}/:/etc/osbuild-composer
+    networks:
+      net:
+        ipv4_address: 172.30.0.10
+  worker:
+    image: local/osbuild-worker
+    build:
+      context: ..
+      dockerfile: ./distribution/Dockerfile-worker
+    # override the entrypoint to specify composer hostname and port
+    entrypoint: /usr/libexec/osbuild-composer/osbuild-worker composer:8700
+    volumes:
+      - ${CONTAINER_CONFIG_DIR}/:/etc/osbuild-composer
+    environment:
+      - CACHE_DIRECTORY=/var/cache/osbuild-worker
+    privileged: true
+    cap_add:
+      - MKNOD
+      - SYS_ADMIN
+      - NET_ADMIN
+    networks:
+      net:
+        ipv4_address: 172.30.0.20
+    depends_on:
+      - "composer"
+
+networks:
+  net:
+    ipam:
+      driver: default
+      config:
+        - subnet: 172.30.0.0/16
diff --git a/docs/news/unreleased/koji-manifests.md b/docs/news/unreleased/koji-manifests.md
new file mode 100644
index 000000000..a17478f96
--- /dev/null
+++ b/docs/news/unreleased/koji-manifests.md
@@ -0,0 +1,9 @@
+# Koji API: New endpoint for getting the manifests of a compose job
+
+A new endpoint is available in the Koji API: `GET /compose/{ID}/manifests`.
+Returns the manifests for a running or finished compose. Returns one manifest
+for each image in the request, in the order they were defined.
+
+Relevant PRs:
+https://github.com/osbuild/osbuild-composer/pull/1155
+https://github.com/osbuild/osbuild-composer/pull/1165
diff --git a/docs/news/unreleased/rhel84-differences-fixed.md b/docs/news/unreleased/rhel84-differences-fixed.md
new file mode 100644
index 000000000..d0141aa21
--- /dev/null
+++ b/docs/news/unreleased/rhel84-differences-fixed.md
@@ -0,0 +1,18 @@
+# RHEL 8.4: Update rhel-84 distro to better match imagefactory's qcow2
+
+There are minor discrepancies between our nightly image and the imagefactory's
+qcow2. These differences are mainly in the installed packages, enabled services,
+and disabled services. To remedy these differences the following changes have 
+been made:
+
+The following packages have been added to our qcow2 image: oddjob, 
+oddjob-mkhomedir, psmisc, authselect-compat, rng-tools, dbxtool.
+
+The following packages have been removed from our qcow2 image: 
+dnf-plugin-spacewalk, fwupd, nss, and udisks2.
+
+The following services have been enabled: rngd.service, nfs-convert.service.
+
+The following services have been removed/disabled: mdmonitor.service, 
+udisks2.service, fwupd-refresh.timer, mdcheck_continue.timer, 
+mdcheck_start.timer, and mdmonitor-oneshot.timer.
\ No newline at end of file
diff --git a/docs/news/unreleased/timedatex.md b/docs/news/unreleased/timedatex.md
new file mode 100644
index 000000000..724e7b8a8
--- /dev/null
+++ b/docs/news/unreleased/timedatex.md
@@ -0,0 +1,7 @@
+# RHEL 8.4: Include timedatex in qcow2 images
+
+Timedatex was an excluded package due to an selinux-policy issue that has been
+fixed. Therefore, timedatex should be in the qcow2 image we build. Our list of 
+excluded packages for RHEL 8.4 was not being included in our nightly builds so 
+we did not realize that timedatex was still being excluded. The issue with the 
+excluded packages is now fixed and timedatex is now removed from this list.
\ No newline at end of file
diff --git a/image-types/rhel8/amazon-ec2.md b/image-types/rhel8/amazon-ec2.md
index 5eeb2f77d..d3e2ecbac 100644
--- a/image-types/rhel8/amazon-ec2.md
+++ b/image-types/rhel8/amazon-ec2.md
@@ -23,7 +23,16 @@ package depends on it.
 `dracut-config-rescue` is excluded from the image, because the boot loader
 entry it provides is broken.
 
+The most common way to consume official Red Hat content using this type of
+image is via [Red Hat Update Infrastructure (RHUI)][rhui]. RHUI is used mostly
+for Red Hat Enterprise Linux (RHEL) content, including some of its extensions
+(e.g. for SAP). To access any more specific Red Hat content, one has to use
+[Red Hat Subscription Management (RHSM)][rhsm] ([Red Hat Satellite][satellite]
+/ Red Hat CDN).
 
 [ec2]: https://aws.amazon.com/ec2
 [guidelines]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/building-shared-amis.html
 [requirements]: https://docs.aws.amazon.com/vm-import/latest/userguide/vmie_prereqs.html
+[rhui]: https://access.redhat.com/products/red-hat-update-infrastructure/
+[rhsm]: https://access.redhat.com/products/red-hat-subscription-management
+[satellite]: https://access.redhat.com/products/red-hat-satellite/
diff --git a/image-types/rhel8/kvm-guest-image.md b/image-types/rhel8/kvm-guest-image.md
index 9ed46c8e8..eb0ac9425 100644
--- a/image-types/rhel8/kvm-guest-image.md
+++ b/image-types/rhel8/kvm-guest-image.md
@@ -1,7 +1,10 @@
 # KVM Guest Image
 
-This is an image meant to be used as a generic base image for various
-virtualization environments.
+This is an image meant to be used as a generic base image for KVM
+based hypervisors. It is mainly used with [Red Hat Virtualization
+(RHV)][rhv] or [Red Hat OpenStack Platform (RHOSP)][rhosp]. Using this
+type of image with other types of hypervisors or with cloud providers
+is not supported.
 
 To be usable in common environments, it is provided in the *qcow2* format and
 has *cloud-init* installed and enabled.
@@ -16,3 +19,12 @@ The environments this image is meant to be used in usually don't require any
 specialized firmware. Thus, in order to keep the resulting image size small,
 all `-firmware` packages are excluded. An exception is the `linux-firmware`
 package, which cannot be excluded because the `kernel` package depends on it.
+
+The most common way to consume official Red Hat content using this type of
+image is via [Red Hat Subscription Management (RHSM)][rhsm] ([Red Hat
+Satellite][satellite] / Red Hat CDN).
+
+[rhv]: https://access.redhat.com/products/red-hat-virtualization/
+[rhosp]: https://access.redhat.com/products/red-hat-openstack-platform/
+[rhsm]: https://access.redhat.com/products/red-hat-subscription-management
+[satellite]: https://access.redhat.com/products/red-hat-satellite/
diff --git a/internal/distro/rhel8/distro.go b/internal/distro/rhel8/distro.go
index b76a721ba..5b3076bfc 100644
--- a/internal/distro/rhel8/distro.go
+++ b/internal/distro/rhel8/distro.go
@@ -288,7 +288,7 @@ func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOp
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if services := c.GetServices(); services != nil || t.enabledServices != nil {
+	if services := c.GetServices(); services != nil || t.enabledServices != nil || t.disabledServices != nil || t.defaultTarget != "" {
 		p.AddStage(osbuild.NewSystemdStage(t.systemdStageOptions(t.enabledServices, t.disabledServices, services, t.defaultTarget)))
 	}
 
diff --git a/internal/distro/rhel84/distro.go b/internal/distro/rhel84/distro.go
index 6b2bff5c7..9dfc5e5a0 100644
--- a/internal/distro/rhel84/distro.go
+++ b/internal/distro/rhel84/distro.go
@@ -315,7 +315,7 @@ func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOp
 		p.AddStage(osbuild.NewUsersStage(options))
 	}
 
-	if services := c.GetServices(); services != nil || t.enabledServices != nil {
+	if services := c.GetServices(); services != nil || t.enabledServices != nil || t.disabledServices != nil || t.defaultTarget != "" {
 		p.AddStage(osbuild.NewSystemdStage(t.systemdStageOptions(t.enabledServices, t.disabledServices, services, t.defaultTarget)))
 	}
 
@@ -891,42 +891,51 @@ func New() distro.Distro {
 		mimeType: "application/x-qemu-disk",
 		packages: []string{
 			"@core",
+			"authselect-compat",
 			"chrony",
+			"cloud-init",
+			"cloud-utils-growpart",
+			"cockpit-system",
+			"cockpit-ws",
+			"dbxtool",
+			"dhcp-client",
 			"dnf",
+			"dnf-utils",
 			"dosfstools",
+			"dracut-norescue",
+			"insights-client",
 			"kernel",
-			"yum",
+			"NetworkManager",
 			"nfs-utils",
-			"dnf-utils",
-			"cloud-init",
+			"oddjob",
+			"oddjob-mkhomedir",
+			"psmisc",
 			"python3-jsonschema",
 			"qemu-guest-agent",
-			"cloud-utils-growpart",
-			"dracut-norescue",
-			"tar",
-			"tcpdump",
-			"rsync",
-			"dnf-plugin-spacewalk",
-			"NetworkManager",
-			"dhcp-client",
-			"cockpit-ws",
-			"cockpit-system",
-			"subscription-manager-cockpit",
 			"redhat-release",
 			"redhat-release-eula",
-			"insights-client",
-			// TODO: rh-amazon-rhui-client
+			"rsync",
+			"subscription-manager-cockpit",
+			"tar",
+			"tcpdump",
+			"yum",
 		},
 		excludedPackages: []string{
-			"dracut-config-rescue",
 			"aic94xx-firmware",
 			"alsa-firmware",
 			"alsa-lib",
 			"alsa-tools-firmware",
+			"biosdevname",
+			"dnf-plugin-spacewalk",
+			"dracut-config-rescue",
+			"fedora-release",
+			"fedora-repos",
 			"firewalld",
+			"fwupd",
+			"iprutils",
 			"ivtv-firmware",
-			"iwl1000-firmware",
 			"iwl100-firmware",
+			"iwl1000-firmware",
 			"iwl105-firmware",
 			"iwl135-firmware",
 			"iwl2000-firmware",
@@ -941,23 +950,20 @@ func New() distro.Distro {
 			"iwl6000g2b-firmware",
 			"iwl6050-firmware",
 			"iwl7260-firmware",
+			"langpacks-*",
+			"langpacks-en",
+			"langpacks-en",
 			"libertas-sd8686-firmware",
 			"libertas-sd8787-firmware",
 			"libertas-usb8388-firmware",
-			"langpacks-*",
-			"langpacks-en",
-			"biosdevname",
+			"nss",
 			"plymouth",
-			"iprutils",
-			"langpacks-en",
-			"fedora-release",
-			"fedora-repos",
-			"rng-tools",
-
-			// TODO setfiles failes because of usr/sbin/timedatex. Exlude until
-			// https://errata.devel.redhat.com/advisory/47339 lands
-			"timedatex",
+			"udisks2",
 		},
+		enabledServices: []string{
+			"rngd.service",
+		},
+		defaultTarget:           "multi-user.target",
 		kernelOptions:           "console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto",
 		bootable:                true,
 		defaultSize:             10 * GigaByte,
diff --git a/internal/jobqueue/fsjobqueue/fsjobqueue.go b/internal/jobqueue/fsjobqueue/fsjobqueue.go
index 0ef3b4c35..d98171044 100644
--- a/internal/jobqueue/fsjobqueue/fsjobqueue.go
+++ b/internal/jobqueue/fsjobqueue/fsjobqueue.go
@@ -287,6 +287,19 @@ func (q *fsJobQueue) JobStatus(id uuid.UUID) (result json.RawMessage, queued, st
 	return
 }
 
+func (q *fsJobQueue) Job(id uuid.UUID) (jobType string, args json.RawMessage, dependencies []uuid.UUID, err error) {
+	j, err := q.readJob(id)
+	if err != nil {
+		return
+	}
+
+	jobType = j.Type
+	args = j.Args
+	dependencies = j.Dependencies
+
+	return
+}
+
 // Reads job with `id`. This is a thin wrapper around `q.db.Read`, which
 // returns the job directly, or and error if a job with `id` does not exist.
 func (q *fsJobQueue) readJob(id uuid.UUID) (*job, error) {
diff --git a/internal/jobqueue/jobqueue.go b/internal/jobqueue/jobqueue.go
index d95533aa2..6330930b6 100644
--- a/internal/jobqueue/jobqueue.go
+++ b/internal/jobqueue/jobqueue.go
@@ -59,6 +59,9 @@ type JobQueue interface {
 	//
 	// Lastly, the IDs of the jobs dependencies are returned.
 	JobStatus(id uuid.UUID) (result json.RawMessage, queued, started, finished time.Time, canceled bool, deps []uuid.UUID, err error)
+
+	// Job returns all the parameters that define a job (everything provided during Enqueue).
+	Job(id uuid.UUID) (jobType string, args json.RawMessage, dependencies []uuid.UUID, err error)
 }
 
 var (
diff --git a/internal/kojiapi/api/api.gen.go b/internal/kojiapi/api/api.gen.go
index 0cbe1d95c..a28da21c4 100644
--- a/internal/kojiapi/api/api.gen.go
+++ b/internal/kojiapi/api/api.gen.go
@@ -87,6 +87,9 @@ type ServerInterface interface {
 	// Get logs for a compose.
 	// (GET /compose/{id}/logs)
 	GetComposeIdLogs(ctx echo.Context, id string) error
+	// Get the manifests for a compose.
+	// (GET /compose/{id}/manifests)
+	GetComposeIdManifests(ctx echo.Context, id string) error
 	// status
 	// (GET /status)
 	GetStatus(ctx echo.Context) error
@@ -138,6 +141,22 @@ func (w *ServerInterfaceWrapper) GetComposeIdLogs(ctx echo.Context) error {
 	return err
 }
 
+// GetComposeIdManifests converts echo context to params.
+func (w *ServerInterfaceWrapper) GetComposeIdManifests(ctx echo.Context) error {
+	var err error
+	// ------------- Path parameter "id" -------------
+	var id string
+
+	err = runtime.BindStyledParameter("simple", false, "id", ctx.Param("id"), &id)
+	if err != nil {
+		return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err))
+	}
+
+	// Invoke the callback with all the unmarshalled arguments
+	err = w.Handler.GetComposeIdManifests(ctx, id)
+	return err
+}
+
 // GetStatus converts echo context to params.
 func (w *ServerInterfaceWrapper) GetStatus(ctx echo.Context) error {
 	var err error
@@ -172,6 +191,7 @@ func RegisterHandlers(router EchoRouter, si ServerInterface) {
 	router.POST("/compose", wrapper.PostCompose)
 	router.GET("/compose/:id", wrapper.GetComposeId)
 	router.GET("/compose/:id/logs", wrapper.GetComposeIdLogs)
+	router.GET("/compose/:id/manifests", wrapper.GetComposeIdManifests)
 	router.GET("/status", wrapper.GetStatus)
 
 }
diff --git a/internal/kojiapi/api/openapi.yml b/internal/kojiapi/api/openapi.yml
index 923fd7d4d..4476d2241 100644
--- a/internal/kojiapi/api/openapi.yml
+++ b/internal/kojiapi/api/openapi.yml
@@ -87,6 +87,36 @@ paths:
             text/plain:
               schema:
                 type: string
+  '/compose/{id}/manifests':
+    get:
+      summary: Get the manifests for a compose.
+      parameters:
+        - in: path
+          name: id
+          schema:
+            type: string
+            format: uuid
+            example: 123e4567-e89b-12d3-a456-426655440000
+          required: true
+          description: ID of compose status to get
+      description: 'Get the manifests of a running or finished compose. Returns one manifest for each image in the request. Each manifest conforms to the format defined at https://www.osbuild.org/man/osbuild-manifest.5'
+      responses:
+        '200':
+          description: The manifest for the given compose.
+          content:
+            application/json:
+        '400':
+          description: Invalid compose id
+          content:
+            text/plain:
+              schema:
+                type: string
+        '404':
+          description: Unknown compose id
+          content:
+            text/plain:
+              schema:
+                type: string
   /compose:
     post:
       summary: Create compose
diff --git a/internal/kojiapi/server.go b/internal/kojiapi/server.go
index daec0f280..a7b2c5089 100644
--- a/internal/kojiapi/server.go
+++ b/internal/kojiapi/server.go
@@ -155,7 +155,7 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
 		Release: request.Release,
 	})
 	if err != nil {
-		// This is a programming errror.
+		// This is a programming error.
 		panic(err)
 	}
 
@@ -169,7 +169,7 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
 			KojiFilename:  kojiFilenames[i],
 		}, initID)
 		if err != nil {
-			// This is a programming errror.
+			// This is a programming error.
 			panic(err)
 		}
 		buildIDs = append(buildIDs, id)
@@ -186,7 +186,7 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error {
 		StartTime:     uint64(time.Now().Unix()),
 	}, initID, buildIDs)
 	if err != nil {
-		// This is a programming errror.
+		// This is a programming error.
 		panic(err)
 	}
 
@@ -295,12 +295,21 @@ func (h *apiHandlers) GetComposeId(ctx echo.Context, idstr string) error {
 		return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err))
 	}
 
+	// Make sure id exists and matches a FinalizeJob
+	if _, _, err := h.getFinalizeJob(id); err != nil {
+		return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Job %s not found: %s", idstr, err))
+	}
+
 	var finalizeResult worker.KojiFinalizeJobResult
 	finalizeStatus, deps, err := h.server.workers.JobStatus(id, &finalizeResult)
 	if err != nil {
-		return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Job %s not found: %s", idstr, err))
+		return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Job %s not found: %s", idstr, err))
 	}
 
+	// Make sure deps[0] matches a KojiInitJob
+	if _, err := h.getInitJob(deps[0]); err != nil {
+		panic(err)
+	}
 	var initResult worker.KojiInitJobResult
 	_, _, err = h.server.workers.JobStatus(deps[0], &initResult)
 	if err != nil {
@@ -311,6 +320,10 @@ func (h *apiHandlers) GetComposeId(ctx echo.Context, idstr string) error {
 	var buildResults []worker.OSBuildKojiJobResult
 	var imageStatuses []api.ImageStatus
 	for i := 1; i < len(deps); i++ {
+		// Make sure deps[i] matches an OSBuildKojiJob
+		if _, _, err := h.getBuildJob(deps[i]); err != nil {
+			panic(err)
+		}
 		var buildResult worker.OSBuildKojiJobResult
 		jobStatus, _, err := h.server.workers.JobStatus(deps[i], &buildResult)
 		if err != nil {
@@ -348,21 +361,35 @@ func (h *apiHandlers) GetComposeIdLogs(ctx echo.Context, idstr string) error {
 		return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err))
 	}
 
+	// Make sure id exists and matches a FinalizeJob
+	if _, _, err := h.getFinalizeJob(id); err != nil {
+		return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Job %s not found: %s", idstr, err))
+	}
+
 	var finalizeResult worker.KojiFinalizeJobResult
 	_, deps, err := h.server.workers.JobStatus(id, &finalizeResult)
 	if err != nil {
 		return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Job %s not found: %s", idstr, err))
 	}
 
+	// Make sure deps[0] matches a KojiInitJob
+	if _, err := h.getInitJob(deps[0]); err != nil {
+		panic(err)
+	}
+
 	var initResult worker.KojiInitJobResult
 	_, _, err = h.server.workers.JobStatus(deps[0], &initResult)
 	if err != nil {
-		// This is a programming errror.
+		// This is a programming error.
 		panic(err)
 	}
 
 	var buildResults []interface{}
 	for i := 1; i < len(deps); i++ {
+		// Make sure deps[i] matches an OSBuildKojiJob
+		if _, _, err := h.getBuildJob(deps[i]); err != nil {
+			panic(err)
+		}
 		var buildResult worker.OSBuildJobResult
 		_, _, err = h.server.workers.JobStatus(deps[i], &buildResult)
 		if err != nil {
@@ -384,6 +411,78 @@ func (h *apiHandlers) GetComposeIdLogs(ctx echo.Context, idstr string) error {
 	return ctx.JSON(http.StatusOK, response)
 }
 
+// getFinalizeJob retrieves a KojiFinalizeJob and the IDs of its dependencies
+// from the job queue given its ID.  It returns an error if the ID matches a
+// job of a different type.
+func (h *apiHandlers) getFinalizeJob(id uuid.UUID) (*worker.KojiFinalizeJob, []uuid.UUID, error) {
+	job := new(worker.KojiFinalizeJob)
+	jobType, _, deps, err := h.server.workers.Job(id, job)
+	if err != nil {
+		return nil, nil, err
+	}
+	expType := "koji-finalize"
+	if jobType != expType {
+		return nil, nil, fmt.Errorf("expected %q, found %q job instead", expType, jobType)
+	}
+	return job, deps, err
+}
+
+// getInitJob retrieves a KojiInitJob from the job queue given its ID.
+// It returns an error if the ID matches a job of a different type.
+func (h *apiHandlers) getInitJob(id uuid.UUID) (*worker.KojiInitJob, error) {
+	job := new(worker.KojiInitJob)
+	jobType, _, _, err := h.server.workers.Job(id, job)
+	if err != nil {
+		return nil, err
+	}
+	expType := "koji-init"
+	if jobType != expType {
+		return nil, fmt.Errorf("expected %q, found %q job instead", expType, jobType)
+	}
+	return job, err
+}
+
+// getBuildJob retrieves a OSBuildKojiJob and the IDs of its dependencies from
+// the job queue given its ID.  It returns an error if the ID matches a job of
+// a different type.
+func (h *apiHandlers) getBuildJob(id uuid.UUID) (*worker.OSBuildKojiJob, []uuid.UUID, error) {
+	job := new(worker.OSBuildKojiJob)
+	jobType, _, deps, err := h.server.workers.Job(id, job)
+	if err != nil {
+		return nil, nil, err
+	}
+	expType := "osbuild-koji"
+	if !strings.HasPrefix(jobType, expType) { // Build jobs get automatic arch suffix: Check prefix
+		return nil, nil, fmt.Errorf("expected %q, found %q job instead", expType, jobType)
+	}
+	return job, deps, nil
+}
+
+// GetComposeIdManifests returns the Manifests for a given Compose (one for each image).
+func (h *apiHandlers) GetComposeIdManifests(ctx echo.Context, idstr string) error {
+	id, err := uuid.Parse(idstr)
+	if err != nil {
+		return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err))
+	}
+
+	_, deps, err := h.getFinalizeJob(id)
+	if err != nil {
+		return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Job %s not found: %s", idstr, err))
+	}
+
+	manifests := make([]distro.Manifest, len(deps)-1)
+	for i, id := range deps[1:] {
+		buildJob, _, err := h.getBuildJob(id)
+		if err != nil {
+			// This is a programming error.
+			panic(err)
+		}
+		manifests[i] = buildJob.Manifest
+	}
+
+	return ctx.JSON(http.StatusOK, manifests)
+}
+
 // A simple echo.Binder(), which only accepts application/json, but is more
 // strict than echo's DefaultBinder. It does not handle binding query
 // parameters either.
diff --git a/internal/upload/awsupload/awsupload.go b/internal/upload/awsupload/awsupload.go
index 78f9910e9..cd8c60df9 100644
--- a/internal/upload/awsupload/awsupload.go
+++ b/internal/upload/awsupload/awsupload.go
@@ -243,6 +243,23 @@ func (a *AWS) Register(name, bucket, key string, shareWith []string, rpmArch str
 
 	log.Printf("[AWS] 🎉 AMI registered: %s", *registerOutput.ImageId)
 
+	// Tag the image with the image name.
+	req, _ = a.ec2.CreateTagsRequest(
+		&ec2.CreateTagsInput{
+			Resources: []*string{registerOutput.ImageId},
+			Tags: []*ec2.Tag{
+				{
+					Key:   aws.String("Name"),
+					Value: aws.String(name),
+				},
+			},
+		},
+	)
+	err = req.Send()
+	if err != nil {
+		return nil, err
+	}
+
 	if len(shareWith) > 0 {
 		log.Println("[AWS] 💿 Sharing ec2 AMI")
 		var launchPerms []*ec2.LaunchPermission
diff --git a/internal/weldr/api.go b/internal/weldr/api.go
index cbbfd2062..166a86661 100644
--- a/internal/weldr/api.go
+++ b/internal/weldr/api.go
@@ -666,6 +666,19 @@ func (api *API) sourceNewHandler(writer http.ResponseWriter, request *http.Reque
 		return
 	}
 
+	// Is there an existing System Repo using this id?
+	for _, n := range api.systemRepoNames() {
+		if n == source.GetKey() {
+			// Users cannot replace system repos
+			errors := responseError{
+				ID:  "SystemSource",
+				Msg: fmt.Sprintf("%s is a system source, it cannot be changed.", source.GetKey()),
+			}
+			statusResponseError(writer, http.StatusBadRequest, errors)
+			return
+		}
+	}
+
 	api.store.PushSource(source.GetKey(), source.SourceConfig())
 
 	statusResponseOK(writer)
diff --git a/internal/worker/server.go b/internal/worker/server.go
index 665d06c1a..727de708a 100644
--- a/internal/worker/server.go
+++ b/internal/worker/server.go
@@ -121,6 +121,20 @@ func (s *Server) JobStatus(id uuid.UUID, result interface{}) (*JobStatus, []uuid
 	}, deps, nil
 }
 
+// Job provides access to all the parameters of a job.
+func (s *Server) Job(id uuid.UUID, job interface{}) (string, json.RawMessage, []uuid.UUID, error) {
+	jobType, rawArgs, deps, err := s.jobs.Job(id)
+	if err != nil {
+		return "", nil, nil, err
+	}
+
+	if err := json.Unmarshal(rawArgs, job); err != nil {
+		return "", nil, nil, fmt.Errorf("error unmarshaling arguments for job '%s': %v", id, err)
+	}
+
+	return jobType, rawArgs, deps, nil
+}
+
 func (s *Server) Cancel(id uuid.UUID) error {
 	return s.jobs.CancelJob(id)
 }
diff --git a/osbuild-composer.spec b/osbuild-composer.spec
index c56403de5..87aef2ae3 100644
--- a/osbuild-composer.spec
+++ b/osbuild-composer.spec
@@ -179,6 +179,7 @@ install -m 0755 -vp _bin/osbuild-auth-tests                     %{buildroot}%{_l
 install -m 0755 -vp _bin/osbuild-koji-tests                     %{buildroot}%{_libexecdir}/osbuild-composer-test/
 install -m 0755 -vp _bin/cloud-cleaner                          %{buildroot}%{_libexecdir}/osbuild-composer-test/
 install -m 0755 -vp tools/provision.sh                          %{buildroot}%{_libexecdir}/osbuild-composer-test/
+install -m 0755 -vp tools/gen-certs.sh                          %{buildroot}%{_libexecdir}/osbuild-composer-test/
 install -m 0755 -vp tools/image-info                            %{buildroot}%{_libexecdir}/osbuild-composer-test/
 install -m 0755 -vp tools/run-koji-container.sh                 %{buildroot}%{_libexecdir}/osbuild-composer-test/
 install -m 0755 -vp tools/koji-compose.py                       %{buildroot}%{_libexecdir}/osbuild-composer-test/
diff --git a/schutzbot/Jenkinsfile b/schutzbot/Jenkinsfile
index 4d5c9b326..b6eb759a8 100644
--- a/schutzbot/Jenkinsfile
+++ b/schutzbot/Jenkinsfile
@@ -11,7 +11,7 @@ pipeline {
         ansiColor('xterm')
         // Cancel the pipeline if it runs for more than three hours.
         timeout(
-            time: 3,
+            time: 12,
             unit: "HOURS"
         )
     }
diff --git a/tools/gen-certs.sh b/tools/gen-certs.sh
new file mode 100755
index 000000000..c60327990
--- /dev/null
+++ b/tools/gen-certs.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+if (( $# != 3 )); then
+    echo "Usage: $0 <openssl-config> <certdir> <cadir>"
+    echo
+    echo "Positional arguments"
+    echo "  <openssl-config>  OpenSSL configuration file"
+    echo "  <certdir>         Destination directory for the generated files"
+    echo "  <cadir>           Working directory for the generation process"
+    exit 1
+fi
+
+set -euxo pipefail
+# Generate all X.509 certificates for the tests
+# The whole generation is done in a $CADIR to better represent how osbuild-ca
+# it.
+OPENSSL_CONFIG="$1"
+CERTDIR="$2"
+CADIR="$3"
+
+# The $CADIR might exist from a previous test (current Schutzbot's imperfection)
+rm -rf "$CADIR" || true
+mkdir -p "$CADIR" "$CERTDIR"
+
+# Convert the arguments to real paths so we can safely change working directory
+OPENSSL_CONFIG="$(realpath "${OPENSSL_CONFIG}")"
+CERTDIR="$(realpath "${CERTDIR}")"
+CADIR="$(realpath "${CADIR}")"
+
+pushd "$CADIR"
+    mkdir certs private
+    touch index.txt
+
+    # Generate a CA.
+    openssl req -config "$OPENSSL_CONFIG" \
+        -keyout private/ca.key.pem \
+        -new -nodes -x509 -extensions osbuild_ca_ext \
+        -out ca.cert.pem -subj "/CN=osbuild.org"
+
+    # Copy the private key to the location expected by the tests
+    cp ca.cert.pem "$CERTDIR"/ca-crt.pem
+
+    # Generate a composer certificate.
+    openssl req -config "$OPENSSL_CONFIG" \
+        -keyout "$CERTDIR"/composer-key.pem \
+        -new -nodes \
+        -out /tmp/composer-csr.pem \
+        -subj "/CN=localhost/emailAddress=osbuild@example.com" \
+        -addext "subjectAltName=DNS:localhost, DNS:composer"
+
+    openssl ca -batch -config "$OPENSSL_CONFIG" \
+        -extensions osbuild_server_ext \
+        -in /tmp/composer-csr.pem \
+        -out "$CERTDIR"/composer-crt.pem
+
+    # Generate a worker certificate.
+    openssl req -config "$OPENSSL_CONFIG" \
+        -keyout "$CERTDIR"/worker-key.pem \
+        -new -nodes \
+        -out /tmp/worker-csr.pem \
+        -subj "/CN=localhost/emailAddress=osbuild@example.com" \
+        -addext "subjectAltName=DNS:localhost, DNS:worker"
+
+    openssl ca -batch -config "$OPENSSL_CONFIG" \
+        -extensions osbuild_client_ext \
+        -in /tmp/worker-csr.pem \
+        -out "$CERTDIR"/worker-crt.pem
+
+    # Generate a client certificate.
+    openssl req -config "$OPENSSL_CONFIG" \
+        -keyout "$CERTDIR"/client-key.pem \
+        -new -nodes \
+        -out /tmp/client-csr.pem \
+        -subj "/CN=client.osbuild.org/emailAddress=osbuild@example.com" \
+        -addext "subjectAltName=DNS:client.osbuild.org"
+
+    openssl ca -batch -config "$OPENSSL_CONFIG" \
+        -extensions osbuild_client_ext \
+        -in /tmp/client-csr.pem \
+        -out "$CERTDIR"/client-crt.pem
+
+    # Client keys are used by tests to access the composer APIs. Allow all users access.
+    chmod 644 "$CERTDIR"/client-key.pem
+
+    # Generate a kojihub certificate.
+    openssl req -config "$OPENSSL_CONFIG" \
+        -keyout "$CERTDIR"/kojihub-key.pem \
+        -new -nodes \
+        -out /tmp/kojihub-csr.pem \
+        -subj "/CN=localhost/emailAddress=osbuild@example.com" \
+        -addext "subjectAltName=DNS:localhost"
+
+    openssl ca -batch -config "$OPENSSL_CONFIG" \
+        -extensions osbuild_server_ext \
+        -in /tmp/kojihub-csr.pem \
+        -out "$CERTDIR"/kojihub-crt.pem
+
+popd
diff --git a/tools/image-info b/tools/image-info
index 8d682d3f3..cb4e548be 100755
--- a/tools/image-info
+++ b/tools/image-info
@@ -269,6 +269,10 @@ def read_services(tree, state):
     return subprocess_check_output(["systemctl", f"--root={tree}", "list-unit-files"], (lambda s: parse_unit_files(s, state)))
 
 
+def read_default_target(tree):
+    return subprocess_check_output(["systemctl", f"--root={tree}", "get-default"]).rstrip()
+
+
 def read_firewall_zone(tree):
     try:
         with open(f"{tree}/etc/firewalld/firewalld.conf") as f:
@@ -309,6 +313,10 @@ def append_filesystem(report, tree, *, is_ostree=False):
         report["services-enabled"] = read_services(tree, "enabled")
         report["services-disabled"] = read_services(tree, "disabled")
 
+        default_target = read_default_target(tree)
+        if default_target:
+            report["default-target"] = default_target
+
         with contextlib.suppress(FileNotFoundError):
             with open(f"{tree}/etc/hostname") as f:
                 report["hostname"] = f.read().strip()
diff --git a/tools/provision.sh b/tools/provision.sh
index f90f2419e..1ed1e4478 100755
--- a/tools/provision.sh
+++ b/tools/provision.sh
@@ -37,81 +37,9 @@ CERTDIR=/etc/osbuild-composer
 OPENSSL_CONFIG=/usr/share/tests/osbuild-composer/x509/openssl.cnf
 CADIR=/etc/osbuild-composer-test/ca
 
-# The $CADIR might exist from a previous test (current Schutzbot's imperfection)
-sudo rm -rf $CADIR || true
-sudo mkdir -p $CADIR
-
-pushd $CADIR
-    sudo mkdir certs private
-    sudo touch index.txt
-
-    # Generate a CA.
-    sudo openssl req -config $OPENSSL_CONFIG \
-        -keyout private/ca.key.pem \
-        -new -nodes -x509 -extensions osbuild_ca_ext \
-        -out ca.cert.pem -subj "/CN=osbuild.org"
-
-    # Copy the private key to the location expected by the tests
-    sudo cp ca.cert.pem "$CERTDIR"/ca-crt.pem
-
-    # Generate a composer certificate.
-    sudo openssl req -config $OPENSSL_CONFIG \
-        -keyout "$CERTDIR"/composer-key.pem \
-        -new -nodes \
-        -out /tmp/composer-csr.pem \
-        -subj "/CN=localhost/emailAddress=osbuild@example.com" \
-        -addext "subjectAltName=DNS:localhost"
-
-    sudo openssl ca -batch -config $OPENSSL_CONFIG \
-        -extensions osbuild_server_ext \
-        -in /tmp/composer-csr.pem \
-        -out "$CERTDIR"/composer-crt.pem
-
-    sudo chown _osbuild-composer "$CERTDIR"/composer-*.pem
-
-    # Generate a worker certificate.
-    sudo openssl req -config $OPENSSL_CONFIG \
-        -keyout "$CERTDIR"/worker-key.pem \
-        -new -nodes \
-        -out /tmp/worker-csr.pem \
-        -subj "/CN=localhost/emailAddress=osbuild@example.com" \
-        -addext "subjectAltName=DNS:localhost"
-
-    sudo openssl ca -batch -config $OPENSSL_CONFIG \
-        -extensions osbuild_client_ext \
-        -in /tmp/worker-csr.pem \
-        -out "$CERTDIR"/worker-crt.pem
-
-    # Generate a client certificate.
-    sudo openssl req -config $OPENSSL_CONFIG \
-        -keyout "$CERTDIR"/client-key.pem \
-        -new -nodes \
-        -out /tmp/client-csr.pem \
-        -subj "/CN=client.osbuild.org/emailAddress=osbuild@example.com" \
-        -addext "subjectAltName=DNS:client.osbuild.org"
-
-    sudo openssl ca -batch -config $OPENSSL_CONFIG \
-        -extensions osbuild_client_ext \
-        -in /tmp/client-csr.pem \
-        -out "$CERTDIR"/client-crt.pem
-
-    # Client keys are used by tests to access the composer APIs. Allow all users access.
-    sudo chmod 644 "$CERTDIR"/client-key.pem
-
-    # Generate a kojihub certificate.
-    sudo openssl req -config $OPENSSL_CONFIG \
-        -keyout "$CERTDIR"/kojihub-key.pem \
-        -new -nodes \
-        -out /tmp/kojihub-csr.pem \
-        -subj "/CN=localhost/emailAddress=osbuild@example.com" \
-        -addext "subjectAltName=DNS:localhost"
-
-    sudo openssl ca -batch -config $OPENSSL_CONFIG \
-        -extensions osbuild_server_ext \
-        -in /tmp/kojihub-csr.pem \
-        -out "$CERTDIR"/kojihub-crt.pem
-
-popd
+scriptloc=$(dirname "$0")
+sudo "${scriptloc}/gen-certs.sh" "${OPENSSL_CONFIG}" "${CERTDIR}" "${CADIR}"
+sudo chown _osbuild-composer "${CERTDIR}"/composer-*.pem
 
 sudo systemctl start osbuild-remote-worker.socket
 sudo systemctl start osbuild-composer.socket


Test patch:
diff --git a/internal/client/source_test.go b/internal/client/source_test.go
index 8d26101ad..0040ae397 100644
--- a/internal/client/source_test.go
+++ b/internal/client/source_test.go
@@ -9,6 +9,7 @@
 package client
 
 import (
+	"fmt"
 	"strings"
 	"testing"
 
@@ -88,6 +89,73 @@ func TestPOSTInvalidJSONSourceV1(t *testing.T) {
 	require.False(t, resp.Status, "did not return an error")
 }
 
+// POST a JSON system source using V0 API
+func TestPOSTSystemJSONSourceV0(t *testing.T) {
+	sources_list, api, err := ListSourcesV0(testState.socket)
+	require.NoError(t, err, "GET source failed with a client error")
+	require.Nil(t, api, "ListSources failed: %#v", api)
+
+	// Cannot override system sources
+	source := `{
+		"name": "REPO-NAME",
+		"url": "file://REPO-PATH",
+		"type": "yum-baseurl",
+		"proxy": "https://proxy-url/",
+		"check_ssl": true,
+		"check_gpg": true,
+		"gpgkey_urls": ["https://url/path/to/gpg-key"]
+	}`
+
+	for _, repoName := range []string{"test-system-repo", "fedora", "baseos"} {
+		// skip repository names which are not present b/c this test can be
+		// executed both as a unit test and as an integration test
+		if !Include(sources_list, repoName) {
+			continue
+		}
+		useSource := strings.Replace(source, "REPO-NAME", repoName, 1)
+
+		resp, err := PostJSONSourceV0(testState.socket, useSource)
+		require.NoError(t, err, "POST source failed with a client error")
+		require.False(t, resp.Status, "did not return an error")
+		msg := fmt.Sprintf("%s is a system source, it cannot be changed.", repoName)
+		require.Equal(t, APIErrorMsg{ID: "SystemSource", Msg: msg}, resp.Errors[0])
+	}
+}
+
+// POST a JSON system source using V1 API
+func TestPOSTSystemJSONSourceV1(t *testing.T) {
+	sources_list, api, err := ListSourcesV1(testState.socket)
+	require.NoError(t, err, "GET source failed with a client error")
+	require.Nil(t, api, "ListSources failed: %#v", api)
+
+	// Cannot override system sources
+	source := `{
+        "id": "REPO-NAME",
+		"name": "json package system repo",
+		"url": "file://REPO-PATH",
+		"type": "yum-baseurl",
+		"proxy": "https://proxy-url/",
+		"check_ssl": true,
+		"check_gpg": true,
+		"gpgkey_urls": ["https://url/path/to/gpg-key"]
+	}`
+
+	for _, repoName := range []string{"test-system-repo", "fedora", "baseos"} {
+		// skip repository names which are not present b/c this test can be
+		// executed both as a unit test and as an integration test
+		if !Include(sources_list, repoName) {
+			continue
+		}
+		useSource := strings.Replace(source, "REPO-NAME", repoName, 1)
+
+		resp, err := PostJSONSourceV1(testState.socket, useSource)
+		require.NoError(t, err, "POST source failed with a client error")
+		require.False(t, resp.Status, "did not return an error")
+		msg := fmt.Sprintf("%s is a system source, it cannot be changed.", repoName)
+		require.Equal(t, APIErrorMsg{ID: "SystemSource", Msg: msg}, resp.Errors[0])
+	}
+}
+
 // POST a new TOML source using V0 API
 func TestPOSTTOMLSourceV0(t *testing.T) {
 	source := `
@@ -223,6 +291,71 @@ func TestPOSTWrongTOMLSourceV1(t *testing.T) {
 	require.False(t, resp.Status, "did not return an error")
 }
 
+// POST a TOML system source using V0 API
+func TestPOSTTOMLSystemSourceV0(t *testing.T) {
+	sources_list, api, err := ListSourcesV0(testState.socket)
+	require.NoError(t, err, "GET source failed with a client error")
+	require.Nil(t, api, "ListSources failed: %#v", api)
+
+	source := `
+		name = "REPO-NAME"
+		url = "file://REPO-PATH"
+		type = "yum-baseurl"
+		proxy = "https://proxy-url/"
+		check_ssl = true
+		check_gpg = true
+		gpgkey_urls = ["https://url/path/to/gpg-key"]
+	`
+	source = strings.Replace(source, "REPO-PATH", testState.repoDir, 1)
+	for _, repoName := range []string{"test-system-repo", "fedora", "baseos"} {
+		// skip repository names which are not present b/c this test can be
+		// executed both as a unit test and as an integration test
+		if !Include(sources_list, repoName) {
+			continue
+		}
+		useSource := strings.Replace(source, "REPO-NAME", repoName, 1)
+
+		resp, err := PostTOMLSourceV0(testState.socket, useSource)
+		require.NoError(t, err, "POST source failed with a client error")
+		require.False(t, resp.Status, "did not return an error")
+		msg := fmt.Sprintf("%s is a system source, it cannot be changed.", repoName)
+		require.Equal(t, APIErrorMsg{ID: "SystemSource", Msg: msg}, resp.Errors[0])
+	}
+}
+
+// POST a new TOML system source using V1 API
+func TestPOSTTOMLSystemSourceV1(t *testing.T) {
+	sources_list, api, err := ListSourcesV1(testState.socket)
+	require.NoError(t, err, "GET source failed with a client error")
+	require.Nil(t, api, "ListSources failed: %#v", api)
+
+	source := `
+		id = "REPO-NAME"
+		name = "toml package repo"
+		url = "file://REPO-PATH"
+		type = "yum-baseurl"
+		proxy = "https://proxy-url/"
+		check_ssl = true
+		check_gpg = true
+		gpgkey_urls = ["https://url/path/to/gpg-key"]
+	`
+	source = strings.Replace(source, "REPO-PATH", testState.repoDir, 1)
+	for _, repoName := range []string{"test-system-repo", "fedora", "baseos"} {
+		// skip repository names which are not present b/c this test can be
+		// executed both as a unit test and as an integration test
+		if !Include(sources_list, repoName) {
+			continue
+		}
+		useSource := strings.Replace(source, "REPO-NAME", repoName, 1)
+
+		resp, err := PostTOMLSourceV1(testState.socket, useSource)
+		require.NoError(t, err, "POST source failed with a client error")
+		require.False(t, resp.Status, "did not return an error")
+		msg := fmt.Sprintf("%s is a system source, it cannot be changed.", repoName)
+		require.Equal(t, APIErrorMsg{ID: "SystemSource", Msg: msg}, resp.Errors[0])
+	}
+}
+
 // list sources using the v0 API
 func TestListSourcesV0(t *testing.T) {
 	sources := []string{`{
diff --git a/internal/jobqueue/fsjobqueue/fsjobqueue_test.go b/internal/jobqueue/fsjobqueue/fsjobqueue_test.go
index 114e9735d..1348e4252 100644
--- a/internal/jobqueue/fsjobqueue/fsjobqueue_test.go
+++ b/internal/jobqueue/fsjobqueue/fsjobqueue_test.go
@@ -103,6 +103,13 @@ func TestArgs(t *testing.T) {
 	require.NoError(t, err)
 	require.Equal(t, twoargs, parsedArgs)
 
+	// Read job params after Dequeue
+	jtype, jargs, jdeps, err := q.Job(id)
+	require.NoError(t, err)
+	require.Equal(t, args, jargs)
+	require.Equal(t, deps, jdeps)
+	require.Equal(t, typ, jtype)
+
 	id, deps, typ, args, err = q.Dequeue(context.Background(), []string{"fish"})
 	require.NoError(t, err)
 	require.Equal(t, one, id)
@@ -111,6 +118,15 @@ func TestArgs(t *testing.T) {
 	err = json.Unmarshal(args, &parsedArgs)
 	require.NoError(t, err)
 	require.Equal(t, oneargs, parsedArgs)
+
+	jtype, jargs, jdeps, err = q.Job(id)
+	require.NoError(t, err)
+	require.Equal(t, args, jargs)
+	require.Equal(t, deps, jdeps)
+	require.Equal(t, typ, jtype)
+
+	_, _, _, err = q.Job(uuid.New())
+	require.Error(t, err)
 }
 
 func TestJobTypes(t *testing.T) {
diff --git a/internal/kojiapi/server_test.go b/internal/kojiapi/server_test.go
index 1f5ac9c07..bfeae4e8f 100644
--- a/internal/kojiapi/server_test.go
+++ b/internal/kojiapi/server_test.go
@@ -11,7 +11,9 @@ import (
 	"os"
 	"sync"
 	"testing"
+	"time"
 
+	"github.com/google/uuid"
 	"github.com/osbuild/osbuild-composer/internal/kojiapi"
 	"github.com/osbuild/osbuild-composer/internal/kojiapi/api"
 	distro_mock "github.com/osbuild/osbuild-composer/internal/mocks/distro"
@@ -338,6 +340,8 @@ func TestCompose(t *testing.T) {
 		test.TestRoute(t, workerHandler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%v", token), string(finalizeResult), http.StatusOK, `{}`)
 
 		test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%v", finalizeID), ``, http.StatusOK, c.composeStatus)
+
+		test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%v/manifests", finalizeID), ``, http.StatusOK, `[{"pipeline": {}, "sources": {}}, {"pipeline": {}, "sources": {}}]`)
 	}
 }
 
@@ -374,3 +378,82 @@ func TestRequest(t *testing.T) {
 	require.NoError(t, err)
 	require.Equal(t, http.StatusBadRequest, resp.StatusCode)
 }
+
+func TestJobTypeValidation(t *testing.T) {
+	dir, err := ioutil.TempDir("", "osbuild-composer-test-kojiapi-")
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer os.RemoveAll(dir)
+
+	server, workers := newTestKojiServer(t, dir)
+	handler := server.Handler("/api/composer-koji/v1")
+
+	// Enqueue a compose job with N images (+ an Init and a Finalize job)
+	// Enqueuing them manually gives us access to the job IDs to use in
+	// requests.
+	nImages := 4
+	initJob := worker.KojiInitJob{
+		Server:  "test-server",
+		Name:    "test-job",
+		Version: "42",
+		Release: "1",
+	}
+	initID, err := workers.EnqueueKojiInit(&initJob)
+	require.NoError(t, err)
+
+	buildJobs := make([]worker.OSBuildKojiJob, nImages)
+	buildJobIDs := make([]uuid.UUID, nImages)
+	filenames := make([]string, nImages)
+	for idx := 0; idx < nImages; idx++ {
+		fname := fmt.Sprintf("image-file-%04d", idx)
+		buildJob := worker.OSBuildKojiJob{
+			ImageName:     fmt.Sprintf("build-job-%04d", idx),
+			KojiServer:    "test-server",
+			KojiDirectory: "koji-server-test-dir",
+			KojiFilename:  fname,
+		}
+		buildID, err := workers.EnqueueOSBuildKoji(fmt.Sprintf("fake-arch-%d", idx), &buildJob, initID)
+		require.NoError(t, err)
+
+		buildJobs[idx] = buildJob
+		buildJobIDs[idx] = buildID
+		filenames[idx] = fname
+	}
+
+	finalizeJob := worker.KojiFinalizeJob{
+		Server:        "test-server",
+		Name:          "test-job",
+		Version:       "42",
+		Release:       "1",
+		KojiFilenames: filenames,
+		KojiDirectory: "koji-server-test-dir",
+		TaskID:        0,
+		StartTime:     uint64(time.Now().Unix()),
+	}
+	finalizeID, err := workers.EnqueueKojiFinalize(&finalizeJob, initID, buildJobIDs)
+	require.NoError(t, err)
+
+	// ----- Jobs queued - Test API endpoints (status, manifests, logs) ----- //
+
+	for _, path := range []string{"", "/manifests", "/logs"} {
+		// should return OK - actual result should be tested elsewhere
+		test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", finalizeID, path), ``, http.StatusOK, "*")
+
+		// The other IDs should fail
+		msg := fmt.Sprintf("Job %s not found: expected \"koji-finalize\", found \"koji-init\" job instead", initID)
+		resp, _ := json.Marshal(map[string]string{"message": msg})
+		test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", initID, path), ``, http.StatusNotFound, string(resp))
+
+		for idx, buildID := range buildJobIDs {
+			msg := fmt.Sprintf("Job %s not found: expected \"koji-finalize\", found \"osbuild-koji:fake-arch-%d\" job instead", buildID, idx)
+			resp, _ := json.Marshal(map[string]string{"message": msg})
+			test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", buildID, path), ``, http.StatusNotFound, string(resp))
+		}
+
+		badID := uuid.New()
+		msg = fmt.Sprintf("Job %s not found: job does not exist", badID)
+		resp, _ = json.Marshal(map[string]string{"message": msg})
+		test.TestRoute(t, handler, false, "GET", fmt.Sprintf("/api/composer-koji/v1/compose/%s%s", badID, path), ``, http.StatusNotFound, string(resp))
+	}
+}
diff --git a/internal/weldr/api_test.go b/internal/weldr/api_test.go
index 9f32dec3e..8af9c1fc8 100644
--- a/internal/weldr/api_test.go
+++ b/internal/weldr/api_test.go
@@ -925,6 +925,8 @@ func TestSourcesNew(t *testing.T) {
 		{"POST", "/api/v0/projects/source/new", `{"url": "https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/","type": "yum-baseurl","check_ssl": false,"check_gpg": false}`, http.StatusBadRequest, `{"errors": [{"id": "ProjectsError","msg": "Problem parsing POST body: 'name' field is missing from request"}],"status":false}`},
 		{"POST", "/api/v0/projects/source/new", `{"name": "fish", "type": "yum-baseurl","check_ssl": false,"check_gpg": false}`, http.StatusBadRequest, `{"errors": [{"id": "ProjectsError","msg": "Problem parsing POST body: 'url' field is missing from request"}],"status":false}`},
 		{"POST", "/api/v0/projects/source/new", `{"name": "fish", "url": "https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/","check_ssl": false,"check_gpg": false}`, http.StatusBadRequest, `{"errors": [{"id": "ProjectsError","msg": "Problem parsing POST body: 'type' field is missing from request"}],"status":false}`},
+		{"POST", "/api/v0/projects/source/new", `{"name": "test-id", "url": "https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/","type": "yum-baseurl","check_ssl": false,"check_gpg": false}`, http.StatusBadRequest, `{"errors": [{"id": "SystemSource","msg": "test-id is a system source, it cannot be changed."}],"status":false}`},
+		{"POST", "/api/v1/projects/source/new", `{"id": "test-id", "name": "test system repo", "url": "https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/","type": "yum-baseurl","check_ssl": false,"check_gpg": false}`, http.StatusBadRequest, `{"errors": [{"id": "SystemSource","msg": "test-id is a system source, it cannot be changed."}],"status":false}`},
 	}
 
 	tempdir, err := ioutil.TempDir("", "weldr-tests-")
diff --git a/internal/worker/server_test.go b/internal/worker/server_test.go
index 7a34eb1dd..59df3b6e0 100644
--- a/internal/worker/server_test.go
+++ b/internal/worker/server_test.go
@@ -8,6 +8,7 @@ import (
 	"os"
 	"testing"
 
+	"github.com/google/uuid"
 	"github.com/stretchr/testify/require"
 
 	"github.com/osbuild/osbuild-composer/internal/distro"
@@ -172,6 +173,40 @@ func TestUpdate(t *testing.T) {
 	test.TestRoute(t, handler, false, "PATCH", fmt.Sprintf("/api/worker/v1/jobs/%s", token), `{}`, http.StatusNotFound, `*`)
 }
 
+func TestArgs(t *testing.T) {
+	distroStruct := fedoratest.New()
+	arch, err := distroStruct.GetArch("x86_64")
+	require.NoError(t, err)
+	imageType, err := arch.GetImageType("qcow2")
+	require.NoError(t, err)
+	manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, nil, 0)
+	require.NoError(t, err)
+
+	tempdir, err := ioutil.TempDir("", "worker-tests-")
+	require.NoError(t, err)
+	defer os.RemoveAll(tempdir)
+	server := newTestServer(t, tempdir)
+
+	job := worker.OSBuildJob{
+		Manifest:  manifest,
+		ImageName: "test-image",
+	}
+	jobId, err := server.EnqueueOSBuild(arch.Name(), &job)
+	require.NoError(t, err)
+
+	_, _, _, args, _, err := server.RequestJob(context.Background(), arch.Name(), []string{"osbuild"})
+	require.NoError(t, err)
+	require.NotNil(t, args)
+
+	var jobArgs worker.OSBuildJob
+	jobType, rawArgs, deps, err := server.Job(jobId, &jobArgs)
+	require.NoError(t, err)
+	require.Equal(t, args, rawArgs)
+	require.Equal(t, job, jobArgs)
+	require.Equal(t, jobType, "osbuild:"+arch.Name())
+	require.Equal(t, []uuid.UUID(nil), deps)
+}
+
 func TestUpload(t *testing.T) {
 	tempdir, err := ioutil.TempDir("", "worker-tests-")
 	require.NoError(t, err)
diff --git a/test/cases/aws.sh b/test/cases/aws.sh
index b99265fcb..72d4d742b 100755
--- a/test/cases/aws.sh
+++ b/test/cases/aws.sh
@@ -263,6 +263,12 @@ for LOOP_COUNTER in {0..10}; do
     sleep 5
 done
 
+# Ensure the image was properly tagged.
+IMAGE_TAG=$($AWS_CMD ec2 describe-images --image-ids "${AMI_IMAGE_ID}" | jq -r '.Images[0].Tags[] | select(.Key=="Name") | .Value')
+if [[ ! $IMAGE_TAG == "${IMAGE_KEY}" ]]; then
+    RESULTS=0
+fi
+
 # Clean up our mess.
 greenprint "🧼 Cleaning up"
 SNAPSHOT_ID=$(jq -r '.Images[].BlockDeviceMappings[].Ebs.SnapshotId' "$AMI_DATA")
diff --git a/test/data/manifests/fedora_32-aarch64-ami-boot.json b/test/data/manifests/fedora_32-aarch64-ami-boot.json
index 78650e0c6..dd6c7559a 100644
--- a/test/data/manifests/fedora_32-aarch64-ami-boot.json
+++ b/test/data/manifests/fedora_32-aarch64-ami-boot.json
@@ -8902,6 +8902,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=46BB-8120",
diff --git a/test/data/manifests/fedora_32-aarch64-openstack-boot.json b/test/data/manifests/fedora_32-aarch64-openstack-boot.json
index aa6058247..54ab8cc7c 100644
--- a/test/data/manifests/fedora_32-aarch64-openstack-boot.json
+++ b/test/data/manifests/fedora_32-aarch64-openstack-boot.json
@@ -9252,6 +9252,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=46BB-8120",
diff --git a/test/data/manifests/fedora_32-aarch64-qcow2-boot.json b/test/data/manifests/fedora_32-aarch64-qcow2-boot.json
index 4c10782f3..bc874f873 100644
--- a/test/data/manifests/fedora_32-aarch64-qcow2-boot.json
+++ b/test/data/manifests/fedora_32-aarch64-qcow2-boot.json
@@ -8754,6 +8754,7 @@
         "version": "5.6.6-300.fc32.aarch64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=46BB-8120",
diff --git a/test/data/manifests/fedora_32-x86_64-ami-boot.json b/test/data/manifests/fedora_32-x86_64-ami-boot.json
index 8032a7ab4..a5f9f51b4 100644
--- a/test/data/manifests/fedora_32-x86_64-ami-boot.json
+++ b/test/data/manifests/fedora_32-x86_64-ami-boot.json
@@ -9160,6 +9160,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json b/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json
index 95c57ba75..f6bc7adb0 100644
--- a/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json
+++ b/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json
@@ -10135,6 +10135,7 @@
     }
   },
   "image-info": {
+    "default-target": "graphical.target",
     "firewall-enabled": [
       "ssh",
       "mdns",
diff --git a/test/data/manifests/fedora_32-x86_64-openstack-boot.json b/test/data/manifests/fedora_32-x86_64-openstack-boot.json
index 9d40eabc8..e2abb4316 100644
--- a/test/data/manifests/fedora_32-x86_64-openstack-boot.json
+++ b/test/data/manifests/fedora_32-x86_64-openstack-boot.json
@@ -9510,6 +9510,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_32-x86_64-qcow2-boot.json b/test/data/manifests/fedora_32-x86_64-qcow2-boot.json
index 97d3da4e0..a9a0aa282 100644
--- a/test/data/manifests/fedora_32-x86_64-qcow2-boot.json
+++ b/test/data/manifests/fedora_32-x86_64-qcow2-boot.json
@@ -9114,6 +9114,7 @@
         "version": "5.6.6-300.fc32.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_32-x86_64-qcow2-customize.json b/test/data/manifests/fedora_32-x86_64-qcow2-customize.json
index dcf47b9af..c204bad20 100644
--- a/test/data/manifests/fedora_32-x86_64-qcow2-customize.json
+++ b/test/data/manifests/fedora_32-x86_64-qcow2-customize.json
@@ -9217,6 +9217,7 @@
         "version": "5.6.6-300.fc32.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_32-x86_64-vhd-boot.json b/test/data/manifests/fedora_32-x86_64-vhd-boot.json
index 54524d999..486ebd700 100644
--- a/test/data/manifests/fedora_32-x86_64-vhd-boot.json
+++ b/test/data/manifests/fedora_32-x86_64-vhd-boot.json
@@ -8761,6 +8761,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_32-x86_64-vmdk-boot.json b/test/data/manifests/fedora_32-x86_64-vmdk-boot.json
index 5a3f6d992..3f41ad8ac 100644
--- a/test/data/manifests/fedora_32-x86_64-vmdk-boot.json
+++ b/test/data/manifests/fedora_32-x86_64-vmdk-boot.json
@@ -8867,6 +8867,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_33-aarch64-ami-boot.json b/test/data/manifests/fedora_33-aarch64-ami-boot.json
index f04960cbf..029c829d5 100644
--- a/test/data/manifests/fedora_33-aarch64-ami-boot.json
+++ b/test/data/manifests/fedora_33-aarch64-ami-boot.json
@@ -9822,6 +9822,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=46BB-8120",
diff --git a/test/data/manifests/fedora_33-x86_64-ami-boot.json b/test/data/manifests/fedora_33-x86_64-ami-boot.json
index 884c3c222..825e37472 100644
--- a/test/data/manifests/fedora_33-x86_64-ami-boot.json
+++ b/test/data/manifests/fedora_33-x86_64-ami-boot.json
@@ -9401,6 +9401,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json b/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json
index 13aa93074..ca77d2257 100644
--- a/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json
+++ b/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json
@@ -10577,6 +10577,7 @@
     }
   },
   "image-info": {
+    "default-target": "graphical.target",
     "firewall-enabled": [
       "ssh",
       "mdns",
diff --git a/test/data/manifests/fedora_33-x86_64-openstack-boot.json b/test/data/manifests/fedora_33-x86_64-openstack-boot.json
index 3622e9978..b332bade7 100644
--- a/test/data/manifests/fedora_33-x86_64-openstack-boot.json
+++ b/test/data/manifests/fedora_33-x86_64-openstack-boot.json
@@ -9716,6 +9716,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_33-x86_64-qcow2-boot.json b/test/data/manifests/fedora_33-x86_64-qcow2-boot.json
index df4abd99f..82db9e53e 100644
--- a/test/data/manifests/fedora_33-x86_64-qcow2-boot.json
+++ b/test/data/manifests/fedora_33-x86_64-qcow2-boot.json
@@ -9289,6 +9289,7 @@
         "version": "5.8.15-301.fc33.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_33-x86_64-qcow2-customize.json b/test/data/manifests/fedora_33-x86_64-qcow2-customize.json
index b24aadcd1..ac9d7a327 100644
--- a/test/data/manifests/fedora_33-x86_64-qcow2-customize.json
+++ b/test/data/manifests/fedora_33-x86_64-qcow2-customize.json
@@ -9387,6 +9387,7 @@
         "version": "5.8.15-301.fc33.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_33-x86_64-vhd-boot.json b/test/data/manifests/fedora_33-x86_64-vhd-boot.json
index 8f3441aea..605acb153 100644
--- a/test/data/manifests/fedora_33-x86_64-vhd-boot.json
+++ b/test/data/manifests/fedora_33-x86_64-vhd-boot.json
@@ -9002,6 +9002,7 @@
       "mdns",
       "dhcpv6-client"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/fedora_33-x86_64-vmdk-boot.json b/test/data/manifests/fedora_33-x86_64-vmdk-boot.json
index 94b2d8e95..0e07e87b7 100644
--- a/test/data/manifests/fedora_33-x86_64-vmdk-boot.json
+++ b/test/data/manifests/fedora_33-x86_64-vmdk-boot.json
@@ -9289,6 +9289,7 @@
         "version": "5.8.15-301.fc33.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac",
diff --git a/test/data/manifests/rhel_8-aarch64-ami-boot.json b/test/data/manifests/rhel_8-aarch64-ami-boot.json
index baf6ea176..76d2b4ad6 100644
--- a/test/data/manifests/rhel_8-aarch64-ami-boot.json
+++ b/test/data/manifests/rhel_8-aarch64-ami-boot.json
@@ -3157,6 +3157,12 @@
             "language": "en_US"
           }
         },
+        {
+          "name": "org.osbuild.systemd",
+          "options": {
+            "default_target": "multi-user.target"
+          }
+        },
         {
           "name": "org.osbuild.selinux",
           "options": {
@@ -8724,6 +8730,7 @@
         "version": "4.18.0-221.el8.aarch64"
       }
     ],
+    "default-target": "multi-user.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-aarch64-openstack-boot.json b/test/data/manifests/rhel_8-aarch64-openstack-boot.json
index de08c58a1..7d53a8ab1 100644
--- a/test/data/manifests/rhel_8-aarch64-openstack-boot.json
+++ b/test/data/manifests/rhel_8-aarch64-openstack-boot.json
@@ -9296,6 +9296,7 @@
       "dhcpv6-client",
       "cockpit"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-aarch64-qcow2-boot.json b/test/data/manifests/rhel_8-aarch64-qcow2-boot.json
index 7b64a6057..33bde9f41 100644
--- a/test/data/manifests/rhel_8-aarch64-qcow2-boot.json
+++ b/test/data/manifests/rhel_8-aarch64-qcow2-boot.json
@@ -9495,6 +9495,7 @@
         "version": "4.18.0-221.el8.aarch64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json b/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json
index 68ab1b69b..919c57e44 100644
--- a/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json
+++ b/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json
@@ -8206,6 +8206,7 @@
     }
   },
   "image-info": {
+    "default-target": "graphical.target",
     "firewall-enabled": [
       "ssh",
       "dhcpv6-client",
diff --git a/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json b/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json
index 1c5e7e67d..a6c92d087 100644
--- a/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json
+++ b/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json
@@ -10254,6 +10254,7 @@
         "version": "4.18.0-221.el8.ppc64le"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-s390x-qcow2-boot.json b/test/data/manifests/rhel_8-s390x-qcow2-boot.json
index 66dcedf59..e64a19c9e 100644
--- a/test/data/manifests/rhel_8-s390x-qcow2-boot.json
+++ b/test/data/manifests/rhel_8-s390x-qcow2-boot.json
@@ -10209,6 +10209,7 @@
         "version": "4.18.0-193.el8.s390x"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-x86_64-ami-boot.json b/test/data/manifests/rhel_8-x86_64-ami-boot.json
index 95fbc019d..91a181b23 100644
--- a/test/data/manifests/rhel_8-x86_64-ami-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-ami-boot.json
@@ -3156,6 +3156,12 @@
             "language": "en_US"
           }
         },
+        {
+          "name": "org.osbuild.systemd",
+          "options": {
+            "default_target": "multi-user.target"
+          }
+        },
         {
           "name": "org.osbuild.selinux",
           "options": {
@@ -8731,6 +8737,7 @@
         "version": "4.18.0-221.el8.x86_64"
       }
     ],
+    "default-target": "multi-user.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-x86_64-openstack-boot.json b/test/data/manifests/rhel_8-x86_64-openstack-boot.json
index da5bfe480..9a1d7ecd3 100644
--- a/test/data/manifests/rhel_8-x86_64-openstack-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-openstack-boot.json
@@ -9329,6 +9329,7 @@
       "dhcpv6-client",
       "cockpit"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-x86_64-qcow2-boot.json b/test/data/manifests/rhel_8-x86_64-qcow2-boot.json
index 5177c8152..c522caff2 100644
--- a/test/data/manifests/rhel_8-x86_64-qcow2-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-qcow2-boot.json
@@ -9498,6 +9498,7 @@
         "version": "4.18.0-221.el8.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-x86_64-qcow2-customize.json b/test/data/manifests/rhel_8-x86_64-qcow2-customize.json
index 0e9aa0de9..eee11ba1c 100644
--- a/test/data/manifests/rhel_8-x86_64-qcow2-customize.json
+++ b/test/data/manifests/rhel_8-x86_64-qcow2-customize.json
@@ -9586,6 +9586,7 @@
         "version": "4.18.0-221.el8.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json b/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json
index 0c38301bf..37fcfb29a 100644
--- a/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json
@@ -8502,6 +8502,7 @@
     }
   },
   "image-info": {
+    "default-target": "graphical.target",
     "firewall-enabled": [
       "ssh",
       "dhcpv6-client",
diff --git a/test/data/manifests/rhel_8-x86_64-tar-boot.json b/test/data/manifests/rhel_8-x86_64-tar-boot.json
index 243ab432c..62c1c6248 100644
--- a/test/data/manifests/rhel_8-x86_64-tar-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-tar-boot.json
@@ -5431,6 +5431,7 @@
   },
   "image-info": {
     "bootmenu": [],
+    "default-target": "graphical.target",
     "groups": [
       "adm:x:4:",
       "audio:x:63:",
diff --git a/test/data/manifests/rhel_8-x86_64-vhd-boot.json b/test/data/manifests/rhel_8-x86_64-vhd-boot.json
index 987dbcfc8..b52f0d6b8 100644
--- a/test/data/manifests/rhel_8-x86_64-vhd-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-vhd-boot.json
@@ -9240,6 +9240,7 @@
       "dhcpv6-client",
       "cockpit"
     ],
+    "default-target": "multi-user.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_8-x86_64-vmdk-boot.json b/test/data/manifests/rhel_8-x86_64-vmdk-boot.json
index eaee4fdc6..191751651 100644
--- a/test/data/manifests/rhel_8-x86_64-vmdk-boot.json
+++ b/test/data/manifests/rhel_8-x86_64-vmdk-boot.json
@@ -8966,6 +8966,7 @@
       "dhcpv6-client",
       "cockpit"
     ],
+    "default-target": "graphical.target",
     "fstab": [
       [
         "UUID=0bd700f8-090f-4556-b797-b340297ea1bd",
diff --git a/test/data/manifests/rhel_84-x86_64-ami-boot.json b/test/data/manifests/rhel_84-x86_64-ami-boot.json
index ca7299b54..81b1c2965 100644
--- a/test/data/manifests/rhel_84-x86_64-ami-boot.json
+++ b/test/data/manifests/rhel_84-x86_64-ami-boot.json
@@ -3103,6 +3103,12 @@
             "zone": "America/New_York"
           }
         },
+        {
+          "name": "org.osbuild.systemd",
+          "options": {
+            "default_target": "multi-user.target"
+          }
+        },
         {
           "name": "org.osbuild.selinux",
           "options": {
@@ -8611,6 +8617,7 @@
         "version": "4.18.0-240.4.el8.x86_64"
       }
     ],
+    "default-target": "multi-user.target",
     "fstab": [
       [
         "UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8",
diff --git a/test/data/manifests/rhel_84-x86_64-openstack-boot.json b/test/data/manifests/rhel_84-x86_64-openstack-boot.json
index 7b527baec..5b0d144d0 100644
--- a/test/data/manifests/rhel_84-x86_64-openstack-boot.json
+++ b/test/data/manifests/rhel_84-x86_64-openstack-boot.json
@@ -9193,6 +9193,7 @@
         "version": "4.18.0-240.4.el8.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "firewall-enabled": [
       "ssh",
       "dhcpv6-client",
diff --git a/test/data/manifests/rhel_84-x86_64-qcow2-boot.json b/test/data/manifests/rhel_84-x86_64-qcow2-boot.json
index 99afd65e4..df83a71e5 100644
--- a/test/data/manifests/rhel_84-x86_64-qcow2-boot.json
+++ b/test/data/manifests/rhel_84-x86_64-qcow2-boot.json
@@ -87,6 +87,9 @@
           "sha256:09fc3154e76c8ee25b3982c15f3bc455017262c3df5af84075859dcbf79e4f82": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-libsemanage-2.9-3.el8.x86_64.rpm"
           },
+          "sha256:0adaf78120709f5e2c6207bdc1efafb309b1fbd4f7405155645d0b266abcc2df": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-mkhomedir-0.34.5-4.el8.x86_64.rpm"
+          },
           "sha256:0b26e1715694a85c1aa9b940003c8cddb0bc8de9514434f60a1f2f22c467a121": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/grub2-pc-2.02-90.el8.x86_64.rpm"
           },
@@ -234,6 +237,9 @@
           "sha256:28ccf9ff472c824f6c5a3c2a0c076bfa221b8e48368e43de9b3c2e83d67e8b5d": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/mpfr-3.1.6-1.el8.x86_64.rpm"
           },
+          "sha256:28ddc63822e22635ea234bfc182976a16441ce6a8ad05966e3618e692f2c105c": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/authselect-compat-1.2.1-2.el8.x86_64.rpm"
+          },
           "sha256:2a65cec3eb67ba7645dd97cf3f3811cd5fb06eea2526d36a683d3fdaa0f2825e": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/cronie-anacron-1.5.2-4.el8.x86_64.rpm"
           },
@@ -246,9 +252,6 @@
           "sha256:2cfcc3d6163dfaf7ce76998be992bd0b70dd7cbb838430cecf2aff04cd435d24": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/virt-what-1.18-6.el8.x86_64.rpm"
           },
-          "sha256:2e1d3cb29f87138b9f9c5415bf980443ae3ea4929426e79776557dc3c82b8e21": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pyOpenSSL-18.0.0-1.el8.noarch.rpm"
-          },
           "sha256:2e8fd9d87a922b1441538318c401b1e4353b87a9e8000ca76b0cee681ec79c45": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libnghttp2-1.33.0-3.el8_2.1.x86_64.rpm"
           },
@@ -354,9 +357,6 @@
           "sha256:3e9dff1e55f3d4121bb4d85839f0e26a05bb95ed652abbe15535167528226414": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pyserial-3.1.1-8.el8.noarch.rpm"
           },
-          "sha256:3edf7d29e530e6568416d4455e9fbaa511aba236c603da9928e689fae77b9874": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-netifaces-0.10.6-4.el8.x86_64.rpm"
-          },
           "sha256:3f71ec03af43ae8b36714efedb63dbc439259d8c7a321dd6788f74f92987d7c6": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/qemu-img-4.2.0-34.module+el8.3.0+7976+077be4ec.x86_64.rpm"
           },
@@ -390,6 +390,9 @@
           "sha256:4476a92d949229c4eba1fc216356971c400dfcafb7004ad2d321aa9190b34260": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/sssd-nfs-idmap-2.3.0-9.el8.x86_64.rpm"
           },
+          "sha256:45146c375eb639749ed4da202b2b006fce609d585f8125fe8295481a5ef3d07a": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-0.34.5-4.el8.x86_64.rpm"
+          },
           "sha256:45cc50a8b02f9bbbbe2c8c056f34622d15d383f695916ac07821d688fcab1c25": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libzstd-1.4.4-1.el8.x86_64.rpm"
           },
@@ -609,9 +612,6 @@
           "sha256:703f78e932f243ccf2890039ab582176b829f4dfc302a4c9a4e48189eb3a0bd2": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/ca-certificates-2020.2.41-80.0.el8_2.noarch.rpm"
           },
-          "sha256:713ec69b972a8e88622b3fcd3b84fccdbd6c333b68b6c52151c2350edad2576a": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgudev-232-4.el8.x86_64.rpm"
-          },
           "sha256:716bd3f5c05a71ed91a44747c2dac5a93679af31594850f25378970be15e931a": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/grub2-tools-extra-2.02-90.el8.x86_64.rpm"
           },
@@ -804,9 +804,6 @@
           "sha256:995a5401cd86404d14d08c0aeafeaa8da3f540b1806f9d0e233d75dec9e45c74": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/libmaxminddb-1.2.0-10.el8.x86_64.rpm"
           },
-          "sha256:9965cc9389159c9a0ca4e2f6257f756ed5cc77771bde1e27ed4013bbbc20558b": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm"
-          },
           "sha256:9a6eb680e8debcd0b97575a76e9cf0d0655ef7f875b362542e0d129f5e423419": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-iniparse-0.4-31.el8.noarch.rpm"
           },
@@ -831,6 +828,9 @@
           "sha256:9d2a2ef762444163e91c433c83ce91ef37acb2318ba168a81ac0dd4d65b834ef": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/subscription-manager-1.27.16-1.el8.x86_64.rpm"
           },
+          "sha256:9d9d1bdfba4cd852f90232ebe2c4247e7b3a88c4476578c820788a91d6838e55": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/rng-tools-6.8-3.el8.x86_64.rpm"
+          },
           "sha256:9e08c0338eac83abf9a0118cb05fb646d4554c1b2513ab6801e9587aede40b28": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-babel-2.5.1-5.el8.noarch.rpm"
           },
@@ -846,9 +846,6 @@
           "sha256:9fd289f7557c4d6be1fd3eaeea22c626432fddd1a97f9e5f804b6545cc53fcb9": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-ply-3.9-8.el8.noarch.rpm"
           },
-          "sha256:a0f1dd76470a1ecde87526b1429f259033ef3cfd1d019fba0a781910d4d5b61a": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhnlib-2.8.6-8.module+el8.1.0+3455+3ddf2832.noarch.rpm"
-          },
           "sha256:a12d7736b18b1cb21ab10e3b42c303693904e4fa03b772a9a7c9ca8be84f6894": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgcrypt-1.8.5-4.el8.x86_64.rpm"
           },
@@ -960,9 +957,6 @@
           "sha256:b446b1469bd535cf94e555525f40fa751b1343d89d589f3cff30ee2d7c38258e": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/hdparm-9.54-2.el8.x86_64.rpm"
           },
-          "sha256:b4e89276818abec218c909ca961db9bb2e09b1fc609ff280e6c05227143fa24d": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-newt-0.52.20-11.el8.x86_64.rpm"
-          },
           "sha256:b4fb3d8b0255a5ba9456b61e4f479f2f8355d171263508bbe869af677015fd97": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/policycoreutils-python-utils-2.9-9.el8.noarch.rpm"
           },
@@ -1011,9 +1005,6 @@
           "sha256:bdd6bd905c3b0275c373d8282af5d82ff6257c521d02781ba2094587886d20f9": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/kernel-tools-libs-4.18.0-240.4.el8.x86_64.rpm"
           },
-          "sha256:bed436b103161f7d8f61b617c84f3a7b5509f1d00c8425900a88c222b1331b31": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm"
-          },
           "sha256:bf05c810e12f5e5b86da335e372e9775c243b72e7fbd224714ef1590ab56b3dc": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/dbus-libs-1.12.8-11.el8.x86_64.rpm"
           },
@@ -1047,9 +1038,6 @@
           "sha256:c46ee71ba426e0964b2264bdf18fc4cff4d7815206c9e8a471bdf678e65c24b9": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libini_config-1.3.1-39.el8.x86_64.rpm"
           },
-          "sha256:c5429b045d9343c672da91167a72f2e10d65dd675322accaeee0b4cc18350362": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-hwdata-2.3.6-3.el8.noarch.rpm"
-          },
           "sha256:c5d0c9a5acc6c2de5e52b38701d6cad5cc37d22c1cb518ca8bcac79bddffaaba": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libappstream-glib-0.7.14-3.el8.x86_64.rpm"
           },
@@ -1140,6 +1128,9 @@
           "sha256:d4736913c9527c97b95cbd12eb3a181c3c980be9c29758fb909f2d60bf378c53": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-urllib3-1.24.2-4.el8.noarch.rpm"
           },
+          "sha256:d4dc248be7aacad57e6684036d48d7fc1697bb0f1aa880c2a77dbd3ed714c642": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/timedatex-0.5-3.el8.x86_64.rpm"
+          },
           "sha256:d570af0578f5b2c6225f1f2354404f65bccf91c3974e98dcbc0c7b55a61b9b46": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/grep-3.1-6.el8.x86_64.rpm"
           },
@@ -1155,9 +1146,6 @@
           "sha256:d7c7ba51c19e80dc07f72cfef5467279ab485c652e144cb790c8ce2471040ece": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/fontconfig-2.13.1-3.el8.x86_64.rpm"
           },
-          "sha256:d80219a299035688091aa230b1c9169143c00c141c4f1ad8e75d176d22cc1cd0": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm"
-          },
           "sha256:d84d9c2262e0ccdff46b3f6363c1a74ef870795947f716ada3d5ccf160d7b433": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/audit-libs-3.0-0.17.20191104git1c2f876.el8.x86_64.rpm"
           },
@@ -1194,9 +1182,6 @@
           "sha256:db8bc154626bdd906a1f50104031a5042bbe91db7f5a1473657795eedd4158c6": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-setools-4.3.0-2.el8.x86_64.rpm"
           },
-          "sha256:dc07cc3536a601e2b7ca0e2823cd437f3a2e6d1d206a06612eee0515eee84b43": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm"
-          },
           "sha256:dd379385bd1d2e05f50c4795e5a0eff9030fdac0fd2579bb4b56233257672b27": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/dejavu-sans-mono-fonts-2.35-6.el8.noarch.rpm"
           },
@@ -1221,6 +1206,9 @@
           "sha256:e1b2922991a12bcfd754c77baf6278f6f7c91bde603fe67dbd480ac4cf26147c": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libsmartcols-2.32.1-24.el8.x86_64.rpm"
           },
+          "sha256:e22840ee14aa1993e75fd690749c01dbb7d4419c2b210fef173ff99a76f61ff6": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/psmisc-23.1-5.el8.x86_64.rpm"
+          },
           "sha256:e233a9ecfbf657192902180f6a67a225e5ec0194834df672eaeb2b3a50e8fb49": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/info-6.5-6.el8.x86_64.rpm"
           },
@@ -2584,9 +2572,6 @@
               {
                 "checksum": "sha256:4bef8c6105544198bc4c5fecd21202bcf7823dda888cbe3fee888ee936c46bd9"
               },
-              {
-                "checksum": "sha256:713ec69b972a8e88622b3fcd3b84fccdbd6c333b68b6c52151c2350edad2576a"
-              },
               {
                 "checksum": "sha256:4a62975251933dcaff77fdbd7704e8a12bea0ecb6eaaae5ea5e552bedd6788ec"
               },
@@ -2938,6 +2923,9 @@
               {
                 "checksum": "sha256:49646b15bc83441dad756598083137562b7b06fe6d88249141b6e3006f703797"
               },
+              {
+                "checksum": "sha256:e22840ee14aa1993e75fd690749c01dbb7d4419c2b210fef173ff99a76f61ff6"
+              },
               {
                 "checksum": "sha256:f8c191d8b952621d10a1055be960bbe07be66f557c5a9d007f8908abcde1b9af"
               },
@@ -3109,6 +3097,9 @@
               {
                 "checksum": "sha256:9be187fd62ada3a61cb494a383b8a60fd6c705c93897a13051600dbbeb1d914f"
               },
+              {
+                "checksum": "sha256:9d9d1bdfba4cd852f90232ebe2c4247e7b3a88c4476578c820788a91d6838e55"
+              },
               {
                 "checksum": "sha256:ad060f60303b6764e08657436147cc24cfc4bb1ccc1431796407ba005a7bcec0"
               },
@@ -3217,6 +3208,9 @@
               {
                 "checksum": "sha256:9137a707b7793567b38e7d8dba78fcf3f70c39320e68a9ee0b745b3a77f182ee"
               },
+              {
+                "checksum": "sha256:d4dc248be7aacad57e6684036d48d7fc1697bb0f1aa880c2a77dbd3ed714c642"
+              },
               {
                 "checksum": "sha256:a16b38fc2975ab7c8b6200fafb7e577c7434c5c0ab0683653f1f4f630e05a053"
               },
@@ -3271,6 +3265,9 @@
               {
                 "checksum": "sha256:1594afba86593ec614299ef6af255755a98ea55a34a72a22fdc9d80a040be39d"
               },
+              {
+                "checksum": "sha256:28ddc63822e22635ea234bfc182976a16441ce6a8ad05966e3618e692f2c105c"
+              },
               {
                 "checksum": "sha256:7d0bc4f2f78166013ef160ed10930a4902c7c5c6d6b7940fc900d36eaacc65a2"
               },
@@ -3283,9 +3280,6 @@
               {
                 "checksum": "sha256:664a883f3c7042eb91e0b66fc99c309a729011b4912e4af9397f4e25e1adae90"
               },
-              {
-                "checksum": "sha256:9965cc9389159c9a0ca4e2f6257f756ed5cc77771bde1e27ed4013bbbc20558b"
-              },
               {
                 "checksum": "sha256:19dba7cb30c3cb598886326df0ec1114c6e195a57c9ce3a8b78b83555e9e8648"
               },
@@ -3325,6 +3319,12 @@
               {
                 "checksum": "sha256:25b13ea50e21233dc5fccf42da344fbf24605dde38db9b94e49739ae39faa072"
               },
+              {
+                "checksum": "sha256:45146c375eb639749ed4da202b2b006fce609d585f8125fe8295481a5ef3d07a"
+              },
+              {
+                "checksum": "sha256:0adaf78120709f5e2c6207bdc1efafb309b1fbd4f7405155645d0b266abcc2df"
+              },
               {
                 "checksum": "sha256:7bb63c8b955ff7f993877c0323e8bc17c6d85c7a8e844db9e9980a9ca7a227c5"
               },
@@ -3337,15 +3337,9 @@
               {
                 "checksum": "sha256:8caac6d04fc98a82d17af56a8faacd1e1a019112ba207388fb82ffdd6df54301"
               },
-              {
-                "checksum": "sha256:dc07cc3536a601e2b7ca0e2823cd437f3a2e6d1d206a06612eee0515eee84b43"
-              },
               {
                 "checksum": "sha256:4229196b5ea88c1133d5509a2ec326093a2c7ac5566ca4abb55c3d6fab47130a"
               },
-              {
-                "checksum": "sha256:c5429b045d9343c672da91167a72f2e10d65dd675322accaeee0b4cc18350362"
-              },
               {
                 "checksum": "sha256:0899ddc5a37434135f1f8402aafde3228db6bdbb71cb4e9401c1ed53524c3d64"
               },
@@ -3361,18 +3355,9 @@
               {
                 "checksum": "sha256:e868499743c399baa6463fa64a2534a7d32f8e1cca7b1b47ec00c60b34250bfe"
               },
-              {
-                "checksum": "sha256:3edf7d29e530e6568416d4455e9fbaa511aba236c603da9928e689fae77b9874"
-              },
-              {
-                "checksum": "sha256:b4e89276818abec218c909ca961db9bb2e09b1fc609ff280e6c05227143fa24d"
-              },
               {
                 "checksum": "sha256:076bdcf066fabe9c611ceee12665d735136ecd306ec4c1e608bb1e0a4704ae55"
               },
-              {
-                "checksum": "sha256:2e1d3cb29f87138b9f9c5415bf980443ae3ea4929426e79776557dc3c82b8e21"
-              },
               {
                 "checksum": "sha256:fd75c594f871a3353d326833e630ea1d28e5f446f796b836dc628f8c9c039f88"
               },
@@ -3382,12 +3367,6 @@
               {
                 "checksum": "sha256:ccfdbebdf0575395a80f2fa55e49c8358ca601fdbb0685f37e8c584226264eca"
               },
-              {
-                "checksum": "sha256:bed436b103161f7d8f61b617c84f3a7b5509f1d00c8425900a88c222b1331b31"
-              },
-              {
-                "checksum": "sha256:a0f1dd76470a1ecde87526b1429f259033ef3cfd1d019fba0a781910d4d5b61a"
-              },
               {
                 "checksum": "sha256:534bbf990d0f0537715561c818c2b68f10e6ba0cc1252a32a0696f1e22fde1e3"
               },
@@ -3397,9 +3376,6 @@
               {
                 "checksum": "sha256:c6d206d56b73ec65ae9d4e7e872d200b9d7064d7d7b544ec3d8f5237edd37d09"
               },
-              {
-                "checksum": "sha256:d80219a299035688091aa230b1c9169143c00c141c4f1ad8e75d176d22cc1cd0"
-              },
               {
                 "checksum": "sha256:5ef47eb6a042a13c902764907692c1068eb0f69153b47bc85792bef74bfa852b"
               },
@@ -3481,6 +3457,15 @@
             }
           }
         },
+        {
+          "name": "org.osbuild.systemd",
+          "options": {
+            "enabled_services": [
+              "rngd.service"
+            ],
+            "default_target": "multi-user.target"
+          }
+        },
         {
           "name": "org.osbuild.selinux",
           "options": {
@@ -6994,15 +6979,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgpg-error-1.31-1.el8.x86_64.rpm",
         "checksum": "sha256:4bef8c6105544198bc4c5fecd21202bcf7823dda888cbe3fee888ee936c46bd9"
       },
-      {
-        "name": "libgudev",
-        "epoch": 0,
-        "version": "232",
-        "release": "4.el8",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgudev-232-4.el8.x86_64.rpm",
-        "checksum": "sha256:713ec69b972a8e88622b3fcd3b84fccdbd6c333b68b6c52151c2350edad2576a"
-      },
       {
         "name": "libidn2",
         "epoch": 0,
@@ -8056,6 +8032,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/procps-ng-3.3.15-3.el8.x86_64.rpm",
         "checksum": "sha256:49646b15bc83441dad756598083137562b7b06fe6d88249141b6e3006f703797"
       },
+      {
+        "name": "psmisc",
+        "epoch": 0,
+        "version": "23.1",
+        "release": "5.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/psmisc-23.1-5.el8.x86_64.rpm",
+        "checksum": "sha256:e22840ee14aa1993e75fd690749c01dbb7d4419c2b210fef173ff99a76f61ff6"
+      },
       {
         "name": "publicsuffix-list-dafsa",
         "epoch": 0,
@@ -8569,6 +8554,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/rhsm-icons-1.27.16-1.el8.noarch.rpm",
         "checksum": "sha256:9be187fd62ada3a61cb494a383b8a60fd6c705c93897a13051600dbbeb1d914f"
       },
+      {
+        "name": "rng-tools",
+        "epoch": 0,
+        "version": "6.8",
+        "release": "3.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/rng-tools-6.8-3.el8.x86_64.rpm",
+        "checksum": "sha256:9d9d1bdfba4cd852f90232ebe2c4247e7b3a88c4476578c820788a91d6838e55"
+      },
       {
         "name": "rootfiles",
         "epoch": 0,
@@ -8893,6 +8887,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/teamd-1.31-2.el8.x86_64.rpm",
         "checksum": "sha256:9137a707b7793567b38e7d8dba78fcf3f70c39320e68a9ee0b745b3a77f182ee"
       },
+      {
+        "name": "timedatex",
+        "epoch": 0,
+        "version": "0.5",
+        "release": "3.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/timedatex-0.5-3.el8.x86_64.rpm",
+        "checksum": "sha256:d4dc248be7aacad57e6684036d48d7fc1697bb0f1aa880c2a77dbd3ed714c642"
+      },
       {
         "name": "trousers",
         "epoch": 0,
@@ -9055,6 +9058,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/abattis-cantarell-fonts-0.0.25-4.el8.noarch.rpm",
         "checksum": "sha256:1594afba86593ec614299ef6af255755a98ea55a34a72a22fdc9d80a040be39d"
       },
+      {
+        "name": "authselect-compat",
+        "epoch": 0,
+        "version": "1.2.1",
+        "release": "2.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/authselect-compat-1.2.1-2.el8.x86_64.rpm",
+        "checksum": "sha256:28ddc63822e22635ea234bfc182976a16441ce6a8ad05966e3618e692f2c105c"
+      },
       {
         "name": "cairo",
         "epoch": 0,
@@ -9091,15 +9103,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/cloud-utils-growpart-0.31-1.el8.noarch.rpm",
         "checksum": "sha256:664a883f3c7042eb91e0b66fc99c309a729011b4912e4af9397f4e25e1adae90"
       },
-      {
-        "name": "dnf-plugin-spacewalk",
-        "epoch": 0,
-        "version": "2.8.5",
-        "release": "11.module+el8.1.0+3455+3ddf2832",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm",
-        "checksum": "sha256:9965cc9389159c9a0ca4e2f6257f756ed5cc77771bde1e27ed4013bbbc20558b"
-      },
       {
         "name": "geolite2-city",
         "epoch": 0,
@@ -9217,6 +9220,24 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/libxkbcommon-0.9.1-1.el8.x86_64.rpm",
         "checksum": "sha256:25b13ea50e21233dc5fccf42da344fbf24605dde38db9b94e49739ae39faa072"
       },
+      {
+        "name": "oddjob",
+        "epoch": 0,
+        "version": "0.34.5",
+        "release": "4.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-0.34.5-4.el8.x86_64.rpm",
+        "checksum": "sha256:45146c375eb639749ed4da202b2b006fce609d585f8125fe8295481a5ef3d07a"
+      },
+      {
+        "name": "oddjob-mkhomedir",
+        "epoch": 0,
+        "version": "0.34.5",
+        "release": "4.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-mkhomedir-0.34.5-4.el8.x86_64.rpm",
+        "checksum": "sha256:0adaf78120709f5e2c6207bdc1efafb309b1fbd4f7405155645d0b266abcc2df"
+      },
       {
         "name": "pinentry",
         "epoch": 0,
@@ -9253,15 +9274,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-cairo-1.16.3-6.el8.x86_64.rpm",
         "checksum": "sha256:8caac6d04fc98a82d17af56a8faacd1e1a019112ba207388fb82ffdd6df54301"
       },
-      {
-        "name": "python3-dnf-plugin-spacewalk",
-        "epoch": 0,
-        "version": "2.8.5",
-        "release": "11.module+el8.1.0+3455+3ddf2832",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm",
-        "checksum": "sha256:dc07cc3536a601e2b7ca0e2823cd437f3a2e6d1d206a06612eee0515eee84b43"
-      },
       {
         "name": "python3-gobject",
         "epoch": 0,
@@ -9271,15 +9283,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-gobject-3.28.3-2.el8.x86_64.rpm",
         "checksum": "sha256:4229196b5ea88c1133d5509a2ec326093a2c7ac5566ca4abb55c3d6fab47130a"
       },
-      {
-        "name": "python3-hwdata",
-        "epoch": 0,
-        "version": "2.3.6",
-        "release": "3.el8",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-hwdata-2.3.6-3.el8.noarch.rpm",
-        "checksum": "sha256:c5429b045d9343c672da91167a72f2e10d65dd675322accaeee0b4cc18350362"
-      },
       {
         "name": "python3-jinja2",
         "epoch": 0,
@@ -9325,24 +9328,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-markupsafe-0.23-19.el8.x86_64.rpm",
         "checksum": "sha256:e868499743c399baa6463fa64a2534a7d32f8e1cca7b1b47ec00c60b34250bfe"
       },
-      {
-        "name": "python3-netifaces",
-        "epoch": 0,
-        "version": "0.10.6",
-        "release": "4.el8",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-netifaces-0.10.6-4.el8.x86_64.rpm",
-        "checksum": "sha256:3edf7d29e530e6568416d4455e9fbaa511aba236c603da9928e689fae77b9874"
-      },
-      {
-        "name": "python3-newt",
-        "epoch": 0,
-        "version": "0.52.20",
-        "release": "11.el8",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-newt-0.52.20-11.el8.x86_64.rpm",
-        "checksum": "sha256:b4e89276818abec218c909ca961db9bb2e09b1fc609ff280e6c05227143fa24d"
-      },
       {
         "name": "python3-prettytable",
         "epoch": 0,
@@ -9352,15 +9337,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-prettytable-0.7.2-14.el8.noarch.rpm",
         "checksum": "sha256:076bdcf066fabe9c611ceee12665d735136ecd306ec4c1e608bb1e0a4704ae55"
       },
-      {
-        "name": "python3-pyOpenSSL",
-        "epoch": 0,
-        "version": "18.0.0",
-        "release": "1.el8",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pyOpenSSL-18.0.0-1.el8.noarch.rpm",
-        "checksum": "sha256:2e1d3cb29f87138b9f9c5415bf980443ae3ea4929426e79776557dc3c82b8e21"
-      },
       {
         "name": "python3-pydbus",
         "epoch": 0,
@@ -9388,24 +9364,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pytz-2017.2-9.el8.noarch.rpm",
         "checksum": "sha256:ccfdbebdf0575395a80f2fa55e49c8358ca601fdbb0685f37e8c584226264eca"
       },
-      {
-        "name": "python3-rhn-client-tools",
-        "epoch": 0,
-        "version": "2.8.16",
-        "release": "13.module+el8.1.0+3455+3ddf2832",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm",
-        "checksum": "sha256:bed436b103161f7d8f61b617c84f3a7b5509f1d00c8425900a88c222b1331b31"
-      },
-      {
-        "name": "python3-rhnlib",
-        "epoch": 0,
-        "version": "2.8.6",
-        "release": "8.module+el8.1.0+3455+3ddf2832",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhnlib-2.8.6-8.module+el8.1.0+3455+3ddf2832.noarch.rpm",
-        "checksum": "sha256:a0f1dd76470a1ecde87526b1429f259033ef3cfd1d019fba0a781910d4d5b61a"
-      },
       {
         "name": "python3-systemd",
         "epoch": 0,
@@ -9433,15 +9391,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/qemu-guest-agent-4.2.0-34.module+el8.3.0+7976+077be4ec.x86_64.rpm",
         "checksum": "sha256:c6d206d56b73ec65ae9d4e7e872d200b9d7064d7d7b544ec3d8f5237edd37d09"
       },
-      {
-        "name": "rhn-client-tools",
-        "epoch": 0,
-        "version": "2.8.16",
-        "release": "13.module+el8.1.0+3455+3ddf2832",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm",
-        "checksum": "sha256:d80219a299035688091aa230b1c9169143c00c141c4f1ad8e75d176d22cc1cd0"
-      },
       {
         "name": "rsyslog",
         "epoch": 0,
@@ -9529,6 +9478,7 @@
         "version": "4.18.0-240.4.el8.x86_64"
       }
     ],
+    "default-target": "multi-user.target",
     "fstab": [
       [
         "UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8",
@@ -9574,6 +9524,7 @@
       "polkitd:x:996:",
       "redhat:x:1000:",
       "render:x:998:",
+      "rngd:x:988:",
       "root:x:0:",
       "rpc:x:32:",
       "rpcuser:x:29:",
@@ -9627,6 +9578,7 @@
       "audit-3.0-0.17.20191104git1c2f876.el8.x86_64",
       "audit-libs-3.0-0.17.20191104git1c2f876.el8.x86_64",
       "authselect-1.2.1-2.el8.x86_64",
+      "authselect-compat-1.2.1-2.el8.x86_64",
       "authselect-libs-1.2.1-2.el8.x86_64",
       "basesystem-11-5.el8.noarch",
       "bash-4.4.19-12.el8.x86_64",
@@ -9677,7 +9629,6 @@
       "dmidecode-3.2-6.el8.x86_64",
       "dnf-4.2.23-4.el8.noarch",
       "dnf-data-4.2.23-4.el8.noarch",
-      "dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch",
       "dnf-plugin-subscription-manager-1.27.16-1.el8.x86_64",
       "dnf-plugins-core-4.0.17-5.el8.noarch",
       "dosfstools-4.1-6.el8.x86_64",
@@ -9804,7 +9755,6 @@
       "libgcrypt-1.8.5-4.el8.x86_64",
       "libgomp-8.4.1-1.el8.x86_64",
       "libgpg-error-1.31-1.el8.x86_64",
-      "libgudev-232-4.el8.x86_64",
       "libidn2-2.2.0-1.el8.x86_64",
       "libini_config-1.3.1-39.el8.x86_64",
       "libkcapi-1.2.0-2.el8.x86_64",
@@ -9896,6 +9846,8 @@
       "nfs-utils-2.3.3-35.el8.x86_64",
       "npth-1.5-4.el8.x86_64",
       "numactl-libs-2.0.12-11.el8.x86_64",
+      "oddjob-0.34.5-4.el8.x86_64",
+      "oddjob-mkhomedir-0.34.5-4.el8.x86_64",
       "openldap-2.4.46-16.el8.x86_64",
       "openssh-8.0p1-5.el8.x86_64",
       "openssh-clients-8.0p1-5.el8.x86_64",
@@ -9927,6 +9879,7 @@
       "popt-1.16-14.el8.x86_64",
       "prefixdevname-0.1.0-6.el8.x86_64",
       "procps-ng-3.3.15-3.el8.x86_64",
+      "psmisc-23.1-5.el8.x86_64",
       "publicsuffix-list-dafsa-20180723-1.el8.noarch",
       "python3-asn1crypto-0.24.0-3.el8.noarch",
       "python3-audit-3.0-0.17.20191104git1c2f876.el8.x86_64",
@@ -9941,14 +9894,12 @@
       "python3-decorator-4.2.1-2.el8.noarch",
       "python3-dmidecode-3.12.2-15.el8.x86_64",
       "python3-dnf-4.2.23-4.el8.noarch",
-      "python3-dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch",
       "python3-dnf-plugins-core-4.0.17-5.el8.noarch",
       "python3-ethtool-0.14-3.el8.x86_64",
       "python3-gobject-3.28.3-2.el8.x86_64",
       "python3-gobject-base-3.28.3-2.el8.x86_64",
       "python3-gpg-1.13.1-4.el8.x86_64",
       "python3-hawkey-0.48.0-5.el8.x86_64",
-      "python3-hwdata-2.3.6-3.el8.noarch",
       "python3-idna-2.5-5.el8.noarch",
       "python3-iniparse-0.4-31.el8.noarch",
       "python3-inotify-0.9.6-13.el8.noarch",
@@ -9967,15 +9918,12 @@
       "python3-linux-procfs-0.6.2-2.el8.noarch",
       "python3-magic-5.33-16.el8.noarch",
       "python3-markupsafe-0.23-19.el8.x86_64",
-      "python3-netifaces-0.10.6-4.el8.x86_64",
-      "python3-newt-0.52.20-11.el8.x86_64",
       "python3-oauthlib-2.1.0-1.el8.noarch",
       "python3-perf-4.18.0-240.4.el8.x86_64",
       "python3-pip-wheel-9.0.3-18.el8.noarch",
       "python3-ply-3.9-8.el8.noarch",
       "python3-policycoreutils-2.9-9.el8.noarch",
       "python3-prettytable-0.7.2-14.el8.noarch",
-      "python3-pyOpenSSL-18.0.0-1.el8.noarch",
       "python3-pycparser-2.14-14.el8.noarch",
       "python3-pydbus-0.6.0-5.el8.noarch",
       "python3-pyserial-3.1.1-8.el8.noarch",
@@ -9984,8 +9932,6 @@
       "python3-pyudev-0.21.0-7.el8.noarch",
       "python3-pyyaml-3.12-12.el8.x86_64",
       "python3-requests-2.20.0-2.1.el8_1.noarch",
-      "python3-rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64",
-      "python3-rhnlib-2.8.6-8.module+el8.1.0+3455+3ddf2832.noarch",
       "python3-rpm-4.14.3-4.el8.x86_64",
       "python3-schedutils-0.6-6.el8.x86_64",
       "python3-setools-4.3.0-2.el8.x86_64",
@@ -10005,8 +9951,8 @@
       "redhat-logos-81.1-1.el8.x86_64",
       "redhat-release-8.4-0.5.el8.x86_64",
       "redhat-release-eula-8.4-0.5.el8.x86_64",
-      "rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64",
       "rhsm-icons-1.27.16-1.el8.noarch",
+      "rng-tools-6.8-3.el8.x86_64",
       "rootfiles-8.1-22.el8.noarch",
       "rpcbind-1.2.5-7.el8.x86_64",
       "rpm-4.14.3-4.el8.x86_64",
@@ -10048,6 +9994,7 @@
       "tar-1.30-5.el8.x86_64",
       "tcpdump-4.9.3-1.el8.x86_64",
       "teamd-1.31-2.el8.x86_64",
+      "timedatex-0.5-3.el8.x86_64",
       "trousers-0.3.14-4.el8.x86_64",
       "trousers-lib-0.3.14-4.el8.x86_64",
       "tuned-2.14.0-3.el8.noarch",
@@ -10117,6 +10064,7 @@
       "operator:x:11:0:operator:/root:/sbin/nologin",
       "polkitd:x:998:996:User for polkitd:/:/sbin/nologin",
       "redhat:x:1000:1000::/home/redhat:/bin/bash",
+      "rngd:x:991:988:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin",
       "root:x:0:0:root:/root:/bin/bash",
       "rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin",
       "rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin",
@@ -10164,6 +10112,7 @@
       "kexec.target",
       "nfs-blkmap.service",
       "nfs-server.service",
+      "oddjobd.service",
       "poweroff.target",
       "qemu-guest-agent.service",
       "rdisc.service",
@@ -10171,6 +10120,7 @@
       "remote-cryptsetup.target",
       "rhsm-facts.service",
       "rhsm.service",
+      "rngd-wake-threshold.service",
       "runlevel0.target",
       "runlevel6.target",
       "serial-getty@.service",
@@ -10200,6 +10150,7 @@
       "cloud-init.service",
       "crond.service",
       "dbus-org.freedesktop.nm-dispatcher.service",
+      "dbus-org.freedesktop.timedate1.service",
       "dnf-makecache.timer",
       "getty@.service",
       "import-state.service",
@@ -10212,6 +10163,7 @@
       "nis-domainname.service",
       "remote-fs.target",
       "rhsmcertd.service",
+      "rngd.service",
       "rpcbind.service",
       "rpcbind.socket",
       "rsyslog.service",
@@ -10220,9 +10172,10 @@
       "sssd-kcm.socket",
       "sssd.service",
       "syslog.service",
+      "timedatex.service",
       "tuned.service",
       "unbound-anchor.timer"
     ],
     "timezone": "New_York"
   }
-}
+}
\ No newline at end of file
diff --git a/test/data/manifests/rhel_84-x86_64-qcow2-customize.json b/test/data/manifests/rhel_84-x86_64-qcow2-customize.json
index 3dc436645..a6e28f48a 100644
--- a/test/data/manifests/rhel_84-x86_64-qcow2-customize.json
+++ b/test/data/manifests/rhel_84-x86_64-qcow2-customize.json
@@ -139,6 +139,9 @@
           "sha256:09fc3154e76c8ee25b3982c15f3bc455017262c3df5af84075859dcbf79e4f82": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-libsemanage-2.9-3.el8.x86_64.rpm"
           },
+          "sha256:0adaf78120709f5e2c6207bdc1efafb309b1fbd4f7405155645d0b266abcc2df": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-mkhomedir-0.34.5-4.el8.x86_64.rpm"
+          },
           "sha256:0b26e1715694a85c1aa9b940003c8cddb0bc8de9514434f60a1f2f22c467a121": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/grub2-pc-2.02-90.el8.x86_64.rpm"
           },
@@ -286,6 +289,9 @@
           "sha256:28ccf9ff472c824f6c5a3c2a0c076bfa221b8e48368e43de9b3c2e83d67e8b5d": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/mpfr-3.1.6-1.el8.x86_64.rpm"
           },
+          "sha256:28ddc63822e22635ea234bfc182976a16441ce6a8ad05966e3618e692f2c105c": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/authselect-compat-1.2.1-2.el8.x86_64.rpm"
+          },
           "sha256:2a65cec3eb67ba7645dd97cf3f3811cd5fb06eea2526d36a683d3fdaa0f2825e": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/cronie-anacron-1.5.2-4.el8.x86_64.rpm"
           },
@@ -298,9 +304,6 @@
           "sha256:2cfcc3d6163dfaf7ce76998be992bd0b70dd7cbb838430cecf2aff04cd435d24": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/virt-what-1.18-6.el8.x86_64.rpm"
           },
-          "sha256:2e1d3cb29f87138b9f9c5415bf980443ae3ea4929426e79776557dc3c82b8e21": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pyOpenSSL-18.0.0-1.el8.noarch.rpm"
-          },
           "sha256:2e8fd9d87a922b1441538318c401b1e4353b87a9e8000ca76b0cee681ec79c45": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libnghttp2-1.33.0-3.el8_2.1.x86_64.rpm"
           },
@@ -406,9 +409,6 @@
           "sha256:3e9dff1e55f3d4121bb4d85839f0e26a05bb95ed652abbe15535167528226414": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pyserial-3.1.1-8.el8.noarch.rpm"
           },
-          "sha256:3edf7d29e530e6568416d4455e9fbaa511aba236c603da9928e689fae77b9874": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-netifaces-0.10.6-4.el8.x86_64.rpm"
-          },
           "sha256:3f71ec03af43ae8b36714efedb63dbc439259d8c7a321dd6788f74f92987d7c6": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/qemu-img-4.2.0-34.module+el8.3.0+7976+077be4ec.x86_64.rpm"
           },
@@ -442,6 +442,9 @@
           "sha256:4476a92d949229c4eba1fc216356971c400dfcafb7004ad2d321aa9190b34260": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/sssd-nfs-idmap-2.3.0-9.el8.x86_64.rpm"
           },
+          "sha256:45146c375eb639749ed4da202b2b006fce609d585f8125fe8295481a5ef3d07a": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-0.34.5-4.el8.x86_64.rpm"
+          },
           "sha256:45cc50a8b02f9bbbbe2c8c056f34622d15d383f695916ac07821d688fcab1c25": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libzstd-1.4.4-1.el8.x86_64.rpm"
           },
@@ -661,9 +664,6 @@
           "sha256:703f78e932f243ccf2890039ab582176b829f4dfc302a4c9a4e48189eb3a0bd2": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/ca-certificates-2020.2.41-80.0.el8_2.noarch.rpm"
           },
-          "sha256:713ec69b972a8e88622b3fcd3b84fccdbd6c333b68b6c52151c2350edad2576a": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgudev-232-4.el8.x86_64.rpm"
-          },
           "sha256:716bd3f5c05a71ed91a44747c2dac5a93679af31594850f25378970be15e931a": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/grub2-tools-extra-2.02-90.el8.x86_64.rpm"
           },
@@ -856,9 +856,6 @@
           "sha256:995a5401cd86404d14d08c0aeafeaa8da3f540b1806f9d0e233d75dec9e45c74": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/libmaxminddb-1.2.0-10.el8.x86_64.rpm"
           },
-          "sha256:9965cc9389159c9a0ca4e2f6257f756ed5cc77771bde1e27ed4013bbbc20558b": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm"
-          },
           "sha256:9a6eb680e8debcd0b97575a76e9cf0d0655ef7f875b362542e0d129f5e423419": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-iniparse-0.4-31.el8.noarch.rpm"
           },
@@ -883,6 +880,9 @@
           "sha256:9d2a2ef762444163e91c433c83ce91ef37acb2318ba168a81ac0dd4d65b834ef": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/subscription-manager-1.27.16-1.el8.x86_64.rpm"
           },
+          "sha256:9d9d1bdfba4cd852f90232ebe2c4247e7b3a88c4476578c820788a91d6838e55": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/rng-tools-6.8-3.el8.x86_64.rpm"
+          },
           "sha256:9e08c0338eac83abf9a0118cb05fb646d4554c1b2513ab6801e9587aede40b28": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-babel-2.5.1-5.el8.noarch.rpm"
           },
@@ -898,9 +898,6 @@
           "sha256:9fd289f7557c4d6be1fd3eaeea22c626432fddd1a97f9e5f804b6545cc53fcb9": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-ply-3.9-8.el8.noarch.rpm"
           },
-          "sha256:a0f1dd76470a1ecde87526b1429f259033ef3cfd1d019fba0a781910d4d5b61a": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhnlib-2.8.6-8.module+el8.1.0+3455+3ddf2832.noarch.rpm"
-          },
           "sha256:a12d7736b18b1cb21ab10e3b42c303693904e4fa03b772a9a7c9ca8be84f6894": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgcrypt-1.8.5-4.el8.x86_64.rpm"
           },
@@ -1012,9 +1009,6 @@
           "sha256:b446b1469bd535cf94e555525f40fa751b1343d89d589f3cff30ee2d7c38258e": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/hdparm-9.54-2.el8.x86_64.rpm"
           },
-          "sha256:b4e89276818abec218c909ca961db9bb2e09b1fc609ff280e6c05227143fa24d": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-newt-0.52.20-11.el8.x86_64.rpm"
-          },
           "sha256:b4fb3d8b0255a5ba9456b61e4f479f2f8355d171263508bbe869af677015fd97": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/policycoreutils-python-utils-2.9-9.el8.noarch.rpm"
           },
@@ -1063,9 +1057,6 @@
           "sha256:bdd6bd905c3b0275c373d8282af5d82ff6257c521d02781ba2094587886d20f9": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/kernel-tools-libs-4.18.0-240.4.el8.x86_64.rpm"
           },
-          "sha256:bed436b103161f7d8f61b617c84f3a7b5509f1d00c8425900a88c222b1331b31": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm"
-          },
           "sha256:bf05c810e12f5e5b86da335e372e9775c243b72e7fbd224714ef1590ab56b3dc": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/dbus-libs-1.12.8-11.el8.x86_64.rpm"
           },
@@ -1099,9 +1090,6 @@
           "sha256:c46ee71ba426e0964b2264bdf18fc4cff4d7815206c9e8a471bdf678e65c24b9": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libini_config-1.3.1-39.el8.x86_64.rpm"
           },
-          "sha256:c5429b045d9343c672da91167a72f2e10d65dd675322accaeee0b4cc18350362": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-hwdata-2.3.6-3.el8.noarch.rpm"
-          },
           "sha256:c5d0c9a5acc6c2de5e52b38701d6cad5cc37d22c1cb518ca8bcac79bddffaaba": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libappstream-glib-0.7.14-3.el8.x86_64.rpm"
           },
@@ -1192,6 +1180,9 @@
           "sha256:d4736913c9527c97b95cbd12eb3a181c3c980be9c29758fb909f2d60bf378c53": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-urllib3-1.24.2-4.el8.noarch.rpm"
           },
+          "sha256:d4dc248be7aacad57e6684036d48d7fc1697bb0f1aa880c2a77dbd3ed714c642": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/timedatex-0.5-3.el8.x86_64.rpm"
+          },
           "sha256:d570af0578f5b2c6225f1f2354404f65bccf91c3974e98dcbc0c7b55a61b9b46": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/grep-3.1-6.el8.x86_64.rpm"
           },
@@ -1207,9 +1198,6 @@
           "sha256:d7c7ba51c19e80dc07f72cfef5467279ab485c652e144cb790c8ce2471040ece": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/fontconfig-2.13.1-3.el8.x86_64.rpm"
           },
-          "sha256:d80219a299035688091aa230b1c9169143c00c141c4f1ad8e75d176d22cc1cd0": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm"
-          },
           "sha256:d84d9c2262e0ccdff46b3f6363c1a74ef870795947f716ada3d5ccf160d7b433": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/audit-libs-3.0-0.17.20191104git1c2f876.el8.x86_64.rpm"
           },
@@ -1246,9 +1234,6 @@
           "sha256:db8bc154626bdd906a1f50104031a5042bbe91db7f5a1473657795eedd4158c6": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/python3-setools-4.3.0-2.el8.x86_64.rpm"
           },
-          "sha256:dc07cc3536a601e2b7ca0e2823cd437f3a2e6d1d206a06612eee0515eee84b43": {
-            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm"
-          },
           "sha256:dd379385bd1d2e05f50c4795e5a0eff9030fdac0fd2579bb4b56233257672b27": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/dejavu-sans-mono-fonts-2.35-6.el8.noarch.rpm"
           },
@@ -1273,6 +1258,9 @@
           "sha256:e1b2922991a12bcfd754c77baf6278f6f7c91bde603fe67dbd480ac4cf26147c": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libsmartcols-2.32.1-24.el8.x86_64.rpm"
           },
+          "sha256:e22840ee14aa1993e75fd690749c01dbb7d4419c2b210fef173ff99a76f61ff6": {
+            "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/psmisc-23.1-5.el8.x86_64.rpm"
+          },
           "sha256:e233a9ecfbf657192902180f6a67a225e5ec0194834df672eaeb2b3a50e8fb49": {
             "url": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/info-6.5-6.el8.x86_64.rpm"
           },
@@ -2636,9 +2624,6 @@
               {
                 "checksum": "sha256:4bef8c6105544198bc4c5fecd21202bcf7823dda888cbe3fee888ee936c46bd9"
               },
-              {
-                "checksum": "sha256:713ec69b972a8e88622b3fcd3b84fccdbd6c333b68b6c52151c2350edad2576a"
-              },
               {
                 "checksum": "sha256:4a62975251933dcaff77fdbd7704e8a12bea0ecb6eaaae5ea5e552bedd6788ec"
               },
@@ -2990,6 +2975,9 @@
               {
                 "checksum": "sha256:49646b15bc83441dad756598083137562b7b06fe6d88249141b6e3006f703797"
               },
+              {
+                "checksum": "sha256:e22840ee14aa1993e75fd690749c01dbb7d4419c2b210fef173ff99a76f61ff6"
+              },
               {
                 "checksum": "sha256:f8c191d8b952621d10a1055be960bbe07be66f557c5a9d007f8908abcde1b9af"
               },
@@ -3161,6 +3149,9 @@
               {
                 "checksum": "sha256:9be187fd62ada3a61cb494a383b8a60fd6c705c93897a13051600dbbeb1d914f"
               },
+              {
+                "checksum": "sha256:9d9d1bdfba4cd852f90232ebe2c4247e7b3a88c4476578c820788a91d6838e55"
+              },
               {
                 "checksum": "sha256:ad060f60303b6764e08657436147cc24cfc4bb1ccc1431796407ba005a7bcec0"
               },
@@ -3269,6 +3260,9 @@
               {
                 "checksum": "sha256:9137a707b7793567b38e7d8dba78fcf3f70c39320e68a9ee0b745b3a77f182ee"
               },
+              {
+                "checksum": "sha256:d4dc248be7aacad57e6684036d48d7fc1697bb0f1aa880c2a77dbd3ed714c642"
+              },
               {
                 "checksum": "sha256:a16b38fc2975ab7c8b6200fafb7e577c7434c5c0ab0683653f1f4f630e05a053"
               },
@@ -3323,6 +3317,9 @@
               {
                 "checksum": "sha256:1594afba86593ec614299ef6af255755a98ea55a34a72a22fdc9d80a040be39d"
               },
+              {
+                "checksum": "sha256:28ddc63822e22635ea234bfc182976a16441ce6a8ad05966e3618e692f2c105c"
+              },
               {
                 "checksum": "sha256:7d0bc4f2f78166013ef160ed10930a4902c7c5c6d6b7940fc900d36eaacc65a2"
               },
@@ -3335,9 +3332,6 @@
               {
                 "checksum": "sha256:664a883f3c7042eb91e0b66fc99c309a729011b4912e4af9397f4e25e1adae90"
               },
-              {
-                "checksum": "sha256:9965cc9389159c9a0ca4e2f6257f756ed5cc77771bde1e27ed4013bbbc20558b"
-              },
               {
                 "checksum": "sha256:19dba7cb30c3cb598886326df0ec1114c6e195a57c9ce3a8b78b83555e9e8648"
               },
@@ -3377,6 +3371,12 @@
               {
                 "checksum": "sha256:25b13ea50e21233dc5fccf42da344fbf24605dde38db9b94e49739ae39faa072"
               },
+              {
+                "checksum": "sha256:45146c375eb639749ed4da202b2b006fce609d585f8125fe8295481a5ef3d07a"
+              },
+              {
+                "checksum": "sha256:0adaf78120709f5e2c6207bdc1efafb309b1fbd4f7405155645d0b266abcc2df"
+              },
               {
                 "checksum": "sha256:7bb63c8b955ff7f993877c0323e8bc17c6d85c7a8e844db9e9980a9ca7a227c5"
               },
@@ -3389,15 +3389,9 @@
               {
                 "checksum": "sha256:8caac6d04fc98a82d17af56a8faacd1e1a019112ba207388fb82ffdd6df54301"
               },
-              {
-                "checksum": "sha256:dc07cc3536a601e2b7ca0e2823cd437f3a2e6d1d206a06612eee0515eee84b43"
-              },
               {
                 "checksum": "sha256:4229196b5ea88c1133d5509a2ec326093a2c7ac5566ca4abb55c3d6fab47130a"
               },
-              {
-                "checksum": "sha256:c5429b045d9343c672da91167a72f2e10d65dd675322accaeee0b4cc18350362"
-              },
               {
                 "checksum": "sha256:0899ddc5a37434135f1f8402aafde3228db6bdbb71cb4e9401c1ed53524c3d64"
               },
@@ -3413,18 +3407,9 @@
               {
                 "checksum": "sha256:e868499743c399baa6463fa64a2534a7d32f8e1cca7b1b47ec00c60b34250bfe"
               },
-              {
-                "checksum": "sha256:3edf7d29e530e6568416d4455e9fbaa511aba236c603da9928e689fae77b9874"
-              },
-              {
-                "checksum": "sha256:b4e89276818abec218c909ca961db9bb2e09b1fc609ff280e6c05227143fa24d"
-              },
               {
                 "checksum": "sha256:076bdcf066fabe9c611ceee12665d735136ecd306ec4c1e608bb1e0a4704ae55"
               },
-              {
-                "checksum": "sha256:2e1d3cb29f87138b9f9c5415bf980443ae3ea4929426e79776557dc3c82b8e21"
-              },
               {
                 "checksum": "sha256:fd75c594f871a3353d326833e630ea1d28e5f446f796b836dc628f8c9c039f88"
               },
@@ -3434,12 +3419,6 @@
               {
                 "checksum": "sha256:ccfdbebdf0575395a80f2fa55e49c8358ca601fdbb0685f37e8c584226264eca"
               },
-              {
-                "checksum": "sha256:bed436b103161f7d8f61b617c84f3a7b5509f1d00c8425900a88c222b1331b31"
-              },
-              {
-                "checksum": "sha256:a0f1dd76470a1ecde87526b1429f259033ef3cfd1d019fba0a781910d4d5b61a"
-              },
               {
                 "checksum": "sha256:534bbf990d0f0537715561c818c2b68f10e6ba0cc1252a32a0696f1e22fde1e3"
               },
@@ -3449,9 +3428,6 @@
               {
                 "checksum": "sha256:c6d206d56b73ec65ae9d4e7e872d200b9d7064d7d7b544ec3d8f5237edd37d09"
               },
-              {
-                "checksum": "sha256:d80219a299035688091aa230b1c9169143c00c141c4f1ad8e75d176d22cc1cd0"
-              },
               {
                 "checksum": "sha256:5ef47eb6a042a13c902764907692c1068eb0f69153b47bc85792bef74bfa852b"
               },
@@ -3578,11 +3554,13 @@
           "name": "org.osbuild.systemd",
           "options": {
             "enabled_services": [
+              "rngd.service",
               "sshd.socket"
             ],
             "disabled_services": [
               "bluetooth.service"
-            ]
+            ],
+            "default_target": "multi-user.target"
           }
         },
         {
@@ -7098,15 +7076,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgpg-error-1.31-1.el8.x86_64.rpm",
         "checksum": "sha256:4bef8c6105544198bc4c5fecd21202bcf7823dda888cbe3fee888ee936c46bd9"
       },
-      {
-        "name": "libgudev",
-        "epoch": 0,
-        "version": "232",
-        "release": "4.el8",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/libgudev-232-4.el8.x86_64.rpm",
-        "checksum": "sha256:713ec69b972a8e88622b3fcd3b84fccdbd6c333b68b6c52151c2350edad2576a"
-      },
       {
         "name": "libidn2",
         "epoch": 0,
@@ -8160,6 +8129,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/procps-ng-3.3.15-3.el8.x86_64.rpm",
         "checksum": "sha256:49646b15bc83441dad756598083137562b7b06fe6d88249141b6e3006f703797"
       },
+      {
+        "name": "psmisc",
+        "epoch": 0,
+        "version": "23.1",
+        "release": "5.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/psmisc-23.1-5.el8.x86_64.rpm",
+        "checksum": "sha256:e22840ee14aa1993e75fd690749c01dbb7d4419c2b210fef173ff99a76f61ff6"
+      },
       {
         "name": "publicsuffix-list-dafsa",
         "epoch": 0,
@@ -8673,6 +8651,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/rhsm-icons-1.27.16-1.el8.noarch.rpm",
         "checksum": "sha256:9be187fd62ada3a61cb494a383b8a60fd6c705c93897a13051600dbbeb1d914f"
       },
+      {
+        "name": "rng-tools",
+        "epoch": 0,
+        "version": "6.8",
+        "release": "3.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/rng-tools-6.8-3.el8.x86_64.rpm",
+        "checksum": "sha256:9d9d1bdfba4cd852f90232ebe2c4247e7b3a88c4476578c820788a91d6838e55"
+      },
       {
         "name": "rootfiles",
         "epoch": 0,
@@ -8997,6 +8984,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/teamd-1.31-2.el8.x86_64.rpm",
         "checksum": "sha256:9137a707b7793567b38e7d8dba78fcf3f70c39320e68a9ee0b745b3a77f182ee"
       },
+      {
+        "name": "timedatex",
+        "epoch": 0,
+        "version": "0.5",
+        "release": "3.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201010/Packages/timedatex-0.5-3.el8.x86_64.rpm",
+        "checksum": "sha256:d4dc248be7aacad57e6684036d48d7fc1697bb0f1aa880c2a77dbd3ed714c642"
+      },
       {
         "name": "trousers",
         "epoch": 0,
@@ -9159,6 +9155,15 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/abattis-cantarell-fonts-0.0.25-4.el8.noarch.rpm",
         "checksum": "sha256:1594afba86593ec614299ef6af255755a98ea55a34a72a22fdc9d80a040be39d"
       },
+      {
+        "name": "authselect-compat",
+        "epoch": 0,
+        "version": "1.2.1",
+        "release": "2.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/authselect-compat-1.2.1-2.el8.x86_64.rpm",
+        "checksum": "sha256:28ddc63822e22635ea234bfc182976a16441ce6a8ad05966e3618e692f2c105c"
+      },
       {
         "name": "cairo",
         "epoch": 0,
@@ -9195,15 +9200,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/cloud-utils-growpart-0.31-1.el8.noarch.rpm",
         "checksum": "sha256:664a883f3c7042eb91e0b66fc99c309a729011b4912e4af9397f4e25e1adae90"
       },
-      {
-        "name": "dnf-plugin-spacewalk",
-        "epoch": 0,
-        "version": "2.8.5",
-        "release": "11.module+el8.1.0+3455+3ddf2832",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm",
-        "checksum": "sha256:9965cc9389159c9a0ca4e2f6257f756ed5cc77771bde1e27ed4013bbbc20558b"
-      },
       {
         "name": "geolite2-city",
         "epoch": 0,
@@ -9321,6 +9317,24 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/libxkbcommon-0.9.1-1.el8.x86_64.rpm",
         "checksum": "sha256:25b13ea50e21233dc5fccf42da344fbf24605dde38db9b94e49739ae39faa072"
       },
+      {
+        "name": "oddjob",
+        "epoch": 0,
+        "version": "0.34.5",
+        "release": "4.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-0.34.5-4.el8.x86_64.rpm",
+        "checksum": "sha256:45146c375eb639749ed4da202b2b006fce609d585f8125fe8295481a5ef3d07a"
+      },
+      {
+        "name": "oddjob-mkhomedir",
+        "epoch": 0,
+        "version": "0.34.5",
+        "release": "4.el8",
+        "arch": "x86_64",
+        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/oddjob-mkhomedir-0.34.5-4.el8.x86_64.rpm",
+        "checksum": "sha256:0adaf78120709f5e2c6207bdc1efafb309b1fbd4f7405155645d0b266abcc2df"
+      },
       {
         "name": "pinentry",
         "epoch": 0,
@@ -9357,15 +9371,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-cairo-1.16.3-6.el8.x86_64.rpm",
         "checksum": "sha256:8caac6d04fc98a82d17af56a8faacd1e1a019112ba207388fb82ffdd6df54301"
       },
-      {
-        "name": "python3-dnf-plugin-spacewalk",
-        "epoch": 0,
-        "version": "2.8.5",
-        "release": "11.module+el8.1.0+3455+3ddf2832",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch.rpm",
-        "checksum": "sha256:dc07cc3536a601e2b7ca0e2823cd437f3a2e6d1d206a06612eee0515eee84b43"
-      },
       {
         "name": "python3-gobject",
         "epoch": 0,
@@ -9375,15 +9380,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-gobject-3.28.3-2.el8.x86_64.rpm",
         "checksum": "sha256:4229196b5ea88c1133d5509a2ec326093a2c7ac5566ca4abb55c3d6fab47130a"
       },
-      {
-        "name": "python3-hwdata",
-        "epoch": 0,
-        "version": "2.3.6",
-        "release": "3.el8",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-hwdata-2.3.6-3.el8.noarch.rpm",
-        "checksum": "sha256:c5429b045d9343c672da91167a72f2e10d65dd675322accaeee0b4cc18350362"
-      },
       {
         "name": "python3-jinja2",
         "epoch": 0,
@@ -9429,24 +9425,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-markupsafe-0.23-19.el8.x86_64.rpm",
         "checksum": "sha256:e868499743c399baa6463fa64a2534a7d32f8e1cca7b1b47ec00c60b34250bfe"
       },
-      {
-        "name": "python3-netifaces",
-        "epoch": 0,
-        "version": "0.10.6",
-        "release": "4.el8",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-netifaces-0.10.6-4.el8.x86_64.rpm",
-        "checksum": "sha256:3edf7d29e530e6568416d4455e9fbaa511aba236c603da9928e689fae77b9874"
-      },
-      {
-        "name": "python3-newt",
-        "epoch": 0,
-        "version": "0.52.20",
-        "release": "11.el8",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-newt-0.52.20-11.el8.x86_64.rpm",
-        "checksum": "sha256:b4e89276818abec218c909ca961db9bb2e09b1fc609ff280e6c05227143fa24d"
-      },
       {
         "name": "python3-prettytable",
         "epoch": 0,
@@ -9456,15 +9434,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-prettytable-0.7.2-14.el8.noarch.rpm",
         "checksum": "sha256:076bdcf066fabe9c611ceee12665d735136ecd306ec4c1e608bb1e0a4704ae55"
       },
-      {
-        "name": "python3-pyOpenSSL",
-        "epoch": 0,
-        "version": "18.0.0",
-        "release": "1.el8",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pyOpenSSL-18.0.0-1.el8.noarch.rpm",
-        "checksum": "sha256:2e1d3cb29f87138b9f9c5415bf980443ae3ea4929426e79776557dc3c82b8e21"
-      },
       {
         "name": "python3-pydbus",
         "epoch": 0,
@@ -9492,24 +9461,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-pytz-2017.2-9.el8.noarch.rpm",
         "checksum": "sha256:ccfdbebdf0575395a80f2fa55e49c8358ca601fdbb0685f37e8c584226264eca"
       },
-      {
-        "name": "python3-rhn-client-tools",
-        "epoch": 0,
-        "version": "2.8.16",
-        "release": "13.module+el8.1.0+3455+3ddf2832",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm",
-        "checksum": "sha256:bed436b103161f7d8f61b617c84f3a7b5509f1d00c8425900a88c222b1331b31"
-      },
-      {
-        "name": "python3-rhnlib",
-        "epoch": 0,
-        "version": "2.8.6",
-        "release": "8.module+el8.1.0+3455+3ddf2832",
-        "arch": "noarch",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/python3-rhnlib-2.8.6-8.module+el8.1.0+3455+3ddf2832.noarch.rpm",
-        "checksum": "sha256:a0f1dd76470a1ecde87526b1429f259033ef3cfd1d019fba0a781910d4d5b61a"
-      },
       {
         "name": "python3-systemd",
         "epoch": 0,
@@ -9537,15 +9488,6 @@
         "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/qemu-guest-agent-4.2.0-34.module+el8.3.0+7976+077be4ec.x86_64.rpm",
         "checksum": "sha256:c6d206d56b73ec65ae9d4e7e872d200b9d7064d7d7b544ec3d8f5237edd37d09"
       },
-      {
-        "name": "rhn-client-tools",
-        "epoch": 0,
-        "version": "2.8.16",
-        "release": "13.module+el8.1.0+3455+3ddf2832",
-        "arch": "x86_64",
-        "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201010/Packages/rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64.rpm",
-        "checksum": "sha256:d80219a299035688091aa230b1c9169143c00c141c4f1ad8e75d176d22cc1cd0"
-      },
       {
         "name": "rsyslog",
         "epoch": 0,
@@ -9633,6 +9575,7 @@
         "version": "4.18.0-240.4.el8.x86_64"
       }
     ],
+    "default-target": "multi-user.target",
     "fstab": [
       [
         "UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8",
@@ -9679,6 +9622,7 @@
       "nobody:x:65534:",
       "polkitd:x:996:",
       "render:x:998:",
+      "rngd:x:988:",
       "root:x:0:",
       "rpc:x:32:",
       "rpcuser:x:29:",
@@ -9733,6 +9677,7 @@
       "audit-3.0-0.17.20191104git1c2f876.el8.x86_64",
       "audit-libs-3.0-0.17.20191104git1c2f876.el8.x86_64",
       "authselect-1.2.1-2.el8.x86_64",
+      "authselect-compat-1.2.1-2.el8.x86_64",
       "authselect-libs-1.2.1-2.el8.x86_64",
       "basesystem-11-5.el8.noarch",
       "bash-4.4.19-12.el8.x86_64",
@@ -9783,7 +9728,6 @@
       "dmidecode-3.2-6.el8.x86_64",
       "dnf-4.2.23-4.el8.noarch",
       "dnf-data-4.2.23-4.el8.noarch",
-      "dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch",
       "dnf-plugin-subscription-manager-1.27.16-1.el8.x86_64",
       "dnf-plugins-core-4.0.17-5.el8.noarch",
       "dosfstools-4.1-6.el8.x86_64",
@@ -9910,7 +9854,6 @@
       "libgcrypt-1.8.5-4.el8.x86_64",
       "libgomp-8.4.1-1.el8.x86_64",
       "libgpg-error-1.31-1.el8.x86_64",
-      "libgudev-232-4.el8.x86_64",
       "libidn2-2.2.0-1.el8.x86_64",
       "libini_config-1.3.1-39.el8.x86_64",
       "libkcapi-1.2.0-2.el8.x86_64",
@@ -10002,6 +9945,8 @@
       "nfs-utils-2.3.3-35.el8.x86_64",
       "npth-1.5-4.el8.x86_64",
       "numactl-libs-2.0.12-11.el8.x86_64",
+      "oddjob-0.34.5-4.el8.x86_64",
+      "oddjob-mkhomedir-0.34.5-4.el8.x86_64",
       "openldap-2.4.46-16.el8.x86_64",
       "openssh-8.0p1-5.el8.x86_64",
       "openssh-clients-8.0p1-5.el8.x86_64",
@@ -10033,6 +9978,7 @@
       "popt-1.16-14.el8.x86_64",
       "prefixdevname-0.1.0-6.el8.x86_64",
       "procps-ng-3.3.15-3.el8.x86_64",
+      "psmisc-23.1-5.el8.x86_64",
       "publicsuffix-list-dafsa-20180723-1.el8.noarch",
       "python3-asn1crypto-0.24.0-3.el8.noarch",
       "python3-audit-3.0-0.17.20191104git1c2f876.el8.x86_64",
@@ -10047,14 +9993,12 @@
       "python3-decorator-4.2.1-2.el8.noarch",
       "python3-dmidecode-3.12.2-15.el8.x86_64",
       "python3-dnf-4.2.23-4.el8.noarch",
-      "python3-dnf-plugin-spacewalk-2.8.5-11.module+el8.1.0+3455+3ddf2832.noarch",
       "python3-dnf-plugins-core-4.0.17-5.el8.noarch",
       "python3-ethtool-0.14-3.el8.x86_64",
       "python3-gobject-3.28.3-2.el8.x86_64",
       "python3-gobject-base-3.28.3-2.el8.x86_64",
       "python3-gpg-1.13.1-4.el8.x86_64",
       "python3-hawkey-0.48.0-5.el8.x86_64",
-      "python3-hwdata-2.3.6-3.el8.noarch",
       "python3-idna-2.5-5.el8.noarch",
       "python3-iniparse-0.4-31.el8.noarch",
       "python3-inotify-0.9.6-13.el8.noarch",
@@ -10073,15 +10017,12 @@
       "python3-linux-procfs-0.6.2-2.el8.noarch",
       "python3-magic-5.33-16.el8.noarch",
       "python3-markupsafe-0.23-19.el8.x86_64",
-      "python3-netifaces-0.10.6-4.el8.x86_64",
-      "python3-newt-0.52.20-11.el8.x86_64",
       "python3-oauthlib-2.1.0-1.el8.noarch",
       "python3-perf-4.18.0-240.4.el8.x86_64",
       "python3-pip-wheel-9.0.3-18.el8.noarch",
       "python3-ply-3.9-8.el8.noarch",
       "python3-policycoreutils-2.9-9.el8.noarch",
       "python3-prettytable-0.7.2-14.el8.noarch",
-      "python3-pyOpenSSL-18.0.0-1.el8.noarch",
       "python3-pycparser-2.14-14.el8.noarch",
       "python3-pydbus-0.6.0-5.el8.noarch",
       "python3-pyserial-3.1.1-8.el8.noarch",
@@ -10090,8 +10031,6 @@
       "python3-pyudev-0.21.0-7.el8.noarch",
       "python3-pyyaml-3.12-12.el8.x86_64",
       "python3-requests-2.20.0-2.1.el8_1.noarch",
-      "python3-rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64",
-      "python3-rhnlib-2.8.6-8.module+el8.1.0+3455+3ddf2832.noarch",
       "python3-rpm-4.14.3-4.el8.x86_64",
       "python3-schedutils-0.6-6.el8.x86_64",
       "python3-setools-4.3.0-2.el8.x86_64",
@@ -10111,8 +10050,8 @@
       "redhat-logos-81.1-1.el8.x86_64",
       "redhat-release-8.4-0.5.el8.x86_64",
       "redhat-release-eula-8.4-0.5.el8.x86_64",
-      "rhn-client-tools-2.8.16-13.module+el8.1.0+3455+3ddf2832.x86_64",
       "rhsm-icons-1.27.16-1.el8.noarch",
+      "rng-tools-6.8-3.el8.x86_64",
       "rootfiles-8.1-22.el8.noarch",
       "rpcbind-1.2.5-7.el8.x86_64",
       "rpm-4.14.3-4.el8.x86_64",
@@ -10154,6 +10093,7 @@
       "tar-1.30-5.el8.x86_64",
       "tcpdump-4.9.3-1.el8.x86_64",
       "teamd-1.31-2.el8.x86_64",
+      "timedatex-0.5-3.el8.x86_64",
       "trousers-0.3.14-4.el8.x86_64",
       "trousers-lib-0.3.14-4.el8.x86_64",
       "tuned-2.14.0-3.el8.noarch",
@@ -10222,6 +10162,7 @@
       "nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin",
       "operator:x:11:0:operator:/root:/sbin/nologin",
       "polkitd:x:998:996:User for polkitd:/:/sbin/nologin",
+      "rngd:x:991:988:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin",
       "root:x:0:0:root:/root:/bin/bash",
       "rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin",
       "rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin",
@@ -10272,6 +10213,7 @@
       "kexec.target",
       "nfs-blkmap.service",
       "nfs-server.service",
+      "oddjobd.service",
       "poweroff.target",
       "qemu-guest-agent.service",
       "rdisc.service",
@@ -10279,6 +10221,7 @@
       "remote-cryptsetup.target",
       "rhsm-facts.service",
       "rhsm.service",
+      "rngd-wake-threshold.service",
       "runlevel0.target",
       "runlevel6.target",
       "serial-getty@.service",
@@ -10307,6 +10250,7 @@
       "cloud-init.service",
       "crond.service",
       "dbus-org.freedesktop.nm-dispatcher.service",
+      "dbus-org.freedesktop.timedate1.service",
       "dnf-makecache.timer",
       "getty@.service",
       "import-state.service",
@@ -10319,6 +10263,7 @@
       "nis-domainname.service",
       "remote-fs.target",
       "rhsmcertd.service",
+      "rngd.service",
       "rpcbind.service",
       "rpcbind.socket",
       "rsyslog.service",
@@ -10328,9 +10273,10 @@
       "sssd-kcm.socket",
       "sssd.service",
       "syslog.service",
+      "timedatex.service",
       "tuned.service",
       "unbound-anchor.timer"
     ],
     "timezone": "London"
   }
-}
+}
\ No newline at end of file
diff --git a/test/data/manifests/rhel_84-x86_64-vhd-boot.json b/test/data/manifests/rhel_84-x86_64-vhd-boot.json
index e83c26863..d987d4682 100644
--- a/test/data/manifests/rhel_84-x86_64-vhd-boot.json
+++ b/test/data/manifests/rhel_84-x86_64-vhd-boot.json
@@ -9104,6 +9104,7 @@
         "version": "4.18.0-240.4.el8.x86_64"
       }
     ],
+    "default-target": "multi-user.target",
     "firewall-enabled": [
       "ssh",
       "dhcpv6-client",
diff --git a/test/data/manifests/rhel_84-x86_64-vmdk-boot.json b/test/data/manifests/rhel_84-x86_64-vmdk-boot.json
index da56828c7..809624674 100644
--- a/test/data/manifests/rhel_84-x86_64-vmdk-boot.json
+++ b/test/data/manifests/rhel_84-x86_64-vmdk-boot.json
@@ -8740,6 +8740,7 @@
         "version": "4.18.0-240.4.el8.x86_64"
       }
     ],
+    "default-target": "graphical.target",
     "firewall-enabled": [
       "ssh",
       "dhcpv6-client",