From b70d30fe8403725ac241b7ce4cf89933eb3c3de4 Mon Sep 17 00:00:00 2001 From: Graham Dumpleton Date: Tue, 13 Aug 2024 09:51:28 +1000 Subject: [PATCH] Initial files. --- .github/workflows/publish-workshops.yaml | 75 +++++++ README.md | 7 + resources/trainingportal.yaml | 0 workshops/lab-authoring-environment/README.md | 5 + .../resources/workshop.yaml | 199 ++++++++++++++++++ .../workshop/content/00-workshop-overview.md | 11 + .../workshop/content/01-kubernetes-cluster.md | 21 ++ .../content/02-packaging-mechanism.md | 30 +++ .../workshop/content/03-clickable-actions.md | 36 ++++ .../content/04-package-configuration.md | 87 ++++++++ .../content/05-package-installation.md | 32 +++ .../workshop/content/06-hosting-a-workshop.md | 36 ++++ .../content/07-accessing-workshops.md | 22 ++ .../content/08-starting-a-workshop.md | 28 +++ .../content/09-authoring-workshops.md | 22 ++ .../content/10-publishing-workshops.md | 54 +++++ .../content/11-deploy-the-workshop.md | 23 ++ .../content/12-updating-instructions.md | 41 ++++ .../workshop/content/13-manually-updating.md | 44 ++++ .../workshop/content/14-realtime-updates.md | 40 ++++ .../content/15-workshop-definition.md | 63 ++++++ .../workshop/content/99-workshop-summary.md | 14 ++ .../workshop/setup.d/setup-educates-cli.sh | 9 + .../static/images/training-portal-ui.png | Bin 0 -> 82201 bytes 24 files changed, 899 insertions(+) create mode 100644 .github/workflows/publish-workshops.yaml create mode 100644 README.md create mode 100644 resources/trainingportal.yaml create mode 100644 workshops/lab-authoring-environment/README.md create mode 100644 workshops/lab-authoring-environment/resources/workshop.yaml create mode 100644 workshops/lab-authoring-environment/workshop/content/00-workshop-overview.md create mode 100644 workshops/lab-authoring-environment/workshop/content/01-kubernetes-cluster.md create mode 100644 workshops/lab-authoring-environment/workshop/content/02-packaging-mechanism.md create mode 100644 workshops/lab-authoring-environment/workshop/content/03-clickable-actions.md create mode 100644 workshops/lab-authoring-environment/workshop/content/04-package-configuration.md create mode 100644 workshops/lab-authoring-environment/workshop/content/05-package-installation.md create mode 100644 workshops/lab-authoring-environment/workshop/content/06-hosting-a-workshop.md create mode 100644 workshops/lab-authoring-environment/workshop/content/07-accessing-workshops.md create mode 100644 workshops/lab-authoring-environment/workshop/content/08-starting-a-workshop.md create mode 100644 workshops/lab-authoring-environment/workshop/content/09-authoring-workshops.md create mode 100644 workshops/lab-authoring-environment/workshop/content/10-publishing-workshops.md create mode 100644 workshops/lab-authoring-environment/workshop/content/11-deploy-the-workshop.md create mode 100644 workshops/lab-authoring-environment/workshop/content/12-updating-instructions.md create mode 100644 workshops/lab-authoring-environment/workshop/content/13-manually-updating.md create mode 100644 workshops/lab-authoring-environment/workshop/content/14-realtime-updates.md create mode 100644 workshops/lab-authoring-environment/workshop/content/15-workshop-definition.md create mode 100644 workshops/lab-authoring-environment/workshop/content/99-workshop-summary.md create mode 100755 workshops/lab-authoring-environment/workshop/setup.d/setup-educates-cli.sh create mode 100644 workshops/lab-authoring-environment/workshop/static/images/training-portal-ui.png diff --git a/.github/workflows/publish-workshops.yaml b/.github/workflows/publish-workshops.yaml new file mode 100644 index 0000000..806e49b --- /dev/null +++ b/.github/workflows/publish-workshops.yaml @@ -0,0 +1,75 @@ +name: Publish Workshops + +on: + push: + tags: + - "[0-9]+.[0-9]+" + - "[0-9]+.[0-9]+-alpha.[0-9]+" + - "[0-9]+.[0-9]+-beta.[0-9]+" + - "[0-9]+.[0-9]+-rc.[0-9]+" + branches: + - main + - develop + workflow_dispatch: + +jobs: + publish-workshops: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install Carvel tools + shell: bash + run: curl -L https://carvel.dev/install.sh | bash + + - name: Install Educates CLI + shell: bash + run: | + imgpkg pull -i ghcr.io/vmware-tanzu-labs/educates-client-programs:2.7.2 -o /tmp/client-programs + mv /tmp/client-programs/educates-linux-amd64 /usr/local/bin/educates + + - name: Setup repository variables and release details + shell: bash + run: | + REPOSITORY_NAME=${{github.event.repository.name}} + echo "REPOSITORY_NAME=${REPOSITORY_NAME,,}" >>${GITHUB_ENV} + echo "REPOSITORY_OWNER=${GITHUB_REPOSITORY_OWNER,,}" >>${GITHUB_ENV} + echo "REPOSITORY_TAG=${GITHUB_REF##*/}" >>${GITHUB_ENV} + + - name: Publish workshops and create workshop definitions + shell: bash + run: | + for WORKSHOP_DIRECTORY in workshops/*; do + mkdir -p ${{runner.temp}}/${WORKSHOP_DIRECTORY}/resources + educates publish-workshop ${WORKSHOP_DIRECTORY} \ + --export-workshop ${{runner.temp}}/${WORKSHOP_DIRECTORY}/resources/workshop.yaml \ + --image-repository=ghcr.io/${REPOSITORY_OWNER} \ + --workshop-version=${REPOSITORY_TAG} \ + --registry-username=${{github.actor}} \ + --registry-password=${{secrets.GITHUB_TOKEN}} + done + + - name: Generate archives containing the workshop definitions + shell: bash + run: | + ytt -f ${{runner.temp}}/workshops > ${{runner.temp}}/workshops.yaml + (cd ${{runner.temp}}; tar cvfz workshops.tar.gz workshops) + (cd ${{runner.temp}}; zip workshops.zip -r workshops) + + - name: Create the GitHub release for the workshops + id: create_release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + with: + tag_name: ${{env.REPOSITORY_TAG}} + name: ${{env.REPOSITORY_NAME}}:${{env.REPOSITORY_TAG}} + draft: false + prerelease: false + files: | + ${{runner.temp}}/workshops.tar.gz + ${{runner.temp}}/workshops.zip + ${{runner.temp}}/workshops.yaml + resources/trainingportal.yaml diff --git a/README.md b/README.md new file mode 100644 index 0000000..2e2ac0c --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +Authoring Guides +================ + +This repository contains a set of workshops for learning about how to create +workshops for Educates. The workshops are: + +* [Getting Started](workshops/lab-authoring-environment) - Workshop on getting started with workshop authoring. diff --git a/resources/trainingportal.yaml b/resources/trainingportal.yaml new file mode 100644 index 0000000..e69de29 diff --git a/workshops/lab-authoring-environment/README.md b/workshops/lab-authoring-environment/README.md new file mode 100644 index 0000000..3bd963e --- /dev/null +++ b/workshops/lab-authoring-environment/README.md @@ -0,0 +1,5 @@ +# Authoring Environment + +This Educates workshop will teach you about how to install Educates to create +your own authoring environment, use it to host workshops, and how to create your +first workshop. diff --git a/workshops/lab-authoring-environment/resources/workshop.yaml b/workshops/lab-authoring-environment/resources/workshop.yaml new file mode 100644 index 0000000..07b405f --- /dev/null +++ b/workshops/lab-authoring-environment/resources/workshop.yaml @@ -0,0 +1,199 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: "lab-authoring-environment" +spec: + title: "Authoring Environment" + description: "A workshop on getting started with workshop authoring." + publish: + image: "$(image_repository)/labs-authoring-guides/lab-authoring-environment-files:$(workshop_version)" + workshop: + files: + - image: + url: "$(image_repository)/labs-authoring-guides/lab-authoring-environment-files:$(workshop_version)" + includePaths: + - /workshop/** + - /exercises/** + - /README.md + packages: + - name: educates + files: + - image: + url: $(oci_image_cache)/educates-client-programs:3.0.0-alpha.12 + path: bin + includePaths: + - educates-linux-$(platform_arch) + session: + namespaces: + budget: x-large + security: + policy: baseline + token: + enabled: false + applications: + terminal: + enabled: true + layout: split + editor: + enabled: true + console: + enabled: false + docker: + enabled: true + socket: + enabled: false + compose: + services: + registry: + image: registry:2.8.3 + ports: + - "0.0.0.0:5001:5000" + registry: + enabled: false + vcluster: + enabled: false + volumes: + - name: admin-credentials-config + secret: + secretName: $(session_name)-kubeconfig + volumeMounts: + - name: admin-credentials-config + mountPath: /opt/kubeconfig + dashboards: + - name: Docs + url: https://docs.educates.dev/ + objects: + - apiVersion: v1 + kind: Secret + metadata: + name: $(session_name)-admin-vcluster-values + namespace: $(workshop_namespace) + stringData: + values.yaml: | + vcluster: + image: rancher/k3s:v1.25.3-k3s1 + syncer: + extraArgs: + - --tls-san=admin-vcluster.$(session_namespace).svc.$(cluster_domain) + - --out-kube-config-server=https://admin-vcluster.$(session_namespace).svc.$(cluster_domain) + mapServices: + fromHost: + - from: $(workshop_namespace)/registry-$(session_name) + to: default/registry + - from: $(workshop_namespace)/localhost-$(session_name) + to: default/loopback + sync: + ingresses: + enabled: true + - apiVersion: kappctrl.k14s.io/v1alpha1 + kind: App + metadata: + name: $(session_name)-admin-vcluster-package + namespace: $(workshop_namespace) + spec: + serviceAccountName: kapp-installer + syncPeriod: 720h + noopDelete: true + fetch: + - helmChart: + name: vcluster + repository: + url: https://charts.loft.sh + template: + - helmTemplate: + name: admin-vcluster + namespace: $(session_namespace) + valuesFrom: + - secretRef: + name: $(session_name)-admin-vcluster-values + - ytt: + inline: + paths: + overlays.yaml: | + #@ load("@ytt:data", "data") + #@ load("@ytt:overlay", "overlay") + #@overlay/match by=overlay.all, expects="1+" + --- + metadata: + #@overlay/match missing_ok=True + ownerReferences: + - apiVersion: training.educates.dev/v1beta1 + kind: WorkshopSession + blockOwnerDeletion: true + controller: true + name: $(session_name) + uid: $(workshop_session_uid) + deploy: + - kapp: + rawOptions: + - --app-changes-max-to-keep=5 + - apiVersion: secrets.educates.dev/v1beta1 + kind: SecretCopier + metadata: + name: $(session_name)-kubeconfig + spec: + rules: + - sourceSecret: + name: vc-admin-vcluster + namespace: $(session_namespace) + targetNamespaces: + nameSelector: + matchNames: + - $(workshop_namespace) + targetSecret: + name: $(session_name)-kubeconfig + - apiVersion: v1 + kind: Service + metadata: + name: registry-$(session_name) + namespace: $(workshop_namespace) + spec: + type: ClusterIP + selector: + deployment: $(session_name) + ports: + - name: registry + port: 80 + protocol: TCP + targetPort: 5001 + - apiVersion: v1 + kind: Service + metadata: + name: localhost-$(session_name) + namespace: $(workshop_namespace) + spec: + type: ClusterIP + selector: + deployment: $(session_name) + ports: + - name: renderer + port: 10081 + protocol: TCP + targetPort: 10081 + environment: + images: + registries: + - content: + - destination: /educates-client-programs + prefix: /vmware-tanzu-labs/educates-client-programs + stripPrefix: true + onDemand: true + urls: + - https://ghcr.io + objects: + - apiVersion: v1 + kind: ServiceAccount + metadata: + name: kapp-installer + - apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + name: kapp-installer-$(workshop_namespace) + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin + subjects: + - kind: ServiceAccount + name: kapp-installer + namespace: $(workshop_namespace) diff --git a/workshops/lab-authoring-environment/workshop/content/00-workshop-overview.md b/workshops/lab-authoring-environment/workshop/content/00-workshop-overview.md new file mode 100644 index 0000000..93f52f8 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/00-workshop-overview.md @@ -0,0 +1,11 @@ +--- +title: Workshop Overview +--- + +Educates is a system for hosting interactive workshop environments in +Kubernetes, or a local docker environment. It can be used for self paced or +supervised workshops. It can also be useful where you need to package up demos +of applications hosted in Kubernetes. + +In this workshop you will learn the basics of how to install Educates, host +workshops with Educates, and create your own workshops. diff --git a/workshops/lab-authoring-environment/workshop/content/01-kubernetes-cluster.md b/workshops/lab-authoring-environment/workshop/content/01-kubernetes-cluster.md new file mode 100644 index 0000000..439b266 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/01-kubernetes-cluster.md @@ -0,0 +1,21 @@ +--- +title: Kubernetes Cluster +--- + +The full Educates training platform requires a Kubernetes cluster in which to +run. It is possible to deploy single workshop instances in a local docker +container runtime, however in this workshop we will only be covering deploying +to Kubernetes. + +Any Kubernetes cluster should be able to be used to deploy Educates. This +includes being able to use a local Kind cluster running on your own computer, a +hosted Kubernetes cluster such as EKS (AWS), GKE (GCP) or AKS (Azure), or a +Kubernetes cluster you have installed yourself to an IaaS or your own compute +hardware. + +In this workshop we will be deploying to a Kubernetes virtual cluster created +for you for this workshop session. This virtual cluster is running inside of the +larger Kubernetes cluster that the Educates instance hosting this workshop, is +running. + +In other words, we are using Educates itself to teach you about Educates. diff --git a/workshops/lab-authoring-environment/workshop/content/02-packaging-mechanism.md b/workshops/lab-authoring-environment/workshop/content/02-packaging-mechanism.md new file mode 100644 index 0000000..7a01cac --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/02-packaging-mechanism.md @@ -0,0 +1,30 @@ +--- +title: Packaging Mechanism +--- + +Numerous packaging and installation mechanisms exist for applications to be +deployed to a Kubernetes cluster. Probably the most well known is Helm +templates. For Educates, we use an alternative packaging and installation +mechanism utilizing the [Carvel](https://carvel.dev/) tool set. + +The Carvel tool set consists of a number of different tools which perform tasks +such as vendoring (`vendir`), YAML templating (`ytt`), container image +resolution and pinning (`kbld`), and Kubernetes application deployment (`kapp`). + +Used together these tools provide a very powerful and flexible system for +distributing and installing packages for Kubernetes. + +To install Educates you can use the Carvel command line tools from your +computer, or using Carvel's in cluster `kapp-controller` operator. + +To make it much easier to install Educates to your local computer, but also in a +hosted Kubernetes cluster, Educates provides it's own CLI which bundles up the +functionality of the Carvel tools so you do not need to install them on your +computer to install Educates. + +In the case of installing Educates to your local computer, the CLI is even able +to create a local Kubernetes cluster for you using Kind into which Educates is +then installed. + +In this workshop we will use the CLI to install Educates into the Kubernetes +virtual cluster allocated to your workshop session. diff --git a/workshops/lab-authoring-environment/workshop/content/03-clickable-actions.md b/workshops/lab-authoring-environment/workshop/content/03-clickable-actions.md new file mode 100644 index 0000000..acbc954 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/03-clickable-actions.md @@ -0,0 +1,36 @@ +--- +title: Clickable Actions +--- + +The name of the CLI for Educates is as one might expect, called `educates`. +Running the CLI with no arguments will yield help on the major top level +commands and command groups. Run the command in the terminal of the workshop +session. + +```terminal:execute +command: educates +``` + +If this is your first experience with Educates you may have typed in the command +manually, this however is not necessary and demonstrates the first bit of magic +that Educates provides to make your workshops simpler for your users to work +though. + +The highlighed section showing the command to be executed is what in Educates we +call a clickable action block. In this case of a command we want you to execute +in the terminal, rather than typing it yourself, you can click on it and it will +be run for your automatically in the appropriate terminal. + +Clickable actions like this in workshop instructions for a training system are +not unique to Educates, however other similar systems only apply them to the +execution of terminal commands or copying text from the instructions. In +Educates we use them for a much broader range of tasks, some of which you will +get to see in this workshop. So whenever you see a clickable action block, +rather than try and work out yourself how you should perform the required task, +just click on it. + +Note that for clickable actions for such things as commands, if you wanted to +copy the command shown rather than execute it, hold down the shift key while +clicking on it and the text shown will be copied to your system paste buffer +rather than executing the command. You can then paste it to the terminal or +into another application if you want to capture the text for later. diff --git a/workshops/lab-authoring-environment/workshop/content/04-package-configuration.md b/workshops/lab-authoring-environment/workshop/content/04-package-configuration.md new file mode 100644 index 0000000..02698ed --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/04-package-configuration.md @@ -0,0 +1,87 @@ +--- +title: Package Configuration +--- + +If you were wishing to install Educates from your own local computer and you did +not already have a Kubernetes cluster available, you could use the `educates +create-cluster` command to create a local Kubernetes cluster using Kind +(Kubernetes in docker). This requires you have the docker runtime installed and +configured appropriately. For this workshop session we will install into the +Kubernetes virtual cluster which as already mentioned has been created for you +for this workshop session. + +To install into an existing Kubernetes cluster the CLI command which needs to be +used is `educates admin cluster install`. Before running this command an +appropriate configuration file needs to be created. + +For installation of Educates into the virtual cluster created for this workshop +session we will use the following configuration. Clicking on the action block +this time should automatically open the editor and create the file for you. + +```editor:append-lines-to-file +file: ~/config.yaml +text: | + # Specify the infrastructure provider hosting the Kubernetes cluster. + + clusterInfrastructure: + provider: vcluster + + # Specify the ingress domain to be used to access the workshops hosted by + # the Educates installation. + + clusterIngress: + domain: {{< param session_name >}}.{{< param ingress_domain >}} + + # Disable the cluster and security policy engines, and skip installing + # Kyverno, as policies are enforced by the Educates installation running + # this workshop session. + + clusterPackages: + kyverno: + enabled: false + + clusterSecurity: + policyEngine: none + + workshopSecurity: + rulesEngine: none +``` + +The two key bits of information that we are supplying here are the type of +infrastructure provider and what domain name should be used to access workshops +hosted by the cluster after Educates has been installed. + +To make it easier to install Educates into a freshly created Kubernetes cluster +a number of opinionated configurations are provided for different infrastructure +providers, such as EKS (AWS), GKE (GCP) and AKS (Azure). In this case we have +set the provider as `vcluster` corresponding to what would be expected for a +virtual cluster created using the +[vCluster](https://github.com/loft-sh/vcluster) package from [Loft +Labs](https://loft.sh/). + +In the case of the opinionated virtual cluster configuration, it makes for +example the assumption that the virtual cluster was preconfigured to delegate +ingress handling to the underlying Kubernetes cluster, and thus the virtual +cluster doesn't itself require an ingress controller to be installed. In the +case of the opinionated configuration for major IaaS providers, they might +instead automatically install and configure the ingress controller as well, and +if appropriate credentials are provided, the DNS provider for that IaaS could +also be automatically configured to point at the ingress router for the cluster +which is installed. + +The aim of the opinionated cluster configurations is thus to take a fresh +Kubernetes cluster and install everything you need to run Educates, as well as +Educates itself. + +For this workshop session running in Educates, we set the ingress domain for +our Educates installation to correspond to the ingress domain allocated for +this workshop session. + +Other configuration we have included above isn't strictly necessary and +everything will work without supplying it, but since we are using Educates to +demonstrate installation of Educates, we don't need to enable the cluster and +workshop security policy engine, nor install Kyverno which is normally used to +implement such policies, as the underlying Educates installation this workshop +session is running in is already enforcing security policies for everything we +are doing. Disabling this will speed up our installation a bit, but for a real +Educates installation you should keep the security policy engines enabled. diff --git a/workshops/lab-authoring-environment/workshop/content/05-package-installation.md b/workshops/lab-authoring-environment/workshop/content/05-package-installation.md new file mode 100644 index 0000000..3d671b0 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/05-package-installation.md @@ -0,0 +1,32 @@ +--- +title: Package Installation +--- + +With the configuration created we are ready to perform the installation by +running the CLI command: + +```terminal:execute +command: educates admin platform deploy --config config.yaml +``` + +Using the Carvel tools linked into the `educates` CLI binary, this will download +the Educates package files (using `vendir`), customize the package YAML files +using our configuration (using `ytt`), resolve the container images used and pin +the versions (using `kbld`), and finally deploy everything to Kubernetes (using +`kapp`). + +During the deployment phase you should see the log output as the various +different types of Kubernetes resources are created and everything is verified +as having been deployed successfully. + +If all went well, the CLI should respond with: + +``` +Educates has been installed succesfully +``` + +Note that this worked because we had effective admin access to the Kubernetes +cluster we were deploying to. If you only have restricted access to the +Kubernetes cluster you are using this would not have worked. This is because +Educates creates new custom resource types in the cluster, and installs a number +of operators to manage those custom resources. diff --git a/workshops/lab-authoring-environment/workshop/content/06-hosting-a-workshop.md b/workshops/lab-authoring-environment/workshop/content/06-hosting-a-workshop.md new file mode 100644 index 0000000..621f40b --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/06-hosting-a-workshop.md @@ -0,0 +1,36 @@ +--- +title: Hosting a Workshop +--- + +We are now ready to deploy our first workshop. + +For this we will use a previously published workshop by running the command: + +```terminal:execute +command: educates deploy-workshop -f https://github.com/educates/lab-k8s-fundamentals/releases/latest/download/workshop.yaml +``` + +We will dig into what is happening under the covers later in the workshop, but +the effect of this command is to load the definition of the workshop into the +Kubernetes cluster, with the workshop then being made available through the +Educates training portal service. + +To access the training portal service and browse the workshops hosted by it, +run the command: + +```terminal:execute +command: educates browse-workshops +``` + +When the training portal service is ready, this should automatically open a new +web browser window. If you find that your web browser blocks opening of the new +window, then you can instead click on the link display in the terminal. Again +depending on the browser, clicking on the action block a second time after a few +seconds may also work to open a new window with the workshop. If you still have +issues, you can cut and paste the URL displayed in the terminal into a new +browser window yourself. + +This is only an issue when trying to run Educates inside of Educates as we are +with this workshop. The underlying reason and a solution in this specific case +is still being investigated. If using these commands from your own local +computer with a separate Kubernetes cluster there should be no issue. diff --git a/workshops/lab-authoring-environment/workshop/content/07-accessing-workshops.md b/workshops/lab-authoring-environment/workshop/content/07-accessing-workshops.md new file mode 100644 index 0000000..26f10e5 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/07-accessing-workshops.md @@ -0,0 +1,22 @@ +--- +title: Accessing Workshops +--- + +The training portal service in Educates provides a gateway for accessing one or +more workshops deployed to the Kubernetes cluster. If required, you can have +more than one training portal service, with each providing access to a different +set of workshops. + +{{< figure src="../images/training-portal-ui.png" >}} + +The training portal service can be configured to require simple authentication +or access can be anonymous. The user interface provided by the training portal +is designed to be basic and was originally intended to provide a quick way to +provide access to a set of workshops for ad-hoc training, or use in conference +booths for workshops or demos. + +If you need a more rich user interface the training portal can be used in a +headless mode, with access to creation of workshops being performed via a REST +API. In this way you can integrate hosting of workshops into your own custom +front end portal or even an existing web site, with user access controlled by +your own SSO system. diff --git a/workshops/lab-authoring-environment/workshop/content/08-starting-a-workshop.md b/workshops/lab-authoring-environment/workshop/content/08-starting-a-workshop.md new file mode 100644 index 0000000..e43cc0a --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/08-starting-a-workshop.md @@ -0,0 +1,28 @@ +--- +title: Starting a Workshop +--- + +From the training portal start up an instance of the workshop displayed. + +In this configuration the workshop session will be created on demand, however +the training portal can be configured to pre-create a pool of reserved workshop +sessions ready for immediate allocation to users when requested. + +Overall, even without reserved sessions, unless specific workshops have time +consuming setup steps, starting up a workshop session should be relatively quick +as only a container within the Kubernetes cluster needs to be created, in +comparison to a full virtual machine as is typical with other training systems. + +Since the purpose of this workshop is to learn about using Educates and not to +actually complete the workshop you deployed in this exercise, you can exit the +workshop by selecting "Terminate Session" from the drop down menu top right of +the workshop session dashboard of the separate web browser window which was +created. Don't terminate the workshop session here in this dashboard though as +otherwise you will need to start over. + +So that we have sufficient resources to complete later steps of this workshop, +also delete the workshop you just deployed by running: + +```terminal:execute +command: educates delete-workshop -f https://github.com/educates/lab-k8s-fundamentals/releases/latest/download/workshop.yaml +``` diff --git a/workshops/lab-authoring-environment/workshop/content/09-authoring-workshops.md b/workshops/lab-authoring-environment/workshop/content/09-authoring-workshops.md new file mode 100644 index 0000000..b102ac8 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/09-authoring-workshops.md @@ -0,0 +1,22 @@ +--- +title: Authoring Workshops +--- + +You can use Educates to deploy workshops published by others, but to get the +most from Educates you are more likely going to want to create your own +workshops. You could also use it to create a simple mechanism to deploy +application demos or test environments. + +To create the skeleton for a new workshop using the CLI, run the command: + +```terminal:execute +command: educates new-workshop lab-demo-workshop --title "Demo Workshop" --description "Workshop to demo use of Educates." +``` + +To view the set of files created run: + +```terminal:execute +command: tree lab-demo-workshop +``` + +Before we change any files let's deploy the workshop. diff --git a/workshops/lab-authoring-environment/workshop/content/10-publishing-workshops.md b/workshops/lab-authoring-environment/workshop/content/10-publishing-workshops.md new file mode 100644 index 0000000..874c6a1 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/10-publishing-workshops.md @@ -0,0 +1,54 @@ +--- +title: Publishing Workshops +--- + +To deploy the workshop we first need to publish it to a place where Educates +will be able to download the workshop files at runtime. + +Educates supports different mechanisms for hosting of the workshop files, +including: + +* Hosting workshop files as an OCI image on an image registry. +* Hosting workshop files as a tar/zip archive on a web server. +* Hosting workshop files on a hosted Git repository (eg., GitHub). + +In other words, unlike many other SaaS based training platforms, you are not +required to edit your workshop content in the platforms web interface. Instead, +you can work on your workshop content locally and host your workshop files +separately, with Educates downloading the workshop files when required. + +Of the mechanisms listed above, the recommended method is to publish workshop +files as an OCI image to an image registry. The standard workflow for authoring +workshops using the CLI and a local Educates cluster is tailored to using this +mechanism. + +To publish our workshop, first change to the directory containing the workshop +files: + +```terminal:execute +command: cd ~/lab-demo-workshop +``` + +and run the following command to publish the workshop files. + +```terminal:execute +command: educates publish-workshop +``` + +What is being done here is that the workshop files from the current directory +are being bundled up into an OCI image and pushed to a local image registry +hosted at `localhost:5001`. This image registry was automatically created for +you as part of this workshop session. If you used the CLI to create a local +Kubernetes cluster running Educates, a local image registry would similarly be +automatically deployed for you and integrated with the cluster. The process here +in this workshop session thus mimics what you can expect if using the Educates +CLI from your own computer using a local Kubernetes cluster. + +If not using a local Kubernetes cluster and you were instead using a hosted +Kubernetes cluster, instead of using a local image registry you would need to +specify a separate image registry to use which is visible to the hosted +Kubernetes cluster. + +If using GitHub to host workshops, you could use GitHub container registry, and +to make that process simpler Educates provides a pre-packaged GitHub action +which can be used to automate publishing of workshops. diff --git a/workshops/lab-authoring-environment/workshop/content/11-deploy-the-workshop.md b/workshops/lab-authoring-environment/workshop/content/11-deploy-the-workshop.md new file mode 100644 index 0000000..1026dba --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/11-deploy-the-workshop.md @@ -0,0 +1,23 @@ +--- +title: Deploy the Workshop +--- + +To deploy the workshop from the current directory we now need to run: + +```terminal:execute +command: educates deploy-workshop +``` + +This is similar to how we deployed a previously published workshop except that +since we are running it out of the directory for the workshop it will use the +version of the workshop we just published to the local image registry. + +Hop back over to the web browser window where the training portal was running +and refresh the page, or once again run: + +```terminal:execute +command: educates browse-workshops +``` + +Start the workshop for the newly created demo workshop to verify it is working +and to view the default workshop instructions. diff --git a/workshops/lab-authoring-environment/workshop/content/12-updating-instructions.md b/workshops/lab-authoring-environment/workshop/content/12-updating-instructions.md new file mode 100644 index 0000000..e0ad071 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/12-updating-instructions.md @@ -0,0 +1,41 @@ +--- +title: Updating Instructions +--- + +To update the workshop instructions open up the editor on the workshop overview +page found in the `workshop/content` directory. + +```editor:open-file +file: ~/lab-demo-workshop/workshop/content/00-workshop-overview.md +``` + +Select the paragraph describing the workshop: + +```editor:select-matching-text +file: ~/lab-demo-workshop/workshop/content/00-workshop-overview.md +text: "^This is .*$" +isRegex: true +``` + +and replace it with a better description of this workshop. + +```editor:replace-text-selection +file: ~/lab-demo-workshop/workshop/content/00-workshop-overview.md +text: | + This demo workshop is intended to demonstrate how awesome Educates is. +``` + +After having made the change re-publish the workshop files so that they will be +picked up for any freshly created workshop sessions. + +```terminal:execute +command: educates publish-workshop +``` + +In the separate web browser window where the demo workshop is running, terminate +the workshop session and create a new workshop session from the training portal. +You should now see the modifications you made. + +Note that obviously we used the embedded editor provided by the workshop session +to update the workshop files. When working from your own local computer you can +use whatever editor you would normally use. diff --git a/workshops/lab-authoring-environment/workshop/content/13-manually-updating.md b/workshops/lab-authoring-environment/workshop/content/13-manually-updating.md new file mode 100644 index 0000000..d0d13c5 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/13-manually-updating.md @@ -0,0 +1,44 @@ +--- +title: Manually Updating +--- + +As demonstrated, the basic lifecyle for updating workshop content is to make any +modifications, publish the workshop files as an OCI image to an image registry, +and then create a new workshop session to see any changes. + +When making lots of small changes it is possible to short circuit this process +and use one of two mechanisms for making updates in a running workshop session. + +The first of these still entails re-publishing the workshop files, but we can +avoid the need to create a new workshop session by manually pulling down the +changes into the current live workshop session. This is done by running the +`update-workshop` command inside of the workshop container. + +Make another change to the workshop overview page of the demo workshop. + +```editor:append-lines-to-file +file: ~/lab-demo-workshop/workshop/content/00-workshop-overview.md +text: | + Once you have finished the workshop, I am sure you will agree. +``` + +Publish the workshop files: + +```terminal:execute +command: educates publish-workshop +``` + +Now jump back to demo workshop in the other web browser window and in the +terminal run: + +```workshop:copy +text: update-workshop +``` + +Reload the workshop instructions pane on the left hand side by holding down the +shift key at the same time as clicking on the reload icon to the right hand side +of the countdown clock in the workshop dashboard. Alternatively right click on +the workshop instructions pane and use the browser menu option to reload the +frame. + +Once the workshop instructions have been reloaded, you should see the changes. diff --git a/workshops/lab-authoring-environment/workshop/content/14-realtime-updates.md b/workshops/lab-authoring-environment/workshop/content/14-realtime-updates.md new file mode 100644 index 0000000..da9bf4c --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/14-realtime-updates.md @@ -0,0 +1,40 @@ +--- +title: Realtime Updates +--- + +The second option for updating workshop content within the running workshop +session involves a bit more magic. + +To demonstrate this mechanism run the command: + +```terminal:execute +command: educates serve-workshop --patch-workshop +``` + +Exit the running instance of the demo workshop you have running in your other +web browser window and start a new workshop session. Confirm you can see the +same workshop instructions you had previously. + +Make some more changes to the workshop instructions. + +```editor:append-lines-to-file +file: ~/lab-demo-workshop/workshop/content/00-workshop-overview.md +text: | + Especially when you see the live update feature in action. +``` + +This time we will not re-publish the workshop content. Instead, immediately swap +back to the other web browser window running the demo workshop. You should see +that it has already been updated with the changes. + +The manner by which this works was that the existing deployed workshop was +patched on the fly to get the workshop instructions from the local process +created when you ran the `educates serve-workshop` command. + +More specifically, since the rendering of workshop instructions is done using +the [Hugo](https://gohugo.io/) static site renderer, we ran the Hugo live +renderer, with the workshop session dashboard displaying the live view from the +local Hugo process. When changes are made to the local workshop files, Hugo will +automatically detect this and the view displayed in the workshop session +dashboard would be updated. You are thus able to quickly make changes without +needing to re-publish the workshop, or create a new workshop session. diff --git a/workshops/lab-authoring-environment/workshop/content/15-workshop-definition.md b/workshops/lab-authoring-environment/workshop/content/15-workshop-definition.md new file mode 100644 index 0000000..f9781f7 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/15-workshop-definition.md @@ -0,0 +1,63 @@ +--- +title: Workshop Definition +--- + +The publishing lifecycle as described pertains to the workshop files used for +workshop instructions as well as any other files, scripts or applications used +within the workshop session. These will be downloaded for each distinct workshop +session. + +When the workshop was deployed using the `educates deploy-workshop` command, the +configuration of the workshop environment was dictated by the workshop +definition. This is a Kubernetes resource which describes where the workshop +files can be found, as well as what capabilities are required for a workshop. + +When using the standard workshop directory structure, the workshop definition +can be found in the `resources/workshop.yaml` file. + +```editor:open-file +file: ~/lab-demo-workshop/resources/workshop.yaml +``` + +Actual deployment of a workshop environment based on the workshop definition +only occurs when the workshop is registered with a training portal. + +When publishing a workshop, no update is made to the workshop definition +of any workshop environment that has already been created. + +When a training portal is configured to monitor for changes to the workshop +definition, updating the workshop definition will trigger the creation of a new +workshop environment based on the new workshop definition and the old workshop +environment will be shutdown, being deleted when all active workshop sessions +against it have completed. Any new requests for the workshop will be directed +towards the new workshop environment. + +This is done by first making the required changes to the workshop definition: + +```editor:select-matching-text +file: ~/lab-demo-workshop/resources/workshop.yaml +text: 'description: "(.*)"' +isRegex: true +group: 1 +``` + +```editor:replace-text-selection +file: ~/lab-demo-workshop/resources/workshop.yaml +text: "An awesome workshop to demo use of Educates." +``` + +Because you have a live preview running for the existing version of the +workshop, you will need to exit it. + +```terminal:interrupt +``` + +Next update the workshop definition in the cluster using the command: + +```terminal:execute +command: educates update-workshop +``` + +In your other web browser window terminate the running instance of the workshop +session for the demo workshop. Upon returning to the training portal you should +see that the description of the workshop has now changed. diff --git a/workshops/lab-authoring-environment/workshop/content/99-workshop-summary.md b/workshops/lab-authoring-environment/workshop/content/99-workshop-summary.md new file mode 100644 index 0000000..bc13733 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/content/99-workshop-summary.md @@ -0,0 +1,14 @@ +--- +title: Workshop Summary +--- + +You have reached the end of this workshop. For more information about Educates +see: + +* [Educates Documentation](https://docs.educates.dev) +* [Educates GitHub Repository](https://github.com/vmware-tanzu-labs/educates-training-platform) + +If you have questions about Educates or need help installing or using it, you +can reach out to the developers of Educates and other Educates users in the +`#educates` Slack channel hosted under the [Kubernetes Slack +Community](https://kubernetes.slack.com/). diff --git a/workshops/lab-authoring-environment/workshop/setup.d/setup-educates-cli.sh b/workshops/lab-authoring-environment/workshop/setup.d/setup-educates-cli.sh new file mode 100755 index 0000000..86cb922 --- /dev/null +++ b/workshops/lab-authoring-environment/workshop/setup.d/setup-educates-cli.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +mkdir -p $HOME/bin + +ln -s /opt/packages/educates/bin/educates-linux-$PLATFORM_ARCH $HOME/bin/educates + +if [[ ! -f $HOME/.bash_profile || ! $(grep -q "__start_educates" $HOME/.bash_profile) ]]; then + /opt/packages/educates/bin/educates-linux-$PLATFORM_ARCH completion bash >> $HOME/.bash_profile +fi diff --git a/workshops/lab-authoring-environment/workshop/static/images/training-portal-ui.png b/workshops/lab-authoring-environment/workshop/static/images/training-portal-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfbc569c7e65fbcab4b39655a95d9726f3cc74c GIT binary patch literal 82201 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 j1W$e*p`#3l6lgj&i@2-^=84qYoM>dL4mAFVef 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