From 856b2fdabc30a71ed68408a525cc358d30afba2d Mon Sep 17 00:00:00 2001 From: Jakub Stejskal Date: Fri, 10 Jan 2025 16:45:32 +0100 Subject: [PATCH] Migrate to OVNKubernetes and do upgrades of several components (#384) * Migrate to OVNKubernetes network type and remove tealc completely after recreation Signed-off-by: Jakub Stejskal * Add some minor fixes after migration Signed-off-by: Jakub Stejskal * Rename few files Signed-off-by: Jakub Stejskal * Add yq to skodjob-ee Signed-off-by: Jakub Stejskal --------- Signed-off-by: Jakub Stejskal --- .github/workflows/image_build.yaml | 41 -- .github/workflows/skodjob-ee.yaml | 35 ++ .github/workflows/tealc-ee.yaml | 32 -- .gitignore | 2 +- install/ansible-navigator.yml | 5 +- install/examples/clusters.yaml | 8 +- install/examples/github-secret.yaml | 2 +- .../roles/automation-hub/defaults/main.yml | 26 +- .../tasks/common/check_parameters.yaml | 5 - .../common/setup_cluster_kubeconfig.yaml | 8 - .../cluster-logging/delete_loki_stack.yaml | 2 +- .../infra-setup/delete/delete_links.yaml | 2 +- .../infra-setup/delete/delete_tekton.yaml | 2 +- .../install_observability.yaml | 2 +- .../cluster-logging/install_loki_stack.yaml | 2 +- .../install/hive/02-deploy_cluster.yaml | 4 +- .../infra-setup/install/install_argo.yaml | 16 +- .../infra-setup/install/install_links.yaml | 4 +- .../infra-setup/install/install_strimzi.yaml | 2 +- .../tasks/infra-setup/prepare_access.yaml | 7 +- .../tasks/monitoring/install_monitoring.yaml | 6 +- ...8-extend-default-metrics-allowlist.yaml.j2 | 4 +- .../09-alert-manager-configuration.yaml.j2 | 12 +- .../infra/automation-hub-install.yaml.j2 | 2 +- .../argo-workflows/workflows/infra/cleaner.j2 | 1 + .../workflows/infra/slack-notifier.yaml.j2 | 2 +- .../templates/argo/applications/debezium.yaml | 2 +- .../alerts/infra/argo-alerts.yaml.j2 | 2 +- .../argo/applications/strimzi-infra.yaml | 4 +- .../templates/argo/install/argocd.yaml | 30 +- .../templates/argo/install/sub.yaml | 4 +- .../cert-manager/02-cluster-issuer.yaml.j2 | 2 +- .../templates/cluster-secret.yaml.j2 | 3 +- ...=> skodjob--github-automation-hub.yaml.j2} | 2 +- ... => skodjob-github-deployment-hub.yaml.j2} | 2 +- ...-gitops.yaml.j2 => skodjob-gitops.yaml.j2} | 0 ...rafana.yaml.j2 => skodjob-grafana.yaml.j2} | 2 +- ...ines.yaml.j2 => skodjob-pipelines.yaml.j2} | 0 .../grafana/grafana-data-source.yaml.j2 | 2 +- .../templates/grafana/grafana.yaml.j2 | 2 +- .../templates/hive/install-config.yaml.j2 | 2 +- .../templates/hive/oauth.yaml.j2 | 2 +- .../templates/infra-machine-sets.yaml.j2 | 3 - .../02-cluster-logging-instance.yaml.j2 | 100 +++- .../install/loki/03-loki-stack.yaml.j2 | 6 +- .../templates/remote_access_sa.yaml | 18 +- .../tekton/install/tekton-slack-task.yaml | 2 +- .../pipelines/cleaner/tkn-runs-cleanup.yaml | 1 + .../infra/upgrade-worker-cluster.yaml.j2 | 10 +- .../image-changer-trigger.yaml | 5 +- .../strimzi-image-updater.yaml.j2 | 8 +- .../strimzi-e2e-metrics-collector.yaml | 7 +- .../test-suite/strimzi-e2e-test-suite.yaml.j2 | 21 +- .../templates/worker-machine-sets.yaml.j2 | 1 - install/secrets/clusters.yaml | Bin 43272 -> 6948 bytes install/secrets/docker-secret.yaml | Bin 361 -> 0 bytes install/secrets/github-secret.yaml | Bin 194 -> 234 bytes install/secrets/skodjob-install-key.yaml | Bin 0 -> 331 bytes install/secrets/tealc-install-key.yaml | Bin 329 -> 0 bytes scripts/bootstrap.sh | 43 ++ scripts/test-github-access.yaml | 2 +- .../context/Containerfile | 29 +- .../context/_build/bindep.txt | 2 +- skodjob-ee/context/_build/exclude-bindep.txt | 1 + .../context/_build/requirements.txt | 0 .../context/_build/requirements.yml | 0 .../context/_build/scripts/assemble | 4 +- .../context/_build/scripts/check_ansible | 0 .../context/_build/scripts/check_galaxy | 0 .../context/_build/scripts/entrypoint | 0 .../_build/scripts/install-from-bindep | 4 +- .../context/_build/scripts/introspect.py | 507 ++++++++++++++++++ skodjob-ee/context/_build/scripts/pip_install | 56 ++ skodjob-ee/execution-environment.yml | 47 ++ tealc-ee/context/_build/scripts/introspect.py | 400 -------------- tealc-ee/execution-environment.yml | 43 -- 76 files changed, 929 insertions(+), 686 deletions(-) delete mode 100644 .github/workflows/image_build.yaml create mode 100644 .github/workflows/skodjob-ee.yaml delete mode 100644 .github/workflows/tealc-ee.yaml rename install/roles/automation-hub/templates/console-link/{tealc-github-tealc.yaml.j2 => skodjob--github-automation-hub.yaml.j2} (99%) rename install/roles/automation-hub/templates/console-link/{tealc-github-sokar.yaml.j2 => skodjob-github-deployment-hub.yaml.j2} (99%) rename install/roles/automation-hub/templates/console-link/{tealc-gitops.yaml.j2 => skodjob-gitops.yaml.j2} (100%) rename install/roles/automation-hub/templates/console-link/{tealc-grafana.yaml.j2 => skodjob-grafana.yaml.j2} (99%) rename install/roles/automation-hub/templates/console-link/{tealc-pipelines.yaml.j2 => skodjob-pipelines.yaml.j2} (100%) delete mode 100644 install/secrets/docker-secret.yaml create mode 100644 install/secrets/skodjob-install-key.yaml delete mode 100644 install/secrets/tealc-install-key.yaml create mode 100755 scripts/bootstrap.sh rename tealc-ee/context/Dockerfile => skodjob-ee/context/Containerfile (63%) rename {tealc-ee => skodjob-ee}/context/_build/bindep.txt (54%) create mode 100644 skodjob-ee/context/_build/exclude-bindep.txt rename {tealc-ee => skodjob-ee}/context/_build/requirements.txt (100%) rename {tealc-ee => skodjob-ee}/context/_build/requirements.yml (100%) rename {tealc-ee => skodjob-ee}/context/_build/scripts/assemble (99%) rename {tealc-ee => skodjob-ee}/context/_build/scripts/check_ansible (100%) rename {tealc-ee => skodjob-ee}/context/_build/scripts/check_galaxy (100%) rename {tealc-ee => skodjob-ee}/context/_build/scripts/entrypoint (100%) rename {tealc-ee => skodjob-ee}/context/_build/scripts/install-from-bindep (98%) create mode 100644 skodjob-ee/context/_build/scripts/introspect.py create mode 100755 skodjob-ee/context/_build/scripts/pip_install create mode 100644 skodjob-ee/execution-environment.yml delete mode 100644 tealc-ee/context/_build/scripts/introspect.py delete mode 100644 tealc-ee/execution-environment.yml diff --git a/.github/workflows/image_build.yaml b/.github/workflows/image_build.yaml deleted file mode 100644 index 3171ad47..00000000 --- a/.github/workflows/image_build.yaml +++ /dev/null @@ -1,41 +0,0 @@ -name: Apophis Image Build -on: - push: - paths: - - "image-update/Dockerfile" - branches: - - "main" - pull_request: - branches: - - "*" - paths: - - "image-update/Dockerfile" - -jobs: - build_image: - runs-on: ubuntu-latest - steps: - - name: Cancel Previous Runs - if: github.event_name == 'pull_request' - uses: styfle/cancel-workflow-action@0.9.1 - - - name: Checkout - uses: actions/checkout@v2 - - - name: Login to quay.io Hub - uses: docker/login-action@v1 - with: - registry: quay.io - username: ${{ secrets.QUAY_USER }} - password: ${{ secrets.QUAY_PASSWORD }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: ./image-update - file: ./image-update/Dockerfile - push: ${{ github.event_name != 'pull_request' }} - tags: quay.io/tealc/apophis:latest diff --git a/.github/workflows/skodjob-ee.yaml b/.github/workflows/skodjob-ee.yaml new file mode 100644 index 00000000..f99e877e --- /dev/null +++ b/.github/workflows/skodjob-ee.yaml @@ -0,0 +1,35 @@ +name: skodjob-ee + +on: + push: + branches: + - "main" + +jobs: + image: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v4 + - + name: Login to Quay.io + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_USER }} + password: ${{ secrets.QUAY_PASSWORD }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Build and push + uses: docker/build-push-action@v6 + with: + context: ./skodjob-ee/context + file: ./skodjob-ee/context/Dockerfile + push: true + # TODO - Change org when we will create a new one + tags: quay.io/tealc/skodjob-ee:latest diff --git a/.github/workflows/tealc-ee.yaml b/.github/workflows/tealc-ee.yaml deleted file mode 100644 index 5267ac53..00000000 --- a/.github/workflows/tealc-ee.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: tealc-ee - -on: - push: - branches: - - "main" - -jobs: - image: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - registry: quay.io - username: ${{ secrets.QUAY_USER }} - password: ${{ secrets.QUAY_PASSWORD }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: ./tealc-ee/context - file: ./tealc-ee/context/Dockerfile - push: true - tags: quay.io/tealc/tealc-ee:latest diff --git a/.gitignore b/.gitignore index c8a54b27..fd407355 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .idea .vscode -tealc-ci-test.yaml +skodjob-ci-test.yaml **/kubeconfig install/kubeconfig **/.ssh/ diff --git a/install/ansible-navigator.yml b/install/ansible-navigator.yml index 72935ec8..8a7241e0 100644 --- a/install/ansible-navigator.yml +++ b/install/ansible-navigator.yml @@ -5,10 +5,7 @@ ansible-navigator: execution-environment: enabled: true - image: quay.io/tealc/tealc-ee:latest - pull: - arguments: - - "--platform linux/amd64" + image: quay.io/tealc/skodjob-ee:latest environment-variables: set: ANSIBLE_RUN_TAGS: 'infra,strimzi-infra' diff --git a/install/examples/clusters.yaml b/install/examples/clusters.yaml index bf79fe8d..d99a7f29 100644 --- a/install/examples/clusters.yaml +++ b/install/examples/clusters.yaml @@ -1,15 +1,15 @@ --- +# TODO - this is no longer valid, update it accordingly! # Infra cluster configuration infra_access_token: placeholder infra_api_url: server_api_url -infra_context_name: tealc-infra +infra_context_name: skodjob-infra infra_username: pepa infra_token: zdepa # Paths info kubeconfig_path: configpath github_secret_path: configpath/install/examples/github-secret.yaml -grafana_docker_secret_path: configpath/install/examples/docker-secret.yaml # Workers workers: @@ -19,7 +19,7 @@ workers: access_token: placeholder username: pepa password: zdepa - monitoring_namespace: tealc + monitoring_namespace: skodjob environment: upstream workload: true release_cluster: @@ -28,6 +28,6 @@ workers: access_token: placeholder username: pepa password: zdepa - monitoring_namespace: tealc + monitoring_namespace: skodjob environment: upstream workload: true diff --git a/install/examples/github-secret.yaml b/install/examples/github-secret.yaml index f6e3a7b7..f367c680 100644 --- a/install/examples/github-secret.yaml +++ b/install/examples/github-secret.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Secret metadata: name: github-secret - app: tealc + app: skodjob type: Opaque stringData: USERNAME: "pepa-ci" diff --git a/install/roles/automation-hub/defaults/main.yml b/install/roles/automation-hub/defaults/main.yml index 773da9b9..108c8990 100644 --- a/install/roles/automation-hub/defaults/main.yml +++ b/install/roles/automation-hub/defaults/main.yml @@ -1,9 +1,9 @@ --- # defaults file -infra_monitoring_namespace: tealc-monitoring -infra_ci_namespace: tealc-pipelines +infra_monitoring_namespace: skodjob-monitoring +infra_ci_namespace: skodjob-pipelines infra_workflow_namespace: skodjob-ci -infra_argo_namespace: tealc-gitops +infra_argo_namespace: skodjob-gitops openshift_pipelines_namespace: openshift-pipelines openshift_operators_namespace: openshift-operators @@ -14,19 +14,19 @@ access_token: empty htpasswd_file: /tmp/htpasswd # GitOps -gitops_channel_version: 1.13 -gitops_version: 1.13.1 +gitops_channel_version: 1.15 +gitops_version: 1.15.0 # ACM -acm_version: 2.11 -loki_version: 6.0 -openshift_logging_version: 6.0 -acm_namespace: tealc-rhacm +acm_version: 2.12 +loki_version: 6.1 +openshift_logging_version: 6.1 +acm_namespace: skodjob-rhacm acm_observability_namespace: open-cluster-management-observability # ACS -acs_version: 4.5 -acs_namespace: tealc-rhacs +acs_version: 4.6 +acs_namespace: skodjob-rhacs acs_stackrox_namespace: stackrox acs_api_token_file: "{{ playbook_dir }}/acs_api_token" acs_init_secrets: "{{ playbook_dir }}/init-bundle.yaml" @@ -37,8 +37,8 @@ cm_operator_namespace: cert-manager-operator cm_route53_credentials: route53-le-credentials cm_route53_secret_key_ref: secret-key cm_route53_access_key_ref: access-key -cm_certificate_secret: tealc-signed-certificate -cm_version: 1.14.0 +cm_certificate_secret: skodjob-signed-certificate +cm_version: 1.14.1 # Strimzi strimzi_operator_namespace: strimzi-operator diff --git a/install/roles/automation-hub/tasks/common/check_parameters.yaml b/install/roles/automation-hub/tasks/common/check_parameters.yaml index 8d3f6b87..8ab716ab 100644 --- a/install/roles/automation-hub/tasks/common/check_parameters.yaml +++ b/install/roles/automation-hub/tasks/common/check_parameters.yaml @@ -18,8 +18,3 @@ fail: msg: "Variable 'infra_api_url' is not defined" when: infra_api_url is not defined - -- name: Check that 'grafana_docker_secret_path' is not defined - fail: - msg: "Variable 'grafana_docker_secret_path' is not defined" - when: grafana_docker_secret_path is not defined diff --git a/install/roles/automation-hub/tasks/common/setup_cluster_kubeconfig.yaml b/install/roles/automation-hub/tasks/common/setup_cluster_kubeconfig.yaml index 8ae84d0e..c0fd11b9 100644 --- a/install/roles/automation-hub/tasks/common/setup_cluster_kubeconfig.yaml +++ b/install/roles/automation-hub/tasks/common/setup_cluster_kubeconfig.yaml @@ -1,10 +1,6 @@ ################################## #### Set kubeconfig data from yaml ################################## -- name: "Debug na zacatku" - debug: - msg: "{{ clusters_dict }}" - - name: "Update facts for {{ cluster.name }} - kubeconfig based" ansible.utils.update_fact: updates: @@ -51,7 +47,3 @@ path: "{{ kubeconfig_path }}/{{ cluster.name }}" mode: '0755' when: clusters_dict[cluster.name].provisioned - -- name: "Debug na konci" - debug: - msg: "{{ clusters_dict }}" diff --git a/install/roles/automation-hub/tasks/infra-setup/delete/cluster-logging/delete_loki_stack.yaml b/install/roles/automation-hub/tasks/infra-setup/delete/cluster-logging/delete_loki_stack.yaml index 0db88f01..84a7b6e0 100644 --- a/install/roles/automation-hub/tasks/infra-setup/delete/cluster-logging/delete_loki_stack.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/delete/cluster-logging/delete_loki_stack.yaml @@ -30,7 +30,7 @@ region: "{{ aws_region | b64encode }}" bucketnames: "{{ bucketname | b64encode }}" vars: - bucketname: "tealc-{{ clusterName }}-loki" + bucketname: "skodjob-{{ clusterName }}-loki" - name: "Delete Loki subscription on {{ clusterName }}" kubernetes.core.k8s: diff --git a/install/roles/automation-hub/tasks/infra-setup/delete/delete_links.yaml b/install/roles/automation-hub/tasks/infra-setup/delete/delete_links.yaml index b85f1d47..7024cae8 100644 --- a/install/roles/automation-hub/tasks/infra-setup/delete/delete_links.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/delete/delete_links.yaml @@ -1,5 +1,5 @@ --- -- name: Delete console link for tealc applications +- name: Delete console link for skodjob applications kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" state: absent diff --git a/install/roles/automation-hub/tasks/infra-setup/delete/delete_tekton.yaml b/install/roles/automation-hub/tasks/infra-setup/delete/delete_tekton.yaml index e73c481a..be3fbdd3 100644 --- a/install/roles/automation-hub/tasks/infra-setup/delete/delete_tekton.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/delete/delete_tekton.yaml @@ -4,7 +4,7 @@ kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" namespace: "{{ infra_ci_namespace }}" api_version: "triggers.tekton.dev/v1alpha1" - label_selectors: listener=tealc + label_selectors: listener=skodjob verify_ssl: no state: absent kind: EventListener diff --git a/install/roles/automation-hub/tasks/infra-setup/install/advanced-cluster-management/install_observability.yaml b/install/roles/automation-hub/tasks/infra-setup/install/advanced-cluster-management/install_observability.yaml index 742486ea..91e03ccf 100644 --- a/install/roles/automation-hub/tasks/infra-setup/install/advanced-cluster-management/install_observability.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/install/advanced-cluster-management/install_observability.yaml @@ -49,7 +49,7 @@ verify_ssl: no wait_condition: type: Ready - status: True + status: 'True' reason: Ready - name: "Create multicluster observability config map for custom metrics on {{ worker.name }} cluster" diff --git a/install/roles/automation-hub/tasks/infra-setup/install/cluster-logging/install_loki_stack.yaml b/install/roles/automation-hub/tasks/infra-setup/install/cluster-logging/install_loki_stack.yaml index e2facd18..0958ca72 100644 --- a/install/roles/automation-hub/tasks/infra-setup/install/cluster-logging/install_loki_stack.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/install/cluster-logging/install_loki_stack.yaml @@ -68,7 +68,7 @@ region: "{{ aws_region | b64encode }}" bucketnames: "{{ bucketname | b64encode }}" vars: - bucketname: "tealc-{{ clusterName }}-loki" + bucketname: "skodjob-{{ clusterName }}-loki" - name: "Remove Grafana access on {{ clusterName }} to avoid conflicts" kubernetes.core.k8s: diff --git a/install/roles/automation-hub/tasks/infra-setup/install/hive/02-deploy_cluster.yaml b/install/roles/automation-hub/tasks/infra-setup/install/hive/02-deploy_cluster.yaml index d704fd94..849cf050 100644 --- a/install/roles/automation-hub/tasks/infra-setup/install/hive/02-deploy_cluster.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/install/hive/02-deploy_cluster.yaml @@ -2,14 +2,14 @@ # Create FIPs # ############### - name: "Create FIP API" - shell: "openstack floating ip create --description 'Tealc - {{ cluster.name }} API' -f value -c floating_ip_address {{ cluster.openstack_network }}" + shell: "openstack floating ip create --description 'Skodjob - {{ cluster.name }} API' -f value -c floating_ip_address {{ cluster.openstack_network }}" environment: OS_CLOUD: "{{ cluster.cloud }}" register: "fip_api_output" when: cluster.fip_api is undefined - name: "Create FIP apps" - shell: "openstack floating ip create --description 'Tealc - {{ cluster.name }} APPS' -f value -c floating_ip_address {{ cluster.openstack_network }}" + shell: "openstack floating ip create --description 'Skodjob - {{ cluster.name }} APPS' -f value -c floating_ip_address {{ cluster.openstack_network }}" environment: OS_CLOUD: "{{ cluster.cloud }}" register: "fip_apps_output" diff --git a/install/roles/automation-hub/tasks/infra-setup/install/install_argo.yaml b/install/roles/automation-hub/tasks/infra-setup/install/install_argo.yaml index a2650c2e..4016be76 100644 --- a/install/roles/automation-hub/tasks/infra-setup/install/install_argo.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/install/install_argo.yaml @@ -13,20 +13,12 @@ project: "skodjob" secret: "cert-manager" -- name: Create image pull secret on infra cluster - kubernetes.core.k8s: - kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" - namespace: "{{ infra_argo_namespace }}" - state: present - verify_ssl: no - src: "{{ grafana_docker_secret_path }}" - - name: Create Argo subscription kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" state: present verify_ssl: no - src: templates/argo/install/sub.yaml + template: templates/argo/install/sub.yaml register: argo_sub - name: Sleep for 5 seconds and continue with play @@ -58,7 +50,7 @@ environment: KUBECONFIG: "{{ kubeconfig_path }}/{{ infra_context_name }}" -- name: Create Argo app +- name: Install Argo kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" namespace: "{{ infra_argo_namespace }}" @@ -92,7 +84,7 @@ namespace: "{{ infra_argo_namespace }}" kind: Deployment api_version: apps/v1 - name: tealc-gitops-server + name: skodjob-gitops-server wait: true verify_ssl: no wait_condition: @@ -106,7 +98,7 @@ namespace: "{{ infra_argo_namespace }}" kind: Deployment api_version: apps/v1 - name: tealc-gitops-dex-server + name: skodjob-gitops-dex-server wait: true verify_ssl: no wait_condition: diff --git a/install/roles/automation-hub/tasks/infra-setup/install/install_links.yaml b/install/roles/automation-hub/tasks/infra-setup/install/install_links.yaml index a74d2bf7..f6524ab3 100644 --- a/install/roles/automation-hub/tasks/infra-setup/install/install_links.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/install/install_links.yaml @@ -1,5 +1,5 @@ --- -- name: Delete console link for tealc applications +- name: Delete console link for skodjob applications kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" state: absent @@ -7,7 +7,7 @@ verify_ssl: no with_fileglob: 'templates/console-link/*.j2' -- name: Create console link for tealc applications +- name: Create console link for skodjob applications kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" state: present diff --git a/install/roles/automation-hub/tasks/infra-setup/install/install_strimzi.yaml b/install/roles/automation-hub/tasks/infra-setup/install/install_strimzi.yaml index 06b92134..ab541de4 100644 --- a/install/roles/automation-hub/tasks/infra-setup/install/install_strimzi.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/install/install_strimzi.yaml @@ -22,7 +22,7 @@ environment: KUBECONFIG: "{{ kubeconfig_path }}/{{ infra_context_name }}" -- name: Add Argo Helm Repo +- name: Add Strimzi Helm Repo kubernetes.core.helm_repository: name: strimzi url: https://strimzi.io/charts diff --git a/install/roles/automation-hub/tasks/infra-setup/prepare_access.yaml b/install/roles/automation-hub/tasks/infra-setup/prepare_access.yaml index 759bcc7d..e89c69bf 100644 --- a/install/roles/automation-hub/tasks/infra-setup/prepare_access.yaml +++ b/install/roles/automation-hub/tasks/infra-setup/prepare_access.yaml @@ -15,6 +15,7 @@ - "{{ infra_ci_namespace }}" - "{{ openshift_pipelines_namespace }}" - "{{ infra_argo_namespace }}" + - "{{ infra_workflow_namespace }}" - name: "Create ServiceAccount for remote access on {{ worker.name }}" kubernetes.core.k8s: @@ -26,7 +27,7 @@ - name: "Export access token on {{ worker.name }}" # shell: "oc serviceaccounts get-token access-serviceaccount -n default" - shell: "oc get $(oc get secret -o name -n default | grep access-serviceaccount-token) -n default -o=jsonpath='{.data.token}' | base64 -d" + shell: "oc get secret access-serviceaccount -n default -o=jsonpath='{.data.token}' | base64 -d" environment: KUBECONFIG: "{{ kubeconfig_path }}/{{ worker.name }}" register: "access_token_out" @@ -58,12 +59,12 @@ verify_ssl: no apply: true -- name: Create tealc-install access secret in CI namespaces +- name: Create skodjob-install access secret in CI namespaces kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}/{{ infra_context_name }}" namespace: "{{ namespaceName }}" state: present - src: "{{ tealc_git_crypt_key }}" + src: "{{ skodjob_git_crypt_key }}" verify_ssl: no apply: true loop_control: diff --git a/install/roles/automation-hub/tasks/monitoring/install_monitoring.yaml b/install/roles/automation-hub/tasks/monitoring/install_monitoring.yaml index 5f7c8337..7ff9b8a3 100644 --- a/install/roles/automation-hub/tasks/monitoring/install_monitoring.yaml +++ b/install/roles/automation-hub/tasks/monitoring/install_monitoring.yaml @@ -145,7 +145,7 @@ target_cluster_name: "{{ infra_context_name }}", context: "{{ infra_context_name }}", url: "https://thanos-querier.openshift-monitoring.svc.cluster.local:9091"} - - {name: "tealc-thanos", + - {name: "skodjob-thanos", sa_namespace: "{{ infra_user_namespace }}", monitoring_namespace: "{{ infra_monitoring_namespace }}", target_cluster_name: "{{ infra_context_name }}", @@ -172,7 +172,7 @@ loop: # Turn off notifications from Thanos alert manager because the one from original monitoring stack is better configured now for user alerts - {namespace: "open-cluster-management-observability", suffix: "config", receiver_infra: "default_blackhole", receiver_strimzi: "default_blackhole"} - - {namespace: "openshift-monitoring", suffix: "main", receiver_infra: "tealc-infra", receiver_strimzi: "strimzi"} + - {namespace: "openshift-monitoring", suffix: "main", receiver_infra: "skodjob-infra", receiver_strimzi: "strimzi"} - name: "Configure default Alertmanager to surpass warnings - {{ clusterName }}" kubernetes.core.k8s: @@ -185,7 +185,7 @@ clusterName: "{{ clusterName }}" namespace: "openshift-monitoring" suffix: "main" - receiver_infra: "tealc-infra" + receiver_infra: "skodjob-infra" receiver_strimzi: "strimzi" loop: "{{ worker_clusters }}" loop_control: diff --git a/install/roles/automation-hub/templates/acm/08-extend-default-metrics-allowlist.yaml.j2 b/install/roles/automation-hub/templates/acm/08-extend-default-metrics-allowlist.yaml.j2 index cd80693e..518e1f70 100644 --- a/install/roles/automation-hub/templates/acm/08-extend-default-metrics-allowlist.yaml.j2 +++ b/install/roles/automation-hub/templates/acm/08-extend-default-metrics-allowlist.yaml.j2 @@ -11,12 +11,12 @@ data: - container_cpu_usage_seconds_total - container_memory_usage_bytes matches: - - __name__=~".*(kafka|zookeeper|strimzi|jvm|argo|loki|tealc|thor|strimzi-e2e).*" + - __name__=~".*(kafka|zookeeper|strimzi|jvm|argo|loki|skodjob|thor|strimzi-e2e).*" uwl_metrics_list.yaml: | names: - container_memory_usage_bytes - container_cpu_usage_seconds_total - process_open_fds matches: - - __name__=~".*(kafka|zookeeper|strimzi|jvm|argo|loki|debezium|tealc|thor|strimzi-e2e).*" + - __name__=~".*(kafka|zookeeper|strimzi|jvm|argo|loki|debezium|skodjob|thor|strimzi-e2e).*" - container=~".*(dmt|kafka|strimzi).*" diff --git a/install/roles/automation-hub/templates/acm/09-alert-manager-configuration.yaml.j2 b/install/roles/automation-hub/templates/acm/09-alert-manager-configuration.yaml.j2 index 3294d459..15b7672c 100644 --- a/install/roles/automation-hub/templates/acm/09-alert-manager-configuration.yaml.j2 +++ b/install/roles/automation-hub/templates/acm/09-alert-manager-configuration.yaml.j2 @@ -111,9 +111,9 @@ stringData: - purpose = infra receivers: - name: 'default_blackhole' - - name: 'tealc-infra' + - name: 'skodjob-infra' slack_configs: - - channel: '#tealc-alerts-infra' + - channel: '#skodjob-alerts-infra' api_url: {{ slack_api_alerts_infra_url }} color: '{% raw %}{{ template "slack.color" . }}{% endraw %}' title: '{% raw %}{{ template "slack.title" . }}{% endraw %}' @@ -124,8 +124,8 @@ stringData: text: 'ACM Grafana :grafana:' url: '{{ grafana_acm_url }}' - type: button - text: 'Tealc Grafana :grafana:' - url: '{{ grafana_tealc_url }}' + text: 'Skodjob Grafana :grafana:' + url: '{{ skodjob_grafana_url }}' - type: button text: 'ArgoCD :argocd:' url: '{{ argo_url }}' @@ -134,7 +134,7 @@ stringData: url: '{% raw %}{{ template "__alert_silence_link" . }}{% endraw %}' - name: 'strimzi' slack_configs: - - channel: '#tealc-alerts-strimzi' + - channel: '#skodjob-alerts-strimzi' api_url: {{ slack_api_alerts_strimzi_url }} color: '{% raw %}{{ template "slack.color" . }}{% endraw %}' title: '{% raw %}{{ template "slack.title" . }}{% endraw %}' @@ -143,7 +143,7 @@ stringData: actions: - type: button text: 'Grafana :grafana:' - url: '{{ grafana_tealc_url }}' + url: '{{ skodjob_grafana_url }}' - type: button text: 'ArgoCD :argocd:' url: '{{ argo_url }}' diff --git a/install/roles/automation-hub/templates/argo-workflows/workflows/infra/automation-hub-install.yaml.j2 b/install/roles/automation-hub/templates/argo-workflows/workflows/infra/automation-hub-install.yaml.j2 index 05ed1add..b672d778 100644 --- a/install/roles/automation-hub/templates/argo-workflows/workflows/infra/automation-hub-install.yaml.j2 +++ b/install/roles/automation-hub/templates/argo-workflows/workflows/infra/automation-hub-install.yaml.j2 @@ -25,7 +25,7 @@ spec: - mountPath: /workspace name: workspace script: - image: quay.io/tealc/tealc-ee:latest + image: quay.io/tealc/skodjob-ee:latest volumeMounts: - mountPath: /workdir name: workdir diff --git a/install/roles/automation-hub/templates/argo-workflows/workflows/infra/cleaner.j2 b/install/roles/automation-hub/templates/argo-workflows/workflows/infra/cleaner.j2 index d3e7978a..0326f6e4 100644 --- a/install/roles/automation-hub/templates/argo-workflows/workflows/infra/cleaner.j2 +++ b/install/roles/automation-hub/templates/argo-workflows/workflows/infra/cleaner.j2 @@ -17,6 +17,7 @@ spec: ttlStrategy: secondsAfterCompletion: 300 script: + # TODO Use skodjob-ee from different org image: 'quay.io/tealc/k8s:latest' command: [bash] env: diff --git a/install/roles/automation-hub/templates/argo-workflows/workflows/infra/slack-notifier.yaml.j2 b/install/roles/automation-hub/templates/argo-workflows/workflows/infra/slack-notifier.yaml.j2 index 9e24161a..8c9d2dbb 100644 --- a/install/roles/automation-hub/templates/argo-workflows/workflows/infra/slack-notifier.yaml.j2 +++ b/install/roles/automation-hub/templates/argo-workflows/workflows/infra/slack-notifier.yaml.j2 @@ -20,7 +20,7 @@ spec: - name: url description: "Slack webhook URL" script: - image: quay.io/tealc/tealc-ee:latest + image: quay.io/tealc/skodjob-ee:latest command: [bash] source: | {% raw %} diff --git a/install/roles/automation-hub/templates/argo/applications/debezium.yaml b/install/roles/automation-hub/templates/argo/applications/debezium.yaml index b1e6f30c..7e336e9b 100644 --- a/install/roles/automation-hub/templates/argo/applications/debezium.yaml +++ b/install/roles/automation-hub/templates/argo/applications/debezium.yaml @@ -14,7 +14,7 @@ spec: - clusters: selector: matchLabels: - environment: 'upstream-latest' + environment: 'upstream' template: metadata: name: '{{appname}}-{{name}}' diff --git a/install/roles/automation-hub/templates/argo/applications/monitoring/alerts/infra/argo-alerts.yaml.j2 b/install/roles/automation-hub/templates/argo/applications/monitoring/alerts/infra/argo-alerts.yaml.j2 index 0865c7aa..e04afef8 100644 --- a/install/roles/automation-hub/templates/argo/applications/monitoring/alerts/infra/argo-alerts.yaml.j2 +++ b/install/roles/automation-hub/templates/argo/applications/monitoring/alerts/infra/argo-alerts.yaml.j2 @@ -21,4 +21,4 @@ spec: - CreateNamespace=true destination: name: {{ cluster }} - namespace: tealc-gitops + namespace: skodjob-gitops diff --git a/install/roles/automation-hub/templates/argo/applications/strimzi-infra.yaml b/install/roles/automation-hub/templates/argo/applications/strimzi-infra.yaml index 7ee9f0d7..82e39466 100644 --- a/install/roles/automation-hub/templates/argo/applications/strimzi-infra.yaml +++ b/install/roles/automation-hub/templates/argo/applications/strimzi-infra.yaml @@ -14,7 +14,7 @@ spec: - clusters: selector: matchLabels: - environment: upstream-latest + environment: upstream - matrix: generators: - git: @@ -25,7 +25,7 @@ spec: - clusters: selector: matchLabels: - environment: upstream-latest + environment: upstream template: metadata: name: '{{appname}}-{{name}}' diff --git a/install/roles/automation-hub/templates/argo/install/argocd.yaml b/install/roles/automation-hub/templates/argo/install/argocd.yaml index ec4c8a3c..dfe913aa 100644 --- a/install/roles/automation-hub/templates/argo/install/argocd.yaml +++ b/install/roles/automation-hub/templates/argo/install/argocd.yaml @@ -1,9 +1,9 @@ -apiVersion: argoproj.io/v1alpha1 +apiVersion: argoproj.io/v1beta1 kind: ArgoCD metadata: - name: tealc-gitops + name: skodjob-gitops labels: - project: tealc + project: skodjob spec: server: autoscale: @@ -77,15 +77,19 @@ spec: kinds: - TaskRun - PipelineRun - dex: - openShiftOAuth: true - resources: - limits: - cpu: 500m - memory: 256Mi - requests: - cpu: 250m - memory: 128Mi + sso: + provider: dex + groups: + - default + dex: + openShiftOAuth: true + resources: + limits: + cpu: 500m + memory: 256Mi + requests: + cpu: 250m + memory: 128Mi ha: enabled: false resources: @@ -116,4 +120,4 @@ spec: sharding: {} tls: ca: - secretName: tealc-signed-certificate + secretName: skodjob-signed-certificate \ No newline at end of file diff --git a/install/roles/automation-hub/templates/argo/install/sub.yaml b/install/roles/automation-hub/templates/argo/install/sub.yaml index efab07d5..4015b834 100644 --- a/install/roles/automation-hub/templates/argo/install/sub.yaml +++ b/install/roles/automation-hub/templates/argo/install/sub.yaml @@ -4,10 +4,10 @@ metadata: name: openshift-gitops-operator namespace: openshift-operators labels: - project: tealc + project: skodjob spec: channel: gitops-{{ gitops_channel_version | string }} - installPlanApproval: Manual + installPlanApproval: Automatic name: openshift-gitops-operator source: redhat-operators sourceNamespace: openshift-marketplace diff --git a/install/roles/automation-hub/templates/cert-manager/02-cluster-issuer.yaml.j2 b/install/roles/automation-hub/templates/cert-manager/02-cluster-issuer.yaml.j2 index 26f5e698..37ae9bf5 100644 --- a/install/roles/automation-hub/templates/cert-manager/02-cluster-issuer.yaml.j2 +++ b/install/roles/automation-hub/templates/cert-manager/02-cluster-issuer.yaml.j2 @@ -7,7 +7,7 @@ spec: email: jstejska@redhat.com privateKeySecretRef: key: key - name: tealc-cert-manager + name: skodjob-cert-manager server: 'https://acme-v02.api.letsencrypt.org/directory' solvers: - dns01: diff --git a/install/roles/automation-hub/templates/cluster-secret.yaml.j2 b/install/roles/automation-hub/templates/cluster-secret.yaml.j2 index f2d17d9a..19c3adda 100644 --- a/install/roles/automation-hub/templates/cluster-secret.yaml.j2 +++ b/install/roles/automation-hub/templates/cluster-secret.yaml.j2 @@ -4,8 +4,7 @@ metadata: name: {{ worker.name }}-access labels: argocd.argoproj.io/secret-type: cluster - app: tealc - project: tealc + project: skodjob environment: {{ worker.environment }} name: {{ worker.name }} workload: "{{ worker.workload }}" diff --git a/install/roles/automation-hub/templates/console-link/tealc-github-tealc.yaml.j2 b/install/roles/automation-hub/templates/console-link/skodjob--github-automation-hub.yaml.j2 similarity index 99% rename from install/roles/automation-hub/templates/console-link/tealc-github-tealc.yaml.j2 rename to install/roles/automation-hub/templates/console-link/skodjob--github-automation-hub.yaml.j2 index f0f3b01b..c6cbc7b9 100644 --- a/install/roles/automation-hub/templates/console-link/tealc-github-tealc.yaml.j2 +++ b/install/roles/automation-hub/templates/console-link/skodjob--github-automation-hub.yaml.j2 @@ -9,6 +9,6 @@ spec: imageURL: >- data:image/png;base64,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 section: Skodjob - href: https://github.com/skodjob/tealc + href: https://github.com/skodjob/automation-hub location: ApplicationMenu text: Github - automation-hub \ No newline at end of file diff --git a/install/roles/automation-hub/templates/console-link/tealc-github-sokar.yaml.j2 b/install/roles/automation-hub/templates/console-link/skodjob-github-deployment-hub.yaml.j2 similarity index 99% rename from install/roles/automation-hub/templates/console-link/tealc-github-sokar.yaml.j2 rename to install/roles/automation-hub/templates/console-link/skodjob-github-deployment-hub.yaml.j2 index 514148eb..04ae768f 100644 --- a/install/roles/automation-hub/templates/console-link/tealc-github-sokar.yaml.j2 +++ b/install/roles/automation-hub/templates/console-link/skodjob-github-deployment-hub.yaml.j2 @@ -9,6 +9,6 @@ spec: imageURL: >- data:image/png;base64,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 section: Skodjob - href: https://github.com/skodjob/tealc + href: https://github.com/skodjob/automation-hub location: ApplicationMenu text: Github - deployment-hub diff --git a/install/roles/automation-hub/templates/console-link/tealc-gitops.yaml.j2 b/install/roles/automation-hub/templates/console-link/skodjob-gitops.yaml.j2 similarity index 100% rename from install/roles/automation-hub/templates/console-link/tealc-gitops.yaml.j2 rename to install/roles/automation-hub/templates/console-link/skodjob-gitops.yaml.j2 diff --git a/install/roles/automation-hub/templates/console-link/tealc-grafana.yaml.j2 b/install/roles/automation-hub/templates/console-link/skodjob-grafana.yaml.j2 similarity index 99% rename from install/roles/automation-hub/templates/console-link/tealc-grafana.yaml.j2 rename to install/roles/automation-hub/templates/console-link/skodjob-grafana.yaml.j2 index 7df7027d..d8036bd9 100644 --- a/install/roles/automation-hub/templates/console-link/tealc-grafana.yaml.j2 +++ b/install/roles/automation-hub/templates/console-link/skodjob-grafana.yaml.j2 @@ -1,7 +1,7 @@ apiVersion: console.openshift.io/v1 kind: ConsoleLink metadata: - name: tealc-grafana + name: skodjob-grafana labels: project: skodjob spec: diff --git a/install/roles/automation-hub/templates/console-link/tealc-pipelines.yaml.j2 b/install/roles/automation-hub/templates/console-link/skodjob-pipelines.yaml.j2 similarity index 100% rename from install/roles/automation-hub/templates/console-link/tealc-pipelines.yaml.j2 rename to install/roles/automation-hub/templates/console-link/skodjob-pipelines.yaml.j2 diff --git a/install/roles/automation-hub/templates/grafana/grafana-data-source.yaml.j2 b/install/roles/automation-hub/templates/grafana/grafana-data-source.yaml.j2 index de2fa8c5..ac291191 100644 --- a/install/roles/automation-hub/templates/grafana/grafana-data-source.yaml.j2 +++ b/install/roles/automation-hub/templates/grafana/grafana-data-source.yaml.j2 @@ -31,7 +31,7 @@ spec: isDefault: false version: 1 editable: true -{% if cluster.name != 'tealc-thanos' %} +{% if cluster.name != 'skodjob-thanos' %} jsonData: tlsSkipVerify: true timeInterval: "5s" diff --git a/install/roles/automation-hub/templates/grafana/grafana.yaml.j2 b/install/roles/automation-hub/templates/grafana/grafana.yaml.j2 index 03cb32fa..05844573 100644 --- a/install/roles/automation-hub/templates/grafana/grafana.yaml.j2 +++ b/install/roles/automation-hub/templates/grafana/grafana.yaml.j2 @@ -53,7 +53,7 @@ roleRef: subjects: - kind: ServiceAccount name: grafana-sa - namespace: tealc-monitoring + namespace: skodjob-monitoring --- apiVersion: grafana.integreatly.org/v1beta1 kind: Grafana diff --git a/install/roles/automation-hub/templates/hive/install-config.yaml.j2 b/install/roles/automation-hub/templates/hive/install-config.yaml.j2 index 53c64dc3..0bee8cf6 100644 --- a/install/roles/automation-hub/templates/hive/install-config.yaml.j2 +++ b/install/roles/automation-hub/templates/hive/install-config.yaml.j2 @@ -22,7 +22,7 @@ networking: hostPrefix: 23 machineNetwork: - cidr: 192.169.0.0/16 - networkType: OpenShiftSDN + networkType: OVNKubernetes serviceNetwork: - 172.30.0.0/16 platform: diff --git a/install/roles/automation-hub/templates/hive/oauth.yaml.j2 b/install/roles/automation-hub/templates/hive/oauth.yaml.j2 index 66778bf9..2074a20d 100644 --- a/install/roles/automation-hub/templates/hive/oauth.yaml.j2 +++ b/install/roles/automation-hub/templates/hive/oauth.yaml.j2 @@ -28,6 +28,6 @@ spec: clientSecret: name: {{ sso_ocp_client_secret }} extraScopes: [] - issuer: https://keycloak-tealc-sso.apps.{{ infra_context_name }}.{{ cluster_domain }}/auth/realms/tealc-realm + issuer: https://keycloak-skodjob-sso.apps.{{ infra_context_name }}.{{ cluster_domain }}/auth/realms/skodjob-realm type: OpenID {% endif %} diff --git a/install/roles/automation-hub/templates/infra-machine-sets.yaml.j2 b/install/roles/automation-hub/templates/infra-machine-sets.yaml.j2 index ea5e2ef8..ac741210 100644 --- a/install/roles/automation-hub/templates/infra-machine-sets.yaml.j2 +++ b/install/roles/automation-hub/templates/infra-machine-sets.yaml.j2 @@ -35,7 +35,6 @@ spec: networks: - subnets: - filter: - name: {{ clusterId }}-nodes tags: openshiftClusterID={{ clusterId }} userDataSecret: name: worker-user-data @@ -93,7 +92,6 @@ spec: networks: - subnets: - filter: - name: {{ clusterId }}-nodes tags: openshiftClusterID={{ clusterId }} userDataSecret: name: worker-user-data @@ -147,7 +145,6 @@ spec: networks: - subnets: - filter: - name: {{ clusterId }}-nodes tags: openshiftClusterID={{ clusterId }} userDataSecret: name: worker-user-data diff --git a/install/roles/automation-hub/templates/logging/install/cluster-logging/02-cluster-logging-instance.yaml.j2 b/install/roles/automation-hub/templates/logging/install/cluster-logging/02-cluster-logging-instance.yaml.j2 index 37735bad..3a596fb3 100644 --- a/install/roles/automation-hub/templates/logging/install/cluster-logging/02-cluster-logging-instance.yaml.j2 +++ b/install/roles/automation-hub/templates/logging/install/cluster-logging/02-cluster-logging-instance.yaml.j2 @@ -1,30 +1,102 @@ --- -apiVersion: logging.openshift.io/v1 -kind: ClusterLogging +apiVersion: v1 +kind: ServiceAccount metadata: - name: instance + name: cluster-logging-sa + namespace: openshift-logging +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: logging-apps-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-logging-write-application-logs +subjects: + - kind: ServiceAccount + name: cluster-logging-sa + namespace: openshift-logging +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: logging-infra-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-logging-write-infrastructure-logs +subjects: + - kind: ServiceAccount + name: cluster-logging-sa + namespace: openshift-logging +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: logging-audit-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-logging-write-audit-logs +subjects: + - kind: ServiceAccount + name: cluster-logging-sa + namespace: openshift-logging +--- +apiVersion: observability.openshift.io/v1 +kind: ClusterLogForwarder +metadata: + name: logging namespace: openshift-logging spec: - collection: - type: vector + managementState: Managed + serviceAccount: + name: cluster-logging-sa + collector: + resources: + limits: {} + requests: {} + nodeSelector: {} tolerations: - effect: NoSchedule key: nodetype value: kafka - effect: NoSchedule key: nodetype - value: connect + value: services - effect: NoSchedule key: nodetype value: logging - effect: NoSchedule key: nodetype value: monitoring - logStore: - lokistack: - name: logging-loki - type: lokistack - managementState: Managed - - - + inputs: + - name: application-logs + type: application + application: + excludes: + - namespace: strimzi-clients + - namespace: strimzi-clients-kraft + - namespace: strimzi-clients-mirror + outputs: + - name: default-lokistack + type: lokiStack + lokiStack: + target: + name: logging-loki + namespace: openshift-logging + authentication: + token: + from: serviceAccount + tls: + ca: + key: service-ca.crt + configMapName: openshift-service-ca.crt + pipelines: + - name: application-and-infra-logs + outputRefs: + - default-lokistack + inputRefs: + - application + - infrastructure diff --git a/install/roles/automation-hub/templates/logging/install/loki/03-loki-stack.yaml.j2 b/install/roles/automation-hub/templates/logging/install/loki/03-loki-stack.yaml.j2 index 728a7dd4..eb0e86b5 100644 --- a/install/roles/automation-hub/templates/logging/install/loki/03-loki-stack.yaml.j2 +++ b/install/roles/automation-hub/templates/logging/install/loki/03-loki-stack.yaml.j2 @@ -22,7 +22,7 @@ spec: mode: openshift-logging template: ingester: - replicas: 3 + replicas: 1 nodeSelector: nodetype: logging tolerations: @@ -31,7 +31,7 @@ spec: operator: Equal value: logging compactor: - replicas: 3 + replicas: 1 nodeSelector: nodetype: logging tolerations: @@ -40,7 +40,7 @@ spec: operator: Equal value: logging distributor: - replicas: 3 + replicas: 1 nodeSelector: nodetype: logging tolerations: diff --git a/install/roles/automation-hub/templates/remote_access_sa.yaml b/install/roles/automation-hub/templates/remote_access_sa.yaml index 5d9045dc..e046d813 100644 --- a/install/roles/automation-hub/templates/remote_access_sa.yaml +++ b/install/roles/automation-hub/templates/remote_access_sa.yaml @@ -7,7 +7,7 @@ metadata: labels: app: strimzi namespace: default - project: tealc + project: skodjob --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding @@ -15,7 +15,7 @@ metadata: name: access-binding labels: app: strimzi - project: tealc + project: skodjob subjects: - kind: ServiceAccount name: access-serviceaccount @@ -23,4 +23,16 @@ subjects: roleRef: kind: ClusterRole name: cluster-admin - apiGroup: rbac.authorization.k8s.io \ No newline at end of file + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: v1 +kind: Secret +type: kubernetes.io/service-account-token +metadata: + name: access-serviceaccount + namespace: default + labels: + app: strimzi + project: skodjob + annotations: + kubernetes.io/service-account.name: access-serviceaccount \ No newline at end of file diff --git a/install/roles/automation-hub/templates/tekton/install/tekton-slack-task.yaml b/install/roles/automation-hub/templates/tekton/install/tekton-slack-task.yaml index c92caf20..17f8413a 100644 --- a/install/roles/automation-hub/templates/tekton/install/tekton-slack-task.yaml +++ b/install/roles/automation-hub/templates/tekton/install/tekton-slack-task.yaml @@ -37,7 +37,7 @@ spec: description: Title of the button steps: - name: post - image: quay.io/tealc/tealc-ee:latest + image: quay.io/tealc/skodjob-ee:latest script: | #!/usr/bin/env sh diff --git a/install/roles/automation-hub/templates/tekton/pipelines/cleaner/tkn-runs-cleanup.yaml b/install/roles/automation-hub/templates/tekton/pipelines/cleaner/tkn-runs-cleanup.yaml index 1826b040..b9d0fe72 100644 --- a/install/roles/automation-hub/templates/tekton/pipelines/cleaner/tkn-runs-cleanup.yaml +++ b/install/roles/automation-hub/templates/tekton/pipelines/cleaner/tkn-runs-cleanup.yaml @@ -23,6 +23,7 @@ spec: restartPolicy: Never containers: - name: kubectl + # TODO Use skodjob-ee from different org image: 'quay.io/tealc/k8s:latest' command: - /bin/bash diff --git a/install/roles/automation-hub/templates/tekton/pipelines/infra/upgrade-worker-cluster.yaml.j2 b/install/roles/automation-hub/templates/tekton/pipelines/infra/upgrade-worker-cluster.yaml.j2 index 6c8ea59d..3bb8e0dd 100644 --- a/install/roles/automation-hub/templates/tekton/pipelines/infra/upgrade-worker-cluster.yaml.j2 +++ b/install/roles/automation-hub/templates/tekton/pipelines/infra/upgrade-worker-cluster.yaml.j2 @@ -22,7 +22,8 @@ spec: - name: pipeline-ws steps: - name: execute-tests - image: quay.io/tealc/apophis:latest + # TODO Use skodjob-ee from different org + image: quay.io/tealc/skodjob-ee:latest env: - name: OC_TOKEN valueFrom: @@ -103,7 +104,7 @@ spec: metadata: generateName: upgrade-{{ name }}-cluster- labels: - app: tealc + app: skodjob spec: pipelineRef: name: upgrade-{{ name }}-cluster-pipeline @@ -166,12 +167,13 @@ spec: spec: containers: - name: notify - image: quay.io/tealc/apophis:latest + # TODO Use skodjob-ee from different org + image: quay.io/tealc/skodjob-ee:latest args: - curl - -d - "{}" - -H - 'Content-Type: application/json' - - el-upgrade-{{ name }}-cluster-event-listener.tealc-pipelines.svc.cluster.local:8080 + - el-upgrade-{{ name }}-cluster-event-listener.skodjob-pipelines.svc.cluster.local:8080 restartPolicy: Never diff --git a/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/image-changer-trigger.yaml b/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/image-changer-trigger.yaml index 4191a079..3f1133eb 100644 --- a/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/image-changer-trigger.yaml +++ b/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/image-changer-trigger.yaml @@ -22,7 +22,8 @@ spec: name: strimzi-image-changer containers: - name: trigger - image: quay.io/tealc/apophis:latest + # TODO Use skodjob-ee from different org + image: quay.io/tealc/skodjob-ee:latest command: - /workspace/entrypoint.sh volumeMounts: @@ -64,5 +65,5 @@ data: if ! grep "${DIGEST_OPERATOR}" "${WORKSPACE}"/deployment-operator.yaml; then echo "[INFO] Going to trigger Operator images update" - curl -d '{"trigger-template": "image-update","params": {"image": "operator"}}' el-strimzi-image-update-event-listener.tealc-pipelines.svc.cluster.local:8080 + curl -d '{"trigger-template": "image-update","params": {"image": "operator"}}' el-strimzi-image-update-event-listener.skodjob-pipelines.svc.cluster.local:8080 fi diff --git a/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/strimzi-image-updater.yaml.j2 b/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/strimzi-image-updater.yaml.j2 index 4674a908..3b7bfd12 100644 --- a/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/strimzi-image-updater.yaml.j2 +++ b/install/roles/automation-hub/templates/tekton/pipelines/strimzi-deployment/strimzi-image-updater.yaml.j2 @@ -18,14 +18,15 @@ spec: workspaces: - name: pipeline-ws steps: - - name: tealc-clone + - name: skodjob-clone image: quay.io/wire/alpine-git script: | export CURRENT_DIR=$(workspaces.pipeline-ws.path)/automation-hub git clone https://github.com/skodjob/automation-hub.git $CURRENT_DIR # This is needed to be sure that all images are pushed, because the webhook pointing to the operator image - name: wait-for-push - image: quay.io/tealc/apophis:latest + # TODO Use skodjob-ee from different org + image: quay.io/tealc/skodjob-ee:latest script: | sleep 5m - name: images-update @@ -54,7 +55,8 @@ spec: secretKeyRef: name: github-secret key: TOKEN - image: quay.io/tealc/apophis:latest + # TODO Use skodjob-ee from different org + image: quay.io/tealc/skodjob-ee:latest script: | $(workspaces.pipeline-ws.path)/automation-hub/image-update/strimzi-image-update.sh echo "[INFO] Done!" diff --git a/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-metrics-collector.yaml b/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-metrics-collector.yaml index 27f701b9..6c302578 100644 --- a/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-metrics-collector.yaml +++ b/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-metrics-collector.yaml @@ -35,11 +35,12 @@ spec: metadata: labels: app: strimzi-e2e-metrics-collector - tealc/kind: strimzi-e2e-exporter + skodjob/kind: strimzi-e2e-exporter spec: serviceAccountName: strimzi-e2e-metrics-collector containers: - name: strimzi-e2e-metrics-collector + # TODO - move to different org and use skodjob-ee image: quay.io/tealc/metrics-collector@sha256:f7adc0b119f1e4fb7df05575e504fd977e57d7fd79e21a1fa135ade15b27bb85 resources: limits: @@ -57,7 +58,7 @@ apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: labels: - app: tealc + app: skodjob name: strimzi-e2e-metrics spec: podMetricsEndpoints: @@ -65,4 +66,4 @@ spec: port: metrics selector: matchLabels: - tealc/kind: strimzi-e2e-exporter + skodjob/kind: strimzi-e2e-exporter diff --git a/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-test-suite.yaml.j2 b/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-test-suite.yaml.j2 index c5ff6c9b..beba0991 100644 --- a/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-test-suite.yaml.j2 +++ b/install/roles/automation-hub/templates/tekton/pipelines/test-suite/strimzi-e2e-test-suite.yaml.j2 @@ -3,7 +3,7 @@ kind: Pipeline metadata: name: strimzi-e2e-test-suite-pipeline labels: - project: tealc + project: skodjob annotations: argocd.argoproj.io/hook: PreSync spec: @@ -72,7 +72,7 @@ spec: image: quay.io/rh_integration/strimzi-tools:latest script: | cd $(workspaces.pipeline-ws.path)/strimzi-e2e/target/surefire-reports - for file in *.xml; do curl -X POST -H "X-Run-ID: $(context.pipelineRun.name)" -d @$file strimzi-e2e-metrics-collector.tealc-pipelines.svc.cluster.local:8080/data; done + for file in *.xml; do curl -X POST -H "X-Run-ID: $(context.pipelineRun.name)" -d @$file strimzi-e2e-metrics-collector.skodjob-pipelines.svc.cluster.local:8080/data; done - name: notify-slack when: - input: $(tasks.status) @@ -100,7 +100,7 @@ kind: TriggerTemplate metadata: name: strimzi-e2e-test-suite-trigger-template labels: - project: tealc + project: skodjob spec: resourcetemplates: - apiVersion: tekton.dev/v1beta1 @@ -108,7 +108,7 @@ spec: metadata: generateName: strimzi-e2e-test-suite- labels: - app: tealc + app: skodjob spec: pipelineRef: name: strimzi-e2e-test-suite-pipeline @@ -130,7 +130,7 @@ kind: TriggerBinding metadata: name: strimzi-e2e-test-suite-triggerbinding labels: - project: tealc + project: skodjob spec: params: - name: message @@ -142,8 +142,8 @@ kind: EventListener metadata: name: strimzi-e2e-test-suite-event-listener labels: - listener: tealc - project: tealc + listener: skodjob + project: skodjob spec: triggers: - name: strimzi-e2e-test-suite-webhook @@ -169,7 +169,7 @@ kind: CronJob metadata: name: strimzi-e2e-test-suite-cron labels: - project: tealc + project: skodjob spec: failedJobsHistoryLimit: 1 successfulJobsHistoryLimit: 1 @@ -180,12 +180,13 @@ spec: spec: containers: - name: notify - image: quay.io/tealc/apophis:latest + # TODO Change org when we will create a new one + image: quay.io/tealc/skodjob-ee:latest args: - curl - -d - "{}" - -H - 'Content-Type: application/json' - - el-strimzi-e2e-test-suite-event-listener.tealc-pipelines.svc.cluster.local:8080 + - el-strimzi-e2e-test-suite-event-listener.skodjob-pipelines.svc.cluster.local:8080 restartPolicy: Never diff --git a/install/roles/automation-hub/templates/worker-machine-sets.yaml.j2 b/install/roles/automation-hub/templates/worker-machine-sets.yaml.j2 index 6f83dcf0..d757bdde 100644 --- a/install/roles/automation-hub/templates/worker-machine-sets.yaml.j2 +++ b/install/roles/automation-hub/templates/worker-machine-sets.yaml.j2 @@ -37,7 +37,6 @@ spec: networks: - subnets: - filter: - name: {{ clusterId }}-nodes tags: openshiftClusterID={{ clusterId }} userDataSecret: name: worker-user-data diff --git a/install/secrets/clusters.yaml b/install/secrets/clusters.yaml index 44956977b6c1cb93c44024454098ba921b5efece..8cdd4f516dd92b2ca4300272eb39164bc0b859ee 100644 GIT binary patch literal 6948 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 literal 43272 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 diff --git a/install/secrets/docker-secret.yaml b/install/secrets/docker-secret.yaml deleted file mode 100644 index d007dc0d52daf762b3bb238fc3079b2e1a99a40c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361 zcmV-v0hay%M@dveQdv+`0BrwS&y?wWX+LTBnAh6rgSuPE#;MyNvxGvhCjL|!xO!-l z*bUW?nvTgWu6iFRmLH5hT$rkhPWhf}11e2vx!`*x4^8p8V>amo`NEesis8Qos}#YZ z&Ty{j56=M}KMaIWn3TWP7KZ!W+K_$LI&7ECqWcgbdTy>@TxIgIG_gnDyUDa?%SP^A z@H<2ut4u?|RUK+DHtA*ZHNrSkB4;r#<+)5*^2f5WE72BZ++8F?SHIJiB?xwnb%J%ovW=*G;N|$ zhgFKf^kqYK*}ibb$B2w>GTkNluJdwfgH}UcvW%+P$b8=6*IGVGz<1QRH}wB%3?V?o z44Rk{S@*Hv#IrHbnE+GTf!Tn<4ucz095XmYf_XL+ty++7n)|uSJgm%3l8gVSlhf0q Hs?%o@y{Wt8 diff --git a/install/secrets/github-secret.yaml b/install/secrets/github-secret.yaml index c09acf87a9912c3cf848493926b6aac551414638..fc2d1cbfa6b692df15a029f0663a18fabfa2507f 100644 GIT binary patch literal 234 zcmVg3=@$aYF;#Ql=%H=R~xTR?2-^Yzf z?Q;TZEKz#474c;5?5=uRY|d0nv_8&)&YU(-Ger!@o>53_6Y8SjYC5uWPvyg@n$i+6 zUedkh$<9!hq=TRRb+{G8k&bd+TGzq{Lb;lKPu_QBL{Am5u_Hoylkz~Gj6~k)^&K*7 kP#M%Yh=cq63;}0%Nsd7g#fcE3aPf2!lae+2g@2W$=o>$CQvd(} literal 194 zcmV;z06qTzM@dveQdv+`0ByB5t((AI-Y>_XdO9_d8gro?oAgc)gzYyd@Vzd&WxEZ3 z7KrG8F=-}~RC1q!8z<)|Nhw#i;sDTnG>+kl@x6GYnMfYm%n9?1*INe;-8N|+6)56C z5}qWR^89?R9RvP}yc1WB5@NC?$d~Wb`6iGSM#jd#w7>;VN`REfNxd9D&v|-fPdd;B w=+tEv)|xtLCqyc^@36fmVhRvEKB@B_pFrBmaWxWpMmgYshtmZcA!(Vmo@6^%-2eap diff --git a/install/secrets/skodjob-install-key.yaml b/install/secrets/skodjob-install-key.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c2fdaac1d95d7993657ccb338d3b35c76e115142 GIT binary patch literal 331 zcmV-R0kr-AM@dveQdv+`0K(lzD|cGh0vp!uB%jVNH7=`R=hTRFoS<%xPGrW*9_)A+n#WAy*90; zj)6@c<79Y1kO8Jkk=B}~_R=tHMPn99_x%_lWvo=^y56(#y$*V~tzk9HHYj>;U(7_H zTNG!b`a*q1i^IYEOt{I@;*3*2EIoWZmw6bx{s8yEl|qmXd6d^n4T=V4!9HJST0^M- zsLe(*lAX{cd?sy?5F&lxxZh2rOmit!V|YYAhn1T(z4_f(Yc*G22ARLY8-{^|Q~qne d$6CRnUZ0Zsx=Y^`>QMTV?pl2WH&Wu>CSh&EpWXlf literal 0 HcmV?d00001 diff --git a/install/secrets/tealc-install-key.yaml b/install/secrets/tealc-install-key.yaml deleted file mode 100644 index ef65786dfb3a8301b75513108654cf8d6a1bc771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}CM@dveQdv+`0NV8A9^;{l13m1t+4_%?Y5`JW%WH9}jf%J^faND3&4(b#$ip&_A(K+Jz0>v1s@Cl5k zKP)vuQXxpY)A*(Jk$rE-HjqwixkQ>n diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh new file mode 100755 index 00000000..9f32a718 --- /dev/null +++ b/scripts/bootstrap.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +source "${DIR}/common.sh" + +# Define variables +SERVICE_ACCOUNT="skodjob-sa" +NAMESPACE="default" +CONFIG_FILE="${DIR}/../install/secrets/clusters.yaml" + +info "Going to use ${NAMESPACE}/${SERVICE_ACCOUNT} service account" + +# Create a service account in the default namespace +oc create sa $SERVICE_ACCOUNT -n $NAMESPACE +# Create token secret +cat << EOF | oc apply -f - +apiVersion: v1 +kind: Secret +type: kubernetes.io/service-account-token +metadata: + name: ${SERVICE_ACCOUNT} + namespace: ${NAMESPACE} + annotations: + kubernetes.io/service-account.name: ${SERVICE_ACCOUNT} +EOF + +# Grant admin rights to the service account +oc adm policy add-cluster-role-to-user cluster-admin -z $SERVICE_ACCOUNT -n $NAMESPACE + +# Retrieve the service account token +TOKEN=$(oc get secret $SERVICE_ACCOUNT -n $NAMESPACE -o jsonpath='{.data.token}' | base64 --decode) + +# Update the token value in the YAML file using yq +if [ -f "$CONFIG_FILE" ]; then + yq e -i ".infra_username = \"$SERVICE_ACCOUNT\"" $CONFIG_FILE + yq e -i ".infra_access_token = \"$TOKEN\"" $CONFIG_FILE + yq e -i ".infra_user_namespace = \"$NAMESPACE\"" $CONFIG_FILE + info "Token updated in $CONFIG_FILE" +else + err_and_exit "Error: $CONFIG_FILE not found." +fi + +info "Do not forget to commit the changes!" diff --git a/scripts/test-github-access.yaml b/scripts/test-github-access.yaml index b1112e97..36961c4c 100644 --- a/scripts/test-github-access.yaml +++ b/scripts/test-github-access.yaml @@ -7,5 +7,5 @@ metadata: spec: containers: - name: myapp-container - image: docker.io/fedora + image: quay.io/fedora command: ['sh', '-c', 'sleep 1d'] \ No newline at end of file diff --git a/tealc-ee/context/Dockerfile b/skodjob-ee/context/Containerfile similarity index 63% rename from tealc-ee/context/Dockerfile rename to skodjob-ee/context/Containerfile index f620111d..46c0d444 100644 --- a/tealc-ee/context/Dockerfile +++ b/skodjob-ee/context/Containerfile @@ -1,14 +1,15 @@ -ARG EE_BASE_IMAGE="quay.io/ansible/awx-ee:latest" +ARG EE_BASE_IMAGE="registry.access.redhat.com/ubi9/ubi:latest" ARG PYCMD="/usr/bin/python3.11" ARG PKGMGR_PRESERVE_CACHE="" ARG ANSIBLE_GALAXY_CLI_COLLECTION_OPTS="" ARG ANSIBLE_GALAXY_CLI_ROLE_OPTS="" -ARG ANSIBLE_INSTALL_REFS="ansible-core==2.15.3 ansible-runner==2.3.4" +ARG ANSIBLE_INSTALL_REFS="ansible-core==2.18.1 ansible-runner==2.4.0" ARG PKGMGR="/usr/bin/dnf" # Base build stage FROM $EE_BASE_IMAGE as base USER root +ENV PIP_BREAK_SYSTEM_PACKAGES=1 ARG EE_BASE_IMAGE ARG PYCMD ARG PKGMGR_PRESERVE_CACHE @@ -17,13 +18,12 @@ ARG ANSIBLE_GALAXY_CLI_ROLE_OPTS ARG ANSIBLE_INSTALL_REFS ARG PKGMGR -RUN $PKGMGR groupinstall -y "Development Tools" -RUN $PKGMGR install -y yum-utils make gcc libcurl-devel libxslt-devel libxml2-devel openssl-devel bzip2-devel libffi-devel zlib-devel python3.11 python3.11-devel httpd-tools -RUN $PYCMD --version -RUN $PYCMD -m ensurepip -RUN $PYCMD -m pip install --no-cache-dir $ANSIBLE_INSTALL_REFS COPY _build/scripts/ /output/scripts/ COPY _build/scripts/entrypoint /opt/builder/bin/entrypoint +RUN $PKGMGR install -y yum-utils make gcc libcurl-devel glibc libxslt-devel libxml2-devel openssl-devel bzip2-devel libffi-devel zlib-devel python3.11 python3.11-devel httpd-tools +RUN $PYCMD --version +RUN /output/scripts/pip_install $PYCMD +RUN $PYCMD -m pip install --no-cache-dir $ANSIBLE_INSTALL_REFS # Galaxy build stage FROM base as galaxy @@ -39,11 +39,13 @@ RUN /output/scripts/check_galaxy COPY _build /build WORKDIR /build +RUN mkdir -p /usr/share/ansible RUN ansible-galaxy role install $ANSIBLE_GALAXY_CLI_ROLE_OPTS -r requirements.yml --roles-path "/usr/share/ansible/roles" RUN ANSIBLE_GALAXY_DISABLE_GPG_VERIFY=1 ansible-galaxy collection install $ANSIBLE_GALAXY_CLI_COLLECTION_OPTS -r requirements.yml --collections-path "/usr/share/ansible/collections" # Builder build stage FROM base as builder +ENV PIP_BREAK_SYSTEM_PACKAGES=1 WORKDIR /build ARG EE_BASE_IMAGE ARG PYCMD @@ -53,17 +55,19 @@ ARG ANSIBLE_GALAXY_CLI_ROLE_OPTS ARG ANSIBLE_INSTALL_REFS ARG PKGMGR -RUN $PYCMD -m pip install --no-cache-dir bindep pyyaml requirements-parser +RUN $PYCMD -m pip install --no-cache-dir bindep pyyaml packaging COPY --from=galaxy /usr/share/ansible /usr/share/ansible COPY _build/requirements.txt requirements.txt COPY _build/bindep.txt bindep.txt -RUN $PYCMD /output/scripts/introspect.py introspect --sanitize --user-pip=requirements.txt --user-bindep=bindep.txt --write-bindep=/tmp/src/bindep.txt --write-pip=/tmp/src/requirements.txt +COPY _build/exclude-bindep.txt exclude-bindep.txt +RUN $PYCMD /output/scripts/introspect.py introspect --user-pip=requirements.txt --user-bindep=bindep.txt --exclude-bindep-reqs=exclude-bindep.txt --write-bindep=/tmp/src/bindep.txt --write-pip=/tmp/src/requirements.txt RUN /output/scripts/assemble # Final build stage FROM base as final +ENV PIP_BREAK_SYSTEM_PACKAGES=1 ARG EE_BASE_IMAGE ARG PYCMD ARG PKGMGR_PRESERVE_CACHE @@ -83,9 +87,10 @@ RUN mkdir -p /build && chgrp 0 /build && chmod -R ug+rwx /build WORKDIR /build RUN $PYCMD -m pip install --no-cache-dir 'dumb-init==1.2.5' RUN echo This is a post-install command! -RUN curl https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/4.14.1/openshift-client-linux-4.14.1.tar.gz -o openshift-client-linux.tar.gz && tar xzf openshift-client-linux.tar.gz && rm -f openshift-client-linux.tar.gz && mv oc /usr/bin/oc && mv kubectl /usr/bin/kubectl -RUN /usr/bin/dnf install -y https://kojipkgs.fedoraproject.org//packages/git-crypt/0.6.0/7.el8/x86_64/git-crypt-0.6.0-7.el8.x86_64.rpm -RUN curl -O https://mirror.openshift.com/pub/rhacs/assets/4.4.2/bin/Linux/roxctl && chmod +x roxctl && mv roxctl /usr/bin/roxctl +RUN wget https://github.com/mikefarah/yq/releases/download/v4.44.6/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq +RUN export ARCH=$(uname -m) && curl https://mirror.openshift.com/pub/openshift-v4/$ARCH/clients/ocp/latest-4.17/openshift-client-linux.tar.gz -o openshift-client-linux.tar.gz && tar xzf openshift-client-linux.tar.gz && rm -f openshift-client-linux.tar.gz && mv oc /usr/bin/oc && mv kubectl /usr/bin/kubectl +RUN export ARCH=$(uname -m) && /usr/bin/dnf install -y https://kojipkgs.fedoraproject.org//packages/git-crypt/0.7.0/1.el9/$ARCH/git-crypt-0.7.0-1.el9.$ARCH.rpm +RUN curl -O https://mirror.openshift.com/pub/rhacs/assets/4.6.1/bin/Linux/roxctl && chmod +x roxctl && mv roxctl /usr/bin/roxctl RUN curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash && mv kustomize /usr/bin/ RUN curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash RUN rm -rf /output diff --git a/tealc-ee/context/_build/bindep.txt b/skodjob-ee/context/_build/bindep.txt similarity index 54% rename from tealc-ee/context/_build/bindep.txt rename to skodjob-ee/context/_build/bindep.txt index 9f5a6395..75fb5a89 100644 --- a/tealc-ee/context/_build/bindep.txt +++ b/skodjob-ee/context/_build/bindep.txt @@ -3,4 +3,4 @@ wget tar skopeo maven -java-17-openjdk-devel \ No newline at end of file +java-21-openjdk-devel \ No newline at end of file diff --git a/skodjob-ee/context/_build/exclude-bindep.txt b/skodjob-ee/context/_build/exclude-bindep.txt new file mode 100644 index 00000000..d9cb843f --- /dev/null +++ b/skodjob-ee/context/_build/exclude-bindep.txt @@ -0,0 +1 @@ +openshift-clients \ No newline at end of file diff --git a/tealc-ee/context/_build/requirements.txt b/skodjob-ee/context/_build/requirements.txt similarity index 100% rename from tealc-ee/context/_build/requirements.txt rename to skodjob-ee/context/_build/requirements.txt diff --git a/tealc-ee/context/_build/requirements.yml b/skodjob-ee/context/_build/requirements.yml similarity index 100% rename from tealc-ee/context/_build/requirements.yml rename to skodjob-ee/context/_build/requirements.yml diff --git a/tealc-ee/context/_build/scripts/assemble b/skodjob-ee/context/_build/scripts/assemble similarity index 99% rename from tealc-ee/context/_build/scripts/assemble rename to skodjob-ee/context/_build/scripts/assemble index 65adabe1..c04c5f1a 100755 --- a/tealc-ee/context/_build/scripts/assemble +++ b/skodjob-ee/context/_build/scripts/assemble @@ -31,8 +31,6 @@ PKGMGR_PRESERVE_CACHE="${PKGMGR_PRESERVE_CACHE:-}" PYCMD="${PYCMD:=/usr/bin/python3}" PIPCMD="${PIPCMD:=$PYCMD -m pip}" -$PYCMD -m ensurepip - if [ -z $PKGMGR ]; then # Expect dnf to be installed, however if we find microdnf default to it. PKGMGR=/usr/bin/dnf @@ -43,7 +41,7 @@ fi if [ "$PKGMGR" = "/usr/bin/microdnf" ] then - if [ -z $PKGMGR_OPTS ]; then + if [ -z "${PKGMGR_OPTS}" ]; then # NOTE(pabelanger): skip install docs and weak dependencies to # make smaller images. Sadly, setting these in dnf.conf don't # appear to work. diff --git a/tealc-ee/context/_build/scripts/check_ansible b/skodjob-ee/context/_build/scripts/check_ansible similarity index 100% rename from tealc-ee/context/_build/scripts/check_ansible rename to skodjob-ee/context/_build/scripts/check_ansible diff --git a/tealc-ee/context/_build/scripts/check_galaxy b/skodjob-ee/context/_build/scripts/check_galaxy similarity index 100% rename from tealc-ee/context/_build/scripts/check_galaxy rename to skodjob-ee/context/_build/scripts/check_galaxy diff --git a/tealc-ee/context/_build/scripts/entrypoint b/skodjob-ee/context/_build/scripts/entrypoint similarity index 100% rename from tealc-ee/context/_build/scripts/entrypoint rename to skodjob-ee/context/_build/scripts/entrypoint diff --git a/tealc-ee/context/_build/scripts/install-from-bindep b/skodjob-ee/context/_build/scripts/install-from-bindep similarity index 98% rename from tealc-ee/context/_build/scripts/install-from-bindep rename to skodjob-ee/context/_build/scripts/install-from-bindep index 228ac3e8..cee2068d 100755 --- a/tealc-ee/context/_build/scripts/install-from-bindep +++ b/skodjob-ee/context/_build/scripts/install-from-bindep @@ -25,8 +25,6 @@ PYCMD="${PYCMD:=/usr/bin/python3}" PIPCMD="${PIPCMD:=$PYCMD -m pip}" PIP_OPTS="${PIP_OPTS-}" -$PYCMD -m ensurepip - if [ -z $PKGMGR ]; then # Expect dnf to be installed, however if we find microdnf default to it. PKGMGR=/usr/bin/dnf @@ -37,7 +35,7 @@ fi if [ "$PKGMGR" = "/usr/bin/microdnf" ] then - if [ -z $PKGMGR_OPTS ]; then + if [ -z "${PKGMGR_OPTS}" ]; then # NOTE(pabelanger): skip install docs and weak dependencies to # make smaller images. Sadly, setting these in dnf.conf don't # appear to work. diff --git a/skodjob-ee/context/_build/scripts/introspect.py b/skodjob-ee/context/_build/scripts/introspect.py new file mode 100644 index 00000000..43c97825 --- /dev/null +++ b/skodjob-ee/context/_build/scripts/introspect.py @@ -0,0 +1,507 @@ +from __future__ import annotations + +import argparse +import logging +import os +import re +import sys +import yaml + +from packaging.requirements import InvalidRequirement, Requirement + + +BASE_COLLECTIONS_PATH = '/usr/share/ansible/collections' + + +# regex for a comment at the start of a line, or embedded with leading space(s) +COMMENT_RE = re.compile(r'(?:^|\s+)#.*$') + + +EXCLUDE_REQUIREMENTS = frozenset(( + # obviously already satisfied or unwanted + 'ansible', 'ansible-base', 'python', 'ansible-core', + # general python test requirements + 'tox', 'pycodestyle', 'yamllint', 'pylint', + 'flake8', 'pytest', 'pytest-xdist', 'coverage', 'mock', 'testinfra', + # test requirements highly specific to Ansible testing + 'ansible-lint', 'molecule', 'galaxy-importer', 'voluptuous', + # already present in image for py3 environments + 'yaml', 'pyyaml', 'json', +)) + + +logger = logging.getLogger(__name__) + + +class CollectionDefinition: + """ + This class represents the dependency metadata for a collection + should be replaced by logic to hit the Galaxy API if made available + """ + + def __init__(self, collection_path): + self.reference_path = collection_path + + # NOTE: Filenames should match constants.DEAFULT_EE_BASENAME and constants.YAML_FILENAME_EXTENSIONS. + meta_file_base = os.path.join(collection_path, 'meta', 'execution-environment') + ee_exists = False + for ext in ('yml', 'yaml'): + meta_file = f"{meta_file_base}.{ext}" + if os.path.exists(meta_file): + with open(meta_file, 'r') as f: + self.raw = yaml.safe_load(f) + ee_exists = True + break + + if not ee_exists: + self.raw = {'version': 1, 'dependencies': {}} + # Automatically infer requirements for collection + for entry, filename in [('python', 'requirements.txt'), ('system', 'bindep.txt')]: + candidate_file = os.path.join(collection_path, filename) + if has_content(candidate_file): + self.raw['dependencies'][entry] = filename + + def target_dir(self): + namespace, name = self.namespace_name() + return os.path.join( + BASE_COLLECTIONS_PATH, 'ansible_collections', + namespace, name + ) + + def namespace_name(self): + "Returns 2-tuple of namespace and name" + path_parts = [p for p in self.reference_path.split(os.path.sep) if p] + return tuple(path_parts[-2:]) + + def get_dependency(self, entry): + """A collection is only allowed to reference a file by a relative path + which is relative to the collection root + """ + req_file = self.raw.get('dependencies', {}).get(entry) + if req_file is None: + return None + if os.path.isabs(req_file): + raise RuntimeError( + 'Collections must specify relative paths for requirements files. ' + f'The file {req_file} specified by {self.reference_path} violates this.' + ) + + return req_file + + +def line_is_empty(line): + return bool((not line.strip()) or line.startswith('#')) + + +def read_req_file(path): + """Provide some minimal error and display handling for file reading""" + if not os.path.exists(path): + print(f'Expected requirements file not present at: {os.path.abspath(path)}') + with open(path, 'r') as f: + return f.read() + + +def pip_file_data(path): + pip_content = read_req_file(path) + + pip_lines = [] + for line in pip_content.split('\n'): + if line_is_empty(line): + continue + if line.startswith('-r') or line.startswith('--requirement'): + _, new_filename = line.split(None, 1) + new_path = os.path.join(os.path.dirname(path or '.'), new_filename) + pip_lines.extend(pip_file_data(new_path)) + else: + pip_lines.append(line) + + return pip_lines + + +def bindep_file_data(path): + sys_content = read_req_file(path) + + sys_lines = [] + for line in sys_content.split('\n'): + if line_is_empty(line): + continue + sys_lines.append(line) + + return sys_lines + + +def process_collection(path): + """Return a tuple of (python_dependencies, system_dependencies) for the + collection install path given. + Both items returned are a list of dependencies. + + :param str path: root directory of collection (this would contain galaxy.yml file) + """ + col_def = CollectionDefinition(path) + + py_file = col_def.get_dependency('python') + pip_lines = [] + if py_file: + pip_lines = pip_file_data(os.path.join(path, py_file)) + + sys_file = col_def.get_dependency('system') + bindep_lines = [] + if sys_file: + bindep_lines = bindep_file_data(os.path.join(path, sys_file)) + + return (pip_lines, bindep_lines) + + +def process(data_dir=BASE_COLLECTIONS_PATH, + user_pip=None, + user_bindep=None, + exclude_pip=None, + exclude_bindep=None, + exclude_collections=None): + """ + Build a dictionary of Python and system requirements from any collections + installed in data_dir, and any user specified requirements. + + Excluded requirements, if any, will be inserted into the return dict. + + Example return dict: + { + 'python': { + 'collection.a': ['abc', 'def'], + 'collection.b': ['ghi'], + 'user': ['jkl'], + 'exclude: ['abc'], + }, + 'system': { + 'collection.a': ['ZYX'], + 'user': ['WVU'], + 'exclude': ['ZYX'], + }, + 'excluded_collections': [ + 'a.b', + ] + } + """ + paths = [] + path_root = os.path.join(data_dir, 'ansible_collections') + + # build a list of all the valid collection paths + if os.path.exists(path_root): + for namespace in sorted(os.listdir(path_root)): + if not os.path.isdir(os.path.join(path_root, namespace)): + continue + for name in sorted(os.listdir(os.path.join(path_root, namespace))): + collection_dir = os.path.join(path_root, namespace, name) + if not os.path.isdir(collection_dir): + continue + files_list = os.listdir(collection_dir) + if 'galaxy.yml' in files_list or 'MANIFEST.json' in files_list: + paths.append(collection_dir) + + # populate the requirements content + py_req = {} + sys_req = {} + for path in paths: + col_pip_lines, col_sys_lines = process_collection(path) + col_def = CollectionDefinition(path) + namespace, name = col_def.namespace_name() + key = f'{namespace}.{name}' + + if col_pip_lines: + py_req[key] = col_pip_lines + + if col_sys_lines: + sys_req[key] = col_sys_lines + + # add on entries from user files, if they are given + if user_pip: + col_pip_lines = pip_file_data(user_pip) + if col_pip_lines: + py_req['user'] = col_pip_lines + if exclude_pip: + col_pip_exclude_lines = pip_file_data(exclude_pip) + if col_pip_exclude_lines: + py_req['exclude'] = col_pip_exclude_lines + if user_bindep: + col_sys_lines = bindep_file_data(user_bindep) + if col_sys_lines: + sys_req['user'] = col_sys_lines + if exclude_bindep: + col_sys_exclude_lines = bindep_file_data(exclude_bindep) + if col_sys_exclude_lines: + sys_req['exclude'] = col_sys_exclude_lines + + retval = { + 'python': py_req, + 'system': sys_req, + } + + if exclude_collections: + # This file should just be a newline separated list of collection names, + # so reusing bindep_file_data() to read it should work fine. + excluded_collection_list = bindep_file_data(exclude_collections) + if excluded_collection_list: + retval['excluded_collections'] = excluded_collection_list + + return retval + + +def has_content(candidate_file): + """Beyond checking that the candidate exists, this also assures + that the file has something other than whitespace, + which can cause errors when given to pip. + """ + if not os.path.exists(candidate_file): + return False + with open(candidate_file, 'r') as f: + content = f.read() + return bool(content.strip().strip('\n')) + + +def strip_comments(reqs: dict[str, list]) -> dict[str, list]: + """ + Filter any comments out of the Python collection requirements input. + + :param dict reqs: A dict of Python requirements, keyed by collection name. + + :return: Same as the input parameter, except with no comment lines. + """ + result: dict[str, list] = {} + for collection, lines in reqs.items(): + for line in lines: + # strip comments + if (base_line := COMMENT_RE.sub('', line.strip())): + result.setdefault(collection, []).append(base_line) + + return result + + +def should_be_excluded(value: str, exclusion_list: list[str]) -> bool: + """ + Test if `value` matches against any value in `exclusion_list`. + + The exclusion_list values are either strings to be compared in a case-insensitive + manner against value, OR, they are regular expressions to be tested against the + value. A regular expression will contain '~' as the first character. + + :return: True if the value should be excluded, False otherwise. + """ + for exclude_value in exclusion_list: + if exclude_value[0] == "~": + pattern = exclude_value[1:] + if re.fullmatch(pattern.lower(), value.lower()): + return True + elif exclude_value.lower() == value.lower(): + return True + return False + + +def filter_requirements(reqs: dict[str, list], + exclude: list[str] | None = None, + exclude_collections: list[str] | None = None, + is_python: bool = True) -> list[str]: + """ + Given a dictionary of Python requirement lines keyed off collections, + return a list of cleaned up (no source comments) requirements + annotated with comments indicating the sources based off the collection keys. + + Currently, non-pep508 compliant Python entries are passed through. We also no + longer attempt to normalize names (replace '_' with '-', etc), other than + lowercasing it for exclusion matching, since we no longer are attempting + to combine similar entries. + + :param dict reqs: A dict of either Python or system requirements, keyed by collection name. + :param list exclude: A list of requirements to be excluded from the output. + :param list exclude_collections: A list of collection names from which to exclude all requirements. + :param bool is_python: This should be set to True for Python requirements, as each + will be tested for PEP508 compliance. This should be set to False for system requirements. + + :return: A list of filtered and annotated requirements. + """ + exclusions: list[str] = [] + collection_ignore_list: list[str] = [] + + if exclude: + exclusions = exclude.copy() + if exclude_collections: + collection_ignore_list = exclude_collections.copy() + + annotated_lines: list[str] = [] + uncommented_reqs = strip_comments(reqs) + + for collection, lines in uncommented_reqs.items(): + # Bypass this collection if we've been told to ignore all requirements from it. + if should_be_excluded(collection, collection_ignore_list): + logger.debug("# Excluding all requirements from collection '%s'", collection) + continue + + for line in lines: + # Determine the simple name based on type of requirement + if is_python: + try: + parsed_req = Requirement(line) + name = parsed_req.name + except InvalidRequirement: + logger.warning( + "Passing through non-PEP508 compliant line '%s' from collection '%s'", + line, collection + ) + annotated_lines.append(line) # We intentionally won't annotate these lines (multi-line?) + continue + else: + # bindep system requirements have the package name as the first "word" on the line + name = line.split(maxsplit=1)[0] + + if collection.lower() not in {'user', 'exclude'}: + lower_name = name.lower() + + if lower_name in EXCLUDE_REQUIREMENTS: + logger.debug("# Excluding requirement '%s' from '%s'", name, collection) + continue + + if should_be_excluded(lower_name, exclusions): + logger.debug("# Explicitly excluding requirement '%s' from '%s'", name, collection) + continue + + annotated_lines.append(f'{line} # from collection {collection}') + + return annotated_lines + + +def parse_args(args=None): + + parser = argparse.ArgumentParser( + prog='introspect', + description=( + 'ansible-builder introspection; injected and used during execution environment build' + ) + ) + + subparsers = parser.add_subparsers( + help='The command to invoke.', + dest='action', + required=True, + ) + + create_introspect_parser(subparsers) + + return parser.parse_args(args) + + +def run_introspect(args, log): + data = process(args.folder, + user_pip=args.user_pip, + user_bindep=args.user_bindep, + exclude_pip=args.exclude_pip, + exclude_bindep=args.exclude_bindep, + exclude_collections=args.exclude_collections) + log.info('# Dependency data for %s', args.folder) + + excluded_collections = data.pop('excluded_collections', None) + + data['python'] = filter_requirements( + data['python'], + exclude=data['python'].pop('exclude', []), + exclude_collections=excluded_collections, + ) + + data['system'] = filter_requirements( + data['system'], + exclude=data['system'].pop('exclude', []), + exclude_collections=excluded_collections, + is_python=False + ) + + print('---') + print(yaml.dump(data, default_flow_style=False)) + + if args.write_pip and data.get('python'): + write_file(args.write_pip, data.get('python') + ['']) + if args.write_bindep and data.get('system'): + write_file(args.write_bindep, data.get('system') + ['']) + + sys.exit(0) + + +def create_introspect_parser(parser): + introspect_parser = parser.add_parser( + 'introspect', + help='Introspects collections in folder.', + description=( + 'Loops over collections in folder and returns data about dependencies. ' + 'This is used internally and exposed here for verification. ' + 'This is targeted toward collection authors and maintainers.' + ) + ) + introspect_parser.add_argument('--sanitize', action='store_true', + help=argparse.SUPPRESS) + + introspect_parser.add_argument( + 'folder', default=BASE_COLLECTIONS_PATH, nargs='?', + help=( + 'Ansible collections path(s) to introspect. ' + 'This should have a folder named ansible_collections inside of it.' + ) + ) + + introspect_parser.add_argument( + '--user-pip', dest='user_pip', + help='An additional file to combine with collection pip requirements.' + ) + introspect_parser.add_argument( + '--user-bindep', dest='user_bindep', + help='An additional file to combine with collection bindep requirements.' + ) + introspect_parser.add_argument( + '--exclude-bindep-reqs', dest='exclude_bindep', + help='An additional file to exclude specific bindep requirements from collections.' + ) + introspect_parser.add_argument( + '--exclude-pip-reqs', dest='exclude_pip', + help='An additional file to exclude specific pip requirements from collections.' + ) + introspect_parser.add_argument( + '--exclude-collection-reqs', dest='exclude_collections', + help='An additional file to exclude all requirements from the listed collections.' + ) + introspect_parser.add_argument( + '--write-pip', dest='write_pip', + help='Write the combined pip requirements file to this location.' + ) + introspect_parser.add_argument( + '--write-bindep', dest='write_bindep', + help='Write the combined bindep requirements file to this location.' + ) + + return introspect_parser + + +def write_file(filename: str, lines: list) -> bool: + parent_dir = os.path.dirname(filename) + if parent_dir and not os.path.exists(parent_dir): + logger.warning('Creating parent directory for %s', filename) + os.makedirs(parent_dir) + new_text = '\n'.join(lines) + if os.path.exists(filename): + with open(filename, 'r') as f: + if f.read() == new_text: + logger.debug("File %s is already up-to-date.", filename) + return False + logger.warning('File %s had modifications and will be rewritten', filename) + with open(filename, 'w') as f: + f.write(new_text) + return True + + +def main(): + args = parse_args() + + if args.action == 'introspect': + run_introspect(args, logger) + + logger.error("An error has occurred.") + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/skodjob-ee/context/_build/scripts/pip_install b/skodjob-ee/context/_build/scripts/pip_install new file mode 100755 index 00000000..46fcdde7 --- /dev/null +++ b/skodjob-ee/context/_build/scripts/pip_install @@ -0,0 +1,56 @@ +#!/bin/bash +# Copyright (c) 2024 Red Hat, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##################################################################### +# Script to encapsulate pip installation. +# +# Usage: pip_install +# +# Options: +# PYCMD - The path to the python executable to use. +##################################################################### + +set -x + +PYCMD=$1 + +if [ -z "$PYCMD" ] +then + echo "Usage: pip_install " + exit 1 +fi + +if [ ! -x "$PYCMD" ] +then + echo "$PYCMD is not an executable" + exit 1 +fi + +# This is going to be our default functionality for now. This will likely +# need to change if we add support for non-RHEL distros. +$PYCMD -m ensurepip --root / + +if [ $? -ne 0 ] +then + cat< bool: - parent_dir = os.path.dirname(filename) - if parent_dir and not os.path.exists(parent_dir): - logger.warning('Creating parent directory for %s', filename) - os.makedirs(parent_dir) - new_text = '\n'.join(lines) - if os.path.exists(filename): - with open(filename, 'r') as f: - if f.read() == new_text: - logger.debug("File %s is already up-to-date.", filename) - return False - else: - logger.warning('File %s had modifications and will be rewritten', filename) - with open(filename, 'w') as f: - f.write(new_text) - return True - - -def main(): - args = parse_args() - - if args.action == 'introspect': - run_introspect(args, logger) - - logger.error("An error has occurred.") - sys.exit(1) - - -if __name__ == '__main__': - main() diff --git a/tealc-ee/execution-environment.yml b/tealc-ee/execution-environment.yml deleted file mode 100644 index f3f7a77c..00000000 --- a/tealc-ee/execution-environment.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -version: 3 - -dependencies: - ansible_core: - package_pip: ansible-core==2.15.3 - ansible_runner: - package_pip: ansible-runner==2.3.4 - galaxy: ../install/collections/requirements.yml - system: - - jq - - wget - - tar - - skopeo - - maven - - java-17-openjdk-devel - python: - - python-openstackclient - - awscli - - passlib - python_interpreter: - python_path: "/usr/bin/python3.11" - -images: - base_image: - name: quay.io/ansible/awx-ee:latest - -additional_build_steps: - prepend_base: - - RUN $PKGMGR groupinstall -y "Development Tools" - - RUN $PKGMGR install -y yum-utils make gcc libcurl-devel libxslt-devel libxml2-devel openssl-devel bzip2-devel libffi-devel zlib-devel python3.11 python3.11-devel httpd-tools - - RUN $PYCMD --version - append_final: - - RUN echo This is a post-install command! - - RUN curl https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/4.14.1/openshift-client-linux-4.14.1.tar.gz -o openshift-client-linux.tar.gz && tar xzf openshift-client-linux.tar.gz && rm -f openshift-client-linux.tar.gz && mv oc /usr/bin/oc && mv kubectl /usr/bin/kubectl - - RUN /usr/bin/dnf install -y https://kojipkgs.fedoraproject.org//packages/git-crypt/0.6.0/7.el8/x86_64/git-crypt-0.6.0-7.el8.x86_64.rpm - - RUN curl -O https://mirror.openshift.com/pub/rhacs/assets/4.4.2/bin/Linux/roxctl && chmod +x roxctl && mv roxctl /usr/bin/roxctl - - RUN curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash && mv kustomize /usr/bin/ - - RUN curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash - -options: - workdir: /build - user: root