diff --git a/instruqt/airgap-embedded/01-prepare-your-jumpbox/assignment.md b/instruqt/airgap-embedded/01-prepare-your-jumpbox/assignment.md
deleted file mode 100755
index e80bae206..000000000
--- a/instruqt/airgap-embedded/01-prepare-your-jumpbox/assignment.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-slug: prepare-your-jumpbox
-id: ztordyohaj5l
-type: challenge
-title: Prepare Your Environment
-teaser: Prepare your jumpbox environment for interacting with Replicated
-notes:
-- type: text
- contents: "\U0001F44B Introduction\n===============\n\nIn this exercise you will
- learn how to perform installations in air gap environments, and\nhow to collect
- support bundles in air gap environments.\n\n* **What you will do**:\n * Access
- and verify a single-node air gap setup via a bastion server\n * Learn to use
- KOTS to install in an air gap environment\n * Create an SSH tunnel to configure
- an air gap instance\n * Perform an upgrade of an application runnning in an
- air gap\n * Collect a support bundle in an air-gapped environment\n* **Who
- this is for**: This lab is for anyone who builds/maintains KOTS applications (see\n
- \ note below)\n * Full Stack / DevOps / Product Engineers\n* **Outcomes**:\n
- \ * You will be ready to deliver a KOTS application into an air gap environment\n
- \ * You will build confidence in performing upgrades and troubleshooting in\n
- \ air gap environments\n"
-- type: text
- contents: "\U0001F512 Packaging\n============\nFirst, we'll push a release -- in
- the background, Replicated's air gap builder will prepare an air gap bundle.\n"
-- type: text
- contents: "\U0001F512 Delivery\n===========\n\nNext, we'll collect a license file,\n
- \ a download link, and a public kURL bundle.\n\n\n"
-- type: text
- contents: "\U0001F512 Deployment\n============\n\nFrom there, we'll move all three
- artifacts into the datacenter via a jump box.\n\n\n\nThe
- above diagram shows a three node cluster, but we'll use only a single node.\nWhile
- the KOTS bundle will be moved onto the server via SCP as in the diagram,\nthe
- app bundle and license file will be uploaded via a browser UI through an SSH tunnel.\n"
-tabs:
-- title: Shell
- type: terminal
- hostname: jumpbox
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 300
----
-
-š Let's start
-==============
-
-## Connecting to the Replicated Vendor Portal
-
-Log into the Replicated Vendor Portal in the "Vendor Portal" tab using the following credentials
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="jumpbox" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="jumpbox" ]]`
-
-
-
-### Configure environment
-
-When you log in, you'll be on our release channels page.
-
-
-
-Go from the channels page to the settings page to see the application slug. The slug is how the
-Replicated CLI and API uniquely identify applications. We'll need to know the slug to use the
-CLI later in the lab.
-
-
-
-When you go back to the "Shell" tab you'll set the variable `REPLICATED_APP` to the app slug. This tells
-the `replicated` command which application you are working on without you having to passing it as
-an argument to every command.
-
-The other thing you need to work with your application is an API token. You
-would usually create `read/write` User API token from the [Account
-Settings](https://vendor.replicated.com/account-settings) page. For this lab,
-we've created one for you. You set the variable `REPLICATED_API_TOKEN` to the
-value of the token.
-
-Set the environment variables in your shell.
-
-```
-export REPLICATED_APP=[[ Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]
-export REPLICATED_API_TOKEN=[[Instruqt-Var key="REPLICATED_API_TOKEN" hostname="jumpbox"]]
-```
-
-You can ensure you are authenticated and using the right application by running
-
-```
-replicated release ls
-```
-
-If you see a list of releases everything is configured correctly.
-
-```
-SEQUENCE CREATED EDITED ACTIVE_CHANNELS
-1 2023-06-23T00:45:18Z 0001-01-01T00:00:00Z Unstable
-```
diff --git a/instruqt/airgap-embedded/01-prepare-your-jumpbox/check-jumpbox b/instruqt/airgap-embedded/01-prepare-your-jumpbox/check-jumpbox
deleted file mode 100644
index 2662cf172..000000000
--- a/instruqt/airgap-embedded/01-prepare-your-jumpbox/check-jumpbox
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# save the session
-tmux capture-pane -t airgap -S -
-SESSION=$(tmux save-buffer -)
-
-if ! grep -qE "REPLICATED_API_TOKEN=[[:alnum:]]+" <(echo ${SESSION}) ; then
- fail-message "Please make sure you've set your API token"
- exit 1
-fi
-
-if ! grep -qE "REPLICATED_APP=\w+" <(echo ${SESSION}) ; then
- fail-message "Please make sure you've set your Replicated app slug"
- exit 1
-fi
-
-exit 0
diff --git a/instruqt/airgap-embedded/01-prepare-your-jumpbox/cleanup-jumpbox b/instruqt/airgap-embedded/01-prepare-your-jumpbox/cleanup-jumpbox
deleted file mode 100755
index a1e1909d1..000000000
--- a/instruqt/airgap-embedded/01-prepare-your-jumpbox/cleanup-jumpbox
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t airgap
-tmux send-keys -t airgap clear ENTER
-
-exit 0
diff --git a/instruqt/airgap-embedded/01-prepare-your-jumpbox/setup-jumpbox b/instruqt/airgap-embedded/01-prepare-your-jumpbox/setup-jumpbox
deleted file mode 100755
index af48a8bf6..000000000
--- a/instruqt/airgap-embedded/01-prepare-your-jumpbox/setup-jumpbox
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-source /etc/profile.d/header.sh
-
-HOME_DIR=/home/replicant
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-# get a token and the app slug
-access_token=$(get_api_token)
-app_slug=$(curl --header 'Accept: application/json' --header "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].slug')
-
-# Display PARTICIPANT_ID info for Vendor Por
-agent variable set USERNAME $(get_username)
-agent variable set PASSWORD $(get_password)
-agent variable set REPLICATED_API_TOKEN ${access_token}
-agent variable set REPLICATED_APP ${app_slug}
diff --git a/instruqt/airgap-embedded/01-prepare-your-jumpbox/solve-jumpbox b/instruqt/airgap-embedded/01-prepare-your-jumpbox/solve-jumpbox
deleted file mode 100644
index 18e7bd54d..000000000
--- a/instruqt/airgap-embedded/01-prepare-your-jumpbox/solve-jumpbox
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-### Assure the tmux session exists
-#
-# In a test scenario Instuqt does not run the user shell for the
-# challenge, which means the tmux session is never established. We
-# need to session for the solve scripts for other challenges to
-# succeed, so let's create it here.
-#
-
-if ! tmux has-session -t airgap ; then
- tmux new-session -d -s airgap su - replicant
-fi
-
-### Set the required environment variables
-source /etc/profile.d/header.sh
-username="${INSTRUQT_PARTICIPANT_ID}@replicated-labs.com"
-password=$(get_password)
-
-login_request=$( jq -n -c --arg email "${username}" --arg password "${password}" '$ARGS.named' )
-token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login_request" https://id.replicated.com/v1/login | jq -r ".token")
-
-i=0
-while [[ "$token" == "null" && $i -lt 20 ]]
-do
- sleep 2
- set +u
- token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login_request" https://id.replicated.com/v1/login | jq -r ".token")
- echo $token
- set -u
- i=$((i+1))
-done
-
-UUID=$(cat /proc/sys/kernel/random/uuid)
-api_token=$( jq -n -c --arg name "instruqt-${UUID}" --argjson read_only false '$ARGS.named' )
-access_token=$(curl -s -H "Content-Type: application/json" -H "Authorization: $token" --request POST -d "$api_token" https://api.replicated.com/vendor/v1/user/token | jq -r ".access_token")
-app_slug=$(curl -s -H "Content-Type: application/json" -H "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq --raw-output ".apps [] | select(.name | test(\".*${INSTRUQT_PARTICIPANT_ID}.*\")).slug")
-
-tmux send-keys -t airgap export SPACE REPLICATED_API_TOKEN=${access_token} ENTER
-tmux send-keys -t airgap export SPACE REPLICATED_APP=${app_slug} ENTER
diff --git a/instruqt/airgap-embedded/02-airgap-deployment-assets/assignment.md b/instruqt/airgap-embedded/02-airgap-deployment-assets/assignment.md
deleted file mode 100755
index 05235cbfe..000000000
--- a/instruqt/airgap-embedded/02-airgap-deployment-assets/assignment.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-slug: airgap-deployment-assets
-id: cqt3rfjrlyp8
-type: challenge
-title: Air Gap Deployment Assets
-teaser: The files you need to deploy your air-gapped instance
-notes:
-- type: text
- contents: Let's learn the assets that make up your air-gapped deployment
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-difficulty: basic
-timelimit: 800
----
-
-Air Gap Deployment Assets
-=========================
-
-Our next step is to collect the assets we need for an Air Gap installation:
-
-1. A license with the Air Gap entitlement enabled
-2. An Air Gap bundle containing the kURL cluster components
-3. An Air Gap bundle containing the application components
-
-Items (2) and (3) are separate artifacts to cut down on bundle size during
-upgrade scenarios where only the application version is changing and the
-underlying cluster does not need to change.
-
-Starting the kURL Bundle Download
-=================================
-
-We're going to start with downloading the bundle for the kURL cluster. This will
-turn our air-gapped instance into a single-node Kubernetes cluster which in
-turn will run our application. We start with the cluster download since it's
-the largest of the three assets and we can download the others while its
-download is running.
-
-From the "Jumpbox" tab, run the command below:
-
-```
-replicated channel inspect Unstable
-```
-
-This command shows you the details of the `Unstable` release channel,
-which we'll use for the air-gap install.
-
-The channel details include the information you need to install the
-application in one of three ways: into an existing (connected) cluster,
-onto a connected machine without a pre-existing clsuter available (the
-install includes its own "embedded" cluster"), and onto an
-air-gapped machine. The air-gapped install method also includes it's
-own cluster.
-
-```text
-ID: 2GSbRtgZKeOTmjsU87d1lhE8Qdq
-NAME: Unstable
-DESCRIPTION:
-RELEASE: 1
-VERSION: 0.0.1
-EXISTING:
-
- curl -fsSL https://kots.io/install | bash
- kubectl kots install [[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]/unstable
-
-EMBEDDED:
-
- curl -fsSL https://k8s.kurl.sh/[[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]-unstable | sudo bash
-
-AIRGAP:
- curl -fSL -o [[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]-unstable.tar.gz https://k8s.kurl.sh/bundle/installing-in-an-air-gapped-environment-q4b0wn3mzsqj-unstable.tar.gz
- # ... scp or sneakernet [[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]-unstable.tar.gz to airgapped machine, then
- tar xvf [[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]-unstable.tar.gz
- sudo bash ./install.sh airgap
-```
-
-The file download we're interested in is in the `AIRGAP` section of the
-output. We're going to run the first command in that list to get the bundle
-onto our jumpbox.
-
-```bash
-curl -fSL -o [[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]-unstable.tar.gz https://k8s.kurl.sh/bundle/[[Instruqt-Var key="REPLICATED_APP" hostname="jumpbox"]]-unstable.tar.gz
-```
-
-This will take several minutes, leave this running and proceed to the next step, we'll come back in a few minutes.
-
diff --git a/instruqt/airgap-embedded/02-airgap-deployment-assets/check-jumpbox b/instruqt/airgap-embedded/02-airgap-deployment-assets/check-jumpbox
deleted file mode 100755
index f57fc2544..000000000
--- a/instruqt/airgap-embedded/02-airgap-deployment-assets/check-jumpbox
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-REPLICANT_HOME=/home/replicant
-
-if ! find ${REPLICANT_HOME} -name "installing-in-an-air-gapped-environment-*-unstable.tar.gz" > /dev/null 2>&1 ; then
- fail-message "You do not appear to have started downloading the bundle, please start the download before continuing"
- exit 1
-fi
diff --git a/instruqt/airgap-embedded/02-airgap-deployment-assets/solve-jumpbox b/instruqt/airgap-embedded/02-airgap-deployment-assets/solve-jumpbox
deleted file mode 100644
index d1a4fa398..000000000
--- a/instruqt/airgap-embedded/02-airgap-deployment-assets/solve-jumpbox
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-tmux send-keys -t airgap curl SPACE -fSL SPACE -o SPACE installing-in-an-air-gapped-environment-${INSTRUQT_PARTICIPANT_ID}-unstable.tar.gz SPACE https://k8s.kurl.sh/bundle/installing-in-an-air-gapped-environment-${INSTRUQT_PARTICIPANT_ID}-unstable.tar.gz ENTER
diff --git a/instruqt/airgap-embedded/03-building-an-air-gap-release/assignment.md b/instruqt/airgap-embedded/03-building-an-air-gap-release/assignment.md
deleted file mode 100755
index 22078d458..000000000
--- a/instruqt/airgap-embedded/03-building-an-air-gap-release/assignment.md
+++ /dev/null
@@ -1,104 +0,0 @@
----
-slug: building-an-air-gap-release
-id: uppk7yks93gg
-type: challenge
-title: Building an Air Gap Release
-teaser: Creating the air-gap deployment bundle for your releaese
-notes:
-- type: text
- contents: Let's build your airgap release
-tabs:
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-Building an Airgap Release
-==========================
-
-While the kURL download continues, let's build the air-gap bundle for
-our current application release. You can see your download status in
-the "Jumpbox" tab. We'll mostly be working in the "Vendor Portal" for
-this lab.
-
-You should still be logged it, but just in case, here's your username
-and password again.
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="jumpbox" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="jumpbox" ]]`
-
-Since air-gapped bundles can be quite large, not all release channels
-build them automatically. Two of the default channels, `Stable` and
-`Beta` are configured to do it. Other channels can be set to auto
-build, or you can manually build a bundle when needed.
-
-You can build air-gap bundles for any of your releases by looking at
-the release history page for a channel. If you have a channel that
-you'll want regular airgap bundles on, you'll likely want to edit
-that channel to enable auto builds.
-
-
-
-Let's go through setting that up for our `Unstable` channel we're
-using for this lab. Start by editing the channel info
-
-
-
-then enable auto-builds by flipping the toggle labeled "Automatically
-create airgap builds for newly promoted release in this channel"
-
-
-
-After enabling the automatic build, you should make sure your current
-release has an airgap bundle built by clicking "Release history" for
-the channel and then "Build" next to the release.
-
-
-
-
-Enabling Airgap for a customer
-==============================
-
-Customers are automatically enabled for air gap deployment. This gives you
-flexibility in terms of product packaging and deployment. Let's enable air-gap
-downloads for the example customer we're using for the lab. Go to "Customers"
-in the Vendor portal and select the "Replicant" customer to enable the airgap.
-Then select "Customer Details" so you can edit their license options to allow
-installation from an airgap bundle.
-
-
-
-Click the checkbox next to "Airgap Download Enabled" and make sure
-you "Save Changes" with the button on the bottom right.
-
-Download Airgap Assets
-======================
-
-After saving the customer, scroll to the bottom of the page to the
-`Download Portal` section.
-
-
-
-Generate a new password and save it somewhere in your notes. Next,
-click the link to open the download portal. This is a link you would
-usually send to your customer. The rest of the lab we'll be back on
-our Jumpbox and working wearing our "end user" hat.
-
-Navigate to the "embedded cluster" option and review the three
-downloadable assets.
-
-This is where your customer downloads the assets they need for an
-air gap install: the kURL bundle, their license file, and the airgap
-bundle for your application. They will usually download all three at
-once for the initial install.
-
-
-
-We're only going to download the license file and the application
-bundle right now. We started downloading the kURL bundle in the previous
-step, so we don't need to do that again.
-
-Click the "Download license" button, then the "Download airgap bundle" button.
diff --git a/instruqt/airgap-embedded/03-building-an-air-gap-release/solve-jumpbox b/instruqt/airgap-embedded/03-building-an-air-gap-release/solve-jumpbox
deleted file mode 100644
index f03231645..000000000
--- a/instruqt/airgap-embedded/03-building-an-air-gap-release/solve-jumpbox
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-source /etc/profile.d/header.sh
-username="${INSTRUQT_PARTICIPANT_ID}@replicated-labs.com"
-password=$(get_password)
-
-login_request=$( jq -n -c --arg email "${username}" --arg password "${password}" '$ARGS.named' )
-token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login_request" https://id.replicated.com/v1/login | jq -r ".token")
-
-i=0
-while [[ "$token" == "null" && $i -lt 20 ]]
-do
- sleep 2
- set +u
- token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login_request" https://id.replicated.com/v1/login | jq -r ".token")
- echo $token
- set -u
- i=$((i+1))
-done
-
-UUID=$(cat /proc/sys/kernel/random/uuid)
-api_token=$( jq -n -c --arg name "instruqt-${UUID}" --argjson read_only false '$ARGS.named' )
-access_token=$(curl -s -H "Content-Type: application/json" -H "Authorization: $token" --request POST -d "$api_token" https://api.replicated.com/vendor/v1/user/token | jq -r ".access_token")
-app_id=$(curl -s -H "Content-Type: application/json" -H "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq --raw-output ".apps [] | select(.name | test(\".*${INSTRUQT_PARTICIPANT_ID}.*\")).id")
-channel_id=$(curl -s -H "Content-Type: application/json" -H "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/app/${app_id}/channels\?channelName\=Unstable | jq -r '.channels[].id')
-
-# enable autobuild airgap for channel "Unstable"
-channel_payload="$(curl -s -H "Content-Type: application/json" -H "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/app/${app_id}/channel/${channel_id} | jq -r '.channel' | jq --arg app_id ${app_id} --arg channel_id ${channel_id} '{
- "name": .name,
- "airgapDockerRegistryFormatEnabled": .airgapDockerRegistryFormatEnabled,
- "autoAirgapBuildsValue": 1,
- "channelIcon": .channelIcon,
- "description": .description,
- "semverRequired": .semverRequired
-}'
-)"
-curl --silent -H "Content-Type: application/json" -H "Authorization: ${access_token}" --request PUT https://api.replicated.com/vendor/v3/app/${app_id}/channel/${channel_id} --data-raw "${channel_payload}"
-
-# enable airgap for the customer "Replicant"
-customer_id="$(curl -s -H "Content-Type: application/json" -H "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/app/${app_id}/customers | jq -r '.customers[] | select(.name == "Replicant").id')"
-customer_payload="$(curl -s -H "Content-Type: application/json" -H "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/app/${app_id}/customers | jq -r '.customers[] | select(.name == "Replicant")' | jq --arg app_id ${app_id} --arg channel_id ${channel_id} '{
- "app_id": $app_id,
- "name": .name,
- "email": .email,
- "channel_id": $channel_id,
- "domain": .domain,
- "avatar": .avatar,
- "expires_at": .expiresAt,
- "type": "dev",
- "is_airgap_enabled": true,
- "is_gitops_supported": false,
- "is_identity_service_supported": false,
- "is_geoaxis_supported": false,
- "is_snapshot_supported": false,
- "is_support_bundle_upload_enabled": false,
- "entitlementValues": []
-}'
-)"
-
-echo "customer_payload=${customer_payload}"
-curl --silent -H "Content-Type: application/json" -H "Authorization: ${access_token}" --request PUT https://api.replicated.com/vendor/v3/customer/${customer_id} --data-raw "${customer_payload}"
diff --git a/instruqt/airgap-embedded/04-moving-assets-into-place/assignment.md b/instruqt/airgap-embedded/04-moving-assets-into-place/assignment.md
deleted file mode 100755
index 58134462c..000000000
--- a/instruqt/airgap-embedded/04-moving-assets-into-place/assignment.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-slug: moving-assets-into-place
-id: 097iz3ahw0xv
-type: challenge
-title: Moving Assets Into Place
-teaser: Getting your airgap assets ready for deployment
-notes:
-- type: text
- contents: Getting our airgap assets ready to deploy
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 800
----
-
-Recall the three assets we need for an Air Gap installation:
-
-1. A license with the Air Gap entitlement enabled
-2. An Air Gap bundle containing the kURL cluster components
-3. An Air Gap bundle containing the application components
-
-We've already begun the download of item (2), since it's the largest one and we
-needed some time for it to complete. We also saw how your customer will get access
-to all three assets from the Replicated download portal, then grabbed their
-license file and application bundle. Now we're going to grab the application
-bundle using the command line.
-
-At this point, your download of the kURL bundle should be completed. If
-not, wait for it to complete before you continue.
-
-Copying the Airgap Bundle to the Air-Gapped Host
-================================================
-
-In the wild, this step could take many forms. Customers may have a "soft"
-airgap like the one we us in this lab, which means you can copy the
-file directly from a jumpbox or through a bastion host. They may have
-a much more robust airgap requiring a cross-domain solution or burning
-the bundles to read-only media and using a sneakernet to move that
-media to the other side. Regardless of the requirements, as long as the
-three assets are available on the isolated network they'll be able to
-install your application.
-
-In our simple case, we're going to use the SSH connection between our
-Jumpbox and the airgapped instance to manage our install. First, we'll
-copy the bundle files to the instance using `scp`, then we'll use
-an SSH tunnel to configure the application and complete the install.
-
-Let's copy the kURL bundle first. Take a look at the files in your
-current directory. The kURL bundle should be there (the name of your
-kURL bundle will be different, but it will include
-`installing-in-an-air-gapped-environment` and end in `-unstable.tar.gz`).
-
-```
-replicant@jumpbox:~$ ls
-installing-in-an-air-gapped-environment-q4b0wn3mzsqj-unstable.tar.gz
-```
-
-Since there's only one file, let's save some typing and use a
-wildcard. We're copying the to the machine named `cluster` which
-will become a single-node Kubernetes cluster running our application.
-
-```
-scp *.tar.gz cluster:
-```
-
-Ready to Install
-================
-
-Now that the bundle is in place, we're ready to install.
diff --git a/instruqt/airgap-embedded/04-moving-assets-into-place/check-jumpbox b/instruqt/airgap-embedded/04-moving-assets-into-place/check-jumpbox
deleted file mode 100755
index 5872c4ccb..000000000
--- a/instruqt/airgap-embedded/04-moving-assets-into-place/check-jumpbox
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# ssh-keyscan -H cluster >> /root/known-hosts
-REMOTE_FILES=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster ls)
-
-if ! grep -q "installing-in-an-air-gapped-environment" <(echo ${REMOTE_FILES}) ; then
- fail-message "Please make sure to copy the kURL bundle to the air-gapped host."
- exit 1
-fi
-
diff --git a/instruqt/airgap-embedded/04-moving-assets-into-place/cleanup-jumpbox b/instruqt/airgap-embedded/04-moving-assets-into-place/cleanup-jumpbox
deleted file mode 100755
index 2ae8665dc..000000000
--- a/instruqt/airgap-embedded/04-moving-assets-into-place/cleanup-jumpbox
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t airgap
-tmux send-keys -t airgap clear ENTER
-
-# clean up tarball
-# get rid of the tarball
-rm /home/replicant/installing-in-an-air-gapped-environment-*-unstable.tar.gz
-
diff --git a/instruqt/airgap-embedded/04-moving-assets-into-place/solve-jumpbox b/instruqt/airgap-embedded/04-moving-assets-into-place/solve-jumpbox
deleted file mode 100644
index 286b2e265..000000000
--- a/instruqt/airgap-embedded/04-moving-assets-into-place/solve-jumpbox
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# save the session
-# tmux capture-pane -t airgap -S -
-# SESSION=$(tmux save-buffer -)
-
-# echo "Checking if bundle download is complete..."
-# while ! echo "${SESSION}" | tail -1 | grep "replicant" ;
-# do
-# sleep 5
-# tmux capture-pane -t airgap -S -
-# SESSION=$(tmux save-buffer -)
-# done
-
-REPLICANT_HOME=/home/replicant
-scp -o StrictHostKeyChecking=no -i ${REPLICANT_HOME}/.ssh/id_ed25519 ${REPLICANT_HOME}/*.tar.gz replicant@cluster:
diff --git a/instruqt/airgap-embedded/05-beginning-the-install/assignment.md b/instruqt/airgap-embedded/05-beginning-the-install/assignment.md
deleted file mode 100755
index ff0330bc8..000000000
--- a/instruqt/airgap-embedded/05-beginning-the-install/assignment.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-slug: beginning-the-install
-id: bsgw1cyzyjgd
-type: challenge
-title: Beginning the Install
-teaser: Kicking of your air-gapped install`
-notes:
-- type: text
- contents: Starting the air-gapped install
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-difficulty: basic
-timelimit: 600
----
-
-In this lab we're using kURL to turn our air-gapped system into a single-node
-Kuberenetes cluster. Our installation begins by connecting to the air-gapped
-instance over SSH. From there we unpack the kURL bundle and run the included
-install script. When these steps are complete we'll be able to install our
-application into the cluster.
-
-Let's Connect
-=============
-
-Since we're installing directly on the air-gapped node, let's connect to it.
-We're using our jumpbox's SSH connection into the air-gap network.
-
-```shell
-ssh cluster
-```
-
-Once you're on the node, untar the bundle and run the install script
-with the `airgap` flag. kURL install flags are documented
-[in the kurl.sh docs](https://kurl.sh/docs/install-with-kurl/advanced-options).
-Since there's only one tarball on the host, you can use a wildcard to expand
-it.
-
-```shell
-tar xvf *.tar.gz
-sudo bash install.sh airgap
-```
-
-At the end, you should see a `Installation Complete` message as shown below.
-Since the instance is Air Gap, we'll need to use a port forward and proxy for
-the UI in the next step. Note that the IP address and password you see will
-differ from mine.
-
-```text
-configmap/kurl-config created
-
-
- Installation
- Complete ā
-
-
-Kotsadm: http://10.128.1.47:30880
-Login with password (will not be shown again): iunIEfPyc
-This password has been set for you by default. It is recommended that you change this password; this can be done with the following command: kubectl kots reset-password default
-```
-
-Change Default Password
-=======================
-
-Let's follow the advice from the install command and change the default
-password to something easy to remember. Run the following command and
-pick a password that you'll use in the next step.
-
-```
-export KUBECONFIG=/etc/kubernetes/admin.conf
-kubectl kots reset-password default
-```
-
-Disconnect
-==========
-
-Make sure you disconnect from the cluster node before moving on to the
-next step. Press "control-D" to log out.
diff --git a/instruqt/airgap-embedded/05-beginning-the-install/check-jumpbox b/instruqt/airgap-embedded/05-beginning-the-install/check-jumpbox
deleted file mode 100755
index 220af2a04..000000000
--- a/instruqt/airgap-embedded/05-beginning-the-install/check-jumpbox
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# short circuit if testing
-set +x
-TEST_RUN=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster "[[ ! -f /tmp/.test-solve ]] || cat /tmp/.test-solve")
-if [[ "${TEST_RUN}" == "True" ]] ; then
- exit 0
-fi
-set -x
-
-# check that the node is ready
-NODE_READY=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes -o "jsonpath='{.items[0].status.conditions[?(@.type == \"Ready\")].status}'")
-if [[ "${NODE_READY}" != "True" ]] ; then
- fail-message "Kubernetes cluster is not Ready, please make sure the install has completed"
- exit 1
-fi
-
-# check that the admin consule is running
-ADMIN_STATUS=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster curl -s -o /dev/null -w "%{http_code}" http://cluster:8800)
-if [[ "${ADMIN_STATUS}" != "200" ]] ; then
- fail-message "Admin Console is not running, please make sure the install has completed"
- exit 1
-fi
-
-# save the last few lines session to check what the learner has disconnected their SSH session
-HEIGHT=$(tmux list-panes -F "#{pane_height}")
-SESSION=$(tmux capture-pane -t airgap -S $(expr $HEIGHT - 10) -p)
-
-# check for disconnection
-if ! grep -qE "Connection to cluster closed" <(echo ${SESSION}) ; then
- fail-message "Please make sure you disconnect from the cluster before continuing"
- exit 1
-fi
-
diff --git a/instruqt/airgap-embedded/05-beginning-the-install/cleanup-jumpbox b/instruqt/airgap-embedded/05-beginning-the-install/cleanup-jumpbox
deleted file mode 100755
index 11450cc5b..000000000
--- a/instruqt/airgap-embedded/05-beginning-the-install/cleanup-jumpbox
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t airgap
-tmux send-keys -t airgap clear ENTER
-
-exit 0
diff --git a/instruqt/airgap-embedded/05-beginning-the-install/solve-jumpbox b/instruqt/airgap-embedded/05-beginning-the-install/solve-jumpbox
deleted file mode 100644
index ceddd93a2..000000000
--- a/instruqt/airgap-embedded/05-beginning-the-install/solve-jumpbox
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster echo "True" > /tmp/.test-solve
diff --git a/instruqt/airgap-embedded/06-configuring-the-application/assignment.md b/instruqt/airgap-embedded/06-configuring-the-application/assignment.md
deleted file mode 100755
index 446090caf..000000000
--- a/instruqt/airgap-embedded/06-configuring-the-application/assignment.md
+++ /dev/null
@@ -1,96 +0,0 @@
----
-slug: configuring-the-application
-id: igbszqdl9ylb
-type: challenge
-title: Configuring the Application
-teaser: Completing your application installation
-notes:
-- type: text
- contents: Time to configure your application and finish the installation
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-- title: Admin Console
- type: website
- url: http://jumpbox.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-Forwarding Traffic to the Installer
-===================================
-
-We're going to use the browser to configure and install your application.
-The installer is running on your air-gapped instance, which can only be
-accessed from your Jumpbox, and only over SSH. We'll use SSH to forward
-a port on the Jumpbox to the Application installer running on your
-cluster.
-
-```
-ssh -NTfL 0.0.0.0:8800:cluster:8800 cluster
-```
-
-The SSH command will run in the background, and you won't see any
-output.
-
-Running the Installer
-=====================
-
-The "Admin Console" tab is configured to point to accces the
-port you forwarded. Switch to that tab to begin the installation. The
-first thing you'll see is a warning about the TLS certificate. In a real
-world install we **strongly** recommend you replace the certificate,
-which is self-signed and thus not signed by a trusted authority.
-
-
-
-For the Lab, we're going to leave the self-signed certificate in place.
-Click the "Skip and continue" to accept the self-signed certificate.
-
-
-
-At the login screen paste in the password noted previously on the
-`Installation Complete` screen. The password is shown in the output from
-the installation script.
-
-
-
-Until this point, this server is just running Kubernetes and the Admin
-Console. The next step begins the install for your application.
-
-The next step is to upload a license file so KOTS can validate which
-application is authorized to be deployed. Use the license file we
-downloaded earlier.
-
-Click the Upload button and select the `Replicant.yaml` file to continue,
-or drag and drop the license file from a file browser.
-
-
-
-After you upload your license, you'll be greeted with an Airgap Upload
-screen. Select "Choose a bundle to upload" and use the application bundle
-that you downloaded to your workstation using the customer portal here.
-Click "Upload Air Gap bundle" to continue the upload process.
-
-
-
-You'll see the bundle uploaded and images being pushed to kURL's internal
-registry. This will take a few minutes to complete.
-
-
-
-Once uploaded `Preflight Checks` will run. These are designed to ensure
-this server has the minimum system and software requirements to run the
-application. Depending on your YAML in `preflight.yaml`, you may see some
-of the example preflight checks fail or offer a warning. If you have
-failing checks, you can click continue -- the UI will show a warning that
-will need to be dismissed before you can continue.
-
-
-
-Your application is now installed and ready.
-
-
diff --git a/instruqt/airgap-embedded/06-configuring-the-application/check-jumpbox b/instruqt/airgap-embedded/06-configuring-the-application/check-jumpbox
deleted file mode 100755
index 130dc4ac0..000000000
--- a/instruqt/airgap-embedded/06-configuring-the-application/check-jumpbox
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# short circuit if testing
-set +x
-TEST_RUN=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster "[[ ! -f /tmp/.test-solve ]] || cat /tmp/.test-solve")
-if [[ "${TEST_RUN}" == "True" ]] ; then
- exit 0
-fi
-set -x
-
-DEPLOYMENT_READY=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster kubectl --kubeconfig /etc/kubernetes/admin.conf get deployments -o "jsonpath='{.items[?(@.metadata.name == \"kuard\")].status.conditions[?(@.type == \"Available\")].status}'")
-if [[ "${DEPLOYMENT_READY}" != "True" ]] ; then
- fail-message "Application deployment is not available, please make sure the install has completed"
- exit 1
-fi
-
-exit 0
diff --git a/instruqt/airgap-embedded/06-configuring-the-application/cleanup-jumpbox b/instruqt/airgap-embedded/06-configuring-the-application/cleanup-jumpbox
deleted file mode 100755
index 877dc325e..000000000
--- a/instruqt/airgap-embedded/06-configuring-the-application/cleanup-jumpbox
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t airgap
-tmux send-keys clear ENTER
-
-exit 0
diff --git a/instruqt/airgap-embedded/06-configuring-the-application/solve-jumpbox b/instruqt/airgap-embedded/06-configuring-the-application/solve-jumpbox
deleted file mode 100644
index ceddd93a2..000000000
--- a/instruqt/airgap-embedded/06-configuring-the-application/solve-jumpbox
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster echo "True" > /tmp/.test-solve
diff --git a/instruqt/airgap-embedded/07-deploying-a-new-version/assignment.md b/instruqt/airgap-embedded/07-deploying-a-new-version/assignment.md
deleted file mode 100755
index caf25de17..000000000
--- a/instruqt/airgap-embedded/07-deploying-a-new-version/assignment.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-slug: deploying-a-new-version
-id: 3a8ilcdrsyed
-type: challenge
-title: Deploying a New Version
-teaser: Upgrading an application deployed in an air-gapped environment
-notes:
-- type: text
- contents: Time to upgrade the application
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-- title: Code Editor
- type: code
- hostname: jumpbox
- path: /home/replicant
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-- title: Admin Console
- type: website
- url: http://jumpbox.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-Now that we've installed into the airgapped environment, let's explore
-what your customer will do when you release a new version of your
-application. The KUARD application has multiple versions published, so
-we're going to change our configuration to deploy the `green` version
-rather than the `blue` version we just installed.
-
-Updating and Releasing
-======================
-
-Go to the the "Code Editor" tab and edit the file `deployment.yaml` in
-the directory application `manifests`. Where it references the `blue` image for
-the application, switch it instead to read `green`.
-
-
-
-After making the change, make sure you save them using the save icon in the
-editor tab. It's easy to miss, so check the image below if you can't find it.
-
-
-
-Once you've saved your changes, pop back over to the "Jumpbox" tab and create a
-new Replicated release.
-
-```shell
-replicated release create --promote Unstable --version green --yaml-dir manifests
-```
-
-Downloading the Updated Bundle
-==============================
-
-Once the release is made, you should be able to navigate back to the
-customer download portal and download the new bundle. Go to the vendor
-portal tab, select "Customers" and then the customer "Replicant" and
-visit their download portal. If you've forgotten the password from before,
-you can easily reset it with the "Generate new password" button.
-
-
-
-Your new release should be at the top, but sometimes an airgap bundle can
-take some time to build. If your release isn't available, refresh your browser
-until you see it, then click 'Download airgap bundle".
-
-If you have to wait, you can explore the different versions of KOTS and your
-application that are available. Clicking "Show other bundles" will show
-historical versions of the KOTS Airgap Bundle that are available. Don't
-worry if you see different versions, we've likely released a lot more
-since I took this screenshot.
-
-
-
-You can also select older versions of your application bundle. You will
-probably see fewer versions in your list, since I've created a few extras
-while building this lab.
-
-
-
-These can be helpful for your customers to align new servers with the version
-they're running in production or to help you discover regressions.
-
-Installing the Update
-=====================
-
-Once you've downloaded the new version, in the KOTS Admin Console
-select "Version History", then click "Upload a new version" and
-select your bundle.
-
-
-
-You'll see the bundle upload as before and you'll have the option to deploy
-it once the preflight checks complete. Click "Deploy" to perform the
-upgrade.
-
-Switch back to the "Dashboard" tab in the Admin Console and confirm that
-your new version is installed and ready.
-
-
-
-Almost There...
-===============
-
-Congratulations! You've deployed your first application in an air-gapped
-environment using the Replicated Admin Console. We're going to take a
-look at one more thing before we finish learning about the airgap
-workflow.
diff --git a/instruqt/airgap-embedded/07-deploying-a-new-version/check-jumpbox b/instruqt/airgap-embedded/07-deploying-a-new-version/check-jumpbox
deleted file mode 100755
index 992d70529..000000000
--- a/instruqt/airgap-embedded/07-deploying-a-new-version/check-jumpbox
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# short circuit if testing
-set +x
-TEST_RUN=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster "[[ ! -f /tmp/.test-solve ]] || cat /tmp/.test-solve")
-if [[ "${TEST_RUN}" == "True" ]] ; then
- exit 0
-fi
-set -x
-
-DEPLOYMENT_READY=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster kubectl --kubeconfig /etc/kubernetes/admin.conf get deployments -o "jsonpath='{.items[?(@.metadata.name == \"kuard\")].status.conditions[?(@.type == \"Available\")].status}'")
-if [[ "${DEPLOYMENT_READY}" != "True" ]] ; then
- fail-message "Upgraded applicaation not available, please make sure the install has completed"
- exit 1
-fi
-
-DEPLOYMENT_TAG=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster kubectl --kubeconfig /etc/kubernetes/admin.conf get deployments -o "jsonpath='{.items[?(@.metadata.name == \"kuard\")].spec.template.spec.containers[?(@.name == \"kuard\")].image}'" | cut -d: -f 2)
-if [[ "${DEPLOYMENT_TAG}" != "green" ]] ; then
- fail-message "Running application is not the correct version, please make sure you uploaded the new bundle"
- exit 1
-fi
-
-exit 0
diff --git a/instruqt/airgap-embedded/07-deploying-a-new-version/cleanup-jumpbox b/instruqt/airgap-embedded/07-deploying-a-new-version/cleanup-jumpbox
deleted file mode 100755
index 877dc325e..000000000
--- a/instruqt/airgap-embedded/07-deploying-a-new-version/cleanup-jumpbox
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t airgap
-tmux send-keys clear ENTER
-
-exit 0
diff --git a/instruqt/airgap-embedded/07-deploying-a-new-version/setup-jumpbox b/instruqt/airgap-embedded/07-deploying-a-new-version/setup-jumpbox
deleted file mode 100755
index 7058a3f3a..000000000
--- a/instruqt/airgap-embedded/07-deploying-a-new-version/setup-jumpbox
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-tmux send-keys -t airgap replicated SPACE release SPACE download SPACE 1 SPACE -d SPACE manifests ENTER
-tmux send-keys -t airgap tar -xzvf '*.tar.gz' ENTER
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t airgap
-tmux send-keys -t airgap clear ENTER
-
diff --git a/instruqt/airgap-embedded/07-deploying-a-new-version/solve-jumpbox b/instruqt/airgap-embedded/07-deploying-a-new-version/solve-jumpbox
deleted file mode 100755
index ceddd93a2..000000000
--- a/instruqt/airgap-embedded/07-deploying-a-new-version/solve-jumpbox
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster echo "True" > /tmp/.test-solve
diff --git a/instruqt/airgap-embedded/08-troubleshooting-admin-console/assignment.md b/instruqt/airgap-embedded/08-troubleshooting-admin-console/assignment.md
deleted file mode 100755
index 2a9b5c7ee..000000000
--- a/instruqt/airgap-embedded/08-troubleshooting-admin-console/assignment.md
+++ /dev/null
@@ -1,108 +0,0 @@
----
-slug: troubleshooting-admin-console
-id: jddje8dvs3oj
-type: challenge
-title: What if the Admin Console fails?
-teaser: Addressing a failed admin console in an air-gapped environment
-notes:
-- type: text
- contents: Troubleshooting the air-gapped Admin Console
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-difficulty: basic
-timelimit: 600
----
-
-If your application is at least partially installed in the customer
-environment, they can use the support bundle you defined to troubleshoot
-application failures. But what happens if it fails before that?
-
-
-The Admin Console Support Bundle
-================================
-
-In a connected network, there is an easy way to connect a support
-bundle from a failing Admin Console
-
-```shell
-kubectl support-bundle https://kots.io
-```
-
-Let's connect to the air-gapped cluster and give this a try:
-
-```shell
-ssh cluster
-```
-
-After you connect, run the command
-
-```shell
-kubectl support-bundle https://kots.io
-```
-
-After a short bit of time you'll see it's timed out, as we
-expected since we can't get to the Internet from the air-gapped
-network.
-
-```shell
-Error: failed to load support bundle spec: failed to get spec from URL: execute request: Get "https://kots.io": dial tcp 104.21.18.220:443: i/o timeout
-```
-
-Moving the KOTS Support Bundle Spec
-===================================
-
-If you haven't already, disconnect from the cluster node by
-typing "control-D".
-
-We're going to pull the spec from the KOTS project, then move
-it onto the cluster node. The steps will vary depending on how your
-airgap is configured.
-
-In our case, we can grab it from GitHub onto our Jumpbox, then
-move the file up onto the air-gapped instance and use it from
-there.
-
-```
-curl -o support-bundle.yaml https://raw.githubusercontent.com/replicatedhq/kots/main/pkg/supportbundle/defaultspec/spec.yaml
-scp support-bundle.yaml cluster:
-```
-
-Collecting the Support Bundle
-=============================
-
-Now we can connect to our cluster node and collect the support
-bundle.
-
-```shell
-ssh cluster
-```
-
-Now we specify the support bundle manifest we moved onto air-gapped
-node when we run command.
-
-```shell
-kubectl support-bundle ./support-bundle.yaml
-```
-
-You may see a couple of errors collecting data because of
-components that are not installed in our kURL cluster, this is
-expected. Once the bundle has been collected, you'll get a quick
-review of the analysis.
-
-
-
-You can now move this support bundle off the air-gapped network
-for analysis, or analyze it from a workstation running on the
-air-gapped network.
-
-There's an in depth post with some other options at [How Can I Generate a Support Bundle If
-I Cannot Access the Admin Console?](https://help.replicated.com/community/t/kots-how-can-i-generate-a-support-bundle-if-i-cannot-access-the-admin-console/455).
-
-š Finish
-=========
-
-Congratulations! You've now explored the air-gapped workflow
-for applications deployed with Replicated.
diff --git a/instruqt/airgap-embedded/08-troubleshooting-admin-console/check-jumpbox b/instruqt/airgap-embedded/08-troubleshooting-admin-console/check-jumpbox
deleted file mode 100755
index 94239c3ef..000000000
--- a/instruqt/airgap-embedded/08-troubleshooting-admin-console/check-jumpbox
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# short circuit if testing
-set +x
-TEST_RUN=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster "[[ ! -f /tmp/.test-solve ]] || cat /tmp/.test-solve")
-if [[ "${TEST_RUN}" == "True" ]] ; then
- exit 0
-fi
-set -x
-
-# ssh-keyscan -H cluster >> /root/known-hosts
-REMOTE_FILES=$(ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster ls)
-
-echo $REMOTE_FILES
-if ! grep -q "support-bundle-.*.tar.gz" <(echo ${REMOTE_FILES}) ; then
- fail-message "Please make sure to copy the kURL bundle to the air-gapped host."
- exit 1
-fi
-
-exit 0
diff --git a/instruqt/airgap-embedded/08-troubleshooting-admin-console/solve-jumpbox b/instruqt/airgap-embedded/08-troubleshooting-admin-console/solve-jumpbox
deleted file mode 100644
index ceddd93a2..000000000
--- a/instruqt/airgap-embedded/08-troubleshooting-admin-console/solve-jumpbox
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-ssh -o StrictHostKeyChecking=no -i /home/replicant/.ssh/id_ed25519 replicant@cluster echo "True" > /tmp/.test-solve
diff --git a/instruqt/airgap-embedded/assets/admin-console-login.png b/instruqt/airgap-embedded/assets/admin-console-login.png
deleted file mode 100644
index 9d63c7f49..000000000
Binary files a/instruqt/airgap-embedded/assets/admin-console-login.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/admin-console-tls.png b/instruqt/airgap-embedded/assets/admin-console-tls.png
deleted file mode 100644
index b6e29ec03..000000000
Binary files a/instruqt/airgap-embedded/assets/admin-console-tls.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-builds.png b/instruqt/airgap-embedded/assets/airgap-builds.png
deleted file mode 100644
index 1a2b280b9..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-builds.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-customer-enable.png b/instruqt/airgap-embedded/assets/airgap-customer-enable.png
deleted file mode 100644
index 2b6b6a9b5..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-customer-enable.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-customer-portal.png b/instruqt/airgap-embedded/assets/airgap-customer-portal.png
deleted file mode 100644
index 57ff262ad..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-customer-portal.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-new-upload.png b/instruqt/airgap-embedded/assets/airgap-new-upload.png
deleted file mode 100644
index 8a041fbe5..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-new-upload.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-preflight.png b/instruqt/airgap-embedded/assets/airgap-preflight.png
deleted file mode 100644
index 02ee00bf5..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-preflight.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-push.png b/instruqt/airgap-embedded/assets/airgap-push.png
deleted file mode 100644
index 42e34ff08..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-push.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-slide-1.png b/instruqt/airgap-embedded/assets/airgap-slide-1.png
deleted file mode 100644
index da7d70086..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-slide-1.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-slide-2.png b/instruqt/airgap-embedded/assets/airgap-slide-2.png
deleted file mode 100644
index 9d83e0962..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-slide-2.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-slide-3.png b/instruqt/airgap-embedded/assets/airgap-slide-3.png
deleted file mode 100644
index 912e510f9..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-slide-3.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/airgap-upload.png b/instruqt/airgap-embedded/assets/airgap-upload.png
deleted file mode 100644
index 0423cc417..000000000
Binary files a/instruqt/airgap-embedded/assets/airgap-upload.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/app-down.png b/instruqt/airgap-embedded/assets/app-down.png
deleted file mode 100644
index 82daac890..000000000
Binary files a/instruqt/airgap-embedded/assets/app-down.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/application-bundle-link.png b/instruqt/airgap-embedded/assets/application-bundle-link.png
deleted file mode 100644
index c2b9e61e0..000000000
Binary files a/instruqt/airgap-embedded/assets/application-bundle-link.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/application-selected.png b/instruqt/airgap-embedded/assets/application-selected.png
deleted file mode 100644
index a9d9502a3..000000000
Binary files a/instruqt/airgap-embedded/assets/application-selected.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/application-slug-in-settings.png b/instruqt/airgap-embedded/assets/application-slug-in-settings.png
deleted file mode 100644
index 089a596a5..000000000
Binary files a/instruqt/airgap-embedded/assets/application-slug-in-settings.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/application-slug.png b/instruqt/airgap-embedded/assets/application-slug.png
deleted file mode 100644
index 0ef3cdf5d..000000000
Binary files a/instruqt/airgap-embedded/assets/application-slug.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/bundle-url.png b/instruqt/airgap-embedded/assets/bundle-url.png
deleted file mode 100644
index a2f782591..000000000
Binary files a/instruqt/airgap-embedded/assets/bundle-url.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/channel-edit-info-btn.png b/instruqt/airgap-embedded/assets/channel-edit-info-btn.png
deleted file mode 100644
index 3853c180a..000000000
Binary files a/instruqt/airgap-embedded/assets/channel-edit-info-btn.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/channel-enable-airgap.png b/instruqt/airgap-embedded/assets/channel-enable-airgap.png
deleted file mode 100644
index bba5b7ed5..000000000
Binary files a/instruqt/airgap-embedded/assets/channel-enable-airgap.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/channel-release-history.png b/instruqt/airgap-embedded/assets/channel-release-history.png
deleted file mode 100755
index c425cd087..000000000
Binary files a/instruqt/airgap-embedded/assets/channel-release-history.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/create-account.png b/instruqt/airgap-embedded/assets/create-account.png
deleted file mode 100644
index e19b0ff9b..000000000
Binary files a/instruqt/airgap-embedded/assets/create-account.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/create-api-token.png b/instruqt/airgap-embedded/assets/create-api-token.png
deleted file mode 100644
index ba08faeef..000000000
Binary files a/instruqt/airgap-embedded/assets/create-api-token.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/download-portal-older-kots-bundles.png b/instruqt/airgap-embedded/assets/download-portal-older-kots-bundles.png
deleted file mode 100644
index 9446bb75e..000000000
Binary files a/instruqt/airgap-embedded/assets/download-portal-older-kots-bundles.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/download-portal-older-versions.png b/instruqt/airgap-embedded/assets/download-portal-older-versions.png
deleted file mode 100644
index bff62c9be..000000000
Binary files a/instruqt/airgap-embedded/assets/download-portal-older-versions.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/download-portal-view.png b/instruqt/airgap-embedded/assets/download-portal-view.png
deleted file mode 100644
index 27d7951af..000000000
Binary files a/instruqt/airgap-embedded/assets/download-portal-view.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/editing-the-deployment.png b/instruqt/airgap-embedded/assets/editing-the-deployment.png
deleted file mode 100644
index dbaf6a996..000000000
Binary files a/instruqt/airgap-embedded/assets/editing-the-deployment.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/email-invite.png b/instruqt/airgap-embedded/assets/email-invite.png
deleted file mode 100644
index 4c8a7915e..000000000
Binary files a/instruqt/airgap-embedded/assets/email-invite.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/installed-and-ready.png b/instruqt/airgap-embedded/assets/installed-and-ready.png
deleted file mode 100644
index c439f4c0e..000000000
Binary files a/instruqt/airgap-embedded/assets/installed-and-ready.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/kots-tls-warning.png b/instruqt/airgap-embedded/assets/kots-tls-warning.png
deleted file mode 100644
index 6ef2b26ee..000000000
Binary files a/instruqt/airgap-embedded/assets/kots-tls-warning.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/kurl-url.png b/instruqt/airgap-embedded/assets/kurl-url.png
deleted file mode 100644
index 44f806702..000000000
Binary files a/instruqt/airgap-embedded/assets/kurl-url.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/manual-airgap-build.png b/instruqt/airgap-embedded/assets/manual-airgap-build.png
deleted file mode 100644
index aec953cbe..000000000
Binary files a/instruqt/airgap-embedded/assets/manual-airgap-build.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/release-channels.png b/instruqt/airgap-embedded/assets/release-channels.png
deleted file mode 100644
index 9d4abb7c4..000000000
Binary files a/instruqt/airgap-embedded/assets/release-channels.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/saving-your-changes.png b/instruqt/airgap-embedded/assets/saving-your-changes.png
deleted file mode 100644
index ce01017cb..000000000
Binary files a/instruqt/airgap-embedded/assets/saving-your-changes.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/terminal-support-bundle-analysis.png b/instruqt/airgap-embedded/assets/terminal-support-bundle-analysis.png
deleted file mode 100644
index 59ab0d224..000000000
Binary files a/instruqt/airgap-embedded/assets/terminal-support-bundle-analysis.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/updated-and-ready.png b/instruqt/airgap-embedded/assets/updated-and-ready.png
deleted file mode 100644
index f10aa6afb..000000000
Binary files a/instruqt/airgap-embedded/assets/updated-and-ready.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/upload-license.png b/instruqt/airgap-embedded/assets/upload-license.png
deleted file mode 100644
index 694ef6915..000000000
Binary files a/instruqt/airgap-embedded/assets/upload-license.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/assets/vendor-portal-login.png b/instruqt/airgap-embedded/assets/vendor-portal-login.png
deleted file mode 100644
index 8b027f7a9..000000000
Binary files a/instruqt/airgap-embedded/assets/vendor-portal-login.png and /dev/null differ
diff --git a/instruqt/airgap-embedded/config.yml b/instruqt/airgap-embedded/config.yml
deleted file mode 100644
index 75222ace7..000000000
--- a/instruqt/airgap-embedded/config.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-version: "3"
-containers:
-- name: airgap
- image: gcr.io/instruqt/cloud-client
- shell: /bin/bash
-virtualmachines:
-- name: jumpbox
- image: kots-field-labs/airgap-jumpbox
- shell: tmux new-session -A -s airgap su - replicant
- machine_type: n1-standard-2
- allow_external_ingress:
- - high-ports
-gcp_projects:
-- name: airgap
- services:
- - compute.googleapis.com
- roles:
- - roles/compute.admin
- - roles/iam.serviceAccountUser
diff --git a/instruqt/airgap-embedded/track.yml b/instruqt/airgap-embedded/track.yml
deleted file mode 100755
index 669246fe9..000000000
--- a/instruqt/airgap-embedded/track.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-slug: airgap-embedded
-id: 0zxhhnehsgua
-title: Managing Airgapped Applications with Replicated
-teaser: Using Replicated to install, upgrade, and support your application into an air-gapped environment
-description: |-
- In this exercise you will learn the Replicated workflow for installing and
- supporting your application when it's installed into an air-gapped network.
-icon: https://storage.googleapis.com/shared-lab-assets/icons/blue/airgap_builder.png
-level: intermediate
-tags:
- - airgap
- - vendor
- - embedded
- - premium-plans
-owner: replicated
-developers:
- - chuck@replicated.com
-lab_config:
- overlay: false
- width: 25
- position: right
-checksum: "790758288752192794"
diff --git a/instruqt/airgap-embedded/track_scripts/setup-airgap b/instruqt/airgap-embedded/track_scripts/setup-airgap
deleted file mode 100755
index 3ca518048..000000000
--- a/instruqt/airgap-embedded/track_scripts/setup-airgap
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-### authenticate to gcloud
-mkdir -p /root/.config/gcloud
-echo $INSTRUQT_GCP_PROJECT_AIRGAP_SERVICE_ACCOUNT_KEY | base64 -d > /root/.config/gcloud/credentials.json
-
-# Activate the service account
-gcloud auth activate-service-account --key-file /root/.config/gcloud/credentials.json
-
-# Set our project
-gcloud config set project $INSTRUQT_GCP_PROJECT_AIRGAP_PROJECT_ID
-
-### Create airgap network
-gcloud compute networks create airgap
-
-# explicitly deny all opther ingress and egress
-gcloud compute firewall-rules create deny-ingress \
- --priority 2000 --network airgap --action deny --rules tcp,udp,icmp \
- --direction ingress --source-ranges 0.0.0.0/0
-gcloud compute firewall-rules create deny-egress \
- --priority 2000 --network airgap --action deny --rules tcp,udp,icmp \
- --direction egress --destination-ranges 0.0.0.0/0
-
-### create cluster VM
-CLUSTER_IP=$(gcloud compute instances create cluster \
- --image-project ubuntu-os-cloud --image-family ubuntu-2204-lts \
- --machine-type n1-standard-8 --network airgap --zone europe-west1-b \
- --boot-disk-size=200GB --boot-disk-type=pd-ssd \
- --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
-
-echo "${CLUSTER_IP} cluster # airgapped cluster" >> /etc/hosts
diff --git a/instruqt/airgap-embedded/track_scripts/setup-jumpbox b/instruqt/airgap-embedded/track_scripts/setup-jumpbox
deleted file mode 100755
index 9517667dd..000000000
--- a/instruqt/airgap-embedded/track_scripts/setup-jumpbox
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-REPLICANT_HOME=/home/replicant
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-
-### make SSH key mismatches go away
-cat <> "$REPLICANT_HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-### authenticate to gcloud
-mkdir -p /root/.config/gcloud
-echo $INSTRUQT_GCP_PROJECT_AIRGAP_SERVICE_ACCOUNT_KEY | base64 -d > /root/.config/gcloud/credentials.json
-
-# Activate the service account
-gcloud auth activate-service-account --key-file /root/.config/gcloud/credentials.json
-
-# Set our project
-gcloud config set project $INSTRUQT_GCP_PROJECT_AIRGAP_PROJECT_ID
-
-### Create airgap network
-JUMPBOX_IP=$(curl -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip)
-
-# allow SSH accesss from the jumpbox
-gcloud compute firewall-rules create allow-jumpbox-ssh \
- --priority 1000 --network airgap --allow tcp:22 \
- --source-ranges ${JUMPBOX_IP}/32
-
-### Assure access to the air-gapped cluster VM
-# create an SSH key
-SSH_DIR=${REPLICANT_HOME}/.ssh
-mkdir -p "${SSH_DIR}" && /bin/chmod 0700 "${SSH_DIR}"
-ssh-keygen -t ed25519 -o -a 100 -f ${SSH_DIR}/id_ed25519 -q -N ""
-/bin/chmod 0600 ${SSH_DIR}/* && /bin/chown -R replicant:replicant ${SSH_DIR}
-
-# add the key to the SSH metadata
-gcloud compute instances add-metadata cluster --zone europe-west1-b \
- --metadata "ssh-keys=replicant:$(cat ${SSH_DIR}/id_ed25519.pub)"
-
-# make sure we can refer to the host by name
-CLUSTER_IP=$(gcloud compute instances describe cluster --zone europe-west1-b \
- --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
-echo "${CLUSTER_IP} cluster # airgapped cluster" >> /etc/hosts
diff --git a/instruqt/airgap-embedded/vendor/manifests/deployment.yaml b/instruqt/airgap-embedded/vendor/manifests/deployment.yaml
deleted file mode 100644
index 037061f45..000000000
--- a/instruqt/airgap-embedded/vendor/manifests/deployment.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: kuard
-spec:
- replicas: 2
- selector:
- matchLabels:
- app: kuard
- template:
- metadata:
- name: kuard
- labels:
- app: kuard
- spec:
- containers:
- - name: kuard
- image: gcr.io/kuar-demo/kuard-amd64:blue
- resources:
- limits:
- cpu: '{{repl ConfigOption "cpu"}}'
- memory: '{{repl ConfigOption "memory"}}'
diff --git a/instruqt/airgap-embedded/vendor/manifests/kots-app.yaml b/instruqt/airgap-embedded/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 6cce9d39a..000000000
--- a/instruqt/airgap-embedded/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: kuard
-spec:
- title: Kubernetes Up and Running
- icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/kubernetes/icon/color/kubernetes-icon-color.png
- statusInformers:
- - deployment/kuard
- - service/kuard
- ports:
- - serviceName: "kuard"
- servicePort: 80
- localPort: 8888
- applicationUrl: "http://kuard"
diff --git a/instruqt/airgap-embedded/vendor/manifests/kots-config.yaml b/instruqt/airgap-embedded/vendor/manifests/kots-config.yaml
deleted file mode 100644
index fb6a75516..000000000
--- a/instruqt/airgap-embedded/vendor/manifests/kots-config.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Config
-metadata:
- name: kuard
-spec:
- groups:
- - name: resources
- title: Resource Limits
- description: Specify application resource limits
- items:
- - name: cpu
- title: CPU
- help_text: "CPU limit in megahertz, e.g. 1000m"
- type: text
- value: 1000m
- default: 1000m
- recommended: true
- - name: memory
- title: Memory
- help_text: "Memory limits, e.g. 256Mi"
- type: text
- value: 256Mi
- default: 256Mi
- recommended: true
-
diff --git a/instruqt/airgap-embedded/vendor/manifests/kots-preflights.yaml b/instruqt/airgap-embedded/vendor/manifests/kots-preflights.yaml
deleted file mode 100644
index 4ba15aaeb..000000000
--- a/instruqt/airgap-embedded/vendor/manifests/kots-preflights.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: Preflight
-metadata:
- name: preflight-checks
-spec:
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.20.0"
- message: The application requires Kubernetes 1.20.0 or later, and recommends 1.21.0 or later.
- uri: https://www.kubernetes.io
- - warn:
- when: "< 1.21.0"
- message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.21.0 or later.
- uri: https://kubernetes.io
- - pass:
- message: Your cluster meets the recommended and required versions of Kubernetes.
- - containerRuntime:
- outcomes:
- - pass:
- when: "== containerd"
- message: containerd container runtime was found.
- - fail:
- message: Did not find containerd container runtime.
- - distribution:
- outcomes:
- - fail:
- when: "== docker-desktop"
- message: The application does not support Docker Desktop clusters.
- - fail:
- when: "== microk8s"
- message: The application does not support MicroK8s clusters.
- - fail:
- when: "== minikube"
- message: The application does not support minikube clusters.
- - pass:
- when: "== eks"
- message: EKS is a supported distribution.
- - pass:
- when: "== gke"
- message: GKE is a supported distribution.
- - pass:
- when: "== aks"
- message: AKS is a supported distribution.
- # Will be supported in the future
- - pass:
- when: "== k3s"
- message: k3s is a supported distribution.
- - pass:
- when: "== kurl"
- message: kURL is a supported distribution.
- - pass:
- when: "== digitalocean"
- message: DigitalOcean is a supported distribution.
- - warn:
- message: Unable to determine the distribution of Kubernetes.
- - nodeResources:
- checkName: Cluster node memory
- outcomes:
- - fail:
- when: "min(memoryCapacity) < 1Gi"
- message: Each node in the cluster must have at least 2Gi of memory, and should have at least 4Gi"
- - warn:
- when: "min(memoryCapacity) < 4Gi"
- message: Each node in the cluster should have at least 4Gi"
- - pass:
- message: There are at least 4Gi of memory on each node of the cluster
diff --git a/instruqt/airgap-embedded/vendor/manifests/kots-support-bundle.yaml b/instruqt/airgap-embedded/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index c254de120..000000000
--- a/instruqt/airgap-embedded/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: support-bundle
-spec:
- collectors:
- - clusterInfo: {}
- - clusterResources: {}
- - logs:
- selector:
- - app=kuard
- namespace: '{{repl Namespace }}'
- limits:
- maxAge: 30d
- maxLines: 10000
- - registryImages:
- namespace: '{{repl Namespace }}'
- images:
- - gcr.io/kuar-demo/kuard-amd64:blue
- analyzers:
- - deploymentStatus:
- name: kuard
- namespace: '{{repl Namespace}}'
- outcomes:
- - fail:
- when: "< 1"
- message: Kubernetes Up and Running is not ready
- - pass:
- message: Kubernetes Up and Running is ready
diff --git a/instruqt/airgap-embedded/vendor/manifests/serivce.yaml b/instruqt/airgap-embedded/vendor/manifests/serivce.yaml
deleted file mode 100644
index dd4fa583e..000000000
--- a/instruqt/airgap-embedded/vendor/manifests/serivce.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
- name: kuard
- labels:
- app: kuard
-spec:
- selector:
- app: kuard
- ports:
- - port: 8080
- protocol: TCP
- targetPort: 8080
- type: NodePort
diff --git a/instruqt/airgap-embedded/vendor/vendor.json b/instruqt/airgap-embedded/vendor/vendor.json
deleted file mode 100644
index a8b411aac..000000000
--- a/instruqt/airgap-embedded/vendor/vendor.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "Installing in an Air-Gapped Environment",
- "slug": "airgap-embedded",
- "channel": "Unstable",
- "customer": "Replicant",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": ""
-}
diff --git a/instruqt/airgap-template/01-validate-airgap/assignment.md b/instruqt/airgap-template/01-validate-airgap/assignment.md
deleted file mode 100755
index 926cd1d2a..000000000
--- a/instruqt/airgap-template/01-validate-airgap/assignment.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-slug: validate-airgap
-id: zwgjxayvrlqk
-type: challenge
-title: validate-airgap
-teaser: Validates the cluster is air-gapped and we can connect over SSH
-notes:
-- type: text
- contents: Let's check that we can't connect
-tabs:
-- title: Jumpbox
- type: terminal
- hostname: jumpbox
- workdir: /home/replicant
-difficulty: basic
-timelimit: 300
----
-
-#### Let's check our air gap
-
-```
-ssh cluster curl --connect-timeout 30 https://google.com
-```
diff --git a/instruqt/airgap-template/01-validate-airgap/check-jumpbox b/instruqt/airgap-template/01-validate-airgap/check-jumpbox
deleted file mode 100755
index bd3d32464..000000000
--- a/instruqt/airgap-template/01-validate-airgap/check-jumpbox
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-ssh -l replicant cluster curl -sm 10 https://google.com
diff --git a/instruqt/airgap-template/01-validate-airgap/setup-jumpbox b/instruqt/airgap-template/01-validate-airgap/setup-jumpbox
deleted file mode 100755
index bb3a0b412..000000000
--- a/instruqt/airgap-template/01-validate-airgap/setup-jumpbox
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-export HOME_DIR=/home/replicant
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-# Display PARTICIPANT_ID info for Vendor Portal
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-echo "show_credentials" >> ${HOME_DIR}/.bashrc
diff --git a/instruqt/airgap-template/config.yml b/instruqt/airgap-template/config.yml
deleted file mode 100644
index 383420ba6..000000000
--- a/instruqt/airgap-template/config.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-version: "3"
-virtualmachines:
-- name: jumpbox
- image: kots-field-labs/airgap-jumpbox
- shell: tmux new-session -A -s airgap su - replicant
- machine_type: n1-standard-2
- version: "2"
- allow_external_ingress:
- - high-ports
-containers:
-- name: airgap
- image: gcr.io/instruqt/cloud-client
- shell: /bin/bash
-gcp_projects:
-- name: airgap
- services:
- - compute.googleapis.com
- roles:
- - roles/compute.admin
- - roles/iam.serviceAccountUser
diff --git a/instruqt/airgap-template/track.yml b/instruqt/airgap-template/track.yml
deleted file mode 100755
index 558205991..000000000
--- a/instruqt/airgap-template/track.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-slug: airgap-template
-id: 8p7434ifnsyd
-title: Airgap Template
-teaser: Template track for a jumpbox connecting to an airgaped host
-description: |-
- This track is a template track to build any lab that requires
- an airgaped host. To use it, run:
-
- ```
- instruqt track create --title [NEW TRACK TITLE] \
- --from airgap-template
- ```
-
- This template does not provide a Kubernetes cluster in the air-gapped
- network, so it is best used with embedded cluster installs.
-icon: https://storage.googleapis.com/instruqt-frontend/img/tracks/default.png
-level: beginner
-tags:
-- template
-- airgap
-- customer
-owner: replicated
-developers:
-- chuck@replicated.com
-private: true
-published: false
-checksum: "12626842098738699013"
diff --git a/instruqt/airgap-template/track_scripts/setup-airgap b/instruqt/airgap-template/track_scripts/setup-airgap
deleted file mode 100755
index 3ca518048..000000000
--- a/instruqt/airgap-template/track_scripts/setup-airgap
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-### authenticate to gcloud
-mkdir -p /root/.config/gcloud
-echo $INSTRUQT_GCP_PROJECT_AIRGAP_SERVICE_ACCOUNT_KEY | base64 -d > /root/.config/gcloud/credentials.json
-
-# Activate the service account
-gcloud auth activate-service-account --key-file /root/.config/gcloud/credentials.json
-
-# Set our project
-gcloud config set project $INSTRUQT_GCP_PROJECT_AIRGAP_PROJECT_ID
-
-### Create airgap network
-gcloud compute networks create airgap
-
-# explicitly deny all opther ingress and egress
-gcloud compute firewall-rules create deny-ingress \
- --priority 2000 --network airgap --action deny --rules tcp,udp,icmp \
- --direction ingress --source-ranges 0.0.0.0/0
-gcloud compute firewall-rules create deny-egress \
- --priority 2000 --network airgap --action deny --rules tcp,udp,icmp \
- --direction egress --destination-ranges 0.0.0.0/0
-
-### create cluster VM
-CLUSTER_IP=$(gcloud compute instances create cluster \
- --image-project ubuntu-os-cloud --image-family ubuntu-2204-lts \
- --machine-type n1-standard-8 --network airgap --zone europe-west1-b \
- --boot-disk-size=200GB --boot-disk-type=pd-ssd \
- --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
-
-echo "${CLUSTER_IP} cluster # airgapped cluster" >> /etc/hosts
diff --git a/instruqt/airgap-template/track_scripts/setup-jumpbox b/instruqt/airgap-template/track_scripts/setup-jumpbox
deleted file mode 100755
index 96d3894bd..000000000
--- a/instruqt/airgap-template/track_scripts/setup-jumpbox
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-HOME_DIR=/home/replicant
-
-### authenticate to gcloud
-mkdir -p /root/.config/gcloud
-echo $INSTRUQT_GCP_PROJECT_AIRGAP_SERVICE_ACCOUNT_KEY | base64 -d > /root/.config/gcloud/credentials.json
-
-# Activate the service account
-gcloud auth activate-service-account --key-file /root/.config/gcloud/credentials.json
-
-# Set our project
-gcloud config set project $INSTRUQT_GCP_PROJECT_AIRGAP_PROJECT_ID
-
-### Create airgap network
-JUMPBOX_IP=$(curl -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip)
-
-# allow SSH accesss from the jumpbox
-gcloud compute firewall-rules create allow-jumpbox-ssh \
- --priority 1000 --network airgap --allow tcp:22 \
- --source-ranges ${JUMPBOX_IP}/32
-
-### Assure access to the air-gapped cluster VM
-# create an SSH key
-SSH_DIR=${HOME_DIR}/.ssh
-mkdir -p "${SSH_DIR}" && /bin/chmod 0700 "${SSH_DIR}"
-ssh-keygen -t ed25519 -o -a 100 -f ${SSH_DIR}/id_ed25519 -q -N ""
-/bin/chmod 0600 ${SSH_DIR}/* && /bin/chown -R replicant:replicant ${SSH_DIR}
-
-# add the key to the SSH metadata
-gcloud compute instances add-metadata cluster --zone europe-west1-b \
- --metadata "ssh-keys=replicant:$(cat /home/replicant/id_ed25519.pub)"
-
-# make sure we can refer to the host by name
-CLUSTER_IP=$(gcloud compute instances describe cluster --zone europe-west1-b \
- --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
-echo "${CLUSTER_IP} cluster # airgapped cluster" >> /etc/hosts
diff --git a/instruqt/compatibility-matrix/01-compatibility-matrix-basics/assignment.md b/instruqt/compatibility-matrix/01-compatibility-matrix-basics/assignment.md
deleted file mode 100755
index a43294915..000000000
--- a/instruqt/compatibility-matrix/01-compatibility-matrix-basics/assignment.md
+++ /dev/null
@@ -1,63 +0,0 @@
----
-slug: compatibility-matrix
-id:
-type: challenge
-title: compatibility-matrix
-teaser:
-notes:
-- type: text
- contents: Examines using the Replicated CLI to work with Compatibility Matrix
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
- workdir: /home/replicant
-- title: Cluster
- type: terminal
- hostname: cluster
-difficulty: basic
-timelimit: 3000
----
-
-#### Let's look at using the Compatibility Matrix
-The Replicated Compatibility Matrix is a service for quickly and easily spinning up ephemeral clusters. In this lab, we will learn some basics of how to work with the Compatibility Matrix: using it to troubleshooting existing environments, testing application changes in a comprehensive manner, and integrating it with existing CI/CD pipelines for automated testing. The Compatibility Matrix is part of our Builders Plan and can be added to your account at any time.
-
-
-Letās start with how to create an environment using the Compatibility Matrix. In this exercise we will examine the different matrix commands and their uses as well as build and tear down a few environments for practice.
-
-1. Look at the new cli commands and run a few to see whatās up
-2. Get list of supported images (wc)
-3. Create a cluster from scratch. Connect to it, then delete it.
-4. Create another cluster with a very short (2 minute) duration. Verify it exists
-5. Create 3-node cluster with multiple OS. (Keep this)
-6. Install application in all three nodes.
-7. Verify that the cluster from step 4 is gone, as the TTL has expired
-
-
-As we saw in the previous exercise, the CM can create a variety of environments. Now letās look at how we might use it to troubleshoot existing customer installations without connecting to the live/production/airgap installations our customer is running. To start off, we will download a support bundle from an example customer and build a support environment that matches our customerās. In this case, we have a customer who is not able to upgrade their environment from Kubernetes X to X (dependency issue)
-
-1. The support bundle can be downloaded from the āBundleā tab at the top of this lab. Go ahead and download it now.
-2. Use the bundle to determine requisite versions
-3. Build a cluster from the bundle manually
-4. Build a cluster from the bundle automatically (possible?)
-5. Connect to the cluster and look at the errors the customer is seeing
-6. Correct the error and update Kubernetes.
-
-Now that weāve practiced some of the basics of working with the CM, letās look at how it can be used for testing application changes prior to releasing them. To start this next exercise, we will be using our environment from the first exercise to test a possible upgrade.
-
-1. Connect to GitLab project *note: would it be better to use GitHub?
-2. Make a simple change to the git project
-3. Push it, and watch how CM picks up the change and spins up testing envs
-
-Weāve made a very simple change that works on all of our nodes. What happens if one of the nodes fails testing? Letās find out. In this exercise, weāre dropping support for OpenShift and deprecating EKS.
-
-1. Add a preflight requiring one not OpenShift
-2. Push to git
-3. See failure at incorrect OS
-4. See warning at EKS
-5. See success at GKE
-
-
-```
-kubectl get nodes
-```
diff --git a/instruqt/compatibility-matrix/config.yml b/instruqt/compatibility-matrix/config.yml
deleted file mode 100644
index 9dee0fe53..000000000
--- a/instruqt/compatibility-matrix/config.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: gcr.io/kots-field-labs/shell
- shell: su - replicant
- memory: 256
-virtualmachines:
-- name: cluster
- image: instruqt/k3s-v1-25-0
- shell: /bin/bash
- machine_type: n1-standard-1
diff --git a/instruqt/compatibility-matrix/track.yml b/instruqt/compatibility-matrix/track.yml
deleted file mode 100755
index e128ea5c9..000000000
--- a/instruqt/compatibility-matrix/track.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-slug: compatibility-matrix
-id:
-title: Shell and Cluster Track Template
-teaser: Template track for a shell connecting to a K3s cluster
-description: |-
- This track is a template track to build any lab that requires
- a shell that connects to an existing cluster. To use it, run:
-
- ```
- instruqt track create --title [NEW TRACK TITLE] \
- --from shell-and-cluster-template
- ```
-icon: https://storage.googleapis.com/instruqt-frontend/img/tracks/default.png
-level: beginner
-tags:
-- template
-owner: replicated
-developers:
-- chuck@replicated.com
-private: false
-published: false
-checksum: "14380425741368892975"
diff --git a/instruqt/compatibility-matrix/track_scripts/setup-cluster b/instruqt/compatibility-matrix/track_scripts/setup-cluster
deleted file mode 100644
index 86447bf77..000000000
--- a/instruqt/compatibility-matrix/track_scripts/setup-cluster
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-while ! ssh shell true; do
- echo "Waiting for container SSH to be available..."
- sleep 1
-done
-
-ssh shell "mkdir /home/replicant/.kube"
-
-while ! [[ -f /etc/rancher/k3s/k3s.yaml ]]; do
- echo "Waiting for Rancher kubernetes configuration to be available..."
- sleep 1
-done
-
-scp /etc/rancher/k3s/k3s.yaml shell:/home/replicant/.kube/config
diff --git a/instruqt/compatibility-matrix/track_scripts/setup-shell b/instruqt/compatibility-matrix/track_scripts/setup-shell
deleted file mode 100644
index 45aabb433..000000000
--- a/instruqt/compatibility-matrix/track_scripts/setup-shell
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
-EOF
-
-# assure an RSA key for Dropbear
-ssh-keygen -t rsa -f /etc/dropbear/dropbear_rsa_host_key -N ''
-
-# change the cluster URI
-yq -i '.clusters[0].cluster.server = "https://cluster:6443"' /home/replicant/.kube/config
-chown -R replicant /home/replicant/.kube
diff --git a/instruqt/custom-fields/01-introduction/assignment.md b/instruqt/custom-fields/01-introduction/assignment.md
deleted file mode 100755
index 4ee483238..000000000
--- a/instruqt/custom-fields/01-introduction/assignment.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-slug: introduction
-id: 5tor9kytns7d
-type: challenge
-title: Introduction
-teaser: Learn what this lab is about!
-notes:
-- type: text
- contents: Get ready to learn about Custom License Fields
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-difficulty: basic
-timelimit: 300
----
-
-š Introduction
-===============
-
-This exercise is designed to give you a sandbox to ensure you have a basic understanding how Custom License Fields work.
-
-* **What you will do**:
- * Learn how to create a Custom License Field
- * Learn how to use the field in a sample application
- * Deploy the sample app and then update the field to enable a feature in the sample application
-* **Who this is for**: This lab is for anyone who works with app code, docker images, k8s yamls, or does field support for multi-prem applications
- * Full Stack / DevOps / Product Engineers
- * Support Engineers
- * Implementation / Field Engineers
-* **Prerequisites**:
- * Hello World Lab
- * Replicated CLI lab
- * Basic working knowledge of Kubernetes
-* **Outcomes**:
- * You will build a working understanding of how you can leverage Custom License Fields in your application.
-
-
-š Get started
-===============
-
-Use the terminal to check if kubernetes is running:
-
-```
-kubectl get nodes
-```
-
-You should see a Kubernetes node listed. If you do, **Congratulations!** you are ready to move to the next challenge.
-
-To complete this challenge, press **Next**.
diff --git a/instruqt/custom-fields/02-creating-custom-fields/assignment.md b/instruqt/custom-fields/02-creating-custom-fields/assignment.md
deleted file mode 100755
index 65f81e421..000000000
--- a/instruqt/custom-fields/02-creating-custom-fields/assignment.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-slug: creating-custom-fields
-id: 0efpwhe3qy3q
-type: challenge
-title: Creating Custom Fields
-teaser: Learn how to create Custom License Fields
-notes:
-- type: text
- contents: Let's get you logged in to Vendor Portal and create a Custom License Field!
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 600
----
-### Vendor Portal login
-
-To access the Vendor Portal, you will need your username and password. The lab
-setup has configured your account the following credentials:
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="kubernetes-vm" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="kubernetes-vm" ]]`
-
-To access the Vendor Portal, click on the **Vendor** tab and login to the Vendor Portal. Once you log in, you should land on the Channels, which allow you to manage who has access to which releases of your application.
-
-### Create Custom Field
-
-Let's create the [Custom License Field](https://docs.replicated.com/vendor/licenses-adding-custom-fields) that we will use as a switch for our Super Duper Feature:
-
-Navigate to **License Fields** on the left hand side navigator.
-
-
-
-Click on **Create custom field** and use the following values:
-
-* **Field:** enable-feature
-* **Title:** Enable Feature
-* **Type:** Boolean
-* **Default:** false
-
-Leave the **Required** and **Hidden** boxes unchecked. Below is a screenshot of what it should look like:
-
-
-
-Click on the **Create** button to create the field. Stay logged in to the Vendor Portal as we will need it in the next challege.
-
-Congratulations! You have completed this challenge.
diff --git a/instruqt/custom-fields/02-creating-custom-fields/setup-kubernetes-vm b/instruqt/custom-fields/02-creating-custom-fields/setup-kubernetes-vm
deleted file mode 100755
index d0ca4a795..000000000
--- a/instruqt/custom-fields/02-creating-custom-fields/setup-kubernetes-vm
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-agent variable set USERNAME $(get_username)
-agent variable set PASSWORD $(get_password)
-
-exit 0
diff --git a/instruqt/custom-fields/03-updating-the-application/assignment.md b/instruqt/custom-fields/03-updating-the-application/assignment.md
deleted file mode 100755
index 3a65c25dc..000000000
--- a/instruqt/custom-fields/03-updating-the-application/assignment.md
+++ /dev/null
@@ -1,179 +0,0 @@
----
-slug: updating-the-application
-id: fbs7dhwu7xxi
-type: challenge
-title: Updating the Application
-teaser: Update the application to consume the value set for the Custom License Field
-notes:
-- type: text
- contents: |-
- In this next challenge we are going to get our hands dirty with some YAML!
- We are going to update the application manifests to support turning on/off the Super Duper Feature.
-tabs:
-- title: Dev
- type: terminal
- hostname: shell
- workdir: /home/replicant
-- title: Code Editor
- type: code
- hostname: shell
- path: /home/replicant/
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-## Setting Up the Dev Environment ##
-
-The application that has been provisioned for you does not currently have the new feature added. So in this challenge we will update the application to include the new feature, which will be in a new `ConfigMap`. We'll then update the application to use the right `ConfigMap` based on the value of the Custom License File we created in the previous challenge.
-
-Before we update the application, let's set up our dev environment. In this lab, you will notice some new tabs:
-
-* **Dev:** This is a Linux environment preloaded with some handy tools, like the `replicated` command line. This will be our dev environment.
-* **Code Editor:** This is a code editor provided by Instruqt. We will use this to edit the manifests.
-
-Let's start by setting our environment variables in our dev environment. The two environment variables are `REPLICATED_APP` and `REPLICATED_API_TOKEN` which tell the `replicated` command line where to push changes. These are covered in the Replicated CLI lab in more detail.
-
-Set the environment variables into your terminal in the **Dev** tab.
-
-```
-export REPLICATED_API_TOKEN=[[Instruqt-Var key="REPLICATED_API_TOKEN" hostname="kubernetes-vm"]]
-export REPLICATED_APP=[[Instruqt-Var key="REPLICATED_APP" hostname="kubernetes-vm"]]
-```
-
-Once you have set your environment variables, you can run `replicated release ls` to see if you get any results.
-
-
-
-If you receive the same result then we have our dev environment ready!
-
-## Downloading the Application Manifests
-
-Next, we are going to download the manifests from the vendor portal. To download the latest version of the application, we'll employ the [release download](https://docs.replicated.com/reference/replicated-cli-release-download) command.
-
-The command needs the `SEQUENCE` we want to download, which was displayed in the results of the `release ls` command:
-```
-SEQUENCE CREATED EDITED ACTIVE_CHANNELS
-1 2022-09-20T19:53:57Z 0001-01-01T00:00:00Z stable
-```
-Let's create a directory structure before we start dowloading files. Create a directory for this lab in your environment and a `manifests` sub directory to store the manifests.
-
-```
-mkdir custom-fields-app
-cd custom-fields-app
-mkdir manifests
-
-```
-To download the contents of the release run the following command
-
-```
-replicated release download 1 -d ./manifests
-
-```
-A succesful download will yield results similar to this:
-
-```shell
- ⢠Fetching Release 1 ā
- ⢠Writing files to ./manifests
- ⢠k8s-app.yaml
- ⢠kots-app.yaml
- ⢠kots-support-bundle.yaml
- ⢠nginx-deployment.yaml
- ⢠nginx-feature-off.yaml
- ⢠nginx-service.yaml
-
-```
-
-Now we are ready to update the application.
-
-## Making Updates to the Application
-
-We are going to add a second `ConfigMap` that will be used when the Super Duper Feature is enabled.
-
-Head over to the **Code Editor** tab, which contains a directory tree that should look similar to this
-
-
-
-You can expand the **custom-fields-app** directory to see its contents:
-
-
-
-Use the **New File** icon (highlighted in red below) to create a new file in the **manifests** directory. Make sure the file is created in the **manifests** directory, otherwise it will not be included in our new release.
-
-
-
-Enter `nginx-feature-on.yaml` as the file name in the dialog.
-
-
-
-You may need to click on the file after you create it to make sure it's opened. Copy and paste the content below:
-
-```yaml
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: nginx-feature-on
-data:
- index.html: |
-
-
-
-
- Custom Fields Track
-
-
-
Congrats!
-
You have turned on the Super Duper Feature!
- This is the default NGINX app
-
-
-```
-
-To save the changes, click on the **Save** icon (highlighted in red below):
-
-
-
-Next, we are going to update the `nginx-deployment.yaml` file to choose which ConfigMap to use.
-
-To do this, we will use [templating](https://docs.replicated.com/vendor/packaging-template-functions), specifically, the [License Context](https://docs.replicated.com/reference/template-functions-license-context).
-
-In the `volumes` section of the file, we will use an `if statement` to determine the `ConfigMap` at run time.
-
-Replace the name of the ConfigMap with the following:
-
-
-```yaml
-'{{repl if (eq (LicenseFieldValue "enable-feature") "true") }}nginx-feature-on{{repl else}}nginx-feature-off{{repl end}}'
-```
-
-Below is what a diff would look like after the change:
-
-```diff
- volumes:
- - name: html
- configMap:
-- name: nginx-feature-off
-+ name: '{{repl if (eq (LicenseFieldValue "enable-feature") "true") }}nginx-feature-on{{repl else}}nginx-feature-off{{repl end}}'
-```
-
-The above basically states that if the Custom License Field is set to true, the value of the `name` key is `nginx-feature-on`, otherwise the value will be `nginx-feature-off`
-
-To save changes, click on the save icon on the file tab in the editor.
-
-Now we are ready to create a new release. Head back to the **Dev** tab and run the following command (make sure you are on the `custom-fields-app` directory):
-
-```
-replicated release create --version 0.1.1 --release-notes "Update for Super Duper feature" \
- --promote Stable --yaml-dir manifests
-```
-
-The output should look very similar to the output below
-
-
-
-Let's verify our release was indeed created and promoted to the channel by running `replicated release ls`. There should be a new SEQUENCE associated to the **stable** channel.
-
-If that is the case, you have completed this challenge and ready to move to the next one!
diff --git a/instruqt/custom-fields/03-updating-the-application/setup-kubernetes-vm b/instruqt/custom-fields/03-updating-the-application/setup-kubernetes-vm
deleted file mode 100644
index 1df9f7a9a..000000000
--- a/instruqt/custom-fields/03-updating-the-application/setup-kubernetes-vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env bash
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-## set variables for use in instructions
-# there's only one app created by the automation, so just grab the first in the list
-access_token=$(get_api_token)
-app_slug=$(curl --header 'Accept: application/json' --header "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].slug')
-
-agent variable set REPLICATED_API_TOKEN ${access_token}
-agent variable set REPLICATED_APP ${app_slug}
-
-exit 0
diff --git a/instruqt/custom-fields/04-setting-the-custom-field/assignment.md b/instruqt/custom-fields/04-setting-the-custom-field/assignment.md
deleted file mode 100755
index 1c03f5d2e..000000000
--- a/instruqt/custom-fields/04-setting-the-custom-field/assignment.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-slug: setting-the-custom-field
-id: cg4lxsjdfb3n
-type: challenge
-title: Setting the Initial Value
-teaser: Let's create a customer license and get the install command
-notes:
-- type: text
- contents: |-
- In this challenge we will create a customer license and set the value of our custom field to `false`.
- While in the Vendor Portal, we'll also grab the install command.
-tabs:
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-## Create Customer ##
-
-Now that we have created our Custom License Field and updated the application, we are ready to put this into motion.
-
-Let's create a new Customer, set the feature flag to `false` and install the application. We will take a look at the application without the Super Duper feature turned on. Then, we'll update the field to `true` and update the application we deployed and verify that the feature is now on.
-
-Go back to your browser that has the Vendor Portal open. If you closed it, no worries, click on the **Open External Window** button on the **Vendor** tab.
-
-
-
-If your session expired, log in again with your credentials.
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="kubernetes-vm" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="kubernetes-vm" ]]`
-
-Let's create a customer, which will create the license file we need to install our sample application. To do this, navigate to **Customers** and click on the **Create Customer** button highlighted below.
-
-
-
-Provide the following information
-
-* **Customer name:** Enter the name of the customer. In the screenshot below, we use `License Customer` as the name.
-
-* **Assigned channel:** By assigning a channel, we can ensure the right version of the application is installed. Select the `Stable` channel.
-* **Expiration policy:** These settings allow to specify if the license should have an expiration date. The expiration date ensures that a new install or upgrades are not allowed as well as restricting access to the image registry. For this lab, leave the setting as-is.
-* **Customer type:** The type of customer you select is used solely for reporting purposes. Their access to your app will not be affected by the type you assign to them. For this lab, select **Development**.
-* **License Options:** This section allows you toggle on & off Replicated features. Leave this section as-is
-* **Custom Fields:** Custom Fields allow you to include custom metadata with the license. The values in these fields can be consumed by the application. In this lab, we have created the **Enable Feature** field. When the field is set to `true` the feature is enabled, and we set to `false` it is not. Let's leave it as `false` for now.
-* **Download Portal:** If the customer has **Airgap Download** enabled, the **Download Portal** provides a place for your customers to download all the nescessary assets.
-
-Once you save the customer, you should see the **Download License** link highlighted below.
-
-
-
-Click on the link to download the file. The license is a YAML file with a signature embedded in it to assure it hasn't been tampered with. Since you downloaded it to your local computer, you can open it in your favorite text editor if you want to take a look.
-
-## Get Install Command
-
-Navigate to **Channels** and find the **Stable** channel. At the bottom of the channel card are the install commands. We need to copy the commands for
-**Existing Cluster** as shown here:
-
-
-
-
-Copy the command to save it to your clipboard.
-
-
-Congratulations! You have finished this challenge!
diff --git a/instruqt/custom-fields/05-admin-console-install/assignment.md b/instruqt/custom-fields/05-admin-console-install/assignment.md
deleted file mode 100755
index de03c8a32..000000000
--- a/instruqt/custom-fields/05-admin-console-install/assignment.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-slug: admin-console-install
-id: beo1zan4ozx3
-type: challenge
-title: Install Admin Console
-teaser: Install the Admin Console, which we'll use to deploy our sample app
-notes:
-- type: text
- contents: In this challenge we will use a terminal to install Admin Console
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 600
----
-š” Install kots
-================
-
-In the previous challenge you already copied the installation command for an existing cluster. It looked like:
-```bash
-curl https://kots.io/install | bash
-kubectl kots install [[Instruqt-Var key="REPLICATED_APP" hostname="kubernetes-vm"]]
-```
-
-If you don't have the command anymore, you can always go back to the `Vendor` tab and copy it from `Channels > Stable` (the existing cluster install command).
-
-Run this command in the `Shell` tab. If prompted for an installation path, leave it blank to use the default. When asked for the `namespace`, you can just press enter and use the one suggested:
-
-
-
-The installation will take a couple minutes, and ask to provide a secure password. Remember it as it will be needed in the next Challenge.
-
-
-
-Once finished you will see the following output:
-
-
-
-Congratulations for finishing this challenge! Click on **Next** to proceed to the next challenge!
diff --git a/instruqt/custom-fields/06-install-application/assignment.md b/instruqt/custom-fields/06-install-application/assignment.md
deleted file mode 100755
index 7f8d11fb9..000000000
--- a/instruqt/custom-fields/06-install-application/assignment.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-slug: install-application
-id: ctn8z4xu0a9l
-type: challenge
-title: Install Application
-teaser: Use the Admin Console to install the sample application.
-notes:
-- type: text
- contents: Now that we have installed the Admin Console, let's use it to deploy the
- sample app
-tabs:
-- title: Admin Console
- type: service
- hostname: kubernetes-vm
- port: 8800
- url: http://kubernetes-vm.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-difficulty: basic
-timelimit: 600
----
-Login to the admin Console by clicking on the **Open External Window** button.
-
-
-
-Enter the password you set during the installation of the Admin Console in the previous challenge.
-
-
-
-Upload the license file we downloaded a couple of challenges ago.
-
-
-
-Wait until the application is `ready` to click on the `Open License Custom Fields App` link
-
-
-
-The sample app should open with the following output:
-
-
-
-If you see the same output, congratulations! You have completed this challenge!
diff --git a/instruqt/custom-fields/06-install-application/setup-kubernetes-vm b/instruqt/custom-fields/06-install-application/setup-kubernetes-vm
deleted file mode 100644
index a1cf8870c..000000000
--- a/instruqt/custom-fields/06-install-application/setup-kubernetes-vm
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-# Setup kotsadm - expose via loadbalancer
-kubectl expose deployment kotsadm -n $(kubectl get pods -A -l app=kotsadm --no-headers | awk '{ print $1 }' ) --type=LoadBalancer --name=kotsadm2 --port=8800 --target-port=3000
diff --git a/instruqt/custom-fields/07-enable-feature/assignment.md b/instruqt/custom-fields/07-enable-feature/assignment.md
deleted file mode 100755
index 152b1fcf2..000000000
--- a/instruqt/custom-fields/07-enable-feature/assignment.md
+++ /dev/null
@@ -1,69 +0,0 @@
----
-slug: enable-feature
-id: yeoizusn3ybg
-type: challenge
-title: Enable the Feature
-teaser: Next, we'll change the feature flag and update the application!
-notes:
-- type: text
- contents: |-
- In this challenge we'll cover:
- - Updating the Custom License Field
- - updating the deployed application
-tabs:
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-- title: Admin Console
- type: service
- hostname: kubernetes-vm
- port: 8800
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-## Update the Customer License
-
-Let's now enable the feature for this customer.
-
-Navigate back to **Customers** in the Vendor Portal. If you closed the browser, no worries, head over to the **Vendor** tab to launch a new browser and use your crednetials to log in again.
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="kubernetes-vm" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="kubernetes-vm" ]]`
-
-
-
-Save the changes. The feature is now available for the customer. If the customer has an online installation you do not need to download the license again.
-
-
-## Update Deployed App
-
-Click on the **Admin Console** tab to access the Admin Console.
-
-Click on **sync licenses** highlighted below
-
-
-
-A dialog is displayed explaining that there is a new version of the application. This is because the underlying manifests have been modified by the license change.
-
-
-
-Click on **Version History** which will take you to **Version history**
-
-
-
-Click on **Deploy** to deploy the update that should now include the Super Duper feature.
-
-Once the update is deployed, click on the Dashboard tab and once the application is **Ready** click on the **Open Custom Fields App** link, which should now look like this:
-
-
-
-You may need to clear your cache or do a hard refresh to see the change
-
-
-
-If you receive the above result, pat yourself on the back for a great job done!
-
-This track is now complete.
diff --git a/instruqt/custom-fields/assets/add-new-field.png b/instruqt/custom-fields/assets/add-new-field.png
deleted file mode 100644
index dc2bb32fe..000000000
Binary files a/instruqt/custom-fields/assets/add-new-field.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-acc-set.png b/instruqt/custom-fields/assets/cf-acc-set.png
deleted file mode 100644
index c604c6756..000000000
Binary files a/instruqt/custom-fields/assets/cf-acc-set.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-app-dir.png b/instruqt/custom-fields/assets/cf-app-dir.png
deleted file mode 100644
index 33d851efb..000000000
Binary files a/instruqt/custom-fields/assets/cf-app-dir.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-app-slug.png b/instruqt/custom-fields/assets/cf-app-slug.png
deleted file mode 100644
index 0f57a98fe..000000000
Binary files a/instruqt/custom-fields/assets/cf-app-slug.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-code-edit-init.png b/instruqt/custom-fields/assets/cf-code-edit-init.png
deleted file mode 100644
index 91393a720..000000000
Binary files a/instruqt/custom-fields/assets/cf-code-edit-init.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-new-file-icon.png b/instruqt/custom-fields/assets/cf-new-file-icon.png
deleted file mode 100644
index 714e9ecfc..000000000
Binary files a/instruqt/custom-fields/assets/cf-new-file-icon.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-new-file.png b/instruqt/custom-fields/assets/cf-new-file.png
deleted file mode 100644
index 0c2cb885e..000000000
Binary files a/instruqt/custom-fields/assets/cf-new-file.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-new-release.png b/instruqt/custom-fields/assets/cf-new-release.png
deleted file mode 100644
index 9a755c20f..000000000
Binary files a/instruqt/custom-fields/assets/cf-new-release.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-save-file-icon.png b/instruqt/custom-fields/assets/cf-save-file-icon.png
deleted file mode 100644
index cfd105257..000000000
Binary files a/instruqt/custom-fields/assets/cf-save-file-icon.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/cf-set-vars.png b/instruqt/custom-fields/assets/cf-set-vars.png
deleted file mode 100644
index b9c64e2cb..000000000
Binary files a/instruqt/custom-fields/assets/cf-set-vars.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/create-field.png b/instruqt/custom-fields/assets/create-field.png
deleted file mode 100644
index 3678cafcc..000000000
Binary files a/instruqt/custom-fields/assets/create-field.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/custom-fields-admin-console.png b/instruqt/custom-fields/assets/custom-fields-admin-console.png
deleted file mode 100644
index a5cae8ee5..000000000
Binary files a/instruqt/custom-fields/assets/custom-fields-admin-console.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/custom-fields-feature-off.png b/instruqt/custom-fields/assets/custom-fields-feature-off.png
deleted file mode 100644
index 2f5b4a936..000000000
Binary files a/instruqt/custom-fields/assets/custom-fields-feature-off.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/custom-fields-install-cmd.png b/instruqt/custom-fields/assets/custom-fields-install-cmd.png
deleted file mode 100644
index d6f995370..000000000
Binary files a/instruqt/custom-fields/assets/custom-fields-install-cmd.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/custom-fields-login.png b/instruqt/custom-fields/assets/custom-fields-login.png
deleted file mode 100644
index 7de44a77e..000000000
Binary files a/instruqt/custom-fields/assets/custom-fields-login.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/custom-fields-upload-license.png b/instruqt/custom-fields/assets/custom-fields-upload-license.png
deleted file mode 100644
index dd18470ff..000000000
Binary files a/instruqt/custom-fields/assets/custom-fields-upload-license.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/customer-list.png b/instruqt/custom-fields/assets/customer-list.png
deleted file mode 100644
index 95bac745c..000000000
Binary files a/instruqt/custom-fields/assets/customer-list.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/external-window.png b/instruqt/custom-fields/assets/external-window.png
deleted file mode 100644
index ae4df940d..000000000
Binary files a/instruqt/custom-fields/assets/external-window.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-admin-console.png b/instruqt/custom-fields/assets/lic-admin-console.png
deleted file mode 100644
index fe061b298..000000000
Binary files a/instruqt/custom-fields/assets/lic-admin-console.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-customer-list.png b/instruqt/custom-fields/assets/lic-customer-list.png
deleted file mode 100644
index 14252cc75..000000000
Binary files a/instruqt/custom-fields/assets/lic-customer-list.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-dashboard-updated.png b/instruqt/custom-fields/assets/lic-dashboard-updated.png
deleted file mode 100644
index 71449cc4e..000000000
Binary files a/instruqt/custom-fields/assets/lic-dashboard-updated.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-install-complete.png b/instruqt/custom-fields/assets/lic-install-complete.png
deleted file mode 100644
index d9adb1fcc..000000000
Binary files a/instruqt/custom-fields/assets/lic-install-complete.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-namespace.png b/instruqt/custom-fields/assets/lic-namespace.png
deleted file mode 100644
index a30ae24d9..000000000
Binary files a/instruqt/custom-fields/assets/lic-namespace.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-new-version.png b/instruqt/custom-fields/assets/lic-new-version.png
deleted file mode 100644
index 5319bddc4..000000000
Binary files a/instruqt/custom-fields/assets/lic-new-version.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-password.png b/instruqt/custom-fields/assets/lic-password.png
deleted file mode 100644
index d9127794b..000000000
Binary files a/instruqt/custom-fields/assets/lic-password.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-sync-licenses.png b/instruqt/custom-fields/assets/lic-sync-licenses.png
deleted file mode 100644
index b5518761d..000000000
Binary files a/instruqt/custom-fields/assets/lic-sync-licenses.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-updated-app.png b/instruqt/custom-fields/assets/lic-updated-app.png
deleted file mode 100644
index 1f6ed4b33..000000000
Binary files a/instruqt/custom-fields/assets/lic-updated-app.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-updated-customer.png b/instruqt/custom-fields/assets/lic-updated-customer.png
deleted file mode 100644
index 036b73296..000000000
Binary files a/instruqt/custom-fields/assets/lic-updated-customer.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/lic-version-tab.png b/instruqt/custom-fields/assets/lic-version-tab.png
deleted file mode 100644
index 57a28c563..000000000
Binary files a/instruqt/custom-fields/assets/lic-version-tab.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/license.png b/instruqt/custom-fields/assets/license.png
deleted file mode 100644
index b395ab22f..000000000
Binary files a/instruqt/custom-fields/assets/license.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/nav-lic-fields.png b/instruqt/custom-fields/assets/nav-lic-fields.png
deleted file mode 100644
index 8a6bdc675..000000000
Binary files a/instruqt/custom-fields/assets/nav-lic-fields.png and /dev/null differ
diff --git a/instruqt/custom-fields/assets/stable-channel.png b/instruqt/custom-fields/assets/stable-channel.png
deleted file mode 100644
index c3dfe82cc..000000000
Binary files a/instruqt/custom-fields/assets/stable-channel.png and /dev/null differ
diff --git a/instruqt/custom-fields/config.yml b/instruqt/custom-fields/config.yml
deleted file mode 100644
index dd7476361..000000000
--- a/instruqt/custom-fields/config.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: gcr.io/kots-field-labs/shell
- shell: su - replicant
- memory: 256
-virtualmachines:
-- name: kubernetes-vm
- image: instruqt/k3s-v1-25-0
- shell: /bin/bash -l
- machine_type: n1-standard-2
- allow_external_ingress:
- - http
- - https
- - high-ports
diff --git a/instruqt/custom-fields/track.yml b/instruqt/custom-fields/track.yml
deleted file mode 100755
index 6681b937a..000000000
--- a/instruqt/custom-fields/track.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-slug: custom-fields
-id: 9ixa2iyrggut
-title: Managing Features with Custom License Fields
-teaser: |-
- Learn how to use Custom License Fields to manage which features to enable
- to your customers
-description: |-
- In this track we take a deeper look at using Licenses with Replicated.
- In this track, you will learn how to define Custom License Fields and how to use
- them to manage features.
-icon: https://storage.googleapis.com/shared-lab-assets/icons/blue/licensing.png
-tags:
- - deprecated
- - premium-plans
-owner: replicated
-developers:
- - fernando@replicated.com
- - chuck@replicated.com
-lab_config:
- overlay: false
- width: 25
- position: right
-checksum: "16074264238685599528"
diff --git a/instruqt/custom-fields/track_scripts/setup-kubernetes-vm b/instruqt/custom-fields/track_scripts/setup-kubernetes-vm
deleted file mode 100755
index 558e401f0..000000000
--- a/instruqt/custom-fields/track_scripts/setup-kubernetes-vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-# Wait for the Instruqt host bootstrap to finish
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# Wait for the Kubernetes API server to become available
-while ! curl --silent --fail --output /dev/null http://localhost:8001/api
-do
- sleep 1
-done
-
-# Enable bash completion for kubectl
-echo "source /usr/share/bash-completion/bash_completion" >> /root/.bashrc
-echo "complete -F __start_kubectl k" >> /root/.bashrc
-
-# Add kots kubectl plugin
-curl -fsSL https://kots.io/install | bash
-
-# Display PARTICIPANT_ID info for Vendor Portal
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-echo "show_credentials" >> /root/.bashrc
diff --git a/instruqt/custom-fields/vendor/manifests/k8s-app.yaml b/instruqt/custom-fields/vendor/manifests/k8s-app.yaml
deleted file mode 100644
index 9646f34b9..000000000
--- a/instruqt/custom-fields/vendor/manifests/k8s-app.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-apiVersion: app.k8s.io/v1beta1
-kind: Application
-metadata:
- name: "Custom Fields"
-spec:
- descriptor:
- links:
- - description: Open Custom Fields App
- url: "http://nginx"
\ No newline at end of file
diff --git a/instruqt/custom-fields/vendor/manifests/kots-app.yaml b/instruqt/custom-fields/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 53afdf680..000000000
--- a/instruqt/custom-fields/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: app-slug
-spec:
- title: "Custom License Fields App"
- statusInformers:
- - deployment/nginx
- ports:
- - serviceName: "nginx"
- servicePort: 80
- localPort: 30888
- applicationUrl: "http://nginx"
- icon: data:image/png;base64,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
\ No newline at end of file
diff --git a/instruqt/custom-fields/vendor/manifests/kots-support-bundle.yaml b/instruqt/custom-fields/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index 35f674f09..000000000
--- a/instruqt/custom-fields/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: CustomFields
-spec:
- collectors:
- - logs:
- selector:
- - app=nginx
- namespace: '{{repl Namespace }}'
- analyzers: []
-
diff --git a/instruqt/custom-fields/vendor/manifests/nginx-deployment.yaml b/instruqt/custom-fields/vendor/manifests/nginx-deployment.yaml
deleted file mode 100644
index d18e1a981..000000000
--- a/instruqt/custom-fields/vendor/manifests/nginx-deployment.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:latest
- volumeMounts:
- - mountPath: /usr/share/nginx/html
- name: html
- resources:
- limits:
- memory: '256Mi'
- cpu: '500m'
- requests:
- memory: '32Mi'
- cpu: '100m'
- volumes:
- - name: html
- configMap:
- name: nginx-feature-off
diff --git a/instruqt/custom-fields/vendor/manifests/nginx-feature-off.yaml b/instruqt/custom-fields/vendor/manifests/nginx-feature-off.yaml
deleted file mode 100644
index 047707748..000000000
--- a/instruqt/custom-fields/vendor/manifests/nginx-feature-off.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: nginx-feature-off
-data:
- index.html: |
-
-
-
-
- Learning Custom License Fields
-
-
-
Congrats!
- This is the default NGINX
-
-
\ No newline at end of file
diff --git a/instruqt/custom-fields/vendor/manifests/nginx-service.yaml b/instruqt/custom-fields/vendor/manifests/nginx-service.yaml
deleted file mode 100644
index e1a30e5fe..000000000
--- a/instruqt/custom-fields/vendor/manifests/nginx-service.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- type: NodePort
- ports:
- - port: 80
- nodePort: 30888
- selector:
- app: nginx
diff --git a/instruqt/custom-fields/vendor/vendor.json b/instruqt/custom-fields/vendor/vendor.json
deleted file mode 100644
index 2e6f0afbb..000000000
--- a/instruqt/custom-fields/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "CustomFields",
- "slug": "customfields",
- "customer": "",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": ""
-}
diff --git a/instruqt/hello-world/01-intro/assignment.md b/instruqt/hello-world/01-intro/assignment.md
deleted file mode 100755
index 62ee28c1f..000000000
--- a/instruqt/hello-world/01-intro/assignment.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-slug: intro
-id: fcmnc0sptag8
-type: challenge
-title: Intro
-teaser: Introduction to deploy a hello world app
-notes:
-- type: text
- contents: |-
- This track uses a single node Kubernetes cluster on a sandbox virtual machine.
- Please wait while we boot the VM for you and start Kubernetes.
-
- ## Objectives
-
- **This track demonstrates how to:**
- - Install Replicated's application installer
- - Deploy a webserver (NGINX) on Kubernetes using Replicated
- - Make a change in the webserver configuration and update the application
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-difficulty: basic
-timelimit: 300
----
-
-š Introduction
-===============
-
-This exercise is designed to give you a sandbox to ensure you have a basic understanding how to deploy a kubernetes application using Replicated.
-
-The README and the YAML sources draw from https://github.com/replicatedhq/replicated-starter-kots
-
-* **What you will do**:
- * Complete the simplest possible "Hello World" setup with a minimal KOTS application designed for demos
-* **Who this is for**: This lab is for anyone who works with app code, docker images, k8s yamls, or does field support for multi-prem applications
- * Full Stack / DevOps / Product Engineers
- * Support Engineers
- * Implementation / Field Engineers
-* **Prerequisites**:
- * Basic working knowledge of Kubernetes
-* **Outcomes**:
- * You will build a working understanding of how to deploy a kubernetes application packaged with Replicated using kots.
-
-
-š Get started
-===============
-
-Use the terminal to check if kubernetes is running:
-
-```
-kubectl get nodes
-```
-
-To complete this challenge, press **Check**.
diff --git a/instruqt/hello-world/01-intro/check-kubernetes-vm b/instruqt/hello-world/01-intro/check-kubernetes-vm
deleted file mode 100755
index 0c435751a..000000000
--- a/instruqt/hello-world/01-intro/check-kubernetes-vm
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-kubectl get nodes || fail-message "I expected an nginx deployment"
-
-
diff --git a/instruqt/hello-world/01-intro/solve-kubernetes-vm b/instruqt/hello-world/01-intro/solve-kubernetes-vm
deleted file mode 100755
index c0c314b06..000000000
--- a/instruqt/hello-world/01-intro/solve-kubernetes-vm
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-kubectl get nodes
diff --git a/instruqt/hello-world/02-getting-started/assignment.md b/instruqt/hello-world/02-getting-started/assignment.md
deleted file mode 100755
index a9f2f2555..000000000
--- a/instruqt/hello-world/02-getting-started/assignment.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-slug: getting-started
-id: iqx8rp86mmkh
-type: challenge
-title: Getting Started
-teaser: Check your email
-notes:
-- type: text
- contents: Making sure you have access to vendor.replicated.com
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 300
----
-
-š Let's start
-==============
-
-### 1. Vendor Portal login
-
-To access the Vendor Portal, you will need your username and password. The lab
-setup has configured your account the following credentials:
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="kubernetes-vm" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="kubernetes-vm" ]]`
-
-Now that you have the credentials, you can login into the Vendor tab and you should land on the Channels. Channels allow you to manage who has access to which releases of your application.
-
-### 2. Getting the install command
-
-Once you're logged in, go to `Channels > Stable` and grab the existing cluster install command.
-
-
-
-We will use this command in the next challenge to kick off the installation process.
-
-### 3. Download a Customer License
-
-A customer license (downloadable as a `.yaml` file) is required to install any KOTS application.
-To create a customer license, go to `Customers > Hola Customer` by selecting the "Customers" link on the left in the Vendor Portal. Customers for each lab have already been created for you.
-
-
-
-You can view the customer details by clicking the row.
-For this Hello World exercise we'll use `Hola Customer`.
-You'll notice that the customer is assigned to the "Stable" channel on the right hand side, and the Customer Type is set to "Development".
-When you've reviewed these, you can click the "Download License" link in the top right corner.
-
-
-
-This will download the file with your customer name and a `.yaml` extension.
-This is the license file a customer would need to install your application.
diff --git a/instruqt/hello-world/02-getting-started/setup-kubernetes-vm b/instruqt/hello-world/02-getting-started/setup-kubernetes-vm
deleted file mode 100755
index 760b06e90..000000000
--- a/instruqt/hello-world/02-getting-started/setup-kubernetes-vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-HOME_DIR=/home/replicant
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-agent variable set USERNAME $(get_username)
-agent variable set PASSWORD $(get_password)
-
-
diff --git a/instruqt/hello-world/03-kots-install/assignment.md b/instruqt/hello-world/03-kots-install/assignment.md
deleted file mode 100755
index 3f54ea1e7..000000000
--- a/instruqt/hello-world/03-kots-install/assignment.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-slug: kots-install
-id: 9yyncefqzmrx
-type: challenge
-title: Kots install
-teaser: Start the application installer
-notes:
-- type: text
- contents: Let's install the application installer
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-š” Install kots
-================
-
-In the previous challenge you already copied the installation command for an existing cluster. It looked like:
-
-```bash
-curl https://kots.io/install | bash
-kubectl kots install [[ Instruqt-Var key="REPLICATED_APP" hostname="kubernetes-vm" ]]
-```
-
-If you don't have the command anymore, you can always go back to the `Vendor` tab and copy it from `Channels > Stable` (the existing cluster install command).
-
-Run this command in the `Shell` tab. When asked for the `namespace`, you can just press enter and use the one suggested:
-
-
-
-The installation will take a couple minutes, and ask to provide a secure password. Remember it as it will be needed in the next Challenge.
-
-
-
-Once finished you will see the following output:
-
-
-
-
-Feel free to press `Ctrl+C` and press **Check** to continue to the next challenge.
diff --git a/instruqt/hello-world/03-kots-install/check-kubernetes-vm b/instruqt/hello-world/03-kots-install/check-kubernetes-vm
deleted file mode 100755
index 7bb527138..000000000
--- a/instruqt/hello-world/03-kots-install/check-kubernetes-vm
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-
-if kubectl get pods -A -l app=kotsadm --no-headers -o custom-columns=":status.phase" | grep -q "Running"; then
- echo "Yeah running"
-else
- kubectl get pods -A -l app=kotsadm
- fail-message "I expected kotsadm to be running"
-fi
-
diff --git a/instruqt/hello-world/03-kots-install/setup-kubernetes-vm b/instruqt/hello-world/03-kots-install/setup-kubernetes-vm
deleted file mode 100755
index cc5270f25..000000000
--- a/instruqt/hello-world/03-kots-install/setup-kubernetes-vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-HOME_DIR=/home/replicant
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-# there's only one app created by the automation, so just grab the first in the list
-access_token=$(get_api_token)
-app_slug=$(curl --header 'Accept: application/json' --header "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].slug')
-
-agent variable set REPLICATED_APP ${app_slug}
-
-
diff --git a/instruqt/hello-world/03-kots-install/solve-kubernetes-vm b/instruqt/hello-world/03-kots-install/solve-kubernetes-vm
deleted file mode 100755
index 903780c66..000000000
--- a/instruqt/hello-world/03-kots-install/solve-kubernetes-vm
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-echo "This is the solve script"
-
-
-kubectl kots install hello-world \
- --shared-password ${INSTRUQT_PARTICIPANT_ID} \
- --namespace hello \
- --no-port-forward
\ No newline at end of file
diff --git a/instruqt/hello-world/04-hello-world-install/assignment.md b/instruqt/hello-world/04-hello-world-install/assignment.md
deleted file mode 100755
index 3b443f58a..000000000
--- a/instruqt/hello-world/04-hello-world-install/assignment.md
+++ /dev/null
@@ -1,78 +0,0 @@
----
-slug: hello-world-install
-id: 6qxrucass5to
-type: challenge
-title: Hello World install
-teaser: Install Hello World using Replicated Application Installer
-notes:
-- type: text
- contents: Let's install the Hello World Application
-tabs:
-- title: Application Installer
- type: website
- url: http://kubernetes-vm.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-difficulty: basic
-timelimit: 900
----
-
-š Install Hello World
-===============
-
-## Step 01
-
-Go to the Application Installer tab, and login using the password you used in the previous step.
-
-
-
-If you forgot the password, enter the shell and run `kubectl kots reset-password -n `
-
-## Step 02
-
-Upload the license for the `Hola Customer` you downloaded in Challenge #2
-
-
-
-## Step 03
-
-Customize the hello world application by adding some text examples like below:
-
-
-
-For now, you can just ignore the `API token` and `Readonly text` fields.
-
-## Step 04
-
-Click `Continue` and watch the Preflights run. These preflights will validate the application environment.
-
-
-
-Once the preflights are finished, you can check the results which will look like below
-
-
-
-For now we will ignore the warnings and click `Continue`. As there is an issue with one of the preflights, you will have to confirm that you want to `Deploy and continue`.
-
-
-
-## Step 05
-
-Once you clicked on `Continue`, the Application Installer will deploy the Hello World Application.
-
-
-
-If you want to check the "Hello World" application, you can do so by clicking on `Open App`
-
-
-
-It will open a new tab and you should see something similar like the screenshot below:
-
-
-
-š Finish
-=========
-
-If you've viewed the Hello World app, congratulations! You've deployed your first application using the Replicated Application Installer. You can click **Check** to finish this track.
diff --git a/instruqt/hello-world/04-hello-world-install/check-kubernetes-vm b/instruqt/hello-world/04-hello-world-install/check-kubernetes-vm
deleted file mode 100755
index ea1de5791..000000000
--- a/instruqt/hello-world/04-hello-world-install/check-kubernetes-vm
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-kubectl get po -A || fail-message "I expected hello-world to be running"
-
-
diff --git a/instruqt/hello-world/04-hello-world-install/setup-kubernetes-vm b/instruqt/hello-world/04-hello-world-install/setup-kubernetes-vm
deleted file mode 100755
index 9c13a544d..000000000
--- a/instruqt/hello-world/04-hello-world-install/setup-kubernetes-vm
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/bash
-
-# Setup kotsadm - expose via loadbalancer
-kubectl expose deployment kotsadm -n $(kubectl get pods -A -l app=kotsadm --no-headers | awk '{ print $1 }' ) --type=LoadBalancer --name=kotsadm2 --port=8800 --target-port=3000
-
-# We need to expose kotsadm over https
-# kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.8.0/cert-manager.yaml
-
-# wait for cert-manager
-# while true; do
-# if kubectl get pods -A -l app=cert-manager --no-headers -o custom-columns=":status.phase" | grep -q "Running"; then
-# echo "Yeah running"
-# break
-# else
-# kubectl get pods -A -l app=kotsadm
-# sleep 1
-# continue
-# fi
-# done
-
-# cat >> ~/letsencrypt-prod.yaml <<-EOF
-# apiVersion: cert-manager.io/v1
-# kind: ClusterIssuer
-# metadata:
-# name: letsencrypt-prod
-# spec:
-# acme:
-# email: joshd@replicated.com
-# server: https://acme-v02.api.letsencrypt.org/directory
-# privateKeySecretRef:
-# name: letsencrypt-prod
-# solvers:
-# - http01:
-# ingress:
-# class: traefik
-# EOF
-
-# cat ~/letsencrypt-prod.yaml | envsubst | kubectl apply -f -
-
-# cat >> ~/traefik-https-redirect-middleware.yaml <<-EOF
-# apiVersion: traefik.containo.us/v1alpha1
-# kind: Middleware
-# metadata:
-# name: redirect-https
-# spec:
-# redirectScheme:
-# scheme: https
-# permanent: true
-# EOF
-
-# cat traefik-https-redirect-middleware.yaml | envsubst | kubectl apply -f -
-
-# cat >> ~/kotsadm-ingress-tls.yaml <<-EOF
-# apiVersion: networking.k8s.io/v1
-# kind: Ingress
-# metadata:
-# name: kotsadm-ingress-tls
-# annotations:
-# kubernetes.io/ingress.class: traefik
-# cert-manager.io/cluster-issuer: letsencrypt-prod
-# traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
-# spec:
-# rules:
-# - host: kubernetes-vm.${_SANDBOX_ID}.instruqt.io
-# http:
-# paths:
-# - path: /
-# pathType: Prefix
-# backend:
-# service:
-# name: kotsadm
-# port:
-# number: 3000
-# tls:
-# - secretName: kotsadm-tls
-# hosts:
-# - kubernetes-vm.${_SANDBOX_ID}.instruqt.io
-# EOF
-
-# cat ~/kotsadm-ingress-tls.yaml | envsubst | kubectl apply -n $(kubectl get pods -A -l app=kotsadm --no-headers | awk '{ print $1 }' ) -f -
diff --git a/instruqt/hello-world/assets/config.png b/instruqt/hello-world/assets/config.png
deleted file mode 100644
index 49205b515..000000000
Binary files a/instruqt/hello-world/assets/config.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/customers-all.png b/instruqt/hello-world/assets/customers-all.png
deleted file mode 100644
index cacdb4059..000000000
Binary files a/instruqt/hello-world/assets/customers-all.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/dashboard.png b/instruqt/hello-world/assets/dashboard.png
deleted file mode 100644
index 8eac6c69f..000000000
Binary files a/instruqt/hello-world/assets/dashboard.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/hola-result.png b/instruqt/hello-world/assets/hola-result.png
deleted file mode 100644
index 8f9380349..000000000
Binary files a/instruqt/hello-world/assets/hola-result.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/kots-install-finished.png b/instruqt/hello-world/assets/kots-install-finished.png
deleted file mode 100644
index 7e6cfb609..000000000
Binary files a/instruqt/hello-world/assets/kots-install-finished.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/login.png b/instruqt/hello-world/assets/login.png
deleted file mode 100644
index b4c0a0d13..000000000
Binary files a/instruqt/hello-world/assets/login.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/namespace.png b/instruqt/hello-world/assets/namespace.png
deleted file mode 100644
index ac743fb80..000000000
Binary files a/instruqt/hello-world/assets/namespace.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/open-app.png b/instruqt/hello-world/assets/open-app.png
deleted file mode 100644
index 8eac6c69f..000000000
Binary files a/instruqt/hello-world/assets/open-app.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/password.png b/instruqt/hello-world/assets/password.png
deleted file mode 100644
index e3b294451..000000000
Binary files a/instruqt/hello-world/assets/password.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/preflights-deploy.png b/instruqt/hello-world/assets/preflights-deploy.png
deleted file mode 100644
index 5a9e55129..000000000
Binary files a/instruqt/hello-world/assets/preflights-deploy.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/preflights-results.png b/instruqt/hello-world/assets/preflights-results.png
deleted file mode 100644
index 0f2bb7f53..000000000
Binary files a/instruqt/hello-world/assets/preflights-results.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/preflights-run.png b/instruqt/hello-world/assets/preflights-run.png
deleted file mode 100644
index ac6a32ca9..000000000
Binary files a/instruqt/hello-world/assets/preflights-run.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/stable-channel.png b/instruqt/hello-world/assets/stable-channel.png
deleted file mode 100644
index 8ee8307ee..000000000
Binary files a/instruqt/hello-world/assets/stable-channel.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/upload-license.png b/instruqt/hello-world/assets/upload-license.png
deleted file mode 100644
index 68a88488d..000000000
Binary files a/instruqt/hello-world/assets/upload-license.png and /dev/null differ
diff --git a/instruqt/hello-world/assets/view-customer.png b/instruqt/hello-world/assets/view-customer.png
deleted file mode 100644
index 08cd7b78e..000000000
Binary files a/instruqt/hello-world/assets/view-customer.png and /dev/null differ
diff --git a/instruqt/hello-world/config.yml b/instruqt/hello-world/config.yml
deleted file mode 100644
index 34268b29b..000000000
--- a/instruqt/hello-world/config.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-version: "3"
-virtualmachines:
-- name: kubernetes-vm
- image: instruqt/k3s-v1-25-0
- shell: /bin/bash -l
- machine_type: n1-standard-2
- allow_external_ingress:
- - http
- - https
- - high-ports
-
diff --git a/instruqt/hello-world/track.yml b/instruqt/hello-world/track.yml
deleted file mode 100755
index 4090169ea..000000000
--- a/instruqt/hello-world/track.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-slug: hello-world
-id: otit0x2yl9ry
-title: Deploy a Hello World Application with Replicated
-teaser: Learn how to deploy kubernetes applications using Replicated
-description: |-
- Learn how to deploy kubernetes applications using Replicated.
-
- **This track demonstrates how to:**
- - Install Replicated's application installer
- - Deploy a webserver (NGINX) on Kubernetes using Replicated
-icon: https://storage.googleapis.com/shared-lab-assets/icons/blue/app_open.png
-tags:
- - deprecated
- - premium-plans
-owner: replicated
-developers:
- - joshd@replicated.com
- - chuck@replicated.com
-lab_config:
- overlay: false
- width: 25
- position: right
-checksum: "2352879202844185805"
diff --git a/instruqt/hello-world/track_scripts/setup-kubernetes-vm b/instruqt/hello-world/track_scripts/setup-kubernetes-vm
deleted file mode 100755
index 59f96ebd6..000000000
--- a/instruqt/hello-world/track_scripts/setup-kubernetes-vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-# Wait for the Instruqt host bootstrap to finish
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# Wait for the Kubernetes API server to become available
-while ! curl --silent --fail --output /dev/null http://localhost:8001/api
-do
- sleep 1
-done
-
-# Enable bash completion for kubectl
-echo "source /usr/share/bash-completion/bash_completion" >> /root/.bashrc
-echo "complete -F __start_kubectl k" >> /root/.bashrc
-
-# Add kots kubectl plugin
-curl -fsSL https://kots.io/install | bash
-
-# Display PARTICIPANT_ID info for Vendor Portal
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-echo "show_credentials" >> /root/.bashrc
\ No newline at end of file
diff --git a/instruqt/hello-world/vendor/manifests/example-configmap.yaml b/instruqt/hello-world/vendor/manifests/example-configmap.yaml
deleted file mode 100644
index 77860a9a1..000000000
--- a/instruqt/hello-world/vendor/manifests/example-configmap.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: nginx-content
-data:
- index.html: |
-
-
-
-
- Demo Application
-
-
-
- This is an example KOTS application.
-
This is text from a user config value: '{{repl ConfigOption "example_default_value"}}'
-
- This is a hidden value: '{{repl ConfigOption "hidden_text"}}'
-
-
- styles.css: |
- body {
- text-align: center;
- background-color: rgb(224,224,224);
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 100%;
- }
diff --git a/instruqt/hello-world/vendor/manifests/example-deployment.yaml b/instruqt/hello-world/vendor/manifests/example-deployment.yaml
deleted file mode 100644
index adbeee89b..000000000
--- a/instruqt/hello-world/vendor/manifests/example-deployment.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- annotations:
- backup.velero.io/backup-volumes: nginx-content
- spec:
- containers:
- - name: nginx
- image: nginx
- volumeMounts:
- - name: nginx-content
- mountPath: /usr/share/nginx/html/
- resources:
- limits:
- memory: '256Mi'
- cpu: '500m'
- requests:
- memory: '32Mi'
- cpu: '100m'
- volumes:
- - name: nginx-content
- configMap:
- name: nginx-content
diff --git a/instruqt/hello-world/vendor/manifests/example-service.yaml b/instruqt/hello-world/vendor/manifests/example-service.yaml
deleted file mode 100644
index 3fed6604c..000000000
--- a/instruqt/hello-world/vendor/manifests/example-service.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- type: NodePort
- ports:
- - port: 80
- nodePort: 30888
- selector:
- app: nginx
\ No newline at end of file
diff --git a/instruqt/hello-world/vendor/manifests/k8s-app.yaml b/instruqt/hello-world/vendor/manifests/k8s-app.yaml
deleted file mode 100644
index 2edb42e99..000000000
--- a/instruqt/hello-world/vendor/manifests/k8s-app.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: app.k8s.io/v1beta1
-kind: Application
-metadata:
- name: "nginx"
-spec:
- descriptor:
- links:
- - description: Open App
- # needs to match applicationUrl in kots-app.yaml
- url: "http://nginx"
\ No newline at end of file
diff --git a/instruqt/hello-world/vendor/manifests/kots-app.yaml b/instruqt/hello-world/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 9cadb8b4d..000000000
--- a/instruqt/hello-world/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: nginx
-spec:
- title: Hello World
- icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/kubernetes/icon/color/kubernetes-icon-color.png
- statusInformers:
- - deployment/nginx
- ports:
- - serviceName: "nginx"
- servicePort: 80
- localPort: 30888
- applicationUrl: "http://nginx"
diff --git a/instruqt/hello-world/vendor/manifests/kots-config.yaml b/instruqt/hello-world/vendor/manifests/kots-config.yaml
deleted file mode 100644
index a8b646d3e..000000000
--- a/instruqt/hello-world/vendor/manifests/kots-config.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Config
-metadata:
- name: config-sample
-spec:
- groups:
- - name: example_settings
- title: My Example Config
- description: Configuration to serve as an example for creating your own. See [https://kots.io/reference/v1beta1/config/](https://kots.io/reference/v1beta1/config/) for configuration docs. In this case, we provide example fields for configuring an Nginx welcome page.
- items:
- - name: show_text_inputs
- title: Customize Text Inputs
- help_text: "Show custom user text inputs"
- type: bool
- default: "0"
- recommended: true
- - name: example_default_value
- title: Text Example (with default value)
- type: text
- value: ""
- default: please change this value
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: api_token
- title: API token
- type: password
- props:
- rows: 5
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: readonly_text_left
- title: Readonly Text
- type: text
- value: "{{repl RandomString 10}}"
- readonly: true
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: hidden_text
- title: Secret Key
- type: password
- hidden: true
- value: "{{repl RandomString 40}}"
diff --git a/instruqt/hello-world/vendor/manifests/kots-preflight.yaml b/instruqt/hello-world/vendor/manifests/kots-preflight.yaml
deleted file mode 100644
index e5b35fc4a..000000000
--- a/instruqt/hello-world/vendor/manifests/kots-preflight.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: Preflight
-metadata:
- name: preflight-checks
-spec:
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.20.0"
- message: The application requires Kubernetes 1.20.0 or later, and recommends 1.21.0 or later.
- uri: https://www.kubernetes.io
- - warn:
- when: "< 1.21.0"
- message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.21.0 or later.
- uri: https://kubernetes.io
- - pass:
- message: Your cluster meets the recommended and required versions of Kubernetes.
- - containerRuntime:
- outcomes:
- - pass:
- when: "== containerd"
- message: containerd container runtime was found.
- - fail:
- message: Did not find containerd container runtime.
- - distribution:
- outcomes:
- - fail:
- when: "== docker-desktop"
- message: The application does not support Docker Desktop clusters.
- - fail:
- when: "== microk8s"
- message: The application does not support MicroK8s clusters.
- - fail:
- when: "== minikube"
- message: The application does not support minikube clusters.
- - pass:
- when: "== eks"
- message: EKS is a supported distribution.
- - pass:
- when: "== gke"
- message: GKE is a supported distribution.
- - pass:
- when: "== k3s"
- message: k3s is a supported distribution.
- - pass:
- when: "== aks"
- message: AKS is a supported distribution.
- # Will be supported in the future
- - pass:
- when: "== kurl"
- message: kURL is a supported distribution.
- - pass:
- when: "== digitalocean"
- message: DigitalOcean is a supported distribution.
- - warn:
- message: Unable to determine the distribution of Kubernetes.
- - nodeResources:
- checkName: Total CPU Cores
- outcomes:
- - fail:
- when: "sum(cpuCapacity) < 2"
- message: The cluster must contain at least 2 cores, and should contain at least 4 cores.
- - warn:
- when: "sum(cpuCapacity) < 4"
- message: The cluster should contain at least 4 cores.
- - pass:
- message: There are at least 4 cores in the cluster.
diff --git a/instruqt/hello-world/vendor/manifests/kots-support-bundle.yaml b/instruqt/hello-world/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index 4f0ade3da..000000000
--- a/instruqt/hello-world/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: support-bundle
-spec:
- collectors:
- - clusterInfo: {}
- - clusterResources: {}
- - logs:
- selector:
- - app=nginx
- namespace: '{{repl Namespace }}'
diff --git a/instruqt/hello-world/vendor/vendor.json b/instruqt/hello-world/vendor/vendor.json
deleted file mode 100644
index a990ce563..000000000
--- a/instruqt/hello-world/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Hello World",
- "slug": "hello-world",
- "customer": "Hola Customer",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": ""
-}
\ No newline at end of file
diff --git a/instruqt/providing-a-console/track.yml b/instruqt/providing-a-console/track.yml
deleted file mode 100755
index b195d2cef..000000000
--- a/instruqt/providing-a-console/track.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-slug: providing-a-console
-title: Providing an Administration Console
-teaser: |-
- Add an administration console to your application to allow
- for graphical installation, troubleshooting, and management.
-description: |-
-
- Some customers appreciate a graphical user interface to support installation,
- configuration, troubleshooting, and management of your application. Learn how
- the Replicated Admin Console provides those capabilities to your customers
- with a few small changes to how you release your and distribute.
-
- **This lab demonstrates how to:**
-
- * Prepare an installation package that includes the Replicated Admin Console.
- * Provide a user interface for your customer to configure their installation.
- * Install an application the way your customer will do it.
-icon: https://storage.googleapis.com/shared-lab-assets/icons/red/admin.png
-tags:
-- premium-plans
-- kots
-- helm
-owner: replicated
-developers:
-- chuck@replicated.com
-maintenance: true
-lab_config:
- overlay: false
- width: 33
- position: right
diff --git a/instruqt/providing-a-console/vendor/vendor.json b/instruqt/providing-a-console/vendor/vendor.json
deleted file mode 100644
index ba5f5ff9a..000000000
--- a/instruqt/providing-a-console/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Harbor",
- "slug": "harbor",
- "customer": "Omozan",
- "yaml_dir": "",
- "k8s_installer_yaml_path": ""
-}
diff --git a/instruqt/proxy/01-proxy-config/assignment.md b/instruqt/proxy/01-proxy-config/assignment.md
deleted file mode 100755
index 35d5a8f3f..000000000
--- a/instruqt/proxy/01-proxy-config/assignment.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-slug: proxy-config
-id: rkd0axhzc3me
-type: challenge
-title: Proxy Config
-teaser: Test connectivity and configure proxy
-notes:
-- type: text
- contents: |
- # Test external network access and configure proxy
-
- This track environment has an isolated deployment host that can access external sites using a proxy server.
-tabs:
-- title: Host
- type: terminal
- hostname: isolated-host
-difficulty: basic
-timelimit: 1200
----
-
-š” Shell
-=========
-
-Test that the host has outbound traffic blocked.
-
-Test blocked website:
-```bash
-curl -v -m 5 https://lwn.net 2>&1 | egrep 'Trying|HTTP/|Failed|error|unreachable'
-```
-
-Test website with proxy config:
-```
-curl -v -m 5 --proxy http://proxy-host:3128 https://lwn.net 2>&1 | egrep 'Trying|HTTP/|Failed|error'
-```
-
-Ping blocked test:
-```
-ping -c 3 google.com
-```
-
-Package manager already configured with proxy as usually packages available in internal repos.
-```
-apt-get install -y tree
-```
-
-Set the proxy environment variables and retest site access"
-```
-export http_proxy=http://proxy-host:3128
-export https_proxy=http://proxy-host:3128
-```
-
-Test website access now works without the additional --proxy parameter::
-```bash
-curl -v -m 5 https://lwn.net 2>&1 | egrep 'Trying|HTTP/|Failed|error|unreachable'
-```
-
-
-š Next
-=======
-
-To complete the challenge, press **Next**.
diff --git a/instruqt/proxy/01-proxy-config/setup-isolated-host b/instruqt/proxy/01-proxy-config/setup-isolated-host
deleted file mode 100755
index bc30e2fed..000000000
--- a/instruqt/proxy/01-proxy-config/setup-isolated-host
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-set -euxo pipefail
-
-echo "Running challenge 01 setup script - Started.."
-epoc_start=`date +%s`
-
-# drop egress (doesn't work with this in track_scripts setup stage as breaks instruqt setup)
-iptables -A OUTPUT -p tcp -m tcp -j DROP
-iptables -A OUTPUT -p icmp -j DROP
-
-# clear some daily package management tasks that cause dpkg lock when installing kurl
-systemctl stop apt-daily.timer
-systemctl disable apt-daily.timer
-systemctl mask apt-daily.service
-systemctl daemon-reload
-mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
-rm -f /etc/cron.daily/dpkg
-rm -f /etc/apt/apt.conf.d/10periodic
-
-# done
-epoc_end=`date +%s`
-duration=$(($epoc_end - $epoc_start))
-DURATION=`echo "DURATION: $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."`
-echo "challenge 01 setup script - Done ($DURATION)"
-
-exit 0
diff --git a/instruqt/proxy/02-kurl-install/assignment.md b/instruqt/proxy/02-kurl-install/assignment.md
deleted file mode 100755
index 0079c7594..000000000
--- a/instruqt/proxy/02-kurl-install/assignment.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-slug: kurl-install
-id: c0g5jayumshi
-type: challenge
-title: kURL install with proxy config
-teaser: Install kURL cluster via proxy server
-notes:
-- type: text
- contents: |
- # Install kURL using a proxy server
-tabs:
-- title: Host
- type: terminal
- hostname: isolated-host
-difficulty: basic
-timelimit: 3600
----
-
-š” Shell
-=========
-
-Check proxy env variables present
-```
-env | grep proxy
-```
-
-Download kurl installer
-```
-curl https://kurl.sh/proxy-$INSTRUQT_PARTICIPANT_ID -o /root/kurl-install.sh
-```
-
-Install kurl kubernetes cluster
-note the below command uses 'screen' to run the install in the background which protects instruqt session timeouts when screen locks.
-```
-screen -d -m bash -c 'time bash /root/kurl-install.sh 2>&1 | tee -a /root/kurl-install.log'
-```
-
-The kurl installer will take around 10-12 minutes to complete.
-
-Monitor the installation progress by tailing the log file..
-```
-tail -f /root/kurl-install.log
-```
-
-Note the proxy settings picked up by the kurl installer:
-```
-cat /root/kurl-install.log | grep proxy
-```
-
-When the installation has completed, test kubernetes is running
-```
-kubectl get nodes
-```
-
-and kotsadm services are deployed and running
-```
-kubectl get all
-```
-
-Change the default randomly generated kotsadm password to a known value
-```
-echo mytestapp | /usr/bin/kubectl kots --kubeconfig=/etc/kubernetes/admin.conf reset-password -n default
-```
-
-š Next
-=======
-
-To complete the challenge, press **Next**.
diff --git a/instruqt/proxy/02-kurl-install/setup-isolated-host b/instruqt/proxy/02-kurl-install/setup-isolated-host
deleted file mode 100755
index 15abae446..000000000
--- a/instruqt/proxy/02-kurl-install/setup-isolated-host
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-set -euxo pipefail
-
-echo "Running challenge 02 setup script - Started.."
-epoc_start=`date +%s`
-
-# Set network interface name for instance type
-NET_INTERFACE=ens4
-
-#
-LOCAL_PROXY_IP=`host proxy-host | grep has | awk '{print $4}'`
-LOCAL_IP=`ifconfig $NET_INTERFACE | grep inet |grep -v inet6 | head -1 | awk '{print $2}'`
-LOCAL_SUBNET=`echo $LOCAL_IP | awk -F"." '{printf("%s.%s.0.0/16"),$1,$2}'`
-
-NO_PROXY="localhost,lo,.internal,.local,.svc,.default,169.254.169.254,127.0.0.0/24,kubernetes,10.0.0.0/8,10.5.0.0/16,10.2.0.0/16,10.32.0.0/20,10.96.0.0/12,10.96.0.10,$LOCAL_IP,$LOCAL_SUBNET,$LOCAL_PROXY_IP"
-
-#
-# systemwide proxy
-cat < /etc/environment
-http_proxy=${LOCAL_PROXY_IP}:3128
-https_proxy=${LOCAL_PROXY_IP}:3128
-no_proxy=$NO_PROXY
-EOF
-#
-# local shell environment
-echo "export LOCAL_PROXY_IP=$LOCAL_PROXY_IP" >> /root/.bashrc
-echo "export http_proxy=http://${LOCAL_PROXY_IP}:3128" >> /root/.bashrc
-echo "export https_proxy=http://${LOCAL_PROXY_IP}:3128" >> /root/.bashrc
-echo "export no_proxy=$NO_PROXY" >> /root/.bashrc
-
-# bashrc
-echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
-
-# done
-epoc_end=`date +%s`
-duration=$(($epoc_end - $epoc_start))
-DURATION=`echo "DURATION: $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."`
-echo "challenge 02 setup script - Done ($DURATION)"
-
-exit 0
diff --git a/instruqt/proxy/03-app-install/assignment.md b/instruqt/proxy/03-app-install/assignment.md
deleted file mode 100755
index f4754d162..000000000
--- a/instruqt/proxy/03-app-install/assignment.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-slug: app-install
-id: zfxhfqtljsrb
-type: challenge
-title: Kots application install with proxy config
-teaser: Install kots application via proxy server
-notes:
-- type: text
- contents: |
- # Install kots application using a proxy server
-tabs:
-- title: Host
- type: terminal
- hostname: isolated-host
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-- title: KotsAdm
- type: website
- url: http://isolated-host.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-difficulty: basic
-timelimit: 1800
----
-
-š” Shell
-=========
-
-Install sample application with proxy config in place.
-
-The license file for the application has already been downloaded in the home directory.
-
-Even thought the kurl installer spec included kotsadm which can be see running the application installation can be completed by the command line with the kots install command using the license.
-
-Install using kots cli including license file to upload automatically vs uploading via kotsadm web UI
-```
-kubectl kots install proxy-$INSTRUQT_PARTICIPANT_ID --skip-preflights --license-file ~/license.yaml --shared-password mytestapp --namespace default --no-port-forward
-```
-
-Test access to kotsapp via the KotsAdm tab..
-
-Verify that the application is running using the cli:
-```
-kubectl get all | egrep 'nginx|NAME'
-```
-
-The output should look like this:
-```
-NAME READY STATUS RESTARTS AGE
-pod/nginx-6795d5954c-dlkz9 1/1 Running 0 5m8s
-NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-service/nginx NodePort 10.96.1.61 80:30888/TCP 5m8s
-NAME READY UP-TO-DATE AVAILABLE AGE
-deployment.apps/nginx 1/1 1 1 5m8s
-NAME DESIRED CURRENT READY AGE
-replicaset.apps/nginx-6795d5954c 1 1 1 5m8s
-```
-
-The application output can be viewed on the command line using:
-```
-curl http://isolated-host.$INSTRUQT_PARTICIPANT_ID.instruqt.io:30888/
-```
-
-You can also view the application status and output via the KotsAdm UI.
-Navigate to the "KotsAdm" tab, login and click on "Details" to see the statusInformers output should be "Ready" (Running okay)
-The application can be viewed in the browser by clicking on the "Open nginx app" link.
-
-
-
-
-š Finish
-==========
-Once the nginx application is running and you have reviewed the application, you can Complete the track.
-
-To Finish this track, press **Check**.
diff --git a/instruqt/proxy/03-app-install/setup-isolated-host b/instruqt/proxy/03-app-install/setup-isolated-host
deleted file mode 100755
index ea42e08a9..000000000
--- a/instruqt/proxy/03-app-install/setup-isolated-host
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash
-set -euxo pipefail
-
-echo "Running challenge 03 setup script - Started.."
-epoc_start=`date +%s`
-
-
-# Download the application license file:
-#
-# install replicated cli
-curl -s https://api.github.com/repos/replicatedhq/replicated/releases/latest \
-| grep "browser_download_url.*linux_amd64.tar.gz" \
-| cut -d : -f 2,3 \
-| tr -d \" \
-| wget -O replicated.tar.gz -qi -
-tar xf replicated.tar.gz replicated && rm replicated.tar.gz
-mv replicated /usr/local/bin/replicated
-
-# Obtain REPLICATED_API_TOKEN for instruqt user id
-source /etc/profile.d/header.sh
-password=$(get_password)
-login=$( jq -n -c --arg email "${INSTRUQT_PARTICIPANT_ID}@replicated-labs.com" --arg password "${password}" '$ARGS.named' )
-token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login" https://id.replicated.com/v1/login | jq -r ".token")
-i=0
-while [[ "$token" == "null" && $i -lt 20 ]]
-do
- sleep 2
- token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login" https://id.replicated.com/v1/login | jq -r ".token")
- echo $token
- i=$((i+1))
-done
-UUID=$(cat /proc/sys/kernel/random/uuid)
-apiToken=$( jq -n -c --arg name "instruqt-${UUID}" --argjson read_only false '$ARGS.named' )
-access_token=$(curl -s -H "Content-Type: application/json" -H "Authorization: $token" --request POST -d "$apiToken" https://api.replicated.com/vendor/v1/user/token | jq -r ".access_token")
-echo "export REPLICATED_API_TOKEN=${access_token}" >> /root/.bashrc
-echo "export REPLICATED_APP=short-demo-$INSTRUQT_PARTICIPANT_ID" >> /root/.bashrc
-
-
-# Download license using replicated client
-REPLICATED_API_TOKEN="${access_token}"
-CUSTOMER_ID=`replicated customer ls --token $REPLICATED_API_TOKEN --app proxy-$INSTRUQT_PARTICIPANT_ID | grep -v EXPIRES | awk '{print $1}'`
-replicated customer download-license --customer $CUSTOMER_ID --token $REPLICATED_API_TOKEN --app proxy-$INSTRUQT_PARTICIPANT_ID --output /root/license.yaml
-
-
-# done
-epoc_end=`date +%s`
-duration=$(($epoc_end - $epoc_start))
-DURATION=`echo "DURATION: $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."`
-echo "challenge 03 setup script - Done ($DURATION)"
-
-exit 0
diff --git a/instruqt/proxy/assets/proxy-applink.png b/instruqt/proxy/assets/proxy-applink.png
deleted file mode 100644
index 7a7ddbbd2..000000000
Binary files a/instruqt/proxy/assets/proxy-applink.png and /dev/null differ
diff --git a/instruqt/proxy/config.yml b/instruqt/proxy/config.yml
deleted file mode 100644
index 49393c3c1..000000000
--- a/instruqt/proxy/config.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-version: "3"
-virtualmachines:
-- name: proxy-host
- image: centos-cloud/centos-7
- shell: /bin/bash
- machine_type: n1-standard-1
- allow_external_ingress:
- - http
- - https
- - high-ports
-- name: isolated-host
- image: kots-field-labs/instruqt-airgap
- shell: /bin/bash -l
- machine_type: n1-standard-8
- allow_external_ingress:
- - http
- - https
- - high-ports
diff --git a/instruqt/proxy/track.yml b/instruqt/proxy/track.yml
deleted file mode 100755
index e6c2aa615..000000000
--- a/instruqt/proxy/track.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-slug: proxy
-id: 8txqwacwfxcu
-title: Proxy
-teaser: Install kurl and kots application using proxy server config
-description: Install kurl and kots application using proxy server config. When a deployment host does not have direct access to the internet, some environments require an http proxy to be configured and used. This lab shows how a proxy server can be used to install both the kubernetes kurl cluster and then the kots application.
-icon: https://cdn.instruqt.com/img/logo/instruqt_isotype_indigo.svg
-tags:
- - deprecated
- - premium-plans
-owner: replicated
-developers:
- - graham@replicated.com
-private: true
-published: false
-checksum: "13998097527451254223"
diff --git a/instruqt/proxy/track_scripts/setup-isolated-host b/instruqt/proxy/track_scripts/setup-isolated-host
deleted file mode 100755
index 3acb542c8..000000000
--- a/instruqt/proxy/track_scripts/setup-isolated-host
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/bash
-set -euxo pipefail
-
-echo "Running track setup script - isolated-host"
-epoc_start=`date +%s`
-
-# Wait for the Instruqt host bootstrap to finish.
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# set interface name for instance type used
-NET_INTERFACE=ens4
-
-# install some useful packages
-apt-get update
-apt-get --fix-broken install
-apt-get install -y mlocate bind9utils net-tools jq
-
-# Display PARTICIPANT_ID info for Vendor Portal
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-
-# enable proxy for apt (after setup package installs as proxy not available yet)
-LOCAL_PROXY_IP=`host proxy-host | grep has | awk '{print $4}'`
-cat < /etc/apt/apt.conf.d/proxy.conf
-Acquire::http::Proxy "http://${LOCAL_PROXY_IP}:3128/";
-Acquire::https::Proxy "http://${LOCAL_PROXY_IP}:3128/";
-EOF
-
-# record DNS details to local file for reference
-LOCAL_HOST=`host isolated-host | grep for | awk '{print $1}'`
-LOCAL_IP=`ifconfig $NET_INTERFACE | grep inet | grep -v inet6 | head -1 | awk '{print $2}'`
-PUB_HOST=$HOSTNAME.$_SANDBOX_ID.instruqt.io
-PUB_IP=`host $PUB_HOST | grep has | awk '{print $4}'`
-echo $LOCAL_IP $LOCAL_HOST >> /root/hosts
-echo $PUB_IP $PUB_HOST >> /root/hosts
-#
-LOCAL_PROXY_HOST=`host proxy-host | grep for | awk '{print $1}'`
-LOCAL_PROXY_IP=`host proxy-host | grep has | awk '{print $4}'`
-echo "#" >> /root/hosts
-echo $LOCAL_PROXY_IP $LOCAL_PROXY_HOST >> /root/hosts
-
-
-# Allow specific egress
-iptables -A OUTPUT -o lo -p all -j ACCEPT
-iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-iptables -A OUTPUT -p tcp -m tcp -m multiport --dports 53,123,3128,15778,15779 -j ACCEPT
-iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -d play.instruqt.com -j ACCEPT
-LOCAL_SUBNET=`echo $LOCAL_IP | awk -F"." '{printf("%s.%s.%s.0/24"),$1,$2,$3}'`
-iptables -A OUTPUT -p tcp -d $LOCAL_IP -j ACCEPT
-iptables -A OUTPUT -p tcp -d $LOCAL_SUBNET -j ACCEPT
-iptables -A OUTPUT -p tcp -d 169.254.169.254 -j ACCEPT
-iptables -A OUTPUT -p tcp -d 127.0.0.53 -j ACCEPT
-iptables -A OUTPUT -p tcp -d replicated.app -j ACCEPT
-# kubernetes
-iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
-#
-# limit forward
-iptables -I FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-iptables -A FORWARD -j DROP
-#
-# note: iptables egress drop is in the first challenge setup script as would block instruqt track initialisation here
-
-# enable forward routing
-echo "net.ipv4.ip_forward = 1" | tee /etc/sysctl.d/99-ipforward.conf
-echo 1 > /proc/sys/net/ipv4/ip_forward
-sysctl -a | grep ip_forward
-
-# bashrc
-# Display PARTICIPANT_ID info for Vendor Portal
-echo "echo Credentials for https://vendor.replicated.com" >> /root/.bashrc
-echo "echo Username: $INSTRUQT_PARTICIPANT_ID@replicated-labs.com" >> /root/.bashrc
-echo "echo Password: $INSTRUQT_PARTICIPANT_ID" >> /root/.bashrc
-
-# done
-epoc_end=`date +%s`
-duration=$(($epoc_end - $epoc_start))
-DURATION=`echo "DURATION: $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."`
-echo "track setup script - isolated-host - Done ($DURATION)"
-
-exit 0
diff --git a/instruqt/proxy/track_scripts/setup-proxy-host b/instruqt/proxy/track_scripts/setup-proxy-host
deleted file mode 100755
index 92324877f..000000000
--- a/instruqt/proxy/track_scripts/setup-proxy-host
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-set -euxo pipefail
-
-echo "Running track setup script - proxy-host"
-epoc_start=`date +%s`
-
-# Wait for the Instruqt host bootstrap to finish.
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# package install
-yum install -y mlocate bind-utils
-
-cat <> ~/.ssh/config
-Host isolated-host
- StrictHostKeyChecking no
-EOF
-
-#
-LOCAL_HOST=`host proxy-host | grep for | awk '{print $1}'`
-LOCAL_IP=`ifconfig eth0 | grep inet |grep -v inet6 | awk '{print $2}'`
-PUB_HOST=$HOSTNAME.$_SANDBOX_ID.instruqt.io
-PUB_IP=`host $PUB_HOST | grep has | awk '{print $4}'`
-echo $LOCAL_IP $LOCAL_HOST >> /root/hosts
-echo $PUB_IP $PUB_HOST >> /root/hosts
-
-#
-echo "net.ipv4.ip_forward = 1" | tee /etc/sysctl.d/99-ipforward.conf
-echo 1 > /proc/sys/net/ipv4/ip_forward
-sysctl -p
-sysctl -a | grep ip_forward
-
-# Deploy squid proxy
-yum install -y squid
-systemctl enable squid
-systemctl start squid
-
-# done
-epoc_end=`date +%s`
-duration=$(($epoc_end - $epoc_start))
-DURATION=`echo "DURATION: $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."`
-echo "track setup script - proxy-host - Done ($DURATION)"
-
-exit 0
-
-
diff --git a/instruqt/proxy/vendor/kurl-installer.yaml b/instruqt/proxy/vendor/kurl-installer.yaml
deleted file mode 100644
index a61cb49de..000000000
--- a/instruqt/proxy/vendor/kurl-installer.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
----
-apiVersion: cluster.kurl.sh/v1beta1
-kind: Installer
-metadata:
- name: "proxy-app"
-spec:
- kubernetes:
- version: 1.25.x
- containerd:
- version: latest
- weave:
- version: latest
- ekco:
- version: latest
- openebs:
- version: latest
- isLocalPVEnabled: true
- localPVStorageClassName: "default"
- minio:
- version: latest
- kotsadm:
- version: latest
diff --git a/instruqt/proxy/vendor/manifests/k8s-app.yaml b/instruqt/proxy/vendor/manifests/k8s-app.yaml
deleted file mode 100644
index 7f6813a11..000000000
--- a/instruqt/proxy/vendor/manifests/k8s-app.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-apiVersion: app.k8s.io/v1beta1
-kind: Application
-metadata:
- name: "proxy"
-spec:
- descriptor:
- links:
- - description: Open nginx app
- url: "http://nginx"
diff --git a/instruqt/proxy/vendor/manifests/kots-app.yaml b/instruqt/proxy/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 1995b6e61..000000000
--- a/instruqt/proxy/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: app-slug
-spec:
- title: "proxy track"
- statusInformers:
- - deployment/nginx
- ports:
- - serviceName: "nginx"
- servicePort: 80
- localPort: 30888
- applicationUrl: "http://nginx"
- icon: data:image/png;base64,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
diff --git a/instruqt/proxy/vendor/manifests/kots-support-bundle.yaml b/instruqt/proxy/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index 3815f8e53..000000000
--- a/instruqt/proxy/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: proxy-supportbundle
-spec:
- collectors:
- - logs:
- selector:
- - app=nginx
- namespace: '{{repl Namespace }}'
diff --git a/instruqt/proxy/vendor/manifests/nginx-deployment.yaml b/instruqt/proxy/vendor/manifests/nginx-deployment.yaml
deleted file mode 100644
index f7293afa2..000000000
--- a/instruqt/proxy/vendor/manifests/nginx-deployment.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- serviceAccountName: kotsadm
- containers:
- - name: nginx
- image: nginx
- volumeMounts:
- - mountPath: /usr/share/nginx/html
- name: html
- resources:
- limits:
- memory: '256Mi'
- cpu: '500m'
- requests:
- memory: '32Mi'
- cpu: '100m'
- volumes:
- - name: html
- configMap:
- name: nginx-html
diff --git a/instruqt/proxy/vendor/manifests/nginx-html.yaml b/instruqt/proxy/vendor/manifests/nginx-html.yaml
deleted file mode 100644
index 0657f2446..000000000
--- a/instruqt/proxy/vendor/manifests/nginx-html.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: nginx-html
-data:
- index.html: |
-
-
-
-
- proxy track
-
-
-
Congrats!
-
-
- If you can read this, you have successfully installed your app in an environment using an http proxy
-
-
diff --git a/instruqt/proxy/vendor/manifests/nginx-service.yaml b/instruqt/proxy/vendor/manifests/nginx-service.yaml
deleted file mode 100644
index 28ed3b0f2..000000000
--- a/instruqt/proxy/vendor/manifests/nginx-service.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
- annotations:
- kots.io/when: '{{repl not IsKurl }}'
-spec:
- type: ClusterIP
- ports:
- - port: 80
- selector:
- app: nginx
----
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
- annotations:
- kots.io/when: '{{repl IsKurl }}'
-spec:
- type: NodePort
- ports:
- - port: 80
- nodePort: 30888
- selector:
- app: nginx
diff --git a/instruqt/proxy/vendor/vendor.json b/instruqt/proxy/vendor/vendor.json
deleted file mode 100644
index 8bb6576ff..000000000
--- a/instruqt/proxy/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Proxy",
- "slug": "proxy",
- "customer": "Hola ProxyCLI Customer",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": "./kurl-installer.yaml"
-}
diff --git a/instruqt/redactors/01-intro/assignment.md b/instruqt/redactors/01-intro/assignment.md
deleted file mode 100755
index 18bd536d8..000000000
--- a/instruqt/redactors/01-intro/assignment.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-slug: intro
-id: avboyvmliqxk
-type: challenge
-title: Intro
-teaser: Learn how to use Redactors
-notes:
-- type: text
- contents: Learn how to avoid sensitive information being included in a Support Bundle
-tabs:
-- title: Shell
- type: terminal
- hostname: kubernetes-vm
-difficulty: basic
-timelimit: 600
----
-
-š Introduction
-===============
-
-This lab is designed to provide you with a sandbox where you can learn about redactors.
-
-* **What you will do**:
- * Learn how redactors work
- * Create a custom redactor and check the results
-* **Who this is for**: This track is for anyone who will build KOTS applications **plus** anyone who will be user-facing
- * Full Stack / DevOps / Product Engineers
- * Support Engineers
- * Implementation / Field Engineers
- * Success / Sales Engineers
-* **Prerequisites**:
- * Basic working knowledge of Linux (Bash)
-* **Outcomes**:
- * You will be ready to use redactors to ensure sensitive information is not leaked in Support Bundles.
-
-š Get started
-===============
-
-Use the terminal to check if kubernetes is running:
-
-```
-kubectl get nodes
-```
-
-To complete this challenge, press **Check**.
diff --git a/instruqt/redactors/02-redactors-overview/assignment.md b/instruqt/redactors/02-redactors-overview/assignment.md
deleted file mode 100755
index eced7a798..000000000
--- a/instruqt/redactors/02-redactors-overview/assignment.md
+++ /dev/null
@@ -1,100 +0,0 @@
----
-slug: redactors-overview
-id: oqega3xpqtwq
-type: challenge
-title: Redactors Overview
-teaser: Familiarize yourself with Redactors!
-notes:
-- type: text
- contents: First, let's learn a little bit about redactors.
-tabs:
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-- title: Application Installer
- type: service
- hostname: kubernetes-vm
- port: 8800
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-## About Redactors
-
-[Redactors](https://troubleshoot.sh/docs/redact/) allow end users to programatically control which information is included in support bundles and which types of information are excluded. They can be used to prevent sensitive data like usernames, IP addresses, and password from being accidentally leaked in support bundles.
-
-We'll explore how Redactors work and learn the workflows that end customers can use to review and customize redaction of support bundles. We'll study an app that has a container that logs sensitive information, and how to ensure that information is excluded from support bundles.
-
-In this lab, the Application Installer is already deployed. So you can download the license from the Vendor Portal (`Redactors Customer`), upload the license in the Application Installer and go through the initial installation.
-
-### 1. Download the license
-
-On the **Vendor** tab, login to the Vendor Portal using the credentials below.
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="kubernetes-vm" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="kubernetes-vm" ]]`
-
-Once logged in, navigate to **Customers** and find the customer already created for you.
-
-
-
-Click on the icon highlighted above to download the license.
-
-### 2. Install the application
-
-In this lab, the Admin Console is already deployed and will be working exclusively in the Admin Console. The password for the Admin Console is the following:
-
-```
-[[ Instruqt-Var key="KOTS_PASSWORD" hostname="kubernetes-vm" ]]
-```
-
-Make sure to save this password as you may need to log back in if your session expires.
-
-Go to the **Application Installer** tab (external window) and login.
-
-
-
- Upload the license and follow the prompts to deploy the application. Once deployed you should arrive at the screen shown below.
-
-
-
-### Redactors Overview
-
-In order to look at redactors, we need to generate a support bundle. Click on the **Troubleshoot** tab and click on **Analyze Redactors App**
-
-
-
-When it's done, head over to the **Redactor Report** tab. You may see different redactors were applied than the set in this image.
-
-
-
-The following redaction rules were applied. You'll see some of them matched text in the logs and those items were redacted.
-
-* Redact connection strings with username and password
-* Redact database connection strings in mutiline JSON
-* Redact ipv4 addresses
-* Redact password environment variables in multiline JSON
-* Redact usernames in multiline JSON
-* Redact values for environment variables with names beginning with 'user'
-
-Clicking on **Show details** will show you where redactions were perfomed for a particular redactor. You may see different results than the screenshot.
-
-
-
-Clicking into each file will show you where data was redacted
-
-
-
-Now that you are on the **File Inspector** tab, scroll the file navigator until you see an entry for the `password-logger-...` and find the application logs.
-
-
-
-You'll notice there's a secret being logged.
-
-```shell
-Tue Oct 21 19:54:00 UTC 2022 [info] the secret code is SW0RDF!SH
-```
-
-Next, we'll write a custom redactor to remove this from the support bundle.
diff --git a/instruqt/redactors/02-redactors-overview/setup-kubernetes-vm b/instruqt/redactors/02-redactors-overview/setup-kubernetes-vm
deleted file mode 100755
index 68ca6fb64..000000000
--- a/instruqt/redactors/02-redactors-overview/setup-kubernetes-vm
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env bash
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-# install the application
-kots_password_base=$(get_password| sha256sum)
-kots_password=${kots_password_base::20}
-kubectl kots install redactors-${INSTRUQT_PARTICIPANT_ID} \
- --shared-password ${kots_password} \
- --namespace redactors \
- --no-port-forward
-
-# Setup kotsadm - expose via loadbalancer
-kubectl expose deployment kotsadm -n $(kubectl get pods -A -l app=kotsadm --no-headers | awk '{ print $1 }' ) --type=LoadBalancer --name=kotsadm2 --port=8800 --target-port=3000
-
-## set variables for use in instructions
-# there's only one app created by the automation, so just grab the first in the list
-access_token=$(get_api_token)
-app_slug=$(curl --header 'Accept: application/json' --header "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].slug')
-
-agent variable set USERNAME $(get_username)
-agent variable set PASSWORD $(get_password)
-agent variable set REPLICATED_APP ${app_slug}
-agent variable set KOTS_PASSWORD ${kots_password}
-
-exit 0
diff --git a/instruqt/redactors/03-adding-a-custom-redactor/assignment.md b/instruqt/redactors/03-adding-a-custom-redactor/assignment.md
deleted file mode 100755
index 030d5c748..000000000
--- a/instruqt/redactors/03-adding-a-custom-redactor/assignment.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-slug: adding-a-custom-redactor
-id: xvg5u21wl0w8
-type: challenge
-title: Adding a Custom Redactor
-teaser: Learn how to add a custom redactor
-notes:
-- type: text
- contents: Now that you are familiar with redactors, let's define a custom one!
-tabs:
-- title: Application Installer
- type: service
- hostname: kubernetes-vm
- port: 8800
- url: http://kubernetes-vm.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-difficulty: basic
-timelimit: 600
----
-
-Custom redactors can be added both by a Vendor in a release and their end customer in the Admin Console. In this lab we are going to learn how to add it from the Admin Console as the feedback loop is shorter. Keep in mind that the file we create in this lab could be also included as part of a release.
-
-Navigate back to the Application Installer tab to access the Admin Console. Provide your password if your session expired. Once in the Admin Console, go to the **Troubleshoot** tab and select **Configure redaction**:
-
-
-
-While a URL to a hosted redactor is possible, we'll use the **Write your own spec** option:
-
-
-
-Use the following content for your redactor:
-
-```yaml
-kind: Redactor
-apiVersion: troubleshoot.sh/v1beta2
-metadata:
- name: kotsadm-redact
-spec:
- redactors:
- - name: hide-secret-code
- removals:
- regex:
- - redactor: (the secret code is )(?P.*)
-```
-Save the redactor, and you should see a green check confirming the redactor has been saved.
-
-## Testing
-
-Once you've edited the redaction settings, let's collect another support bundle to see how our new redactor was applied.
-
-
-
-When you've completed this successfully, you should see the secret removed from your bundle:
-
-```text
-Thu Apr 29 10:39:52 UTC 2021 [info] the secret code is ***HIDDEN***
-```
-
-If you see the above result, **Congratulations** you have completed this lab.
-
-Feel free to try more complex redactors or complete the track.
diff --git a/instruqt/redactors/assets/red-ac-applogs.png b/instruqt/redactors/assets/red-ac-applogs.png
deleted file mode 100644
index 88b45b6b1..000000000
Binary files a/instruqt/redactors/assets/red-ac-applogs.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-conf.png b/instruqt/redactors/assets/red-ac-conf.png
deleted file mode 100644
index 3c4313dde..000000000
Binary files a/instruqt/redactors/assets/red-ac-conf.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-default-redactors.png b/instruqt/redactors/assets/red-ac-default-redactors.png
deleted file mode 100644
index 64882ad0e..000000000
Binary files a/instruqt/redactors/assets/red-ac-default-redactors.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-login.png b/instruqt/redactors/assets/red-ac-login.png
deleted file mode 100644
index 8bcc8ff0f..000000000
Binary files a/instruqt/redactors/assets/red-ac-login.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-redacted-details.png b/instruqt/redactors/assets/red-ac-redacted-details.png
deleted file mode 100644
index 4d36831c5..000000000
Binary files a/instruqt/redactors/assets/red-ac-redacted-details.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-redacted-files.png b/instruqt/redactors/assets/red-ac-redacted-files.png
deleted file mode 100644
index df021517a..000000000
Binary files a/instruqt/redactors/assets/red-ac-redacted-files.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-redacted-results.png b/instruqt/redactors/assets/red-ac-redacted-results.png
deleted file mode 100644
index 86392c23d..000000000
Binary files a/instruqt/redactors/assets/red-ac-redacted-results.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-redactor.png b/instruqt/redactors/assets/red-ac-redactor.png
deleted file mode 100644
index 421f1edf0..000000000
Binary files a/instruqt/redactors/assets/red-ac-redactor.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-troubleshoot.png b/instruqt/redactors/assets/red-ac-troubleshoot.png
deleted file mode 100644
index 20e5d2771..000000000
Binary files a/instruqt/redactors/assets/red-ac-troubleshoot.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-ac-ui.png b/instruqt/redactors/assets/red-ac-ui.png
deleted file mode 100644
index 4106c84f9..000000000
Binary files a/instruqt/redactors/assets/red-ac-ui.png and /dev/null differ
diff --git a/instruqt/redactors/assets/red-cust-list.png b/instruqt/redactors/assets/red-cust-list.png
deleted file mode 100644
index 78ae00de8..000000000
Binary files a/instruqt/redactors/assets/red-cust-list.png and /dev/null differ
diff --git a/instruqt/redactors/config.yml b/instruqt/redactors/config.yml
deleted file mode 100644
index 32a81eec5..000000000
--- a/instruqt/redactors/config.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-version: "3"
-virtualmachines:
-- name: kubernetes-vm
- image: instruqt/k3s-v1-25-0
- shell: /bin/bash -l
- machine_type: n1-standard-2
- allow_external_ingress:
- - http
- - https
- - high-ports
diff --git a/instruqt/redactors/track.yml b/instruqt/redactors/track.yml
deleted file mode 100755
index 29846de44..000000000
--- a/instruqt/redactors/track.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-slug: redactors
-id: gmiwrds3jmuy
-title: Redactors
-teaser: Learn how to use redactors to prevent sensitive information from being included
- in a support bundle
-description: |-
- Learn how to use redactors to prevent sensitive information from being included in a support bundle
-
- **This Lab Covers the Following:**
- - How to view redacted information in a support bundle
- - How to add a custom redactor
- - Testing the custom redactor
-icon: https://storage.googleapis.com/shared-lab-assets/icons/blue/redactor.png
-tags:
-- deprecated
-owner: replicated
-developers:
-- fernando@replicated.com
-- joshd@replicated.com
-- chuck@replicated.com
-lab_config:
- overlay: false
- width: 25
- position: right
-checksum: "6445918644264832368"
diff --git a/instruqt/redactors/track_scripts/setup-kubernetes-vm b/instruqt/redactors/track_scripts/setup-kubernetes-vm
deleted file mode 100644
index 558e401f0..000000000
--- a/instruqt/redactors/track_scripts/setup-kubernetes-vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-# Wait for the Instruqt host bootstrap to finish
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# Wait for the Kubernetes API server to become available
-while ! curl --silent --fail --output /dev/null http://localhost:8001/api
-do
- sleep 1
-done
-
-# Enable bash completion for kubectl
-echo "source /usr/share/bash-completion/bash_completion" >> /root/.bashrc
-echo "complete -F __start_kubectl k" >> /root/.bashrc
-
-# Add kots kubectl plugin
-curl -fsSL https://kots.io/install | bash
-
-# Display PARTICIPANT_ID info for Vendor Portal
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-echo "show_credentials" >> /root/.bashrc
diff --git a/instruqt/redactors/vendor/manifests/kots-app.yaml b/instruqt/redactors/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 3bdd83cb5..000000000
--- a/instruqt/redactors/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: redactors
-spec:
- title: "Redactor App"
- statusInformers:
- - deployment/password-logger
- icon: data:image/png;base64,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
diff --git a/instruqt/redactors/vendor/manifests/kots-support-bundle.yaml b/instruqt/redactors/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index 158c30c5d..000000000
--- a/instruqt/redactors/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: redactors
-spec:
- collectors:
- - logs:
- selector:
- - app=nginx
- namespace: '{{repl Namespace }}'
- - logs:
- selector:
- - app=password-logger
- namespace: '{{repl Namespace }}'
- analyzers: []
-
diff --git a/instruqt/redactors/vendor/manifests/password-logger-deployment.yaml b/instruqt/redactors/vendor/manifests/password-logger-deployment.yaml
deleted file mode 100644
index afa125e7e..000000000
--- a/instruqt/redactors/vendor/manifests/password-logger-deployment.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: password-logger
- labels:
- app: password-logger
-spec:
- selector:
- matchLabels:
- app: password-logger
- template:
- metadata:
- labels:
- app: password-logger
- spec:
- containers:
- - name: password-logger
- image: busybox:latest
- command:
- - /bin/sh
- - -ec
- - |
- while :; do
- echo "$(date) [info] the secret code is SW0RDF!SH"
- sleep 10
- done
- resources:
- limits:
- memory: '256Mi'
- cpu: '500m'
- requests:
- memory: '32Mi'
- cpu: '50m'
diff --git a/instruqt/redactors/vendor/vendor.json b/instruqt/redactors/vendor/vendor.json
deleted file mode 100644
index 60058855a..000000000
--- a/instruqt/redactors/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Redactors",
- "slug": "redactors",
- "customer": "Redactor Customer",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": ""
-}
\ No newline at end of file
diff --git a/instruqt/replicated-cli/01-prepare-for-access/assignment.md b/instruqt/replicated-cli/01-prepare-for-access/assignment.md
deleted file mode 100755
index 71048f3b3..000000000
--- a/instruqt/replicated-cli/01-prepare-for-access/assignment.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-slug: prepare-for-access
-id: oxmjwa2nm04e
-type: challenge
-title: Prepare for Access
-teaser: A short description of the challenge.
-notes:
-- type: text
- contents: Making sure you have access to vendor.replicated.com from the command
- line
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
- workdir: /home/replicant
-- title: Vendor
- type: website
- url: https://vendor.replicated.com
- new_window: true
-difficulty: basic
-timelimit: 300
----
-
-š Introduction
-===============
-
-This exercise is designed to give you a sandbox to ensure you have a basic understanding how to work with the Replicated CLI.
-
-* **What you will do**:
- * Use the Replicated CLI to validate and release your application
- * Find your installation command and install to an existing cluster
- * Iterate on your work and deploy an updated release
-* **Who this is for**: This lab is for anyone who works with app code, docker images, k8s yamls, or does field support for multi-prem applications
- * Full Stack / DevOps / Product Engineers
- * Support Engineers
- * Implementation / Field Engineers
-* **Prerequisites**:
- * Basic working knowledge of Kubernetes
-* **Outcomes**:
- * You will build a working understanding of how to release and deploy a kubernetes application packaged with Replicated using kots.
-
-
-š Let's start
-==============
-
-### 1. Vendor Portal login
-
-To access the Vendor Portal, you can use the following credentials that were created as part of lab setup.
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="shell" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="shell" ]]`
-
-Once you have the credentials, you can log into the Vendor tab and you should land on the Release Channels page. Channels allow you to manage who has access to which releases of your application.
-
-
-### 2. Configure environment
-
-Once registered, your application will be automatically selected:
-
-
-
-Now, you'll need to set up environment variables to interact with vendor.replicated.com and instance.
-
-`REPLICATED_APP` should be set to the app slug from the Settings page.
-
-
-
-Next, you will need to create a `read/write` User API token from your [Account Settings](https://vendor.replicated.com/account-settings) page:
-> Note: Ensure the token has "Write" access or you'll be unable create new releases.
-
-
-
-Once you have the values, set them in your environment (the API token you created will not match the one below, but either will work).
-
-```
-export REPLICATED_API_TOKEN=[[ Instruqt-Var key="REPLICATED_API_TOKEN" hostname="shell" ]]
-export REPLICATED_APP=[[ Instruqt-Var key="REPLICATED_APP" hostname="shell" ]]
-```
-
-You can ensure this is working with
-
-```
-replicated release ls
-```
diff --git a/instruqt/replicated-cli/01-prepare-for-access/check-shell b/instruqt/replicated-cli/01-prepare-for-access/check-shell
deleted file mode 100644
index f4c4a3a2f..000000000
--- a/instruqt/replicated-cli/01-prepare-for-access/check-shell
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# save the session
-tmux capture-pane -t shell -S -
-SESSION=$(tmux save-buffer -)
-
-if ! grep -qE "REPLICATED_API_TOKEN=[[:alnum:]]+" <(echo ${SESSION}) ; then
- fail-message "Please make sure you've set your API token"
- exit 1
-fi
-
-if ! grep -qE "REPLICATED_APP=\w+" <(echo ${SESSION}) ; then
- fail-message "Please make sure you've set your Replicated app slug"
- exit 1
-fi
-
-exit 0
diff --git a/instruqt/replicated-cli/01-prepare-for-access/cleanup-shell b/instruqt/replicated-cli/01-prepare-for-access/cleanup-shell
deleted file mode 100755
index 25821037e..000000000
--- a/instruqt/replicated-cli/01-prepare-for-access/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-tmux send-keys -t shell export SPACE 'REPLICATED_APP=' "$(agent variable get REPLICATED_APP)" ENTER
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/replicated-cli/01-prepare-for-access/setup-shell b/instruqt/replicated-cli/01-prepare-for-access/setup-shell
deleted file mode 100755
index 9c24746e5..000000000
--- a/instruqt/replicated-cli/01-prepare-for-access/setup-shell
+++ /dev/null
@@ -1,28 +0,0 @@
-
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-HOME_DIR=/home/replicant
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-# there's only one app created by the automation, so just grab the first in the list
-access_token=$(get_api_token)
-app_slug=$(curl --header 'Accept: application/json' --header "Authorization: ${access_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].slug')
-
-agent variable set USERNAME $(get_username)
-agent variable set PASSWORD $(get_password)
-agent variable set REPLICATED_API_TOKEN ${access_token}
-agent variable set REPLICATED_APP ${app_slug}
-
-exit 0
diff --git a/instruqt/replicated-cli/01-prepare-for-access/solve-shell b/instruqt/replicated-cli/01-prepare-for-access/solve-shell
deleted file mode 100644
index 931071808..000000000
--- a/instruqt/replicated-cli/01-prepare-for-access/solve-shell
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-source /etc/profile.d/header.sh
-
-### Assure the tmux session exists
-#
-# In a test scenario Instuqt does not run the user shell for the
-# challenge, which means the tmux session is never established. We
-# need to session for the solve scripts for other challenges to
-# succeed, so let's create it here.
-#
-
-if ! tmux has-session -t shell ; then
- tmux new-session -d -s shell su - replicant
-fi
-
-# make sure the user will be authenticated and using the right app
-tmux send-keys -t shell export SPACE 'REPLICATED_API_TOKEN=' "$(agent variable get REPLICATED_API_TOKEN)" ENTER
-tmux send-keys -t shell export SPACE 'REPLICATED_APP=' "$(agent variable get REPLICATED_APP)" ENTER
-tmux send-keys -t shell clear ENTER
diff --git a/instruqt/replicated-cli/02-verifying-manifests/assignment.md b/instruqt/replicated-cli/02-verifying-manifests/assignment.md
deleted file mode 100755
index 5d32c4f26..000000000
--- a/instruqt/replicated-cli/02-verifying-manifests/assignment.md
+++ /dev/null
@@ -1,108 +0,0 @@
----
-slug: verifying-manifests
-id: zajj4jldzsgt
-type: challenge
-title: Verifying Manifests
-teaser: Getting started with the Replicated CLI
-notes:
-- type: text
- contents: Let's see what the Replicated CLI can do
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-difficulty: basic
-timelimit: 600
----
-
-
-š Let's start
-==============
-
-We've created a set of manifests for you that configures
-the "Kubernetes Up and Running" sample application to
-deploy with Replicated. In the next few challenges we'll
-validate those manifests and create a new application
-you can deploy using Replicated.
-
-### 1. Verifying manifests
-
-You should have a few YAML files in `manifests`.
-
-```text
-$ ls -la manifests
-total 28
-drwxr-xr-x. 2 root root 161 Apr 12 18:27 .
-drwxr-xr-x. 4 root root 94 Apr 12 18:27 ..
--rw-r--r--. 1 root root 179 Apr 12 18:27 k8s-app.yaml
--rw-r--r--. 1 root root 4186 Apr 12 18:27 kots-app.yaml
--rw-r--r--. 1 root root 990 Apr 12 18:27 kots-preflight.yaml
--rw-r--r--. 1 root root 347 Apr 12 18:27 kots-support-bundle.yaml
--rw-r--r--. 1 root root 447 Apr 12 18:27 nginx-deployment.yaml
--rw-r--r--. 1 root root 438 Apr 12 18:27 nginx-service.yaml
-```
-Since you're shipping them to your customers, you want to make
-sure they'll install cleanly. Replicated includes a linter
-to check that your installation files are correct. It also
-checks for best practices for installing into customer clusters.
-
-Let's verify these manifests with the linter, which is part of
-the `replicated release` subcommand.
-
-```shell script
-replicated release lint --yaml-dir=manifests
-```
-
-You should get a list that returns no errors. It should have at least
-one info message that looks something like the output. It's OK if you have more
-info or warning messages, since we often update our linting rules to
-capture more best practices.
-
-```text
-RULE TYPE FILENAME LINE MESSAGE
-container-resource-requests info manifests/deployment.yaml 20 Missing resource requests
-```
-
-The command will also exit with a `0` status since there were no
-errors. This helps you include linting in your CI/CD process or
-local build commands and fail on an error. You can verify this if
-you want.
-
-```shell script
-echo $?
-```
-
-### 2. Following the linter's advice
-
-Let's make a quick change to the manifests to follow the advice
-that the linter gave us. We're going to specify the resource
-requests for our deployment so that it's clear what we expect
-to have as available resources in the cluster. We have a pretty
-simple application, so we won't ask for much.
-
-Most times, you'll do this interactively in your favorite editor.
-To simplify for the lab, we're going to fix it from the CLI to
-keep things moving.
-
-```
-yq -i '.spec.template.spec.containers[0].resources.requests.cpu = "100m"' manifests/deployment.yaml
-yq -i '.spec.template.spec.containers[0].resources.requests.memory = "64Mi"' manifests/deployment.yaml
-```
-
-### 3. Check your release again
-
-Let's check the release again with these changes.
-
-```shell script
-replicated release lint --yaml-dir=manifests
-```
-
-You should get a list that returns no errors. It should no longer
-show the information message we saw before. Like before, it's OK if
-you have additional info or warning messages.
-
-```
-RULE TYPE FILENAME LINE MESSAGE
-```
-
-
diff --git a/instruqt/replicated-cli/02-verifying-manifests/cleanup-shell b/instruqt/replicated-cli/02-verifying-manifests/cleanup-shell
deleted file mode 100755
index 25821037e..000000000
--- a/instruqt/replicated-cli/02-verifying-manifests/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-tmux send-keys -t shell export SPACE 'REPLICATED_APP=' "$(agent variable get REPLICATED_APP)" ENTER
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/replicated-cli/02-verifying-manifests/solve-shell b/instruqt/replicated-cli/02-verifying-manifests/solve-shell
deleted file mode 100755
index e37501359..000000000
--- a/instruqt/replicated-cli/02-verifying-manifests/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-yq -i '.spec.template.spec.containers[0].resources.requests.cpu = "100m"' /home/replicant/manifests/deployment.yaml
-yq -i '.spec.template.spec.containers[0].resources.requests.memory = "64Mi"' /home/replicant/manifests/deployment.yaml
-
diff --git a/instruqt/replicated-cli/03-releasing-your-updates/assignment.md b/instruqt/replicated-cli/03-releasing-your-updates/assignment.md
deleted file mode 100755
index 4964089ec..000000000
--- a/instruqt/replicated-cli/03-releasing-your-updates/assignment.md
+++ /dev/null
@@ -1,118 +0,0 @@
----
-slug: releasing-your-updates
-id: vtwciot9j8bb
-type: challenge
-title: Releasing Your Updates
-teaser: Cut a new release for your customers
-notes:
-- type: text
- contents: Releasing your changes to your customer
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-difficulty: basic
-timelimit: 600
----
-
-š Let's start
-==============
-
-In the last challenge, we updated our release manifests to
-follow the advice provided by the Replicated linter. We
-need to release our changes in order for our customers to
-take advantage of them.
-
-
-### 1. Release channels
-
-Releases are shared with customers user channels. We have set
-up the channels for your application for you. Let's take a
-look at what channels are available.
-
-```shell script
-replicated channel ls
-```
-
-You should get a list that has 3 or more channels in it. Our
-application has the default release channels we created for the lab. The names of your channels
-should be the same as you see here. The other fields may
-vary.
-
-```
-ID NAME RELEASE VERSION
-2FK67d5b0y2ilwbAkouIm5Ly98U Stable 1 0.0.1
-2FK67cR5l41w4FrJ17oQz1f0pDX Beta 1 0.0.1
-2FK67bqiSUUpl0PpEHe8fZYuXXK Unstable 2 Sample Track
-```
-
-We're going to release our changes on the `Stable`
-channel in the later steps.
-
-### 2. Creating your first release
-
-Let's create a release with our improved YAML files. We're going
-to create our release and make it available on the `Unstable` channel
-for internal user. After we review the release, we'll promote
-it to our `Stable` channel to simulate releasing to the customer.
-Make sure to change the version number (in my case, I'll go from
-`0.0.1` to `0.0.2`). You should keep it inline with the version you
- used in the unstable channel.
-
-```
-replicated release create --version 0.0.2 --release-notes "Adds resource requests to our deployment" \
- --promote Unstable --yaml-dir manifests
-```
-
-You can view your new release (along with previous releases) using
-
-```
-replicated release ls
-```
-
-Your new release is at the top of the list with a unique sequence
-number.
-
-```
-SEQUENCE CREATED EDITED ACTIVE_CHANNELS
-4 2022-09-27T20:39:40Z 0001-01-01T00:00:00Z Unstable
-3 2022-09-26T23:48:15Z 0001-01-01T00:00:00Z Stable
-2 2022-09-26T21:39:47Z 0001-01-01T00:00:00Z
-1 2022-09-26T21:37:47Z 0001-01-01T00:00:00Z
-```
-
-Your date and times will be different, and it's OK if the sequence numbers
-and the active channels for older releases differ.
-
-### 3. Promoting the release for customers
-
-To make the release available for customers, let's use our customer
-release channel `Stable`. In a real use case, you might promote
-through other channels like `Beta` before going to customers, but we'll
-skip ahead this time.
-
-Look back at your list of releases and take note of the sequence number
-for your latest release (sequence `4` in my case). You're going to
-promote that release in the next command.
-
-```
-replicated release promote [SEQUENCE] Stable \
- --version 0.0.2 --release-notes "Adds resource requests to our deployment"
-```
-
-After promoting the release, take a look at your releases again
-
-```
-replicated release ls
-```
-
-Your new release is at the top of the list is now active on two
-channels, `Unstable` and `Stable`.
-
-```
-SEQUENCE CREATED EDITED ACTIVE_CHANNELS
-4 2022-09-27T20:39:40Z 0001-01-01T00:00:00Z Unstable,Stable
-3 2022-09-26T23:48:15Z 0001-01-01T00:00:00Z
-2 2022-09-26T21:39:47Z 0001-01-01T00:00:00Z
-1 2022-09-26T21:37:47Z 0001-01-01T00:00:00Z
-```
diff --git a/instruqt/replicated-cli/03-releasing-your-updates/cleanup-shell b/instruqt/replicated-cli/03-releasing-your-updates/cleanup-shell
deleted file mode 100755
index 25821037e..000000000
--- a/instruqt/replicated-cli/03-releasing-your-updates/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-tmux send-keys -t shell export SPACE 'REPLICATED_APP=' "$(agent variable get REPLICATED_APP)" ENTER
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/replicated-cli/04-installing-your-release/assignment.md b/instruqt/replicated-cli/04-installing-your-release/assignment.md
deleted file mode 100755
index d9458c159..000000000
--- a/instruqt/replicated-cli/04-installing-your-release/assignment.md
+++ /dev/null
@@ -1,144 +0,0 @@
----
-slug: installing-your-release
-id: 2hcel4ej9cx3
-type: challenge
-title: Installing your release
-teaser: Let's install your release
-notes:
-- type: text
- contents: Installing the new release
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-- title: Example Application
- type: website
- url: http://kubernetes-vm.${_SANDBOX_ID}.instruqt.io:8080
- new_window: true
-difficulty: basic
-timelimit: 1200
----
-
-š” Installing your release
-==========================
-
-This challenge may seem familiar if you've already run through
-the "Hello World" track. We're going to go through the same
-steps to install using Replicated's command line tooling.
-
-### 1. Getting the install command
-
-Each channel for your application has a custom install command.
-You can view the install command either in the vendor portal or
-using the `replicated` command line tool. Let's get it using the
-CLI.
-
-```
-replicated channel inspect Stable
-```
-
-We're going to install into an existing Kubernetes cluster.
-You'll find that one listed first, with the label `EXISTING`.
-
-
-```
-ID: 2FKLzwElQOFuHs6YlYEvZ6ncNEo
-NAME: Stable
-DESCRIPTION:
-RELEASE: 4
-VERSION: 0.0.1
-EXISTING:
-
- curl -fsSL https://kots.io/install | bash
- kubectl kots install the-replicated-cli-abcdefgh
-
-EMBEDDED:
-
- curl -fsSL https://k8s.kurl.sh/the-replicated-cli-abcdefgh | sudo bash
-
-AIRGAP:
-
- curl -fSL -o the-replicated-cli-abcdefgh.tar.gz https://k8s.kurl.sh/bundle/the-replicated-cli-abcdefgh.tar.gz
- # ... scp or sneakernet the-replicated-cli-abcdefgh.tar.gz to airgapped machine, then
- tar xvf the-replicated-cli-abcdefgh.tar.gz
- sudo bash ./install.sh airgap
-```
-
-Your outputs will be in the same format but a bit different, since you'll
-be installing your own application.
-
-The command you'll use will look like this:
-
-```
-curl -fsSL https://kots.io/install | bash
-kubectl kots install [[Instruqt-Var key="REPLICATED_APP" hostname="shell"]]
-```
-
-We'll come back to that in a later step.
-
-### 2. Download a Customer License
-
-A customer license (downloadable as a `.yaml` file) is required
-to install any KOTS application. We're going to use the command-line
-to both create a customer and to download their license file.
-
-```
-replicated customer create --name "Replicant" --channel Stable
-```
-
-once the customer is created, we'll download their license file to use
-as part of the install.
-
-```
-replicated customer download-license --customer "Replicant" > license.yaml
-```
-
-### 3. Run your install
-
-When you looked up your install command, you saw something
-like this. You won't run this full command in this example,
-because we've done some setup ahead of time.
-
-```
-curl -fsSL https://kots.io/install | bash
-kubectl kots install [[Instruqt-Var key="REPLICATED_APP" hostname="shell"]]
-```
-
-This command installs the `kots` plugin to `kubectl` and then
-starts the install of your application. It then sets up a port
-forward to the admin console, where you finish the install. We
-are going to skip the console element and work entirely from
-the command line.
-
-Our shell already has the `kots` plugin installed, so we can
-skip the first line. We are also going to embelish the second
-line a little bit to provide a password and license files so
-that your customer would generally enter into the admin console.
-Most customers won't install from the command line, but since
-this is the command line lab let's see how it would go.
-
-We're also setting the password for the admin console that
-Replicated provides for managing the application. Since we're
-setting it on the command-line, let's use `this-is-unsafe` as
-a reminder not to leak secrets in the real world.
-
-```
-kubectl kots install [[Instruqt-Var key="REPLICATED_APP" hostname="shell"]] --namespace kuard \
- --shared-password this-is-unsafe --license-file ~/license.yaml \
- --no-port-forward
-```
-
-#### 4. Check your application
-
-Click on the "Example Application" tab to see you application running.
-_Be prepared, it gives a giant security warning because it shows a bunch
-of details about the cluster it's running in. Nothing is wrong and your
-browser/laptop/workstation is completely safe._
-
-
-
-
-š Finish
-=========
-
-Congratulations! You've finished the "Replicated CLI" track.
diff --git a/instruqt/replicated-cli/04-installing-your-release/check-kubernetes-vm b/instruqt/replicated-cli/04-installing-your-release/check-kubernetes-vm
deleted file mode 100755
index 2e0cb0809..000000000
--- a/instruqt/replicated-cli/04-installing-your-release/check-kubernetes-vm
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-HTTP_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://kubernetes-vm.${_SANDBOX_ID}.instruqt.io:8080)
-
-if [[ $HTTP_RESPONSE -ne "200" ]] ; then
- fail-message "Your application was not installed correctly"
- exit 0 # TODO: We have to fix this, to make sure we can make use of instruqt track test (have a working solve-kubernetes-vm script)
-fi
-
-exit 0
diff --git a/instruqt/replicated-cli/04-installing-your-release/cleanup-shell b/instruqt/replicated-cli/04-installing-your-release/cleanup-shell
deleted file mode 100755
index 25821037e..000000000
--- a/instruqt/replicated-cli/04-installing-your-release/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-tmux send-keys -t shell export SPACE 'REPLICATED_APP=' "$(agent variable get REPLICATED_APP)" ENTER
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/replicated-cli/04-installing-your-release/setup-kubernetes-vm b/instruqt/replicated-cli/04-installing-your-release/setup-kubernetes-vm
deleted file mode 100755
index e1b9bc5dc..000000000
--- a/instruqt/replicated-cli/04-installing-your-release/setup-kubernetes-vm
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-curl -fsSL https://kots.io/install | bash
-
-curl -s https://api.github.com/repos/replicatedhq/replicated/releases/latest \
- | grep "browser_download_url.*$(uname | tr '[:upper:]' '[:lower:]')_amd64.tar.gz" \
- | cut -d : -f 2,3 \
- | tr -d \" \
- | cat <( echo -n "url") - \
- | curl -fsSL -K- \
- | tar xvz replicated
-mv replicated /usr/local/bin
-
-exit 0
diff --git a/instruqt/replicated-cli/Dockerfile b/instruqt/replicated-cli/Dockerfile
deleted file mode 100644
index 780635393..000000000
--- a/instruqt/replicated-cli/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM gcr.io/kots-field-labs/shell
-
-ARG USERNAME=replicant
-ARG USER_UID=1001
-ARG USER_GID=$USER_UID
-
-COPY vendor/manifests /home/$USERNAME/manifests
-WORKDIR /home/$USERNAME
-RUN chmod -R 755 /home/$USERNAME/manifests && \
- chown -R $USERNAME /home/$USERNAME/manifests
diff --git a/instruqt/replicated-cli/assets/application-selected.png b/instruqt/replicated-cli/assets/application-selected.png
deleted file mode 100644
index a175e86a8..000000000
Binary files a/instruqt/replicated-cli/assets/application-selected.png and /dev/null differ
diff --git a/instruqt/replicated-cli/assets/cli-setup-quickstart-settings.png b/instruqt/replicated-cli/assets/cli-setup-quickstart-settings.png
deleted file mode 100644
index 5eef15b47..000000000
Binary files a/instruqt/replicated-cli/assets/cli-setup-quickstart-settings.png and /dev/null differ
diff --git a/instruqt/replicated-cli/assets/create-api-token.png b/instruqt/replicated-cli/assets/create-api-token.png
deleted file mode 100644
index ba08faeef..000000000
Binary files a/instruqt/replicated-cli/assets/create-api-token.png and /dev/null differ
diff --git a/instruqt/replicated-cli/assets/kuard-homepage.png b/instruqt/replicated-cli/assets/kuard-homepage.png
deleted file mode 100644
index 5fda94b28..000000000
Binary files a/instruqt/replicated-cli/assets/kuard-homepage.png and /dev/null differ
diff --git a/instruqt/replicated-cli/config.yml b/instruqt/replicated-cli/config.yml
deleted file mode 100644
index fcc7c049d..000000000
--- a/instruqt/replicated-cli/config.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: gcr.io/kots-field-labs/replicated-cli
- shell: tmux new-session -A -s shell su - replicant
-virtualmachines:
-- name: kubernetes-vm
- image: instruqt/k3s-v1-27-1
- shell: /bin/bash
- machine_type: n1-standard-2
- allow_external_ingress:
- - http
- - https
- - high-ports
diff --git a/instruqt/replicated-cli/track.yml b/instruqt/replicated-cli/track.yml
deleted file mode 100755
index 76f3be004..000000000
--- a/instruqt/replicated-cli/track.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-slug: replicated-cli
-id: pur3nyzcbryg
-title: The Replicated CLI
-teaser: Iterate quickly with the Replicated CLI
-description: |-
- Learn how to quicky iterate on your work with the Replicated CLI
-
- **This track demonstrates how to:**
- - Validate and release your application from the command line
- - Find your download URL without leaving your shell
- - Begin and installation using `kubectl` and the KOTS plugin
- - Put it together to iterate on your work
-icon: https://storage.googleapis.com/shared-lab-assets/icons/blue/commands.png
-tags:
- - deprecated
- - premium-plans
-owner: replicated
-developers:
- - chuck@replicated.com
-lab_config:
- overlay: false
- width: 25
- position: right
-checksum: "12222287619947085771"
diff --git a/instruqt/replicated-cli/track_scripts/setup-kubernetes-vm b/instruqt/replicated-cli/track_scripts/setup-kubernetes-vm
deleted file mode 100644
index 86447bf77..000000000
--- a/instruqt/replicated-cli/track_scripts/setup-kubernetes-vm
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-while ! ssh shell true; do
- echo "Waiting for container SSH to be available..."
- sleep 1
-done
-
-ssh shell "mkdir /home/replicant/.kube"
-
-while ! [[ -f /etc/rancher/k3s/k3s.yaml ]]; do
- echo "Waiting for Rancher kubernetes configuration to be available..."
- sleep 1
-done
-
-scp /etc/rancher/k3s/k3s.yaml shell:/home/replicant/.kube/config
diff --git a/instruqt/replicated-cli/track_scripts/setup-shell b/instruqt/replicated-cli/track_scripts/setup-shell
deleted file mode 100644
index 24819179d..000000000
--- a/instruqt/replicated-cli/track_scripts/setup-shell
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
-EOF
-
-# assure an RSA key for Dropbear
-ssh-keygen -t rsa -f /etc/dropbear/dropbear_rsa_host_key -N ''
-
-# change the cluster URI
-yq -i '.clusters[0].cluster.server = "https://kubernetes-vm:6443"' /home/replicant/.kube/config
-chown -R replicant /home/replicant/.kube
-
-# Display PARTICIPANT_ID info for Vendor Portal
-echo "export INSTRUQT_PARTICIPANT_ID=${INSTRUQT_PARTICIPANT_ID}" >> /home/replicant/.bashrc
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-echo "show_credentials" >> /home/replicant/.bashrc
diff --git a/instruqt/replicated-cli/vendor/manifests/deployment.yaml b/instruqt/replicated-cli/vendor/manifests/deployment.yaml
deleted file mode 100644
index 58bd2e7fc..000000000
--- a/instruqt/replicated-cli/vendor/manifests/deployment.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: kuard
-spec:
- replicas: 2
- selector:
- matchLabels:
- app: kuard
- template:
- metadata:
- name: kuard
- labels:
- app: kuard
- spec:
- containers:
- - name: kuard
- image: gcr.io/kuar-demo/kuard-amd64:{{repl ConfigOption "color"}}
- resources:
- limits:
- cpu: "1000m"
- memory: "256Mi"
diff --git a/instruqt/replicated-cli/vendor/manifests/kots-app.yaml b/instruqt/replicated-cli/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 6cce9d39a..000000000
--- a/instruqt/replicated-cli/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: kuard
-spec:
- title: Kubernetes Up and Running
- icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/kubernetes/icon/color/kubernetes-icon-color.png
- statusInformers:
- - deployment/kuard
- - service/kuard
- ports:
- - serviceName: "kuard"
- servicePort: 80
- localPort: 8888
- applicationUrl: "http://kuard"
diff --git a/instruqt/replicated-cli/vendor/manifests/kots-config.yaml b/instruqt/replicated-cli/vendor/manifests/kots-config.yaml
deleted file mode 100644
index ed92ef29c..000000000
--- a/instruqt/replicated-cli/vendor/manifests/kots-config.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Config
-metadata:
- name: kuard
-spec:
- groups:
- - name: ui
- title: User Interfacec
- description: Customize the user interface
- items:
- - name: color
- title: Color
- help_text: "Change the color of the application"
- type: text
- default: blue
- recommended: true
diff --git a/instruqt/replicated-cli/vendor/manifests/kots-preflights.yaml b/instruqt/replicated-cli/vendor/manifests/kots-preflights.yaml
deleted file mode 100644
index 4ba15aaeb..000000000
--- a/instruqt/replicated-cli/vendor/manifests/kots-preflights.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: Preflight
-metadata:
- name: preflight-checks
-spec:
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.20.0"
- message: The application requires Kubernetes 1.20.0 or later, and recommends 1.21.0 or later.
- uri: https://www.kubernetes.io
- - warn:
- when: "< 1.21.0"
- message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.21.0 or later.
- uri: https://kubernetes.io
- - pass:
- message: Your cluster meets the recommended and required versions of Kubernetes.
- - containerRuntime:
- outcomes:
- - pass:
- when: "== containerd"
- message: containerd container runtime was found.
- - fail:
- message: Did not find containerd container runtime.
- - distribution:
- outcomes:
- - fail:
- when: "== docker-desktop"
- message: The application does not support Docker Desktop clusters.
- - fail:
- when: "== microk8s"
- message: The application does not support MicroK8s clusters.
- - fail:
- when: "== minikube"
- message: The application does not support minikube clusters.
- - pass:
- when: "== eks"
- message: EKS is a supported distribution.
- - pass:
- when: "== gke"
- message: GKE is a supported distribution.
- - pass:
- when: "== aks"
- message: AKS is a supported distribution.
- # Will be supported in the future
- - pass:
- when: "== k3s"
- message: k3s is a supported distribution.
- - pass:
- when: "== kurl"
- message: kURL is a supported distribution.
- - pass:
- when: "== digitalocean"
- message: DigitalOcean is a supported distribution.
- - warn:
- message: Unable to determine the distribution of Kubernetes.
- - nodeResources:
- checkName: Cluster node memory
- outcomes:
- - fail:
- when: "min(memoryCapacity) < 1Gi"
- message: Each node in the cluster must have at least 2Gi of memory, and should have at least 4Gi"
- - warn:
- when: "min(memoryCapacity) < 4Gi"
- message: Each node in the cluster should have at least 4Gi"
- - pass:
- message: There are at least 4Gi of memory on each node of the cluster
diff --git a/instruqt/replicated-cli/vendor/manifests/kots-support-bundle.yaml b/instruqt/replicated-cli/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index d0a0f459a..000000000
--- a/instruqt/replicated-cli/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: support-bundle
-spec:
- collectors:
- - clusterInfo: {}
- - clusterResources: {}
- - logs:
- selector:
- - app=kuard
- namespace: '{{repl Namespace }}'
- limits:
- maxAge: 30d
- maxLines: 10000
- - registryImages:
- namespace: '{{repl Namespace }}'
- images:
- - gcr.io/kuar-demo/kuard-amd64:{{repl ConfigOption "color"}}
- analyzers:
- - deploymentStatus:
- name: kuard
- namespace: '{{repl Namespace}}'
- outcomes:
- - fail:
- when: "< 1"
- message: Kubernetes Up and Running is not ready
- - pass:
- message: Kubernetes Up and Running is ready
diff --git a/instruqt/replicated-cli/vendor/manifests/serivce.yaml b/instruqt/replicated-cli/vendor/manifests/serivce.yaml
deleted file mode 100644
index 19026f76e..000000000
--- a/instruqt/replicated-cli/vendor/manifests/serivce.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
- name: kuard
- labels:
- app: kuard
-spec:
- selector:
- app: kuard
- ports:
- - port: 8080
- protocol: TCP
- targetPort: 8080
- type: LoadBalancer
diff --git a/instruqt/replicated-cli/vendor/vendor.json b/instruqt/replicated-cli/vendor/vendor.json
deleted file mode 100644
index e58ac2478..000000000
--- a/instruqt/replicated-cli/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "The Replicated CLI",
- "slug": "replicated-cli",
- "customer": "CLI Customer",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": ""
-}
diff --git a/instruqt/sample/01-setup/assignment.md b/instruqt/sample/01-setup/assignment.md
deleted file mode 100755
index 3f995a8d2..000000000
--- a/instruqt/sample/01-setup/assignment.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-slug: setup
-id: igopgzjlo7vg
-type: challenge
-title: setup
-teaser: A short description of the challenge.
-notes:
-- type: text
- contents: Replace this text with your own text
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-difficulty: basic
-timelimit: 600
----
-
-Some simple thing to do
\ No newline at end of file
diff --git a/instruqt/sample/01-setup/check-shell b/instruqt/sample/01-setup/check-shell
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/sample/01-setup/check-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/sample/01-setup/cleanup-shell b/instruqt/sample/01-setup/cleanup-shell
deleted file mode 100755
index 3fab24155..000000000
--- a/instruqt/sample/01-setup/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform cleanup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the cleanup script"
-
-exit 0
diff --git a/instruqt/sample/01-setup/setup-shell b/instruqt/sample/01-setup/setup-shell
deleted file mode 100755
index cd25f332c..000000000
--- a/instruqt/sample/01-setup/setup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the setup script"
-
-exit 0
diff --git a/instruqt/sample/01-setup/solve-shell b/instruqt/sample/01-setup/solve-shell
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/sample/01-setup/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/sample/config.yml b/instruqt/sample/config.yml
deleted file mode 100644
index a7195fc74..000000000
--- a/instruqt/sample/config.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: ubuntu
- shell: /bin/bash
- memory: 256
diff --git a/instruqt/sample/track.yml b/instruqt/sample/track.yml
deleted file mode 100755
index 6232a0d8f..000000000
--- a/instruqt/sample/track.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-slug: sample
-id: tvc3c4ohghbi
-title: sample
-teaser: A short description of the track.
-description: |-
- A long description of the track.
-
- You can use any GitHub flavoured markdown.
-icon: https://storage.googleapis.com/instruqt-frontend/img/tracks/default.png
-tags:
-- deprecated
-owner: replicated
-developers:
-- joshd@replicated.com
-private: false
-published: false
-checksum: "12089047522842690766"
diff --git a/instruqt/sample/vendor/kurl-installer.yaml b/instruqt/sample/vendor/kurl-installer.yaml
deleted file mode 100644
index 2fe9cd491..000000000
--- a/instruqt/sample/vendor/kurl-installer.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-apiVersion: kurl.sh/v1beta1
-kind: Installer
-metadata:
- name: 'myapp'
-spec:
- kubernetes:
- version: latest
- containerd:
- version: latest
- weave:
- version: latest
- minio:
- version: latest
- longhorn:
- version: latest
- registry:
- version: latest
- prometheus:
- version: latest
- kotsadm:
- version: latest
- ekco:
- version: latest
diff --git a/instruqt/sample/vendor/manifests/example-configmap.yaml b/instruqt/sample/vendor/manifests/example-configmap.yaml
deleted file mode 100644
index 77860a9a1..000000000
--- a/instruqt/sample/vendor/manifests/example-configmap.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: nginx-content
-data:
- index.html: |
-
-
-
-
- Demo Application
-
-
-
- This is an example KOTS application.
-
This is text from a user config value: '{{repl ConfigOption "example_default_value"}}'
-
- This is a hidden value: '{{repl ConfigOption "hidden_text"}}'
-
-
- styles.css: |
- body {
- text-align: center;
- background-color: rgb(224,224,224);
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 100%;
- }
diff --git a/instruqt/sample/vendor/manifests/example-deployment.yaml b/instruqt/sample/vendor/manifests/example-deployment.yaml
deleted file mode 100644
index adbeee89b..000000000
--- a/instruqt/sample/vendor/manifests/example-deployment.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- annotations:
- backup.velero.io/backup-volumes: nginx-content
- spec:
- containers:
- - name: nginx
- image: nginx
- volumeMounts:
- - name: nginx-content
- mountPath: /usr/share/nginx/html/
- resources:
- limits:
- memory: '256Mi'
- cpu: '500m'
- requests:
- memory: '32Mi'
- cpu: '100m'
- volumes:
- - name: nginx-content
- configMap:
- name: nginx-content
diff --git a/instruqt/sample/vendor/manifests/example-service.yaml b/instruqt/sample/vendor/manifests/example-service.yaml
deleted file mode 100644
index 2c0aa0174..000000000
--- a/instruqt/sample/vendor/manifests/example-service.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
- annotations:
- kots.io/when: '{{repl not IsKurl }}'
-spec:
- type: ClusterIP
- ports:
- - port: 80
- selector:
- app: nginx
----
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
- annotations:
- kots.io/when: '{{repl IsKurl }}'
-spec:
- type: NodePort
- ports:
- - port: 80
- nodePort: 8888
- selector:
- app: nginx
\ No newline at end of file
diff --git a/instruqt/sample/vendor/manifests/k8s-app.yaml b/instruqt/sample/vendor/manifests/k8s-app.yaml
deleted file mode 100644
index 2edb42e99..000000000
--- a/instruqt/sample/vendor/manifests/k8s-app.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: app.k8s.io/v1beta1
-kind: Application
-metadata:
- name: "nginx"
-spec:
- descriptor:
- links:
- - description: Open App
- # needs to match applicationUrl in kots-app.yaml
- url: "http://nginx"
\ No newline at end of file
diff --git a/instruqt/sample/vendor/manifests/kots-app.yaml b/instruqt/sample/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 0e8aac2c7..000000000
--- a/instruqt/sample/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: nginx
-spec:
- title: App Name
- icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/kubernetes/icon/color/kubernetes-icon-color.png
- statusInformers:
- - deployment/nginx
- ports:
- - serviceName: "nginx"
- servicePort: 80
- localPort: 8888
- applicationUrl: "http://nginx"
diff --git a/instruqt/sample/vendor/manifests/kots-config.yaml b/instruqt/sample/vendor/manifests/kots-config.yaml
deleted file mode 100644
index a8b646d3e..000000000
--- a/instruqt/sample/vendor/manifests/kots-config.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Config
-metadata:
- name: config-sample
-spec:
- groups:
- - name: example_settings
- title: My Example Config
- description: Configuration to serve as an example for creating your own. See [https://kots.io/reference/v1beta1/config/](https://kots.io/reference/v1beta1/config/) for configuration docs. In this case, we provide example fields for configuring an Nginx welcome page.
- items:
- - name: show_text_inputs
- title: Customize Text Inputs
- help_text: "Show custom user text inputs"
- type: bool
- default: "0"
- recommended: true
- - name: example_default_value
- title: Text Example (with default value)
- type: text
- value: ""
- default: please change this value
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: api_token
- title: API token
- type: password
- props:
- rows: 5
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: readonly_text_left
- title: Readonly Text
- type: text
- value: "{{repl RandomString 10}}"
- readonly: true
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: hidden_text
- title: Secret Key
- type: password
- hidden: true
- value: "{{repl RandomString 40}}"
diff --git a/instruqt/sample/vendor/manifests/kots-preflight.yaml b/instruqt/sample/vendor/manifests/kots-preflight.yaml
deleted file mode 100644
index b52db000d..000000000
--- a/instruqt/sample/vendor/manifests/kots-preflight.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: Preflight
-metadata:
- name: preflight-checks
-spec:
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.20.0"
- message: The application requires Kubernetes 1.20.0 or later, and recommends 1.21.0 or later.
- uri: https://www.kubernetes.io
- - warn:
- when: "< 1.21.0"
- message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.21.0 or later.
- uri: https://kubernetes.io
- - pass:
- message: Your cluster meets the recommended and required versions of Kubernetes.
- - containerRuntime:
- outcomes:
- - pass:
- when: "== containerd"
- message: containerd container runtime was found.
- - fail:
- message: Did not find containerd container runtime.
- - distribution:
- outcomes:
- - fail:
- when: "== docker-desktop"
- message: The application does not support Docker Desktop clusters.
- - fail:
- when: "== microk8s"
- message: The application does not support MicroK8s clusters.
- - fail:
- when: "== minikube"
- message: The application does not support minikube clusters.
- - pass:
- when: "== eks"
- message: EKS is a supported distribution.
- - pass:
- when: "== gke"
- message: GKE is a supported distribution.
- - pass:
- when: "== aks"
- message: AKS is a supported distribution.
- # Will be supported in the future
- - pass:
- when: "== kurl"
- message: kURL is a supported distribution.
- - pass:
- when: "== digitalocean"
- message: DigitalOcean is a supported distribution.
- - warn:
- message: Unable to determine the distribution of Kubernetes.
- - nodeResources:
- checkName: Total CPU Cores
- outcomes:
- - fail:
- when: "sum(cpuCapacity) < 2"
- message: The cluster must contain at least 2 cores, and should contain at least 4 cores.
- - warn:
- when: "sum(cpuCapacity) < 4"
- message: The cluster should contain at least 4 cores.
- - pass:
- message: There are at least 4 cores in the cluster.
diff --git a/instruqt/sample/vendor/manifests/kots-support-bundle.yaml b/instruqt/sample/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index 4f0ade3da..000000000
--- a/instruqt/sample/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: support-bundle
-spec:
- collectors:
- - clusterInfo: {}
- - clusterResources: {}
- - logs:
- selector:
- - app=nginx
- namespace: '{{repl Namespace }}'
diff --git a/instruqt/sample/vendor/vendor.json b/instruqt/sample/vendor/vendor.json
deleted file mode 100644
index f29399067..000000000
--- a/instruqt/sample/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Sample Track",
- "slug": "sample",
- "customer": "Sample Customer",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": "./kurl-installer.yaml"
-}
\ No newline at end of file
diff --git a/instruqt/short-demo/01-demo/assignment.md b/instruqt/short-demo/01-demo/assignment.md
deleted file mode 100755
index 83ec60cae..000000000
--- a/instruqt/short-demo/01-demo/assignment.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-slug: demo
-id: s0jzecmlrymt
-type: challenge
-title: Demo
-teaser: The demo environment
-notes:
-- type: image
- url: ../assets/slide1.png
-- type: image
- url: ../assets/slide2.png
-- type: image
- url: ../assets/slide3.png
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-- title: Code Editor
- type: code
- hostname: shell
- path: /home/replicant/demo-app
-- title: Vendor Portal
- type: website
- url: https://vendor.replicated.com
- new_window: true
-- title: Application Installer Init
- type: website
- url: http://kotsadm.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-- title: Application Installed
- type: website
- url: http://application.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-- title: kURL
- type: website
- url: http://kurl.${_SANDBOX_ID}.instruqt.io:8800
- new_window: true
-difficulty: basic
-timelimit: 4200
----
-
-Kubeconfig
-==========
-
-kubectl for kotsadm
-```
-export KUBECONFIG=~/.kube/config-kotsadm
-```
-
-kubectl for application
-```
-export KUBECONFIG=~/.kube/config-application
-```
-
-Log output
-==========
-
-Showing the log output for an existing cluster install
-```
-cat kotsadm.log
-```
-
-Remove app
-==========
-
-```shell
-export KUBECONFIG=~/.kube/config-kotsadm
-kubectl kots remove short-demo-${INSTRUQT_PARTICIPANT_ID} -n default --force
-```
-
-kURL Embedded Install
-=====================
-
-You can show the kURL install output from the embedded installation in the shell tab using
-```
-tail -100f ~/kurl.log
-```
-
-Or if you want the full output from the beginning
-```
-cat ~/kurl.log | more
-```
-
-If you want to install the application on the embedded kURL instance, go to the `kURL` tab, upload the license and enjoy.
-
-Create new release
-==================
-
-```shell
-replicated release create --yaml-dir ./demo-app/manifests --promote Stable --version 0.2.0
-```
-
-Support Bundle
-==============
-
-The `Application Installed` instance also has a support-bundle pre generated. So you can browse to the application installer and use that one in case you can't wait for the results.
-
-FYI: It takes a couple minutes before it is generated. If you see the following message in `trigger.out`, it should be loaded: `A copy of this support bundle was written to the current directory, named "support-bundle-....tar.gz"`
\ No newline at end of file
diff --git a/instruqt/short-demo/01-demo/check-application b/instruqt/short-demo/01-demo/check-application
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/short-demo/01-demo/check-application
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/check-kotsadm b/instruqt/short-demo/01-demo/check-kotsadm
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/short-demo/01-demo/check-kotsadm
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/check-shell b/instruqt/short-demo/01-demo/check-shell
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/short-demo/01-demo/check-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/cleanup-application b/instruqt/short-demo/01-demo/cleanup-application
deleted file mode 100755
index 3fab24155..000000000
--- a/instruqt/short-demo/01-demo/cleanup-application
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform cleanup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the cleanup script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/cleanup-kotsadm b/instruqt/short-demo/01-demo/cleanup-kotsadm
deleted file mode 100755
index 3fab24155..000000000
--- a/instruqt/short-demo/01-demo/cleanup-kotsadm
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform cleanup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the cleanup script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/cleanup-shell b/instruqt/short-demo/01-demo/cleanup-shell
deleted file mode 100755
index 3fab24155..000000000
--- a/instruqt/short-demo/01-demo/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform cleanup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the cleanup script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/setup-application b/instruqt/short-demo/01-demo/setup-application
deleted file mode 100755
index cd25f332c..000000000
--- a/instruqt/short-demo/01-demo/setup-application
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the setup script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/setup-kotsadm b/instruqt/short-demo/01-demo/setup-kotsadm
deleted file mode 100755
index cd25f332c..000000000
--- a/instruqt/short-demo/01-demo/setup-kotsadm
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the setup script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/setup-shell b/instruqt/short-demo/01-demo/setup-shell
deleted file mode 100644
index e19b9ea69..000000000
--- a/instruqt/short-demo/01-demo/setup-shell
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-cat <<'SAVE_SCRIPT' >> /home/replicant/trigger.sh
-#!/bin/bash
-
-source /etc/profile.d/header.sh
-
-# Setup REPLICATED_APP and REPLICATED_API_TOKEN
-password=$(get_password)
-login=$( jq -n -c --arg email "${INSTRUQT_PARTICIPANT_ID}@replicated-labs.com" --arg password "${password}" '$ARGS.named' )
-token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login" https://id.replicated.com/v1/login | jq -r ".token")
-
-i=0
-while [[ "$token" == "null" && $i -lt 20 ]]
-do
- sleep 2
- token=$(curl -s -H "Content-Type: application/json" --request POST -d "$login" https://id.replicated.com/v1/login | jq -r ".token")
- echo "Token: ${token} value"
- i=$((i+1))
-done
-
-UUID=$(cat /proc/sys/kernel/random/uuid)
-apiToken=$( jq -n -c --arg name "instruqt-${UUID}" --argjson read_only false '$ARGS.named' )
-access_token=$(curl -s -H "Content-Type: application/json" -H "Authorization: $token" --request POST -d "$apiToken" https://api.replicated.com/vendor/v1/user/token | jq -r ".access_token")
-
-echo "export REPLICATED_API_TOKEN=${access_token}" >> /home/replicant/.bashrc
-echo "export REPLICATED_APP=short-demo-$INSTRUQT_PARTICIPANT_ID" >> /home/replicant/.bashrc
-
-# Download manifests
-mkdir -p /home/replicant/demo-app/manifests
-export REPLICATED_API_TOKEN=${access_token}
-export REPLICATED_APP=short-demo-$INSTRUQT_PARTICIPANT_ID
-replicated release download 1 -d /home/replicant/demo-app/manifests
-chown -R replicant /home/replicant/demo-app
-
-
-# Install kotsadm + application on application
-replicated customer download-license --customer "Some big bank" > /home/replicant/license.yaml
-export KUBECONFIG=/home/replicant/.kube/config-application
-kubectl kots remove short-demo-${INSTRUQT_PARTICIPANT_ID} -n default --force
-kubectl kots install short-demo-$INSTRUQT_PARTICIPANT_ID \
- --name short-demo-$INSTRUQT_PARTICIPANT_ID \
- --namespace default \
- --license-file /home/replicant/license.yaml \
- --shared-password $INSTRUQT_PARTICIPANT_ID \
- --no-port-forward \
- --skip-preflights
-
-# Generate a support-bundle by default
-json=$( jq -n -c --arg password "$INSTRUQT_PARTICIPANT_ID" '$ARGS.named' )
-token=$(curl -H "Content-Type: application/json" --request POST -d "$json" http://application.${_SANDBOX_ID}.instruqt.io:8800/api/v1/login | jq -r ".token")
-origin=$( jq -n -c --arg origin "http://application.${_SANDBOX_ID}.instruqt.io:8800" '$ARGS.named' )
-command=$(curl -s -H "Content-Type: application/json" -H "Authorization: $token" --request POST -d "$origin" http://application.${_SANDBOX_ID}.instruqt.io:8800/api/v1/troubleshoot/app/short-demo-$INSTRUQT_PARTICIPANT_ID/supportbundlecommand | jq -r ".command[1]")
-${command} --insecure-skip-tls-verify=true --interactive=false
-SAVE_SCRIPT
-
-chmod a+x /home/replicant/trigger.sh
-chown -R replicant /home/replicant/trigger.sh
-nohup /home/replicant/trigger.sh > /home/replicant/trigger.out 2> /home/replicant/trigger.err < /dev/null & disown
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/solve-application b/instruqt/short-demo/01-demo/solve-application
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/short-demo/01-demo/solve-application
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/solve-kotsadm b/instruqt/short-demo/01-demo/solve-kotsadm
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/short-demo/01-demo/solve-kotsadm
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/short-demo/01-demo/solve-shell b/instruqt/short-demo/01-demo/solve-shell
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/short-demo/01-demo/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/short-demo/assets/slide1.png b/instruqt/short-demo/assets/slide1.png
deleted file mode 100644
index 362d8f2bd..000000000
Binary files a/instruqt/short-demo/assets/slide1.png and /dev/null differ
diff --git a/instruqt/short-demo/assets/slide2.png b/instruqt/short-demo/assets/slide2.png
deleted file mode 100644
index 23bbbd764..000000000
Binary files a/instruqt/short-demo/assets/slide2.png and /dev/null differ
diff --git a/instruqt/short-demo/assets/slide3.png b/instruqt/short-demo/assets/slide3.png
deleted file mode 100644
index 9ba39fc1b..000000000
Binary files a/instruqt/short-demo/assets/slide3.png and /dev/null differ
diff --git a/instruqt/short-demo/config.yml b/instruqt/short-demo/config.yml
deleted file mode 100644
index aca0ebb99..000000000
--- a/instruqt/short-demo/config.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: gcr.io/kots-field-labs/shell:main
- shell: su - replicant
- memory: 256
-virtualmachines:
-- name: kotsadm
- image: instruqt/k3s-v1-25-0
- shell: /bin/bash
- machine_type: n1-standard-2
- allow_external_ingress:
- - http
- - https
- - high-ports
-- name: application
- image: instruqt/k3s-v1-25-0
- shell: /bin/bash
- machine_type: n1-standard-2
- allow_external_ingress:
- - http
- - https
- - high-ports
-- name: kurl
- image: kots-field-labs/ubuntu-2204-lts-200gb
- shell: /bin/bash
- machine_type: n1-standard-8
- allow_external_ingress:
- - http
- - https
- - high-ports
\ No newline at end of file
diff --git a/instruqt/short-demo/track.yml b/instruqt/short-demo/track.yml
deleted file mode 100644
index 6c43ae84a..000000000
--- a/instruqt/short-demo/track.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-slug: short-demo
-id: iecexaqfyu6j
-title: Short Demo
-teaser: Used for conferences and pitches
-description: |-
- An environment to run demo's
-
- It contains two k3s environments:
- * k3s-1 (kotsadm cluster): Just k3s with kots pre-installed. You can upload a license and go through the installation process.
- * k3s-2 (application cluster): Just k3s with kots pre-installed and also the application pre-installed.
-
- It contains one kURL environment:
- * kurl (kurl cluster): kURL cluster that can be used to show kURL output or do an embedded application install. The kURL cluster is installed async.
-
- It contains a container with the replicated CLI pre-installed.
- It contains an editor with the manifests pre-loaded as an IDE example
-icon: https://storage.googleapis.com/instruqt-frontend/img/tracks/default.png
-tags:
-- internal
-owner: replicated
-developers:
-- joshd@replicated.com
-private: false
-published: false
-show_timer: true
-checksum: "11293693655654846089"
diff --git a/instruqt/short-demo/track_scripts/setup-application b/instruqt/short-demo/track_scripts/setup-application
deleted file mode 100644
index 47c29ea9f..000000000
--- a/instruqt/short-demo/track_scripts/setup-application
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for the Instruqt host bootstrap to finish
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-while ! ssh shell true; do
- echo "Waiting for container SSH to be available..."
- sleep 1
-done
-
-ssh shell "mkdir -p /home/replicant/.kube"
-
-while ! [[ -f /etc/rancher/k3s/k3s.yaml ]]; do
- echo "Waiting for Rancher kubernetes configuration to be available..."
- sleep 1
-done
-
-# Wait for the Kubernetes API server to become available
-while ! curl --silent --fail --output /dev/null http://localhost:8001/api
-do
- sleep 1
-done
-
-scp /etc/rancher/k3s/k3s.yaml shell:/home/replicant/.kube/config-application
diff --git a/instruqt/short-demo/track_scripts/setup-kotsadm b/instruqt/short-demo/track_scripts/setup-kotsadm
deleted file mode 100644
index 3e48fb640..000000000
--- a/instruqt/short-demo/track_scripts/setup-kotsadm
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for the Instruqt host bootstrap to finish
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-while ! ssh shell true; do
- echo "Waiting for container SSH to be available..."
- sleep 1
-done
-
-ssh shell "mkdir -p /home/replicant/.kube"
-
-while ! [[ -f /etc/rancher/k3s/k3s.yaml ]]; do
- echo "Waiting for Rancher kubernetes configuration to be available..."
- sleep 1
-done
-
-# Wait for the Kubernetes API server to become available
-while ! curl --silent --fail --output /dev/null http://localhost:8001/api
-do
- sleep 1
-done
-
-scp /etc/rancher/k3s/k3s.yaml shell:/home/replicant/.kube/config-kotsadm
diff --git a/instruqt/short-demo/track_scripts/setup-kurl b/instruqt/short-demo/track_scripts/setup-kurl
deleted file mode 100644
index 7b9fc6385..000000000
--- a/instruqt/short-demo/track_scripts/setup-kurl
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# Wait for the Instruqt host bootstrap to finish
-until [ -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- sleep 1
-done
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-while ! ssh shell true; do
- echo "Waiting for container SSH to be available..."
- sleep 1
-done
-
-cat <<'SAVE_SCRIPT' >> sharelog.sh
-#!/bin/bash
-tail -f kurl.log | ssh shell "cat > /home/replicant/kurl.log" 2> ssh.err
-
-SAVE_SCRIPT
-
-chmod a+x sharelog.sh
-
-curl https://kurl.sh/short-demo-$INSTRUQT_PARTICIPANT_ID > install.sh
-chmod +x install.sh
-nohup sudo ./install.sh > kurl.log 2> kurl.err < /dev/null & disown
-nohup ./sharelog.sh > tail.log 2> tail.err < /dev/null & disown
-
-exit 0
\ No newline at end of file
diff --git a/instruqt/short-demo/track_scripts/setup-shell b/instruqt/short-demo/track_scripts/setup-shell
deleted file mode 100644
index 574fac81c..000000000
--- a/instruqt/short-demo/track_scripts/setup-shell
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-
-CYAN='\033[0;36m'
-NC='\033[0m' # No Color
-
-# change the cluster URI
-yq -i '.clusters[0].cluster.server = "https://kotsadm:6443"' /home/replicant/.kube/config-kotsadm
-yq -i '.clusters[0].cluster.server = "https://application:6443"' /home/replicant/.kube/config-application
-chown -R replicant /home/replicant/.kube
-
-# Install kotsadm on kotsadm
-export KUBECONFIG=/home/replicant/.kube/config-kotsadm
-echo -e "$CYAN$> kubectl kots install short-demo-$INSTRUQT_PARTICIPANT_ID \n\
- --name short-demo-$INSTRUQT_PARTICIPANT_ID \n\
- --namespace default \n\
- --shared-password $INSTRUQT_PARTICIPANT_ID \n\
- --no-port-forward$NC" > /home/replicant/kotsadm.log
-kubectl kots install short-demo-$INSTRUQT_PARTICIPANT_ID \
- --name short-demo-$INSTRUQT_PARTICIPANT_ID \
- --namespace default \
- --shared-password $INSTRUQT_PARTICIPANT_ID \
- --no-port-forward >> /home/replicant/kotsadm.log
-kubectl expose deployment kotsadm -n $(kubectl get pods -A -l app=kotsadm --no-headers | awk '{ print $1 }' ) --type=LoadBalancer --name=kotsadm-ingress --port=8800 --target-port=3000
-
-# Install kotsadm on application
-export KUBECONFIG=/home/replicant/.kube/config-application
-kubectl kots install short-demo-$INSTRUQT_PARTICIPANT_ID \
- --name short-demo-$INSTRUQT_PARTICIPANT_ID \
- --namespace default \
- --shared-password $INSTRUQT_PARTICIPANT_ID \
- --no-port-forward
-kubectl expose deployment kotsadm -n $(kubectl get pods -A -l app=kotsadm --no-headers | awk '{ print $1 }' ) --type=LoadBalancer --name=kotsadm-ingress --port=8800 --target-port=3000
-
-# Display PARTICIPANT_ID info for Vendor Portal
-echo "export INSTRUQT_PARTICIPANT_ID=${INSTRUQT_PARTICIPANT_ID}" >> /home/replicant/.bashrc
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
-echo "show_credentials" >> /home/replicant/.bashrc
\ No newline at end of file
diff --git a/instruqt/short-demo/vendor/manifests/demo-app-0.1.0.tgz b/instruqt/short-demo/vendor/manifests/demo-app-0.1.0.tgz
deleted file mode 100644
index 28d4854fd..000000000
Binary files a/instruqt/short-demo/vendor/manifests/demo-app-0.1.0.tgz and /dev/null differ
diff --git a/instruqt/short-demo/vendor/manifests/demo-app.yaml b/instruqt/short-demo/vendor/manifests/demo-app.yaml
deleted file mode 100644
index fee4d1612..000000000
--- a/instruqt/short-demo/vendor/manifests/demo-app.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-apiVersion: kots.io/v1beta1
-kind: HelmChart
-metadata:
- name: demo-app
-spec:
- # chart identifies a matching chart from a .tgz
- chart:
- name: demo-app
- chartVersion: 0.1.0
-
- # helmVersion identifies the Helm Version used to render the Chart. Default is v2.
- helmVersion: v3
-
- # useHelmInstall identifies whether this Helm chart will use the
- # Replicated Helm installation (false) or native Helm installation (true). Default is false.
- # Native Helm installations are only available for Helm v3 charts.
- useHelmInstall: true
-
- # values are used in the customer environment, as a pre-render step
- # these values will be supplied to helm template
- values: {}
-
- # builder values provide a way to render the chart with all images
- # and manifests. this is used in replicated to create airgap packages
- builder: {}
diff --git a/instruqt/short-demo/vendor/manifests/example-configmap.yaml b/instruqt/short-demo/vendor/manifests/example-configmap.yaml
deleted file mode 100644
index 77860a9a1..000000000
--- a/instruqt/short-demo/vendor/manifests/example-configmap.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: nginx-content
-data:
- index.html: |
-
-
-
-
- Demo Application
-
-
-
- This is an example KOTS application.
-
This is text from a user config value: '{{repl ConfigOption "example_default_value"}}'
-
- This is a hidden value: '{{repl ConfigOption "hidden_text"}}'
-
-
- styles.css: |
- body {
- text-align: center;
- background-color: rgb(224,224,224);
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 100%;
- }
diff --git a/instruqt/short-demo/vendor/manifests/example-deployment.yaml b/instruqt/short-demo/vendor/manifests/example-deployment.yaml
deleted file mode 100644
index adbeee89b..000000000
--- a/instruqt/short-demo/vendor/manifests/example-deployment.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- annotations:
- backup.velero.io/backup-volumes: nginx-content
- spec:
- containers:
- - name: nginx
- image: nginx
- volumeMounts:
- - name: nginx-content
- mountPath: /usr/share/nginx/html/
- resources:
- limits:
- memory: '256Mi'
- cpu: '500m'
- requests:
- memory: '32Mi'
- cpu: '100m'
- volumes:
- - name: nginx-content
- configMap:
- name: nginx-content
diff --git a/instruqt/short-demo/vendor/manifests/example-service.yaml b/instruqt/short-demo/vendor/manifests/example-service.yaml
deleted file mode 100644
index 3fed6604c..000000000
--- a/instruqt/short-demo/vendor/manifests/example-service.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
- name: nginx
- labels:
- app: nginx
-spec:
- type: NodePort
- ports:
- - port: 80
- nodePort: 30888
- selector:
- app: nginx
\ No newline at end of file
diff --git a/instruqt/short-demo/vendor/manifests/k8s-app.yaml b/instruqt/short-demo/vendor/manifests/k8s-app.yaml
deleted file mode 100644
index 2edb42e99..000000000
--- a/instruqt/short-demo/vendor/manifests/k8s-app.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: app.k8s.io/v1beta1
-kind: Application
-metadata:
- name: "nginx"
-spec:
- descriptor:
- links:
- - description: Open App
- # needs to match applicationUrl in kots-app.yaml
- url: "http://nginx"
\ No newline at end of file
diff --git a/instruqt/short-demo/vendor/manifests/kots-app.yaml b/instruqt/short-demo/vendor/manifests/kots-app.yaml
deleted file mode 100644
index 9d251f727..000000000
--- a/instruqt/short-demo/vendor/manifests/kots-app.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Application
-metadata:
- name: nginx
-spec:
- title: SpaceRocket
- icon: https://user-images.githubusercontent.com/1579188/201223313-7e1c5649-30c4-47f0-bfc6-0c697e1b329b.png
- statusInformers:
- - deployment/nginx
- ports:
- - serviceName: "nginx"
- servicePort: 80
- localPort: 30888
- applicationUrl: "http://nginx"
diff --git a/instruqt/short-demo/vendor/manifests/kots-backup.yaml b/instruqt/short-demo/vendor/manifests/kots-backup.yaml
deleted file mode 100644
index 931ac4a30..000000000
--- a/instruqt/short-demo/vendor/manifests/kots-backup.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-apiVersion: velero.io/v1
-kind: Backup
-metadata:
- name: backup
-spec: {}
\ No newline at end of file
diff --git a/instruqt/short-demo/vendor/manifests/kots-config.yaml b/instruqt/short-demo/vendor/manifests/kots-config.yaml
deleted file mode 100644
index 095075a7f..000000000
--- a/instruqt/short-demo/vendor/manifests/kots-config.yaml
+++ /dev/null
@@ -1,115 +0,0 @@
----
-apiVersion: kots.io/v1beta1
-kind: Config
-metadata:
- name: config-sample
-spec:
- groups:
- - name: database
- title: Database
- description: Database Options
- items:
- - name: postgres_type
- type: select_one
- title: Postgres
- default: embedded_postgres
- items:
- - name: embedded_postgres
- title: Embedded Postgres
- - name: external_postgres_inline
- title: External Postgres
- - name: embedded_postgres_password
- hidden: true
- type: password
- value: "{{repl RandomString 32}}"
- - name: external_postgres_host
- title: Postgres Host
- when: '{{repl ConfigOptionEquals "postgres_type" "external_postgres_inline"}}'
- type: text
- default: postgres
- - name: external_postgres_port
- title: Postgres Port
- when: '{{repl ConfigOptionEquals "postgres_type" "external_postgres_inline"}}'
- type: text
- default: "5432"
- - name: external_postgres_user
- title: Postgres Username
- when: '{{repl ConfigOptionEquals "postgres_type" "external_postgres_inline"}}'
- type: text
- required: true
- - name: external_postgres_password
- title: Postgres Password
- when: '{{repl ConfigOptionEquals "postgres_type" "external_postgres_inline"}}'
- type: password
- required: true
- - name: external_postgres_db
- title: Postgres Database
- when: '{{repl ConfigOptionEquals "postgres_type" "external_postgres_inline"}}'
- type: text
- default: supersecret
-
- - name: redis_type
- type: select_one
- title: Redis
- default: embedded_redis
- items:
- - name: embedded_redis
- title: Embedded Redis
- - name: external_redis_inline
- title: External Redis
- - name: embedded_redis_password
- hidden: true
- type: password
- value: "{{repl RandomString 32}}"
- - name: external_redis_host
- title: Redis Host
- when: '{{repl ConfigOptionEquals "redis_type" "external_redis_inline"}}'
- type: text
- default: redis
- - name: external_redis_port
- title: Redis Port
- when: '{{repl ConfigOptionEquals "redis_type" "external_redis_inline"}}'
- type: text
- default: "6379"
- - name: external_redis_user
- title: Redis Username
- when: '{{repl ConfigOptionEquals "redis_type" "external_redis_inline"}}'
- type: text
- - name: external_redis_password
- title: Redis Password
- when: '{{repl ConfigOptionEquals "redis_type" "external_redis_inline"}}'
- type: password
- required: true
- - name: example_settings
- title: Other Config
- description: Configuration to serve as an example for creating your own. See [https://kots.io/reference/v1beta1/config/](https://kots.io/reference/v1beta1/config/) for configuration docs. In this case, we provide example fields for configuring an Nginx welcome page.
- items:
- - name: show_text_inputs
- title: Customize Text Inputs
- help_text: "Show custom user text inputs"
- type: bool
- default: "0"
- recommended: true
- - name: example_default_value
- title: Text Example (with default value)
- type: text
- value: ""
- default: please change this value
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: api_token
- title: API token
- type: password
- props:
- rows: 5
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: readonly_text_left
- title: Readonly Text
- type: text
- value: "{{repl RandomString 10}}"
- readonly: true
- when: repl{{ ConfigOptionEquals "show_text_inputs" "1" }}
- - name: hidden_text
- title: Secret Key
- type: password
- hidden: true
- value: "{{repl RandomString 40}}"
diff --git a/instruqt/short-demo/vendor/manifests/kots-preflight.yaml b/instruqt/short-demo/vendor/manifests/kots-preflight.yaml
deleted file mode 100644
index b52db000d..000000000
--- a/instruqt/short-demo/vendor/manifests/kots-preflight.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: Preflight
-metadata:
- name: preflight-checks
-spec:
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.20.0"
- message: The application requires Kubernetes 1.20.0 or later, and recommends 1.21.0 or later.
- uri: https://www.kubernetes.io
- - warn:
- when: "< 1.21.0"
- message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.21.0 or later.
- uri: https://kubernetes.io
- - pass:
- message: Your cluster meets the recommended and required versions of Kubernetes.
- - containerRuntime:
- outcomes:
- - pass:
- when: "== containerd"
- message: containerd container runtime was found.
- - fail:
- message: Did not find containerd container runtime.
- - distribution:
- outcomes:
- - fail:
- when: "== docker-desktop"
- message: The application does not support Docker Desktop clusters.
- - fail:
- when: "== microk8s"
- message: The application does not support MicroK8s clusters.
- - fail:
- when: "== minikube"
- message: The application does not support minikube clusters.
- - pass:
- when: "== eks"
- message: EKS is a supported distribution.
- - pass:
- when: "== gke"
- message: GKE is a supported distribution.
- - pass:
- when: "== aks"
- message: AKS is a supported distribution.
- # Will be supported in the future
- - pass:
- when: "== kurl"
- message: kURL is a supported distribution.
- - pass:
- when: "== digitalocean"
- message: DigitalOcean is a supported distribution.
- - warn:
- message: Unable to determine the distribution of Kubernetes.
- - nodeResources:
- checkName: Total CPU Cores
- outcomes:
- - fail:
- when: "sum(cpuCapacity) < 2"
- message: The cluster must contain at least 2 cores, and should contain at least 4 cores.
- - warn:
- when: "sum(cpuCapacity) < 4"
- message: The cluster should contain at least 4 cores.
- - pass:
- message: There are at least 4 cores in the cluster.
diff --git a/instruqt/short-demo/vendor/manifests/kots-support-bundle.yaml b/instruqt/short-demo/vendor/manifests/kots-support-bundle.yaml
deleted file mode 100644
index 2ba80e7c5..000000000
--- a/instruqt/short-demo/vendor/manifests/kots-support-bundle.yaml
+++ /dev/null
@@ -1,63 +0,0 @@
-apiVersion: troubleshoot.sh/v1beta2
-kind: SupportBundle
-metadata:
- name: support-bundle
-spec:
- collectors:
- - clusterInfo: {}
- - clusterResources: {}
- - logs:
- selector:
- - app=nginx
- namespace: '{{repl Namespace }}'
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.20.0"
- message: Spooky requires a Kubernetes 1.21.0 or later, and recommends 1.24.0.
- uri: https://www.kubernetes.io
- - warn:
- when: "< 1.21.0"
- - pass:
- message: "Your version of Kubernetes is OK"
- - nodeResources:
- checkName: Allocatable Storage
- outcomes:
- - fail:
- when: "max(ephemeralStorageAllocatable) < 10Gi"
- message: No Node has more than 10Gi storage allocatable
- uri: https://kurl.sh/docs/install-with-kurl/system-requirements
- - warn:
- when: "max(ephemeralStorageAllocatable) < 20Gi"
- message: No Node has more than 20Gi storage allocatable
- uri: https://kurl.sh/docs/install-with-kurl/system-requirements
- - pass:
- message: All nodes have at least 20 GB of allocatable ephemeral storage.
- - nodeResources:
- checkName: Allocatable Memory
- outcomes:
- - fail:
- when: "max(memoryAllocatable) < 1Gi"
- message: All nodes have less than 1Gi allocatable memory
- uri: https://kurl.sh/docs/install-with-kurl/system-requirements
- - warn:
- when: "max(memoryAllocatable) < 2Gi"
- message: All nodes have less than 2Gi allocatable memory
- uri: https://kurl.sh/docs/install-with-kurl/system-requirements
- - pass:
- message: All nodes have at least 2 Gi of allocatable memory
- - nodeResources:
- checkName: Allocatable CPU
- outcomes:
- - fail:
- when: "max(cpuAllocatable) < 500m"
- message: All nodes have less than 500m allocatable CPU
- uri: https://kurl.sh/docs/install-with-kurl/system-requirements
- - warn:
- when: "max(cpuAllocatable) < 1"
- message: All nodes have less than 1 allocatable CPU
- uri: https://kurl.sh/docs/install-with-kurl/system-requirements
- - pass:
- message: All nodes have at least 1 allocatable CPUs
-
diff --git a/instruqt/short-demo/vendor/vendor.json b/instruqt/short-demo/vendor/vendor.json
deleted file mode 100644
index be498343d..000000000
--- a/instruqt/short-demo/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Short Demo",
- "slug": "short-demo",
- "customer": "Some big bank",
- "yaml_dir": "./manifests",
- "k8s_installer_yaml_path": ""
-}
\ No newline at end of file
diff --git a/instruqt/trying-out-cmx/01-create-a-test-cluster/assignment.md b/instruqt/trying-out-cmx/01-create-a-test-cluster/assignment.md
deleted file mode 100755
index 0ad04b967..000000000
--- a/instruqt/trying-out-cmx/01-create-a-test-cluster/assignment.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-slug: create-a-test-cluster
-id: znzkrjto96nr
-type: challenge
-title: Create a Test Cluster
-teaser: A short description of the challenge.
-notes:
-- type: text
- contents: Replace this text with your own text
-tabs:
-- title: Vendor Portal
- type: website
- url: https://vendor.replicated.com/compatibility-matrix/clusters
- new_window: true
-difficulty: basic
-timelimit: 300
----
-
-
-š Introducing the Comptibility Matrix
-======================================
-
-The Replicated Compatibility Matrix is a service for quickly and easily
-spinning up ephemeral clusters for testing your application. You can manage
-your clusters using the Replicated Vendor Portal. We also provide a command-line
-interface and a series of GitHub actions to facilitate Continuous Delivery.
-
-Clusters Available
-==================
-
-Let's use the Replicated Vendor Portal to understand the types of clusters
-you can create for you testing. Click the "Vendor Portal" tab and log in with
-the following credentials
-
-Username: `[[ Instruqt-Var key="USERNAME" hostname="shell" ]]`
-Password: `[[ Instruqt-Var key="PASSWORD" hostname="shell" ]]`
-
-
diff --git a/instruqt/trying-out-cmx/01-create-a-test-cluster/check-shell b/instruqt/trying-out-cmx/01-create-a-test-cluster/check-shell
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/trying-out-cmx/01-create-a-test-cluster/check-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/trying-out-cmx/01-create-a-test-cluster/cleanup-shell b/instruqt/trying-out-cmx/01-create-a-test-cluster/cleanup-shell
deleted file mode 100755
index 3fab24155..000000000
--- a/instruqt/trying-out-cmx/01-create-a-test-cluster/cleanup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform cleanup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the cleanup script"
-
-exit 0
diff --git a/instruqt/trying-out-cmx/01-create-a-test-cluster/setup-shell b/instruqt/trying-out-cmx/01-create-a-test-cluster/setup-shell
deleted file mode 100755
index a3da48a0a..000000000
--- a/instruqt/trying-out-cmx/01-create-a-test-cluster/setup-shell
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-HOME_DIR=/home/replicant
-
-# Wait for Instruqt bootstrap to be complete
-while [ ! -f /opt/instruqt/bootstrap/host-bootstrap-completed ]
-do
- echo "Waiting for Instruqt to finish booting the VM"
- sleep 1
-done
-
-# convenience library for Replicated lab lifecycle scripts
-source /etc/profile.d/header.sh
-
-agent variable set USERNAME $(get_username)
-agent variable set PASSWORD $(get_password)
diff --git a/instruqt/trying-out-cmx/01-create-a-test-cluster/solve-shell b/instruqt/trying-out-cmx/01-create-a-test-cluster/solve-shell
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/trying-out-cmx/01-create-a-test-cluster/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/trying-out-cmx/config.yml b/instruqt/trying-out-cmx/config.yml
deleted file mode 100644
index c970e1a00..000000000
--- a/instruqt/trying-out-cmx/config.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: gcr.io/kots-field-labs/shell:latest
- shell: tmux new-session -A -s shell su - replicant
diff --git a/instruqt/trying-out-cmx/track.yml b/instruqt/trying-out-cmx/track.yml
deleted file mode 100755
index 6594172ba..000000000
--- a/instruqt/trying-out-cmx/track.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-slug: trying-out-cmx
-id: 1gpba3eivmb4
-title: Trying Out the Replicated Compability Matrix
-teaser: |-
- Learn how the Replicated Platform helps you prevent cluster compatibility
- issue before you release to your customers
-description: |2-
-
- What if you could automatically test your new releases on truly
- customer-representative environmentsāsame cloud provider, same Kubernetes
- distribution and version, and even the same entitlements and configuration?
- With the [Compatibility Matrix](https://www.replicated.com/test-compatibility-in-customer-representative-environments),
- you can.
-icon: https://storage.googleapis.com/shared-lab-assets/icons/red/connect.png
-tags:
-- prod
-- builders-plan
-- compatibility-matrix
-- helm
-owner: replicated
-developers:
-- chuck@replicated.com
-lab_config:
- overlay: false
- width: 33
- position: right
-checksum: "16262887100161909657"
diff --git a/instruqt/trying-out-cmx/track_scripts/setup-shell b/instruqt/trying-out-cmx/track_scripts/setup-shell
deleted file mode 100755
index 19726fbda..000000000
--- a/instruqt/trying-out-cmx/track_scripts/setup-shell
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
-EOF
-
-# assure an RSA key for Dropbear
-ssh-keygen -t rsa -f /etc/dropbear/dropbear_rsa_host_key -N ''
-
-# use our shared libary in setup scripts
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/main/libs/header.sh
diff --git a/instruqt/trying-out-cmx/vendor/vendor.json b/instruqt/trying-out-cmx/vendor/vendor.json
deleted file mode 100755
index ba5f5ff9a..000000000
--- a/instruqt/trying-out-cmx/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Harbor",
- "slug": "harbor",
- "customer": "Omozan",
- "yaml_dir": "",
- "k8s_installer_yaml_path": ""
-}
diff --git a/instruqt/validating-compatibility/01-basics/assignment.md b/instruqt/validating-compatibility/01-basics/assignment.md
deleted file mode 100755
index 68cd2b385..000000000
--- a/instruqt/validating-compatibility/01-basics/assignment.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-slug: basics
-id: fytbmwjxpo78
-type: challenge
-title: Compatibility Matrix Basics
-teaser: Learn the basic commands for working with the Compatibility Matrix CLI.
-notes:
-- type: text
- contents: Let's explore the Compatibility Matrix
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-difficulty: basic
-timelimit: 600
----
-Introduction
-===============
-The Compatibility Matrix creates ephemeral lab-like environments which can be used for testing upgrades and deployments, troubleshooting customer issues, and exploring potential changes to systems. Because it is CLI-driven, it can be easily automated and integrated into existing (or planned) CI/CD processes without requiring a permanent lab environment. In this set of labs, we'll explore how to use the Replicated Compatibility Matrix and some of the ways in which it can be incorporated into existing pipelines. Let's dive in!
-
-Getting Started
-===
-In this exercise we will examine the different matrix commands and their uses as well as build and tear down a few environments. The goal of this exercise is to familiarize us with the basics of the compatibility matrix and get us comfortable working with it.
-
-First we'll learn how to create an environment using the Compatibility Matrix. Once we understand the basics of creating an environment, we can use that to automate building environments to meet our testing, troubleshooting, and deployment goals. Because the environments we'll be building are customizable to match our customers' specs, they can mimic the actual environments our customers are using, and because they're ephemeral, they won't require any maintenance.
-
-Let's start by looking at the new CLI commands that the `replicated` command offers:
-
-
-
-Using the replicated cluster commands
-===
-
-To see the list of available `replicated cluster` subcommands, run:
-
-``` replicated cluster --help ```
-
-The output provides a list of possible subcommands. The `--help` flag works here, too. Let's learn a little more about `replicated cluster create`:
-
-``` replicated cluster create --help ```
-
-The `create` subcommand takes flags to customize cluster creation, which allows us to tailor our clusters to match our cuatomer environments.
-
-One of the customizable options is the type of cluster. Let's go ahead and find out what versions we have access to:
-
-``` replicated cluster versions ```
-
-Now that we know what we can use and what a creation command looks like, let's build a cluster. We'll start with a simple k3s 1.24 cluster:
-
-``` replicated cluster create --distribution k3s --version 1.24 ```
-
-When the cluster is created, cluster information will be displayed. You can also see available clusters with the `ls` command:
-
-``` replicated cluster ls ```
-
-Watch this cluster build with `watch replicated cluster ls` as it goes through the build stages: assigned, preparing, provisioning, running. This is the simplest form of cluster we can build, but as `replicated cluster create --help` showed, there are a lot of options for customizing it to suit our needs.
-
-Let's create a more complex cluster. Our BigBank customer is running a standard setup, with 3 nodes in a kind cluster with the following specs, so to match that environment we will do the same.
-
-Specs:
-
-Version: kind 1.27.0
-Memory: 8GB
-vCPU: 8
-Nodes: 3
-
-This is an unusual config, so let's verify we've assembled the correct command before building. The`--dry-run` flag will allow us to verify that our specs are supported:
-
-``` replicated cluster create --distribution kind --version 1.27.0 --name bigbank-testing --memory 8 --vcpu 8 --node-count
- 3 --dry-run ```
-
-As we can see, the dry run was a success so we can go ahead and build this new testing cluster:
-
-``` replicated cluster create --distribution kind --version 1.27.0 --name bigbank-testing --memory 8 --vcpu 8 --node-count
- 3 ```
-
-As it builds, we can see both clusters are up and running/provisioning with another `replicated cluster ls`.
-
-We don't need the first cluster we created, since now we have a cluster that represents our customer accurately. Let's delete that cluster by using its ID:
-
-``` replicated cluster rm {{cluster-ID}} ```
-
-This cluster drops off our cluster list immediately, though in the background it is still cleaning up.
-
-Now we have one running cluster with the same configurations as Big Bank. Let's go ahead and install our app into that cluster so we can begin using it to do testing and troubleshooting.
-
-First, we need to connect to our cluster. If we were to run a `kubectl get namespaces` right now, we wouldn't be interacting with the testing cluster. The `kubeconfig` subcommand allows us to interact with the cluster directly:
-
-``` replicated cluster kubeconfig --name {{name}} ```
-
-Now, when we run `kubectl get namespaces` we can see a list of the current namespaces.
-
-Let's go ahead and get our app installed to this cluster. This uses the same kots installer as a regular installation:
-
-``` kubectl kots install {{app-slug}} ```
-
-Now a `kubeadm get namespaces` shows that our app has installed in the namespace we chose during installation.
-
-Congratulations! You've created your first few clusters using the Replicated compatibility matrix and installed an app to an ephemeral CM cluster! Next, let's look at how we can use a customer's support dump to troubleshoot their errors.
-
-To complete this track, click the **Check** button.
-
diff --git a/instruqt/validating-compatibility/01-basics/check-shell b/instruqt/validating-compatibility/01-basics/check-shell
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/validating-compatibility/01-basics/check-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/01-basics/cleanup-shell b/instruqt/validating-compatibility/01-basics/cleanup-shell
deleted file mode 100755
index a64c34234..000000000
--- a/instruqt/validating-compatibility/01-basics/cleanup-shell
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/validating-compatibility/01-basics/setup-shell b/instruqt/validating-compatibility/01-basics/setup-shell
deleted file mode 100755
index cd25f332c..000000000
--- a/instruqt/validating-compatibility/01-basics/setup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the setup script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/01-basics/solve-shell b/instruqt/validating-compatibility/01-basics/solve-shell
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/validating-compatibility/01-basics/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/02-troubleshooting/assignment.md b/instruqt/validating-compatibility/02-troubleshooting/assignment.md
deleted file mode 100755
index b552ee049..000000000
--- a/instruqt/validating-compatibility/02-troubleshooting/assignment.md
+++ /dev/null
@@ -1,63 +0,0 @@
----
-slug: troubleshooting
-id: a0cvc186bru1
-type: challenge
-title: Troubleshooting
-teaser: Using the compatibility-matrix for Troubleshooting
-notes:
-- type: text
- contents: contents go here
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-difficulty: basic
-timelimit: 600
----
-
-As we saw in the previous exercise, the CM can create a variety of environments. Now letās look at how we might use it to troubleshoot existing customer installations without connecting to the live/production/airgap installations our customer is running. In this case, we'll be looking at a voting app that our customer BigBank is having trouble with. They are having trouble with their voting app, which they need up and running before an important presentation next week where they will use the voting app to interact with the audience. In their testing, whenever more than a few people at a time access the app, it crashes.
-
-Because BigBank is strictly controlled, we aren't able to connect directly to their environment. The support dumps we've gotten so far aren't giving us any indications as to why they might be crashing. We also haven't been able to reproduce the issue on our testing environment. Let's see if we can use the Compatibility Matrix to figure something out.
-
-The lastest support bundle can be downloaded from the āBundleā tab at the top of this lab. Go ahead and download it now.
-
-Let's take a look at the support bundle and see what kind of a cluster we need to build. First, let's untar the bundle, and use `sbctl` to update our kubeconfig to use it:
-
-``` tar zxvf {{supportbundle-date.tgz}} ```
-``` sbctl shell -s . ```
-``` kubectl get nodes -n {{namespace}} ```
-``` kubectl describe node {{nodename}} | grep -A 3 Resource ```
-``` grep k8s {{bundle-dir}}/kots/admin_console/app-info.json ```
-
-With this set of information, we have all we need to mimic our customer's environment for examination. Let's go ahead and build that cluster now so we can take a look:
-
-``` replicated cluster create --memory 8 --vcpu 8 --distribution kind --version 1.27.0 --name big-bank-voting ```
-
-Now we have a cluster, `big-bank-voting`, that matches our customer's system. Let's set our context to use that system, then we can install our app and see what happens:
-
-``` replicated cluster kubeconfig --name big-bank-voting ```
-``` kubectl kots install {{app-slug}} ```
-
-During the installation to this cluster, we see that there are preflight failures. This system only has 8GB of memory, as we specified to match our customer's environment. However, preflights are showing that we will need considerably more:
-
-'
-Every node in the cluster must have at least 8 GB of memory, with 32 GB recommended
-
-All nodes must have at least 20 GB of memory.
-'
-
-After a little bit of testing we are able to duplicate the error. Using the CM again, we can try increasing memory to see if that resolves the issue:
-
-``` replicated cluster create --memory 32 --vcpu 8 --distribution kind --version 1.27.0 --name big-bank-voting-more-mem ```
-``` replicated cluster kubeconfig --name big-bank-voting-more-mem ```
-``` kube kods install {{app-slug}}}
-
-With additional testing, we are no longer able to reproduce the problem. In other words, BigBank is having trouble due to resource constraints with memory. We can recommend that they increase the memory on their cluster node(s) to 32GB and see if that fixes the issues they're seeing.
-
-Now that we've figured it out, we can clean up our testing clusters. They will disappear automatically in 8 hours, but since we're done with them we can clean up now.
-
-``` replicated cluster rm $ID $ID ```
-
-Now that we've gotten familiar with what CM can do, and also explored a little bit about using it for troubleshooting, let's get to the really good stuff: Using the compatibility matrix to do testing and integrate it into our existing CI/CD pipeline.
-
-To complete this track, click the **Check** button.
diff --git a/instruqt/validating-compatibility/02-troubleshooting/check-shell b/instruqt/validating-compatibility/02-troubleshooting/check-shell
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/validating-compatibility/02-troubleshooting/check-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/02-troubleshooting/cleanup-shell b/instruqt/validating-compatibility/02-troubleshooting/cleanup-shell
deleted file mode 100755
index a64c34234..000000000
--- a/instruqt/validating-compatibility/02-troubleshooting/cleanup-shell
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/validating-compatibility/02-troubleshooting/setup-shell b/instruqt/validating-compatibility/02-troubleshooting/setup-shell
deleted file mode 100755
index cd25f332c..000000000
--- a/instruqt/validating-compatibility/02-troubleshooting/setup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the setup script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/02-troubleshooting/solve-shell b/instruqt/validating-compatibility/02-troubleshooting/solve-shell
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/validating-compatibility/02-troubleshooting/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/03-testing/assignment.md b/instruqt/validating-compatibility/03-testing/assignment.md
deleted file mode 100755
index 9721d7ae1..000000000
--- a/instruqt/validating-compatibility/03-testing/assignment.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-slug: testing
-id: xbhxsyosfy8x
-type: challenge
-title: Testing
-teaser: A short description of the challenge.
-notes:
-- type: text
- contents: Replace this text with your own text
-tabs:
-- title: Shell
- type: terminal
- hostname: shell
-difficulty: basic
-timelimit: 600
----
-Now that weāve practiced some of the basics of working with the CM, letās look at how it can be used for testing application changes prior to releasing them. To start this next exercise, we will be using our environment from the first exercise to test a possible upgrade.
-
-1. Connect to GitHub
-2. Make a simple change to the git project
-3. Push it, and watch how CM picks up the change and spins up testing envs
-
-Weāve made a very simple change that works on all of our nodes. What happens if one of the nodes fails testing? Letās find out. In this exercise, weāre dropping support for OpenShift and deprecating EKS.
-
-1. Add a preflight requiring one not OpenShift
-2. Push to git
-3. See failure at incorrect OS
-4. See warning at EKS
-5. See success at GKE
-
diff --git a/instruqt/validating-compatibility/03-testing/check-shell b/instruqt/validating-compatibility/03-testing/check-shell
deleted file mode 100755
index 8f9df0d6e..000000000
--- a/instruqt/validating-compatibility/03-testing/check-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform check the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the check script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/03-testing/cleanup-shell b/instruqt/validating-compatibility/03-testing/cleanup-shell
deleted file mode 100755
index a64c34234..000000000
--- a/instruqt/validating-compatibility/03-testing/cleanup-shell
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# clear the tmux pane and scrollback to look like a fresh shell
-tmux clear-history -t shell
-tmux send-keys -t shell clear ENTER
-
-exit 0
diff --git a/instruqt/validating-compatibility/03-testing/setup-shell b/instruqt/validating-compatibility/03-testing/setup-shell
deleted file mode 100755
index cd25f332c..000000000
--- a/instruqt/validating-compatibility/03-testing/setup-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform setup the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the setup script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/03-testing/solve-shell b/instruqt/validating-compatibility/03-testing/solve-shell
deleted file mode 100755
index a182bdeed..000000000
--- a/instruqt/validating-compatibility/03-testing/solve-shell
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# This script runs when the platform solve the challenge.
-#
-# The platform determines if the script was successful using the exit code of this
-# script. If the exit code is not 0, the script fails.
-#
-
-echo "This is the solve script"
-
-exit 0
diff --git a/instruqt/validating-compatibility/config.yml b/instruqt/validating-compatibility/config.yml
deleted file mode 100644
index 8fac9483a..000000000
--- a/instruqt/validating-compatibility/config.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-version: "3"
-containers:
-- name: shell
- image: gcr.io/kots-field-labs/shell:instruqt-feature-tmux-template
- shell: tmux new-session -A -s shell su - replicant
-virtualmachines:
-- name: cluster
- image: instruqt/k3s-v1-27-1
- shell: /bin/bash
- machine_type: n1-standard-1
- allow_external_ingress:
- - http
- - https
- - high-ports
diff --git a/instruqt/validating-compatibility/track.yml b/instruqt/validating-compatibility/track.yml
deleted file mode 100755
index 818071e20..000000000
--- a/instruqt/validating-compatibility/track.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-slug: validating-compatibility
-id: riga8tcknxdy
-title: Validating Compatibility with Customer Environments
-teaser: |-
- A template track for sharing the shell environment across
- challenges
-description: |-
- This track is a template track to build any lab that requires
- maintaining the shell and it's environment between challenges.
-
- To use it, run:
-
- ```
- instruqt track create --title [NEW TRACK TITLE] \
- --from shared-env-template
- ```
-
- The track provides both a shell and a single-node cluster, and
- the learner runs their commands as the user `replicant`.
-
- Another advantage of this template is that you can check what
- the learner has typed into their shell by capturing the `tmux`
- pane content and running a grep against it, see the sample
- check script in the first challenge for an example.
-icon: https://storage.googleapis.com/instruqt-frontend/img/tracks/default.png
-tags:
-- builders-plan
-- helm
-- compatibility-matrix
-owner: replicated
-developers:
-- beck@replicated.com
-maintenance: true
-lab_config:
- overlay: false
- width: 33
- position: right
-checksum: "845871537639622139"
diff --git a/instruqt/validating-compatibility/track_scripts/setup-cluster b/instruqt/validating-compatibility/track_scripts/setup-cluster
deleted file mode 100755
index 799830416..000000000
--- a/instruqt/validating-compatibility/track_scripts/setup-cluster
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
- PubkeyAcceptedKeyTypes +ssh-rsa
-EOF
-
-while ! ssh shell true; do
- echo "Waiting for container SSH to be available..."
- sleep 1
-done
-
-# Wait for the Kubernetes API server to become available
-while ! curl --fail --output /dev/null http://localhost:8001/api
-do
- sleep 1
-done
-
-ssh shell "mkdir /home/replicant/.kube"
-
-while ! [[ -f /etc/rancher/k3s/k3s.yaml ]]; do
- echo "Waiting for Rancher kubernetes configuration to be available..."
- sleep 1
-done
-
-scp /etc/rancher/k3s/k3s.yaml shell:/home/replicant/.kube/config
diff --git a/instruqt/validating-compatibility/track_scripts/setup-shell b/instruqt/validating-compatibility/track_scripts/setup-shell
deleted file mode 100755
index 7c9c4b9dd..000000000
--- a/instruqt/validating-compatibility/track_scripts/setup-shell
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/env bash
-
-# This set line ensures that all failures will cause the script to error and exit
-set -euxo pipefail
-
-# simple SSH client setup so we can SSH to/from the shell
-
-cat <> "$HOME/.ssh/config"
-Host *
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
-EOF
-
-# assure an RSA key for Dropbear
-ssh-keygen -t rsa -f /etc/dropbear/dropbear_rsa_host_key -N ''
-
-# use our shared libary in setup scripts
-curl -s -o /etc/profile.d/header.sh https://raw.githubusercontent.com/replicatedhq/kots-field-labs/feature-information-gap/libs/header.sh
-source /etc/profile.d/header.sh
-
-# change the cluster URI
-yq -i '.clusters[0].cluster.server = "https://cluster:6443"' /home/replicant/.kube/config
-chown -R replicant /home/replicant/.kube
-
-## setup for Vendor Portal access
-
-# there's only one app created by the automation, so just grab the first in the list
-api_token=$(get_api_token)
-app_id=$(curl --header 'Accept: application/json' --header "Authorization: ${api_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].id')
-app_slug=$(curl --header 'Accept: application/json' --header "Authorization: ${api_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].slug')
-export REPLICATED_API_TOKEN=${api_token}
-export REPLICATED_APP=${app_slug}
-
-## release the application with the Replicated SDK
-cd /home/replicant
-mkdir release
-helm pull --version 16.6.8 oci://registry-1.docker.io/bitnamicharts/harbor --untar
-yq -i '.version = "16.7.0"' harbor/Chart.yaml
-yq -i '.dependencies += { "name": "replicated", "repository": "oci://registry.replicated.com/library", "version": "0.0.1-alpha.17"}' harbor/Chart.yaml
-
-# update dependencies
-helm dependency update harbor
-
-# re-package the chart
-helm package harbor --destination release
-
-## release and promote the app with the SDK added
-
-# release to the `Unstable` channel
-replicated release create --promote Unstable --yaml-dir /home/replicant/release --version 16.7.0 \
- --release-notes "Prepares for distribution with Replicated by incorporating the Replicated SDK" \
- --app ${app_slug} --token ${api_token}
-
-# get the sequence number for the release to promote
-release_sequence=$(curl --header "Accept: application/json" --header "Authorization: ${api_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].channels[] | select( .name == "Unstable" ) | .releaseSequence')
-
-# promote to the `Beta` channel
-replicated release promote ${release_sequence} Beta --version 16.7.0 \
- --release-notes "Prepares for distribution with Replicated by incorporating the Replicated SDK" \
- --app ${app_slug} --token ${api_token}
-
-# promote to the `Stable` channel
-replicated release promote ${release_sequence} Stable --version 16.7.0 \
- --release-notes "Prepares for distribution with Replicated by incorporating the Replicated SDK" \
- --app ${app_slug} --token ${api_token}
-
-# create LTS channel from the "distributing" lab so things look consistent
-replicated channel create --name LTS --description "Releases with long-term support available" \
- --app ${app_slug} --token ${api_token}
-
-# remove the helm chart we used to create the release
-rm /home/replicant/release/harbor-16.7.0.tgz
-
-## release the application with the Replicated SDK
-# add preflight checks to the Helm chart
-mkdir /home/replicant/harbor/templates/troubleshoot
-cat < /home/replicant/harbor/templates/troubleshoot/preflights.yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: {{ include "common.names.fullname" . }}-preflight
- namespace: {{ .Release.Namespace | quote }}
- labels: {{- include "common.labels.standard" . | nindent 4 }}
- {{- if .Values.commonLabels }}
- {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
- {{- end }}
- app.kubernetes.io/component: preflight
- troubleshoot.sh/kind: preflight
- {{- if .Values.commonAnnotations }}
- annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
- {{- end }}
-type: Opaque
-stringData:
- preflight.yaml: |
- apiVersion: troubleshoot.sh/v1beta2
- kind: Preflight
- metadata:
- name: harbor-preflight-checks
- spec:
- analyzers:
- - clusterVersion:
- outcomes:
- - fail:
- when: "< 1.19.x"
- message: |-
- Your Kubernets cluster is running a version of Kubernetes that is not supported by the Harbor container
- registry and your installation will not succeed. Please upgrade your cluster or install to a different
- cluster running at least Kubernetes 1.19, ideally version 1.24.0 or later.
- uri: https://github.com/bitnami/charts/blob/main/bitnami/harbor/README.md
- - warn:
- when: "< 1.24.0"
- message: |-
- Your Kubernetes cluster is running a version of Kubernetes that is not longer supported by the Kubernetes
- community. If you are receiving extended support from your Kubernetes provider you may be able to ignore
- this warning. If not, we recomend that you upgrade your cluster to at least version 1.24.0.
- uri: https://kubernetes.io
- - pass:
- message: Your cluster is running a version of Kubernetes that is supported by Slackernews.
- - nodeResources:
- checkName: Cluster CPU resources are sufficient to install and run Harbor
- outcomes:
- - fail:
- when: "sum(cpuAllocatable) < 2"
- message: |-
- Harbor requires a minimum of 2 CPU cores in order to run, and runs best with
- at least 4 cores. Your current cluster has less than 2 CPU cores available to Kubernetes
- workloads. Please increase cluster capacity or install into a different cluster.
- uri: https://goharbor.io/docs/2.8.0/install-config/installation-prereqs/
- - warn:
- when: "sum(cpuAllocatable) < 4"
- message: |-
- Harbor runs best with a minimum of 4 CPU cores. Your current cluster has less
- than 4 CPU cores available to run workloads. For the best experience, consider
- increasing cluster capacity or installing into a different cluster.
- uri: https://goharbor.io/docs/2.8.0/install-config/installation-prereqs/
- - pass:
- message: Your cluster has sufficient CPU resources available to run Harbor
- - nodeResources:
- checkName: Cluster memory is sufficient to install and run Harbor
- outcomes:
- - fail:
- when: "sum(memoryAllocatable) < 4G"
- message: |-
- Harbor requires a minimum of 4 GB of memory in order to run, and runs best with
- at least 8 GB. Your current cluster has less than 4 GB available to Kubernetes
- workloads. Please increase cluster capacity or install into a different cluster.
- uri: https://goharbor.io/docs/2.8.0/install-config/installation-prereqs/
- - warn:
- when: "sum(memoryAllocatable) < 8Gi"
- message: |-
- Harbor runs best with a minimum of 8 GB of memory. Your current cluster has less
- than 8 GB of memory available to run workloads. For the best experience, consider
- increasing cluster capacity or installing into a different cluster.
- uri: https://goharbor.io/docs/2.8.0/install-config/installation-prereqs/
- - pass:
- message: Your cluster has sufficient memory available to run Harbor
-HARBOR_PREFLIGHTS
-
-# bump the version
-yq -i '.version = "16.8.0"' /home/replicant/harbor/Chart.yaml
-helm package /home/replicant/harbor --destination /home/replicant/release
-chown -R replicant /home/replicant/harbor /home/replicant/release
-
-## release and promote the preflight checks added
-
-# release to the `Unstable` channel
-replicated release create --promote Unstable --yaml-dir /home/replicant/release --version 16.8.0 \
- --release-notes "Adds preflight checks to enable customers to validate cluster prerequisites before installing" \
- --app ${app_slug} --token ${api_token}
-
-# get the sequence number for the release to promote
-release_sequence=$(curl --header "Accept: application/json" --header "Authorization: ${api_token}" https://api.replicated.com/vendor/v3/apps | jq -r '.apps[0].channels[] | select( .name == "Unstable" ) | .releaseSequence')
-
-# promote to the `Beta` channel
-replicated release promote ${release_sequence} Beta --version 16.8.0 \
- --release-notes "Adds preflight checks to enable customers to validate cluster prerequisites before installing" \
- --app ${app_slug} --token ${api_token}
-
-# promote to the `Stable` channel
-replicated release promote ${release_sequence} Stable --version 16.8.0 \
- --release-notes "Adds preflight checks to enable customers to validate cluster prerequisites before installing" \
- --app ${app_slug} --token ${api_token}
-
-# remove the helm chart we used to create the release
-rm /home/replicant/release/harbor-16.8.0.tgz
-
-## create the customer from the preflights lab
-
-# provide an email address for the new customer
-customer_email="${INSTRUQT_PARTICIPANT_ID}@geeglo.io"
-
-# create the new customer and keep track of the ID
-customer_id=$(replicated customer create --name "Geeglo" --email ${customer_email} --channel Stable --expires-in 720h --output json --app ${app_slug} --token ${api_token} | jq -r .id)
-
-# make sure the customer has a trial license
-updated_customer=$(curl --header 'Accept: application/json' --header "Authorization: ${api_token}" "https://api.replicated.com/vendor/v3/app/${app_id}/customer/${customer_id}" | \
- jq -c --arg appId "${app_id}" '.customer | {"app_id": $appId, "name": .name, "email": .email, "channel_id": .channels[0].id, "expires_at": .expiresAt, "type": "trial", "is_airgap_enabled": .airgap, "is_gitops_supported": .isGitopsSupported, "is_identity_service_supported": .isIdentityServiceSupported, "is_geoaxis_supported": .isGeoaxisSupported, "is_snapshot_supported": .isSnapshotSupported, "is_support_bundle_upload_enabled": .isSupportBundleUploadEnabled, "entitlementValues":[]}')
-
-# make sure the user has a trial license
-
-# log into the registry as the new customer, use tmux so we do it as
-# the `replicant` user
-
-# get the registry password (which is the license id)
-registry_password=$(curl --header 'Accept: application/json' --header "Authorization: ${api_token}" "https://api.replicated.com/vendor/v3/app/${app_id}/customer/${customer_id}" | \
- yq .customer.installationId)
-
-## install the release so we have something to support
-
-# login to the registry
-helm registry login registry.replicated.com \
- --username ${customer_email} \
- --password ${registry_password}
-
-# install the application, trying again if it fails since there might be timing issues
-set +e
-retries=0
-while ! helm install harbor --version 16.8.0 \
- oci://registry.replicated.com/${app_slug}/harbor \
- --set service.type=NodePort --set service.nodePort.https=30443 \
- --set externalURL=https://cluster-30443-${INSTRUQT_PARTICIPANT_ID}.env.play.instruqt.com \
- --kubeconfig /home/replicant/.kube/config && [[ $retries -lt 10 ]]; do
- sleep 2
- let "retries = retries + 1"
-done
-
-# make sure permissions are good
-chown -R replicant /home/replicant/harbor /home/replicant/release
diff --git a/instruqt/validating-compatibility/vendor/vendor.json b/instruqt/validating-compatibility/vendor/vendor.json
deleted file mode 100644
index ba5f5ff9a..000000000
--- a/instruqt/validating-compatibility/vendor/vendor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "Harbor",
- "slug": "harbor",
- "customer": "Omozan",
- "yaml_dir": "",
- "k8s_installer_yaml_path": ""
-}