diff --git a/public/assets/workshops/lab-conda-environment.yaml b/public/assets/workshops/lab-conda-environment.yaml new file mode 100644 index 0000000..d0f6eda --- /dev/null +++ b/public/assets/workshops/lab-conda-environment.yaml @@ -0,0 +1,42 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-conda-environment +spec: + description: Overview of working on Python applications. + duration: 30m + session: + applications: + editor: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + dashboards: + - name: JupyterLab + url: $(ingress_protocol)://$(session_namespace)-jupyterlab.$(ingress_domain)/ + env: + - name: ENABLE_JUPYTERLAB + value: "true" + ingresses: + - name: jupyterlab + port: 8888 + namespaces: + security: + token: + enabled: false + resources: + memory: 1Gi + storage: 5Gi + title: Conda Environment + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-conda-environment-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** + image: conda-environment:* diff --git a/public/assets/workshops/lab-cookie-consent.yaml b/public/assets/workshops/lab-cookie-consent.yaml new file mode 100644 index 0000000..cebacc1 --- /dev/null +++ b/public/assets/workshops/lab-cookie-consent.yaml @@ -0,0 +1,159 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-cookie-consent +spec: + description: Overview of embedding cookie consent. + environment: + images: + registries: + - content: + - destination: educates + prefix: /educates/educates-extension-packages/educates + 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) + session: + applications: + editor: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + dashboards: + - name: Docs + url: https://docs.educates.dev/ + namespaces: + budget: x-large + security: + policy: baseline + token: + enabled: false + objects: + - apiVersion: v1 + kind: Secret + metadata: + name: $(session_name)-admin-vcluster-values + namespace: $(workshop_namespace) + stringData: + values.yaml: | + vcluster: + image: rancher/k3s:v1.29.0-k3s1 + syncer: + extraArgs: + - --tls-san=admin-vcluster.$(session_namespace).svc.$(cluster_domain) + - --out-kube-config-server=https://admin-vcluster.$(session_namespace).svc.$(cluster_domain) + - --kube-config-context-name=admin + mapServices: + fromHost: + - from: $(workshop_namespace)/registry-$(session_name) + to: default/registry + - from: $(workshop_namespace)/localhost-$(session_name) + to: default/loopback + sync: + ingresses: + enabled: true + exportKubeConfig: + context: "admin" + - apiVersion: kappctrl.k14s.io/v1alpha1 + kind: App + metadata: + name: $(session_name)-admin-vcluster-package + namespace: $(workshop_namespace) + spec: + deploy: + - kapp: + rawOptions: + - --app-changes-max-to-keep=5 + fetch: + - helmChart: + name: vcluster + repository: + url: https://charts.loft.sh + version: 0.19.9 + noopDelete: true + serviceAccountName: kapp-installer + syncPeriod: 720h + 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) + - 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 + volumeMounts: + - mountPath: /opt/kubeconfig + name: admin-vcluster-kubeconfig + volumes: + - name: admin-vcluster-kubeconfig + secret: + secretName: $(session_name)-kubeconfig + title: Cookie Consent + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-cookie-consent-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** + - /exercises/** + - /README.md + packages: + - files: + - image: + url: $(oci_image_cache)/educates:v3.3.2 + path: . + name: educates diff --git a/public/assets/workshops/lab-docker-runtime.yaml b/public/assets/workshops/lab-docker-runtime.yaml new file mode 100644 index 0000000..b4b4632 --- /dev/null +++ b/public/assets/workshops/lab-docker-runtime.yaml @@ -0,0 +1,31 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-docker-runtime +spec: + description: Overview of running Docker in Educates + duration: 30m + session: + applications: + console: + enabled: true + docker: + enabled: true + files: + enabled: true + registry: + enabled: true + terminal: + enabled: true + layout: split + namespaces: + budget: medium + title: Docker Runtime + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-docker-runtime-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-examiner-scripts.yaml b/public/assets/workshops/lab-examiner-scripts.yaml new file mode 100644 index 0000000..5087989 --- /dev/null +++ b/public/assets/workshops/lab-examiner-scripts.yaml @@ -0,0 +1,29 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-examiner-scripts +spec: + description: Overview of using self check examinations. + duration: 30m + session: + applications: + examiner: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + namespaces: + budget: medium + security: + policy: baseline + title: Examiner Scripts + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-examiner-scripts-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-extension-packages.yaml b/public/assets/workshops/lab-extension-packages.yaml new file mode 100644 index 0000000..ff8ecf3 --- /dev/null +++ b/public/assets/workshops/lab-extension-packages.yaml @@ -0,0 +1,38 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-extension-packages +spec: + description: Overview of adding additional extension packages. + duration: 30m + session: + applications: + editor: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + namespaces: + budget: medium + title: Extension Packages + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-extension-packages-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** + packages: + - files: + - image: + url: ghcr.io/educates/educates-extension-packages/educates:v3.3.2 + path: . + name: educates + - files: + - image: + url: ghcr.io/educates/educates-extension-packages/vscode-java-tools-oci-overlay:v0.29.2 + path: . + name: spring-academy-vscode-tools-via-overlay diff --git a/public/assets/workshops/lab-git-repositories.yaml b/public/assets/workshops/lab-git-repositories.yaml new file mode 100644 index 0000000..0815249 --- /dev/null +++ b/public/assets/workshops/lab-git-repositories.yaml @@ -0,0 +1,27 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-git-repositories +spec: + description: Overview of using local hosted Git repositories. + duration: 30m + session: + applications: + files: + enabled: true + git: + enabled: true + terminal: + enabled: true + layout: split + namespaces: + budget: medium + title: Git Repositories + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-git-repositories-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-ingress-proxy.yaml b/public/assets/workshops/lab-ingress-proxy.yaml new file mode 100644 index 0000000..d67fd58 --- /dev/null +++ b/public/assets/workshops/lab-ingress-proxy.yaml @@ -0,0 +1,32 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-ingress-proxy +spec: + description: Overview of adding ingresses for local processes. + duration: 30m + session: + applications: + files: + enabled: true + terminal: + enabled: true + layout: split + dashboards: + - name: application + url: $(ingress_protocol)://application-$(session_namespace).$(ingress_domain)/ + ingresses: + - name: application + port: 8001 + namespaces: + budget: medium + title: Ingress Proxy + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-ingress-proxy-files:1.0.0 + includePaths: + - /exercises/** + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-integrated-editor.yaml b/public/assets/workshops/lab-integrated-editor.yaml new file mode 100644 index 0000000..5b1ed4a --- /dev/null +++ b/public/assets/workshops/lab-integrated-editor.yaml @@ -0,0 +1,27 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-integrated-editor +spec: + description: Overview of integrated VS Code editor. + duration: 30m + session: + applications: + editor: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + namespaces: + budget: medium + title: Integrated Editor + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-integrated-editor-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-java-environment.yaml b/public/assets/workshops/lab-java-environment.yaml new file mode 100644 index 0000000..a350c22 --- /dev/null +++ b/public/assets/workshops/lab-java-environment.yaml @@ -0,0 +1,83 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-java-environment +spec: + description: Overview of working on Java applications. + duration: 30m + environment: + objects: + - apiVersion: apps/v1 + kind: Deployment + metadata: + labels: + app: initializr + name: initializr + spec: + replicas: 1 + selector: + matchLabels: + app: initializr + template: + metadata: + labels: + app: initializr + spec: + containers: + - image: ghcr.io/educates/educates-spring-initializr:2.2.0 + imagePullPolicy: Always + name: dashboard + ports: + - containerPort: 8080 + name: 8080-tcp + protocol: TCP + - apiVersion: v1 + kind: Service + metadata: + labels: + app: initializr + name: initializr + spec: + ports: + - name: 8080-tcp + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: initializr + type: ClusterIP + session: + applications: + editor: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + dashboards: + - name: Initializr + url: $(ingress_protocol)://initializr-$(session_namespace).$(ingress_domain) + ingresses: + - host: initializr.$(workshop_namespace).svc.cluster.local + name: initializr + port: 8080 + protocol: http + namespaces: + budget: large + resources: + memory: 2Gi + title: Java Environment + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-java-environment-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** + - /exercises/** + - image: + url: ghcr.io/educates/labs-spring-workshops-maven:latest + path: .m2 + image: jdk17-environment:* diff --git a/public/assets/workshops/lab-session-namespace.yaml b/public/assets/workshops/lab-session-namespace.yaml new file mode 100644 index 0000000..8ba410f --- /dev/null +++ b/public/assets/workshops/lab-session-namespace.yaml @@ -0,0 +1,31 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-session-namespace +spec: + description: Overview of Kubernetes application deployment. + duration: 30m + session: + applications: + console: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + namespaces: + budget: medium + role: admin + security: + policy: restricted + title: Session Namespace + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-session-namespace-files:1.0.0 + includePaths: + - /exercises/** + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-slide-presentations.yaml b/public/assets/workshops/lab-slide-presentations.yaml new file mode 100644 index 0000000..0d990f6 --- /dev/null +++ b/public/assets/workshops/lab-slide-presentations.yaml @@ -0,0 +1,29 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-slide-presentations +spec: + description: Overview of integrating slide presentations. + duration: 30m + session: + applications: + files: + enabled: true + slides: + enabled: true + reveal.js: + version: 3.X + terminal: + enabled: true + layout: split + namespaces: + budget: medium + title: Slide Presentations + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-slide-presentations-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-virtual-cluster.yaml b/public/assets/workshops/lab-virtual-cluster.yaml new file mode 100644 index 0000000..3c12074 --- /dev/null +++ b/public/assets/workshops/lab-virtual-cluster.yaml @@ -0,0 +1,59 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-virtual-cluster +spec: + description: Overview of optional virtual Kubernetes cluster. + duration: 30m + session: + applications: + console: + enabled: true + files: + enabled: true + terminal: + enabled: true + layout: split + vcluster: + enabled: true + objects: + - apiVersion: v1 + kind: Secret + metadata: + name: ssh-keys + namespace: default + stringData: + id_rsa.pub: $(ssh_public_key) + namespaces: + budget: large + objects: + - apiVersion: kappctrl.k14s.io/v1alpha1 + kind: App + metadata: + name: kapp-controller + namespace: $(session_namespace)-vc + spec: + cluster: + kubeconfigSecretRef: + key: config + name: $(vcluster_secret) + namespace: default + deploy: + - kapp: {} + fetch: + - http: + url: https://github.com/carvel-dev/kapp-controller/releases/download/v0.58.0/release.yml + noopDelete: true + syncPeriod: 24h + template: + - ytt: {} + title: Virtual Cluster + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-virtual-cluster-files:1.0.0 + includePaths: + - /exercises/** + - /resources/** + - /workshop/** diff --git a/public/assets/workshops/lab-workshop-session.yaml b/public/assets/workshops/lab-workshop-session.yaml new file mode 100644 index 0000000..8018914 --- /dev/null +++ b/public/assets/workshops/lab-workshop-session.yaml @@ -0,0 +1,30 @@ +apiVersion: training.educates.dev/v1beta1 +kind: Workshop +metadata: + name: lab-workshop-session +spec: + description: Overview of the containerized workshop environment. + duration: 30m + session: + applications: + files: + enabled: true + terminal: + enabled: true + layout: split + dashboards: + - name: Docs + url: https://kubernetes.io/docs/home/ + namespaces: + security: + token: + enabled: false + title: Workshop Session + version: 1.0.0 + workshop: + files: + - image: + url: ghcr.io/educates/labs-educates-showcase/lab-workshop-session-files:1.0.0 + includePaths: + - /resources/** + - /workshop/** diff --git a/public/images/educates-docker.png b/public/images/educates-docker.png new file mode 100644 index 0000000..8f848ef Binary files /dev/null and b/public/images/educates-docker.png differ diff --git a/public/images/educates-java.png b/public/images/educates-java.png new file mode 100644 index 0000000..a941b74 Binary files /dev/null and b/public/images/educates-java.png differ diff --git a/public/images/educates-kubernetes.png b/public/images/educates-kubernetes.png new file mode 100644 index 0000000..7f0e019 Binary files /dev/null and b/public/images/educates-kubernetes.png differ diff --git a/public/images/educates-python.png b/public/images/educates-python.png new file mode 100644 index 0000000..d1819a5 Binary files /dev/null and b/public/images/educates-python.png differ diff --git a/public/images/educates-vcluster.png b/public/images/educates-vcluster.png new file mode 100644 index 0000000..46a30db Binary files /dev/null and b/public/images/educates-vcluster.png differ diff --git a/public/images/educates-vscode.png b/public/images/educates-vscode.png new file mode 100644 index 0000000..ac48577 Binary files /dev/null and b/public/images/educates-vscode.png differ diff --git a/public/images/educates.png b/public/images/educates.png new file mode 100644 index 0000000..af47fdd Binary files /dev/null and b/public/images/educates.png differ diff --git a/public/images/kubernetes.png b/public/images/kubernetes.png new file mode 100644 index 0000000..f2712c7 Binary files /dev/null and b/public/images/kubernetes.png differ diff --git a/public/images/python.png b/public/images/python.png new file mode 100644 index 0000000..20f36f4 Binary files /dev/null and b/public/images/python.png differ diff --git a/public/images/vcluster.png b/public/images/vcluster.png new file mode 100644 index 0000000..c1038f6 Binary files /dev/null and b/public/images/vcluster.png differ diff --git a/public/images/vscode-educates.png b/public/images/vscode-educates.png new file mode 100644 index 0000000..4d012e8 Binary files /dev/null and b/public/images/vscode-educates.png differ diff --git a/public/images/vscode-java.png b/public/images/vscode-java.png new file mode 100644 index 0000000..ad55e58 Binary files /dev/null and b/public/images/vscode-java.png differ diff --git a/public/images/vscode-kubernetes.png b/public/images/vscode-kubernetes.png new file mode 100644 index 0000000..6d8310f Binary files /dev/null and b/public/images/vscode-kubernetes.png differ diff --git a/public/images/vscode-python.png b/public/images/vscode-python.png new file mode 100644 index 0000000..97be540 Binary files /dev/null and b/public/images/vscode-python.png differ diff --git a/src/components/CopyableCodeBlock.jsx b/src/components/CopyableCodeBlock.jsx new file mode 100644 index 0000000..4306c90 --- /dev/null +++ b/src/components/CopyableCodeBlock.jsx @@ -0,0 +1,38 @@ +import { useRef, useState } from 'react'; + +export default function CopyableCodeBlock({ title, command }) { + const [copyStatus, setCopyStatus] = useState('Copy'); + const cmdRef = useRef(null); + + const handleCopy = () => { + if (cmdRef.current) { + const text = cmdRef.current.innerText; + navigator.clipboard.writeText(text).then(() => { + setCopyStatus('Copied!'); + setTimeout(() => setCopyStatus('Copy'), 1500); + }); + } + }; + + return ( + <> +
+ {command}
+
+ >
+ );
+}
\ No newline at end of file
diff --git a/src/components/ExtensionPackageDetail.jsx b/src/components/ExtensionPackageDetail.jsx
index 5dfbb60..5110b25 100644
--- a/src/components/ExtensionPackageDetail.jsx
+++ b/src/components/ExtensionPackageDetail.jsx
@@ -15,8 +15,7 @@ export default function ExtensionPackageDetail({ extensionPackage }) {
files:
- path: .
image:
- url: ${extensionPackage.oci_image}
- ...`
+ url: ${extensionPackage.oci_image}`
const sampleSource =
` apiVersion: training.educates.dev/v1beta1
@@ -30,7 +29,8 @@ export default function ExtensionPackageDetail({ extensionPackage }) {
- image:
url: $(image_repository)/your-workshop-files:$(workshop_version)
path: .
- ${sampleSourceCopyContent}`
+ ${sampleSourceCopyContent}
+ ...`
const sampleSourceWithCacheCopyContent =
diff --git a/src/components/InstallModal.jsx b/src/components/InstallModal.jsx
index 7af675e..4c96d7a 100644
--- a/src/components/InstallModal.jsx
+++ b/src/components/InstallModal.jsx
@@ -1,8 +1,7 @@
import { useRef, useState, useEffect } from 'react';
+import CopyableCodeBlock from './CopyableCodeBlock';
export default function InstallModal({ show, onClose, downloadUrl }) {
- const [copyStatus, setCopyStatus] = useState('Copy');
- const installCmdRef = useRef(null);
const modalRef = useRef(null);
useEffect(() => {
@@ -21,16 +20,6 @@ export default function InstallModal({ show, onClose, downloadUrl }) {
}
}, [show]);
- const handleCopy = () => {
- if (installCmdRef.current) {
- const text = installCmdRef.current.innerText;
- navigator.clipboard.writeText(text).then(() => {
- setCopyStatus('Copied!');
- setTimeout(() => setCopyStatus('Copy'), 1500);
- });
- }
- };
-
return (
-{`educates deploy-workshop -f ${downloadUrl}`}
-
+ my-{workshopSlug} with your desired release name.