Files
workshops/data/hackathon/README.org

9.5 KiB

OpenShift Workshops

This directory contains a set of scenarios to be used for an OpenShift Virtualisation hackathon and was created for an internal enablement exercise at Red Hat.

Pre-requisites

The hackathon is run by breaking attendees into small teams of 2-4 and assigning each team a bare metal OpenShift 4 cluster with OpenShift Virtualisation already installed.

For our purposes we have clusters running in Equinix Metal provisioned via the Red Hat Demo System.

Cluster setup

Follow the steps below to prepare each cluster in advance of the hackathon.

Automated scenario population

To quickly setup an example environment with all solutions populated you can use the following source blocks.

Exercise two - What about my legacy technical debt?

# Create namespace
oc create namespace crusty-corp

# Create the virtual machine template
#+begin_src tmux
cat << 'EOF' | oc apply --namespace crusty-corp -f -
kind: Template
apiVersion: template.openshift.io/v1
metadata:
  name: centos5-server-small
  namespace: crusty-corp
  labels:
    app.kubernetes.io/part-of: hyperconverged-cluster
    os.template.kubevirt.io/centos5.0: 'true'
    flavor.template.kubevirt.io/small: 'true'
    template.kubevirt.io/version: v0.25.0
    app.kubernetes.io/version: 4.13.8
    template.kubevirt.io/type: base
    app.kubernetes.io/component: templating
    app.kubernetes.io/managed-by: ssp-operator
    template.kubevirt.io/default-os-variant: 'true'
    app.kubernetes.io/name: common-templates
    workload.template.kubevirt.io/server: 'true'
  annotations:
    template.kubevirt.io/provider: Red Hat
    name.os.template.kubevirt.io/centos5.0: CentOS 5 or higher
    template.kubevirt.io/provider-url: 'https://www.centos.org'
    template.kubevirt.io/containerdisks: |
      quay.io/containerdisks/centos:7-2009
    template.kubevirt.io/version: v1alpha1
    openshift.io/display-name: CentOS 5 VM
    openshift.io/documentation-url: 'https://github.com/kubevirt/common-templates'
    template.kubevirt.io/images: >
      https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
    operator-sdk/primary-resource-type: SSP.ssp.kubevirt.io
    defaults.template.kubevirt.io/disk: rootdisk
    template.kubevirt.io/editable: |
      /objects[0].spec.template.spec.domain.cpu.sockets
      /objects[0].spec.template.spec.domain.cpu.cores
      /objects[0].spec.template.spec.domain.cpu.threads
      /objects[0].spec.template.spec.domain.resources.requests.memory
      /objects[0].spec.template.spec.domain.devices.disks
      /objects[0].spec.template.spec.volumes
      /objects[0].spec.template.spec.networks
    template.openshift.io/bindable: 'false'
    openshift.kubevirt.io/pronounceable-suffix-for-name-expression: 'true'
    operator-sdk/primary-resource: openshift-cnv/ssp-kubevirt-hyperconverged
    tags: 'hidden,kubevirt,virtualmachine,linux,centos'
    template.kubevirt.io/provider-support-level: Community
    description: >-
      Template for CentOS 5 VM or newer. A PVC with the CentOS disk image must
      be available.
    openshift.io/support-url: 'https://github.com/kubevirt/common-templates/issues'
    iconClass: icon-centos
    openshift.io/provider-display-name: Red Hat
objects:
  - apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      annotations:
        vm.kubevirt.io/validations: |
          [
            {
              "name": "minimal-required-memory",
              "path": "jsonpath::.spec.domain.resources.requests.memory",
              "rule": "integer",
              "message": "This VM requires more memory.",
              "min": 1073741824
            }
          ]
      labels:
        app: '${NAME}'
        vm.kubevirt.io/template: centos5-server-small
        vm.kubevirt.io/template.revision: '1'
        vm.kubevirt.io/template.version: v0.25.0
      name: '${NAME}'
    spec:
      dataVolumeTemplates:
        - apiVersion: cdi.kubevirt.io/v1beta1
          kind: DataVolume
          metadata:
            name: '${NAME}'
          spec:
            sourceRef:
              kind: DataSource
              name: '${DATA_SOURCE_NAME}'
              namespace: '${DATA_SOURCE_NAMESPACE}'
            storage:
              resources:
                requests:
                  storage: 30Gi
      running: false
      template:
        metadata:
          annotations:
            vm.kubevirt.io/flavor: small
            vm.kubevirt.io/os: centos5
            vm.kubevirt.io/workload: server
          labels:
            kubevirt.io/domain: '${NAME}'
            kubevirt.io/size: small
        spec:
          domain:
            cpu:
              cores: 1
              sockets: 1
              threads: 1
            devices:
              disks:
                - disk:
                    bus: virtio
                  name: rootdisk
                - disk:
                    bus: virtio
                  name: cloudinitdisk
              interfaces:
                - masquerade: {}
                  model: virtio
                  name: default
              networkInterfaceMultiqueue: true
              rng: {}
            machine:
              type: pc-q35-rhel9.2.0
            resources:
              requests:
                memory: 2Gi
          evictionStrategy: LiveMigrate
          networks:
            - name: default
              pod: {}
          terminationGracePeriodSeconds: 180
          volumes:
            - dataVolume:
                name: '${NAME}'
              name: rootdisk
            - cloudInitNoCloud:
                userData: |-
                  #cloud-config
                  user: centos
                  password: ${CLOUD_USER_PASSWORD}
                  chpasswd: { expire: False }
              name: cloudinitdisk
parameters:
  - name: NAME
    description: VM name
    generate: expression
    from: 'centos5-[a-z0-9]{16}'
  - name: DATA_SOURCE_NAME
    description: Name of the DataSource to clone
    value: centos5
  - name: DATA_SOURCE_NAMESPACE
    description: Namespace of the DataSource
    value: openshift-virtualization-os-images
  - name: CLOUD_USER_PASSWORD
    description: Randomized password for the cloud-init user centos
    generate: expression
    from: '[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}'
EOF

# Create the virtual machine from template
cat << 'EOF' | oc apply --namespace crusty-corp -f -
apiVersion: 'kubevirt.io/v1'
kind: 'VirtualMachine'
metadata:
  labels:
    app: 'crusty-corp-fun-financial-appliance'
    vm.kubevirt.io/template: 'centos5-server-small'
    vm.kubevirt.io/template.namespace: 'crusty-corp'
    vm.kubevirt.io/template.revision: '1'
    vm.kubevirt.io/template.version: 'v0.25.0'
  name: 'crusty-corp-fun-financial-appliance'
  namespace: 'crusty-corp'
spec:
  dataVolumeTemplates:
    - apiVersion: 'cdi.kubevirt.io/v1beta1'
      kind: 'DataVolume'
      metadata:
        annotations:
          cdi.kubevirt.io/storage.bind.immediate.requested: 'true'
        creationTimestamp: null
        name: 'crusty-corp-fun-financial-appliance'
      spec:
        source:
          blank: {}
        storage:
          resources:
            requests:
              storage: '30Gi'
    - metadata:
        creationTimestamp: null
        name: 'crusty-corp-fun-financial-appliance-installation-cdrom'
      spec:
        source:
          http:
            url: 'https://vault.centos.org/5.11/isos/x86_64/CentOS-5.11-x86_64-netinstall.iso'
        storage:
          resources:
            requests:
              storage: '5Gi'
  running: false
  template:
    metadata:
      annotations:
        vm.kubevirt.io/flavor: 'small'
        vm.kubevirt.io/os: 'centos5'
        vm.kubevirt.io/workload: 'server'
      creationTimestamp: null
      labels:
        kubevirt.io/domain: 'crusty-corp-fun-financial-appliance'
        kubevirt.io/size: 'small'
    spec:
      domain:
        cpu:
          cores: 1
          sockets: 1
          threads: 1
        devices:
          disks:
            - bootOrder: 2
              disk:
                bus: 'virtio'
              name: 'rootdisk'
            - bootOrder: 3
              disk:
                bus: 'virtio'
              name: 'cloudinitdisk'
            - bootOrder: 1
              cdrom:
                bus: 'sata'
              name: 'installation-cdrom'
          interfaces:
            - macAddress: '02:d5:73:00:00:06'
              masquerade: {}
              model: 'virtio'
              name: 'default'
          networkInterfaceMultiqueue: true
          rng: {}
        machine:
          type: 'pc-q35-rhel9.2.0'
        resources:
          requests:
            memory: '2Gi'
      evictionStrategy: 'LiveMigrate'
      networks:
        - name: 'default'
          pod: {}
      terminationGracePeriodSeconds: 180
      volumes:
        - dataVolume:
            name: 'crusty-corp-fun-financial-appliance'
          name: 'rootdisk'
        - cloudInitNoCloud:
            userData: "#cloud-config\nuser: centos\npassword: cqud-lhel-rd0b\nchpasswd: { expire: False }"
          name: 'cloudinitdisk'
        - dataVolume:
            name: 'crusty-corp-fun-financial-appliance-installation-cdrom'
          name: 'installation-cdrom'
EOF

Automated scenario cleanup

If you need to quickly reset an example environment to have no solutions populated you can use the following source blocks.

oc delete namespace crusty-corp