James Falkner
2020-02-26 06c3cad47f579eb805fc06b540e01c6abd380c32
Updates for OCP 4.3 and CRW 2.x (#1192)

7 files deleted
8 files added
9 files modified
1 files renamed
1163 ■■■■ changed files
ansible/roles/ocp4-workload-quarkus-workshop/defaults/main.yml 18 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/amqstreams_subscription.yaml 13 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/cm-custom-codeready.yaml 16 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready.yaml 30 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_catalog_source.yaml 13 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_cr.yaml 36 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_namespace.yaml 5 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_operatorgroup.yaml 6 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_subscription.yaml 13 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/jaeger_subscription.yaml 13 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/stack.Dockerfile 48 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/stack.json 123 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/files/stack_imagestream.yaml 3 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/add_che_user.yaml 14 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/create_che_workspace.yaml 9 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/create_project.yaml 6 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/install-amqstreams.yaml 25 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/install-codeready.yaml 219 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/install-jaeger.yaml 23 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/post_workload.yml 8 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/remove_workload.yml 27 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/tasks/workload.yml 346 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/templates/che-limitrange.j2 24 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/templates/che-user.j2 4 ●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/templates/devfile.json.j2 121 ●●●●● patch | view | raw | blame | history
ansible/roles/ocp4-workload-quarkus-workshop/defaults/main.yml
@@ -3,23 +3,11 @@
ocp_username: opentlc-mgr
silent: False
crw_workspace: che
guides_workspace: guides
che_stack_definition: docker.io/schtool/che-quarkus-workshop:latest
num_users: 5
workshop_openshift_user_name: userNN
workshop_openshift_user_name: userXX
workshop_openshift_user_password: 'r3dh4t1!'
workshop_che_user_name: userNN
workshop_che_user_password: passNN
workshop_che_user_name: userXX
workshop_che_user_password: 'r3dh4t1!'
workshop_shortenYn: N
workshop_labs_url: "_workshop.yml"
# OCP Limit Range
pod_min_mem: 10Mi
pod_max_mem: 6Gi
container_max_mem: 10Gi
default_min_mem: 256Mi
default_max_mem: 10Gi
default_min_cpu: 500m
default_max_cpu: 1500m
ansible/roles/ocp4-workload-quarkus-workshop/files/amqstreams_subscription.yaml
New file
@@ -0,0 +1,13 @@
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: amq-streams
  namespace: openshift-operators
spec:
  channel: stable
  installPlanApproval: Automatic
  name: amq-streams
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  startingCSV: amqstreams.v1.3.0
ansible/roles/ocp4-workload-quarkus-workshop/files/cm-custom-codeready.yaml
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready.yaml
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_catalog_source.yaml
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_cr.yaml
New file
@@ -0,0 +1,36 @@
---
apiVersion: org.eclipse.che/v1
kind: CheCluster
metadata:
  name: codeready-workspaces
  namespace: codeready
spec:
  server:
    cheImageTag: ''
    cheFlavor: codeready
    devfileRegistryImage: ''
    pluginRegistryImage: ''
    tlsSupport: false
    selfSignedCert: false
    serverMemoryRequest: '2Gi'
    serverMemoryLimit: '6Gi'
    customCheProperties:
      CHE_LIMITS_WORKSPACE_IDLE_TIMEOUT: "0"
  database:
    externalDb: false
    chePostgresHostName: ''
    chePostgresPort: ''
    chePostgresUser: ''
    chePostgresPassword: ''
    chePostgresDb: ''
  auth:
    openShiftoAuth: false
    identityProviderImage: ''
    externalIdentityProvider: false
    identityProviderURL: ''
    identityProviderRealm: ''
    identityProviderClientId: ''
  storage:
    pvcStrategy: per-workspace
    pvcClaimSize: 1Gi
    preCreateSubPaths: true
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_namespace.yaml
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_operatorgroup.yaml
@@ -2,11 +2,11 @@
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: codeready-operator-group
  namespace: che
  generateName: codeready-
  annotations:
    olm.providedAPIs: CheCluster.v1.org.eclipse.che
  name: codeready-operator-group
  namespace: codeready
spec:
  targetNamespaces:
  - che
    - codeready
ansible/roles/ocp4-workload-quarkus-workshop/files/codeready_subscription.yaml
@@ -3,14 +3,11 @@
kind: Subscription
metadata:
  name: codeready-workspaces
  namespace: che
  labels:
    csc-owner-name: installed-redhat-codeready
    csc-owner-namespace: openshift-marketplace
  namespace: codeready
spec:
  channel: previous
  channel: latest
  installPlanApproval: Automatic
  name: codeready-workspaces
  source: installed-redhat-codeready
  sourceNamespace: che
  startingCSV: crwoperator.v1.2.2
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  startingCSV: crwoperator.v2.0.0
ansible/roles/ocp4-workload-quarkus-workshop/files/jaeger_subscription.yaml
New file
@@ -0,0 +1,13 @@
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: jaeger-product
  namespace: openshift-operators
spec:
  channel: stable
  installPlanApproval: Automatic
  name: jaeger-product
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  startingCSV: jaeger-operator.v1.13.1
ansible/roles/ocp4-workload-quarkus-workshop/files/stack.Dockerfile
New file
@@ -0,0 +1,48 @@
# syntax = docker/dockerfile:experimental
# To build this stack:
# Put your Red Hat Developer credentials in rhsm.secret.yaml file in this same directory, whose contents should be:
# RH_USERNAME=your-username
# RH_PASSWORD=your-password
#
# then:
# DOCKER_BUILDKIT=1 docker build --progress=plain --secret id=rhsm,src=rhsm.secret.yaml -t quay.io/username/quarkus-workshop-stack:VVV -f stack.Dockerfile .
# docker push quay.io/username/quay.io/username/quarkus-workshop-stack:VVVV
FROM registry.redhat.io/codeready-workspaces/stacks-java-rhel8:2.0
ENV GRAALVM_VERSION=19.3.1
ENV QUARKUS_VERSION=1.2.1.Final
ENV MVN_VERSION=3.6.3
ENV GRAALVM_HOME="/usr/local/graalvm-ce-java8-${GRAALVM_VERSION}"
ENV MAVEN_OPTS="-Xmx4G -Xss128M -XX:MetaspaceSize=1G -XX:MaxMetaspaceSize=2G -XX:+CMSClassUnloadingEnabled"
ENV PATH="/usr/local/maven/apache-maven-${MVN_VERSION}/bin:${PATH}"
USER root
RUN wget -O /tmp/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/oc/4.3/linux/oc.tar.gz && cd /usr/bin && tar -xvzf /tmp/oc.tar.gz && chmod a+x /usr/bin/oc && rm -f /tmp/oc.tar.gz
RUN wget -O /tmp/kn.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/serverless/0.11.0/kn-linux-amd64-0.11.0.tar.gz && cd /usr/bin && tar -xvzf /tmp/kn.tar.gz ./kn && chmod a+x kn && rm -f /tmp/kn.tar.gz
RUN wget -O /tmp/tkn.tar.gz https://github.com/tektoncd/cli/releases/download/v0.7.1/tkn_0.7.1_Linux_x86_64.tar.gz && cd /usr/bin && tar -xvzf /tmp/tkn.tar.gz tkn&& chmod a+x tkn && rm -f /tmp/tkn.tar.gz
RUN wget -O /tmp/graalvm.tar.gz https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${GRAALVM_VERSION}/graalvm-ce-java8-linux-amd64-${GRAALVM_VERSION}.tar.gz && cd /usr/local && tar -xvzf /tmp/graalvm.tar.gz && rm -rf /tmp/graalvm.tar.gz && ${GRAALVM_HOME}/bin/gu install native-image
RUN wget -O /tmp/mvn.tar.gz https://www-us.apache.org/dist/maven/maven-3/${MVN_VERSION}/binaries/apache-maven-${MVN_VERSION}-bin.tar.gz && tar xzf /tmp/mvn.tar.gz && rm -rf /tmp/mvn.tar.gz && mkdir /usr/local/maven && mv apache-maven-${MVN_VERSION}/ /usr/local/maven/ && alternatives --install /usr/bin/mvn mvn /usr/local/maven/apache-maven-${MVN_VERSION}/bin/mvn 1
RUN --mount=type=secret,id=rhsm username="$(grep RH_USERNAME /run/secrets/rhsm|cut -d= -f2)" && password="$(grep RH_PASSWORD /run/secrets/rhsm|cut -d= -f2)" && subscription-manager register --username $username --password $password --auto-attach && yum install -y gcc zlib-devel && yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && yum install -y siege jq && subscription-manager remove --all && subscription-manager unregister
USER jboss
RUN cd /tmp && mkdir project && cd project && mvn io.quarkus:quarkus-maven-plugin:${QUARKUS_VERSION}:create -DprojectGroupId=org.acme -DprojectArtifactId=footest -Dextensions="quarkus-agroal,quarkus-arc,quarkus-hibernate-orm,quarkus-hibernate-orm-panache,quarkus-jdbc-h2,quarkus-jdbc-postgresql,quarkus-kubernetes,quarkus-scheduler,quarkus-smallrye-fault-tolerance,quarkus-smallrye-health,quarkus-smallrye-opentracing" && mvn -f footest clean compile package && cd / && rm -rf /tmp/project
RUN cd /tmp && mkdir project && cd project && mvn io.quarkus:quarkus-maven-plugin:${QUARKUS_VERSION}:create -DprojectGroupId=org.acme -DprojectArtifactId=footest -Dextensions="quarkus-smallrye-reactive-streams-operators,quarkus-smallrye-reactive-messaging,quarkus-smallrye-reactive-messaging-kafka,quarkus-swagger-ui,quarkus-vertx,quarkus-kafka-client, quarkus-smallrye-metrics,quarkus-smallrye-openapi" && mvn -f footest clean compile package -Pnative && cd / && rm -rf /tmp/project
RUN siege && sed -i 's/^connection = close/connection = keep-alive/' $HOME/.siege/siege.conf && sed -i 's/^benchmark = false/benchmark = true/' $HOME/.siege/siege.conf
RUN echo '-w "\n"' > $HOME/.curlrc
USER root
RUN chown -R jboss /home/jboss/.m2
RUN chmod -R a+w /home/jboss/.m2
USER jboss
ansible/roles/ocp4-workload-quarkus-workshop/files/stack.json
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/files/stack_imagestream.yaml
File was renamed from ansible/roles/ocp4-workload-quarkus-workshop/templates/stack.imagestream.j2
@@ -1,3 +1,4 @@
---
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
@@ -13,5 +14,5 @@
      version: "1.0"
    from:
      kind: DockerImage
      name: {{ che_stack_definition }}
      name: quay.io/openshiftlabs/quarkus-workshop-stack:1.0
    name: "1.0"
ansible/roles/ocp4-workload-quarkus-workshop/tasks/add_che_user.yaml
@@ -1,24 +1,24 @@
---
- name: Get SSO admin token
- name: Get codeready SSO admin token
  uri:
    url: http://keycloak-che.{{ route_subdomain }}/auth/realms/master/protocol/openid-connect/token
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/realms/master/protocol/openid-connect/token
    method: POST
    body:
      username: "{{ sso_admin_username.stdout }}"
      password: "{{ sso_admin_password.stdout }}"
      username: "{{ codeready_sso_admin_username }}"
      password: "{{ codeready_sso_admin_password }}"
      grant_type: "password"
      client_id: "admin-cli"
    body_format: form-urlencoded
    status_code: 200,201,204
  register: sso_admin_token
  register: codeready_sso_admin_token
- name: Add user {{ user }} to Che
  uri:
    url: http://keycloak-che.{{ route_subdomain }}/auth/admin/realms/codeready/users
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/admin/realms/codeready/users
    method: POST
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ sso_admin_token.json.access_token }}"
      Authorization: "Bearer {{ codeready_sso_admin_token.json.access_token }}"
    body:
      username: "{{ user }}"
      enabled: true
ansible/roles/ocp4-workload-quarkus-workshop/tasks/create_che_workspace.yaml
@@ -1,7 +1,7 @@
---
- name: "Get Che {{ user }} token"
  uri:
    url: http://keycloak-che.{{ route_subdomain }}/auth/realms/codeready/protocol/openid-connect/token
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/realms/codeready/protocol/openid-connect/token
    method: POST
    body:
      username: "{{ user }}"
@@ -12,13 +12,14 @@
    status_code: 200
  register: user_token
- name: Import stack definition for {{ user }}
- name: Create workspace for {{ user }} from devfile
  uri:
    url: "http://codeready-che.{{ route_subdomain }}/api/workspace?start-after-create=true&namespace={{ user }}"
    url: "http://codeready-codeready.{{ route_subdomain }}/api/workspace/devfile?start-after-create=true&namespace={{ user }}"
    method: POST
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ user_token.json.access_token }}"
    body: "{{ lookup('file', './files/workspace.json') | replace('WORKSPACENAME', 'workspace-' + user) }}"
    body: "{{ lookup('template', './templates/devfile.json.j2') }}"
    body_format: json
    status_code: 201,409
  register: workspace_def
ansible/roles/ocp4-workload-quarkus-workshop/tasks/create_project.yaml
@@ -6,10 +6,10 @@
    api_version: project.openshift.io/v1
    definition:
      metadata:
        name: "{{ user }}-project"
        name: "{{ name }}"
        annotations:
          openshift.io/description: ""
          openshift.io/display-name: "Quarkus Workshop"
          openshift.io/display-name: "Quarkus Workshop project for {{ user }}"
- name: assign permissions for user {{ user }}
  k8s:
    state: present
@@ -18,7 +18,7 @@
    definition:
      metadata:
        name: admin
        namespace: "{{ user }}-project"
        namespace: "{{ name }}"
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
ansible/roles/ocp4-workload-quarkus-workshop/tasks/install-amqstreams.yaml
New file
@@ -0,0 +1,25 @@
---
# Setup AMQ Streams (kafka) via operator
- name: Create OpenShift Objects for amq streams
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/amqstreams_subscription.yaml
# wait for amq (kafka) CRDs
- name: Wait for Kafka CRD
  k8s_facts:
    api_version: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    name: kafkas.kafka.strimzi.io
  register: r_kafka_crd
  retries: 200
  delay: 10
  ignore_errors: yes
  until: r_kafka_crd.resources | list | length == 1
ansible/roles/ocp4-workload-quarkus-workshop/tasks/install-codeready.yaml
New file
@@ -0,0 +1,219 @@
---
# create codeready namespace
- name: create codeready namespace
  k8s:
    state: present
    kind: Project
    api_version: project.openshift.io/v1
    definition:
      metadata:
        name: "codeready"
        annotations:
          openshift.io/description: ""
          openshift.io/display-name: "CodeReady Project"
# deploy codeready operator
- name: Create operator subscription for CodeReady
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/codeready_operatorgroup.yaml
  - ./files/codeready_subscription.yaml
# wait for CRD to be a thing
- name: Wait for CodeReady CRD to be ready
  k8s_facts:
    api_version: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    name: checlusters.org.eclipse.che
  register: r_codeready_crd
  retries: 200
  delay: 10
  ignore_errors: yes
  until: r_codeready_crd.resources | list | length == 1
# deploy codeready CR
- name: Create CR for CodeReady
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/codeready_cr.yaml
# wait for che to be up
- name: wait for CRW to be running
  uri:
    url: http://codeready-codeready.{{ route_subdomain }}/dashboard/
  register: result
  until: result.status == 200
  retries: "120"
  delay: "15"
- name: Get codeready keycloak deployment
  k8s_facts:
    kind: Deployment
    namespace: codeready
    name: keycloak
  register: r_keycloak_deployment
- name: show cr
  debug:
    msg: "existing keycloak deployment: {{ r_keycloak_deployment }}"
- name: set codeready username fact
  set_fact:
    codeready_sso_admin_username: "{{ r_keycloak_deployment.resources[0].spec.template.spec.containers[0].env | selectattr('name','equalto','SSO_ADMIN_USERNAME') |map (attribute='value') | list | first }}"
- name: set codeready password fact
  set_fact:
    codeready_sso_admin_password: "{{ r_keycloak_deployment.resources[0].spec.template.spec.containers[0].env | selectattr('name','equalto','SSO_ADMIN_PASSWORD') |map (attribute='value') | list | first }}"
- name: show codeready keycloak admin username
  debug:
    msg: "codeready keycloak admin username: {{ codeready_sso_admin_username }}"
- name: show codeready keycloak admin password
  debug:
    msg: "codeready keycloak admin password: {{ codeready_sso_admin_password }}"
- name: enable script upload
  command: oc set env -n codeready deployment/keycloak JAVA_OPTS_APPEND="-Dkeycloak.profile.feature.scripts=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
- name: wait for keycloak to return
  command: oc rollout -n codeready status --timeout=1m -w deployment/keycloak
  register: cmd_res
  retries: 120
  delay: 10
  until: cmd_res.rc == 0
- name: get keycloak pod
  k8s_facts:
    api_version: v1
    kind: Pod
    namespace: codeready
    label_selectors:
      - app = codeready
      - component = keycloak
  register: r_keycloak_pod
  retries: 120
  delay: 10
  until: r_keycloak_pod.resources | list | length == 1
- name: Get SSO admin token
  uri:
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/realms/master/protocol/openid-connect/token
    method: POST
    body:
      username: "{{ codeready_sso_admin_username }}"
      password: "{{ codeready_sso_admin_password }}"
      grant_type: "password"
      client_id: "admin-cli"
    body_format: form-urlencoded
    status_code: 200,201,204
  register: sso_admin_token
- name: Import realm
  uri:
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/admin/realms
    method: POST
    body_format: json
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ sso_admin_token.json.access_token }}"
    body: "{{ lookup('file', './files/quarkus-realm.json') }}"
    ## accept 409 Conflict in case realm exists
    status_code: 200,201,204,409
  register: result
  retries: 120
  delay: 10
  until: result is succeeded
- name: create codeready users
  include_tasks: add_che_user.yaml
  vars:
    user: "{{ item }}"
  with_list: "{{ users }}"
- name: Get codeready SSO admin token
  uri:
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/realms/master/protocol/openid-connect/token
    method: POST
    body:
      username: "{{ codeready_sso_admin_username }}"
      password: "{{ codeready_sso_admin_password }}"
      grant_type: "password"
      client_id: "admin-cli"
    body_format: form-urlencoded
    status_code: 200,201,204
  register: codeready_sso_admin_token
- name: Increase codeready access token lifespans
  uri:
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/admin/realms/codeready
    method: PUT
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ codeready_sso_admin_token.json.access_token }}"
    body:
      accessTokenLifespan: 28800
      accessTokenLifespanForImplicitFlow: 28800
      actionTokenGeneratedByUserLifespan: 28800
      ssoSessionIdleTimeout: 28800
      ssoSessionMaxLifespan: 28800
    body_format: json
    status_code: 204
- name: Get Codeready admin token
  uri:
    url: http://keycloak-codeready.{{ route_subdomain }}/auth/realms/codeready/protocol/openid-connect/token
    method: POST
    body:
      username: admin
      password: admin
      grant_type: "password"
      client_id: "admin-cli"
    body_format: form-urlencoded
    status_code: 200,201,204
  register: che_admin_token
- name: Import stack imagestream
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/stack_imagestream.yaml
- name: wait for stack to be a thing
  k8s_facts:
    kind: ImageStream
    name: quarkus-stack
    namespace: openshift
  register: r_stack_is
  retries: 200
  delay: 10
  ignore_errors: yes
  until: r_stack_is.resources | list | length == 1
- name: import stack image
  shell: |
    oc import-image --all quarkus-stack -n openshift
- name: wait a minute and let the image download and be registered so workspaces start up
  pause:
      minutes: 5
- name: Pre-create and warm user workspaces
  include_tasks: create_che_workspace.yaml
  vars:
    user: "{{ item }}"
  with_list: "{{ users }}"
ansible/roles/ocp4-workload-quarkus-workshop/tasks/install-jaeger.yaml
New file
@@ -0,0 +1,23 @@
---
- name: Create OpenShift Objects for jaeger
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/jaeger_subscription.yaml
- name: Wait for Jaeger CRD
  k8s_facts:
    api_version: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    name: jaegers.jaegertracing.io
  register: r_jaeger_crd
  retries: 200
  delay: 10
  ignore_errors: yes
  until: r_jaeger_crd.resources | list | length == 1
ansible/roles/ocp4-workload-quarkus-workshop/tasks/post_workload.yml
@@ -16,11 +16,13 @@
    - "user.info: OpenShift Console: {{ console_url }}"
    - "user.info: Cluster admin login with '{{ ocp_username }}' / 'r3dh4t1!'"
    - "user.info: "
    - "user.info: CodeReady Console: http://codeready-che.{{ route_subdomain }}"
    - "user.info: OpenShift/Kubernetes API (use with oc login): {{ master_url }}"
    - "user.info: "
    - "user.info: CodeReady Console: http://codeready-codeready.{{ route_subdomain }}"
    - "user.info: Admin login with 'admin' / 'admin'"
    - "user.info: "
    - "user.info: Red Hat SSO Console: http://keycloak-che.{{ route_subdomain }}"
    - "user.info: Admin login with: '{{ sso_admin_username.stdout }}' / '{{ sso_admin_password.stdout }}'"
    - "user.info: Red Hat SSO Console: http://keycloak-codeready.{{ route_subdomain }}"
    - "user.info: Find admin credentials with oc set env deployment/keycloak -n codeready --list"
    - "user.info: "
    - "user.info: NOTE: Workspaces in CodeReady are provisioned asynchronously and may not"
    - "user.info: be accessible until rollout finishes shortly."
ansible/roles/ocp4-workload-quarkus-workshop/tasks/remove_workload.yml
@@ -21,30 +21,13 @@
    kind: Project
    api_version: project.openshift.io/v1
- name: Delete OpenShift Objects for Che
  ignore_errors: yes
# TODO delete CodeReady
- name: remove the CodeReady
  k8s:
    state: absent
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/codeready_namespace.yaml
  - ./files/codeready_operatorgroup.yaml
  - ./files/codeready_catalog_source.yaml
  - ./files/codeready_subscription.yaml
- name: delete CodeReady CRD
  shell: |
         oc delete customresourcedefinition/checlusters.org.eclipse.che
  ignore_errors: true
- name: Delete OpenShift Objects for Strimzi
  ignore_errors: yes
  k8s:
    state: absent
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/strimzi_catalog_source.yaml
  - ./files/strimzi_subscription.yaml
    name: "codeready"
    kind: Project
    api_version: project.openshift.io/v1
# Leave this as the last task in the playbook.
- name: remove_workload tasks complete
ansible/roles/ocp4-workload-quarkus-workshop/tasks/workload.yml
@@ -18,7 +18,8 @@
  include_tasks: create_project.yaml
  vars:
    user: "{{ item }}"
  with_list: "{{ users }}"
    name: "{{ item }}-project"
  loop: "{{ users }}"
# Deploy guides
- name: create guides project
@@ -33,24 +34,30 @@
          openshift.io/description: ""
          openshift.io/display-name: "Quarkus Workshop Guides"
- name: search for guide
  k8s_facts:
    kind: DeploymentConfig
    name: web
    namespace: guides
  register: r_guide_dc
- name: deploy guides
  when: r_guide_dc.resources | list | length == 0
  shell: >
    oc new-app -n guides quay.io/osevg/workshopper --name=web
    -e CHE_USER_NAME='{{ workshop_che_user_name}}'
    oc new-app -n guides quay.io/jamesfalkner/workshopper --name=web
    -e CHE_USER_PASSWORD='{{ workshop_che_user_password }}'
    -e OPENSHIFT_USER_NAME='{{ workshop_openshift_user_name }}'
    -e OPENSHIFT_USER_PASSWORD='{{ workshop_openshift_user_password }}'
    -e MASTER_URL={{ master_url }}
    -e CONSOLE_URL={{ console_url }}
    -e CHE_URL=http://codeready-che.{{ route_subdomain }}
    -e KEYCLOAK_URL=http://keycloak-che.{{ route_subdomain }}
    -e CHE_URL=http://codeready-codeready.{{ route_subdomain }}
    -e KEYCLOAK_URL=http://keycloak-codeready.{{ route_subdomain }}
    -e ROUTE_SUBDOMAIN={{ route_subdomain }}
    -e CONTENT_URL_PREFIX='https://raw.githubusercontent.com/RedHatWorkshops/quarkus-workshop/master/docs/'
    -e WORKSHOPS_URLS='https://raw.githubusercontent.com/RedHatWorkshops/quarkus-workshop/master/docs/{{ workshop_labs_url }}'
    -e CONTENT_URL_PREFIX='https://raw.githubusercontent.com/RedHatWorkshops/quarkus-workshop/ocp-4.3/docs/'
    -e WORKSHOPS_URLS='https://raw.githubusercontent.com/RedHatWorkshops/quarkus-workshop/ocp-4.3/docs/{{ workshop_labs_url }}'
    -e LOG_TO_STDOUT=true
  ignore_errors: true
- name: create the Route for guides
  when: r_guide_dc.resources | list | length == 0
  k8s:
    namespace: guides
    state: present
@@ -70,311 +77,56 @@
          targetPort: 8080-tcp
  register: Route
# Install Che via operator
- name: Create OpenShift Objects for Che
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/codeready_namespace.yaml
  - ./files/codeready_operatorgroup.yaml
  - ./files/codeready_catalog_source.yaml
  - ./files/codeready_subscription.yaml
- name: Wait for CodeReady CRD
# Install CRW via operator
- name: see if codeready is installed
  k8s_facts:
    api_version: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    name: checlusters.org.eclipse.che
  register: r_codeready_crd
  retries: 200
  delay: 10
  ignore_errors: yes
  until: r_codeready_crd.resources | list | length == 1
- name: Notify user if CodeReady deployment failed
  when: not r_codeready_crd.resources | list | length == 1
  debug:
    msg: "user.info: *** CodeReady operator could not be installed ***"
- name: Look for CodeReady CR
  k8s_facts:
    api_version: org.eclipse.che/v1
    kind: CheCluster
    namespace: che
    name: codeready
    name: codeready-workspaces
    namespace: codeready
  register: r_codeready_cr
- name: show cr
- name: show codeready cr
  debug:
    msg: "existing codeready cr: {{ r_codeready_cr }}"
    msg: "existing codeready project: {{ r_codeready_cr }}"
- name: Create OpenShift Objects for CodeReady if not existing
- name: install codeready
  when: r_codeready_cr.resources | list | length == 0
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/codeready.yaml
  include_tasks: install-codeready.yaml
- name: wait for CRW to be running
  uri:
    url: http://codeready-che.{{ route_subdomain }}/dashboard/
  register: result
  until: result.status == 200
  retries: "120"
  delay: "15"
  tags: eclipse-che
- name: Search for CodeReady ConfigMap
  # Install  AMQ Streams for all workspaces
- name: Look for amq subscription
  k8s_facts:
    kind: ConfigMap
    namespace: che
    name: custom
  register: codeready_cm
    api_version: operators.coreos.com/v1alpha1
    kind: Subscription
    name: amq-streams
    namespace: openshift-operators
  register: r_amq_sub
- name: show cm object
- name: show existing amq sub
  debug:
    msg: "Codeready Configmap: {{ codeready_cm }}"
    msg: "existing amq sub: {{ r_amq_sub }}"
# Workaround for PVC problem
- name: Alternative to volumeBindingMode=WaitForFirstConsumer
  when: (codeready_cm.resources[0].data.CHE_INFRA_KUBERNETES_PVC_WAIT__BOUND is undefined) or (codeready_cm.resources[0].data.CHE_INFRA_KUBERNETES_PVC_WAIT__BOUND == true)
  k8s:
    state: present
    merge_type:
      - strategic-merge
      - merge
    definition: "{{ lookup('file', './files/cm-custom-codeready.yaml' ) | from_yaml }}"
- name: Create OpenShift Objects for Kafka (amq streams)
  when: r_amq_sub.resources | list | length == 0
  include_tasks: install-amqstreams.yaml
- name: Search for CodeReady Pod
  # Install  Jaeger for all workspaces
- name: Look for jaeger subscription
  k8s_facts:
    kind: Pod
    namespace: che
    label_selectors:
    - app = codeready
    - component = codeready
  register: codeready_pod
    api_version: operators.coreos.com/v1alpha1
    kind: Subscription
    name: jaeger-product
    namespace: openshift-operators
  register: r_jaeger_sub
- name: Restart CodeReady Pod
  when: (codeready_cm.resources[0].data.CHE_INFRA_KUBERNETES_PVC_WAIT__BOUND is undefined) or (codeready_cm.resources[0].data.CHE_INFRA_KUBERNETES_PVC_WAIT__BOUND == true)
  k8s:
    state: absent
    api_version: v1
    kind: Pod
    name: "{{ codeready_pod.resources[0].metadata.name }}"
    namespace: che
- name: wait for CRW to be running after PVC workaround
  when: (codeready_cm.resources[0].data.CHE_INFRA_KUBERNETES_PVC_WAIT__BOUND is undefined) or (codeready_cm.resources[0].data.CHE_INFRA_KUBERNETES_PVC_WAIT__BOUND == true)
  uri:
    url: http://codeready-che.{{ route_subdomain }}/dashboard/
  register: result
  until: result.status == 200
  retries: "120"
  delay: "15"
  tags: eclipse-che
# get ingress host
- name: Get ingress host
  k8s_facts:
    api_version: v1
    kind: Service
    name: router-default
    namespace: openshift-ingress
  register: r_router_default
- name: Show ingress object
- name: show existing jaeger sub
  debug:
    msg: "Ingress object: {{ r_router_default }}"
    msg: "existing jaeger sub: {{ r_jaeger_sub }}"
- name: Show ingress host name
  debug:
    msg: "Ingress hostname: {{ r_router_default.resources[0].status.loadBalancer.ingress[0].hostname }}"
# Fix AWS ELB connection timeout
- name: Get ELB name
  become_user: ec2-user
  shell: |
    sudo -u ec2-user aws elb describe-load-balancers --region {{ aws_region }} | jq  '.LoadBalancerDescriptions |
      map(select( .DNSName == "{{ r_router_default.resources[0].status.loadBalancer.ingress[0].hostname }}"))' |
      jq -r '.[0].LoadBalancerName'
  register: lbname
- name: Show load balancer name
  debug:
    msg: "Load balancer name: {{ lbname.stdout }}"
- name: Fix load balancer
  become_user: ec2-user
  shell: |
    sudo -u ec2-user aws elb modify-load-balancer-attributes --region {{ aws_region }} --load-balancer-name {{ lbname.stdout }} --load-balancer-attributes "{\"ConnectionSettings\":{\"IdleTimeout\":300}}"
# add keycloak realm
- name: Get SSO username
  shell: |
    oc get deployment keycloak -n che -o=jsonpath={'.spec.template.spec.containers[0].env[?(@.name=="SSO_ADMIN_USERNAME")].value'}
  register: sso_admin_username
- name: Get SSO password
  shell: |
    oc get deployment keycloak -n che -o=jsonpath={'.spec.template.spec.containers[0].env[?(@.name=="SSO_ADMIN_PASSWORD")].value'}
  register: sso_admin_password
- name: Print SSO connection info
  debug:
    msg: "url: http://keycloak-che.{{ route_subdomain }} username: {{ sso_admin_username.stdout }} password: {{ sso_admin_password.stdout }}"
- name: Get SSO admin token
  uri:
    url: http://keycloak-che.{{ route_subdomain }}/auth/realms/master/protocol/openid-connect/token
    method: POST
    body:
      username: "{{ sso_admin_username.stdout }}"
      password: "{{ sso_admin_password.stdout }}"
      grant_type: "password"
      client_id: "admin-cli"
    body_format: form-urlencoded
    status_code: 200,201,204
  register: sso_admin_token
- name: Import realm
  uri:
    url: http://keycloak-che.{{ route_subdomain }}/auth/admin/realms
    method: POST
    body_format: json
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ sso_admin_token.json.access_token }}"
    body: "{{ lookup('file', './files/quarkus-realm.json') }}"
    ## accept 409 Conflict in case realm exists
    status_code: 200,201,204,409
# Add users to Che
- name: Add users to che
  include_tasks: add_che_user.yaml
  vars:
    user: "{{ item }}"
  with_list: "{{ users }}"
# Import stack definition
- name: Get Che admin token
  uri:
    url: http://keycloak-che.{{ route_subdomain }}/auth/realms/codeready/protocol/openid-connect/token
    method: POST
    body:
      username: admin
      password: admin
      grant_type: "password"
      client_id: "admin-cli"
    body_format: form-urlencoded
    status_code: 200,201,204
  register: che_admin_token
- name: Import stack definition
  uri:
    url: http://codeready-che.{{ route_subdomain }}/api/stack
    method: POST
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ che_admin_token.json.access_token }}"
    body: "{{ lookup('file', './files/stack.json') }}"
    body_format: json
    ## accept 409 in case it already exists
    status_code: 201,409
# Get stack definition
- name: Get stack definitions
  uri:
    url: http://codeready-che.{{ route_subdomain }}/api/stack
    method: GET
    headers:
      Authorization: "Bearer {{ che_admin_token.json.access_token }}"
    status_code: 200
  register: stack_definitions
- name: Set Stack permissions
  uri:
    url: http://codeready-che.{{ route_subdomain }}/api/permissions
    method: POST
    headers:
      Content-Type: application/json
      Authorization: "Bearer {{ che_admin_token.json.access_token }}"
    body:
      userId: "*"
      domainId: "stack"
      instanceId: "{{ item }}"
      actions: ["read", "search"]
    body_format: json
    status_code: 204
  with_list: "{{ stack_definitions | json_query('json[*].id') }}"
# Adjust che limits
- name: Delete default limitrange
  shell: |
    oc delete limitrange che-core-resource-limits -n che
  ignore_errors: true
- name: Create a new limitrange
  template:
    src: ./templates/che-limitrange.j2
    dest: /tmp/che-limitrange.yaml
- shell: |
    oc create -f /tmp/che-limitrange.yaml -n che
- name: Import stack imagestream
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('template', item ) | from_yaml }}"
  loop:
  - ./templates/stack.imagestream.j2
- name: Wait for ImageStream definition
  k8s_facts:
    kind: ImageStream
    name: quarkus-stack
    namespace: openshift
  register: r_imagestream_d
  retries: 200
  delay: 10
  ignore_errors: yes
  until: r_imagestream_d.resources | list | length == 1
- name: print imagestream
  debug:
    msg: "imagestream: {{ r_imagestream_d }}"
- name: import imagestream
  shell: |
    oc import-image --all quarkus-stack -n openshift
- name: Pre-create user workspaces
  include_tasks: create_che_workspace.yaml
  vars:
    user: "{{ item }}"
  with_list: "{{ users }}"
  # Install Strimzi operator for all workspaces
  # Install Che via operator
- name: Create OpenShift Objects for Strimzi
  k8s:
    state: present
    merge_type:
    - strategic-merge
    - merge
    definition: "{{ lookup('file', item ) | from_yaml }}"
  loop:
  - ./files/strimzi_catalog_source.yaml
  - ./files/strimzi_subscription.yaml
- name: Create OpenShift Objects for Jaeger
  when: r_jaeger_sub.resources | list | length == 0
  include_tasks: install-jaeger.yaml
# Leave this as the last task in the playbook.
- name: workload tasks complete
ansible/roles/ocp4-workload-quarkus-workshop/templates/che-limitrange.j2
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/templates/che-user.j2
File was deleted
ansible/roles/ocp4-workload-quarkus-workshop/templates/devfile.json.j2
New file
@@ -0,0 +1,121 @@
{
  "apiVersion": "1.0.0",
  "metadata": {
    "name": "{{ user }}-workspace"
  },
  "components": [
    {
      "id": "redhat/java/latest",
      "type": "chePlugin"
    },
    {
      "mountSources": true,
      "memoryLimit": "3Gi",
      "type": "dockerimage",
      "volumes": [
        {
          "name": "m2",
          "containerPath": "/home/jboss/.m2"
        }
      ],
      "alias": "quarkus-tools",
      "image": "image-registry.openshift-image-registry.svc:5000/openshift/quarkus-stack:1.0",
      "env": [
        {
          "value": "/home/jboss/.m2",
          "name": "MAVEN_CONFIG"
        },
        {
          "value": "-Xmx4G -Xss128M -XX:MetaspaceSize=1G -XX:MaxMetaspaceSize=2G -XX:+CMSClassUnloadingEnabled",
          "name": "MAVEN_OPTS"
        }
      ],
      "endpoints": [
        {
          "name": "web-{{ user }}",
          "port": 8080,
          "attributes": {
            "discoverable": "true",
            "public": "true",
            "protocol": "http"
          }
        },
        {
          "name": "debug-{{ user }}",
          "port": 5005,
          "attributes": {
            "discoverable": "false",
            "public": "false",
            "protocol": "jdwp"
          }
        }
      ]
    }
  ],
  "commands": [
    {
      "name": "Login to OpenShift",
      "actions": [
        {
          "type": "exec",
          "component": "quarkus-tools",
          "command": "oc login https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT --insecure-skip-tls-verify=true",
          "workdir": "${CHE_PROJECTS_ROOT}"
        }
      ]
    },
    {
      "name": "Run Tests",
      "actions": [
        {
          "type": "exec",
          "component": "quarkus-tools",
          "command": "mvn verify -f ${CHE_PROJECTS_ROOT}/quarkus-workshop-labs",
          "workdir": "${CHE_PROJECTS_ROOT}"
        }
      ]
    },
    {
      "name": "Start Live Coding",
      "actions": [
        {
          "type": "exec",
          "component": "quarkus-tools",
          "command": "mvn clean compile quarkus:dev -f ${CHE_PROJECTS_ROOT}/quarkus-workshop-labs",
          "workdir": "${CHE_PROJECTS_ROOT}"
        }
      ]
    },
    {
      "name": "Package App for OpenShift",
      "actions": [
        {
          "type": "exec",
          "component": "quarkus-tools",
          "command": "mvn package -DuberJar=true -DskipTests -f ${CHE_PROJECTS_ROOT}/quarkus-workshop-labs",
          "workdir": "${CHE_PROJECTS_ROOT}"
        }
      ]
    },
    {
      "name": "Build Native App",
      "actions": [
        {
          "type": "exec",
          "component": "quarkus-tools",
          "command": "mvn package -Pnative -DskipTests -f ${CHE_PROJECTS_ROOT}/quarkus-workshop-labs",
          "workdir": "${CHE_PROJECTS_ROOT}"
        }
      ]
    },
    {
      "name": "Start Debugger on 5005",
      "actions": [
        {
          "type": "vscode-launch",
          "referenceContent": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"type\": \"java\",\n      \"request\": \"attach\",\n      \"name\": \"Attach to App\",\n      \"hostName\": \"localhost\",\n      \"port\": 5005\n    }\n  ]\n}\n"
        }
      ]
    }
  ]
}