123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- ---
- - debug:
- msg: Deploying operator {{ op.op_pkg }} in namespace {{ op.op_nsp }}...
- - name: Check if the CSV exists already
- k8s_info:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: operators.coreos.com/v1alpha1
- kind: clusterserviceversion
- register: all_csv
- - name: Find the wanted CSV among all CSVs
- set_fact:
- found_csv: '{{ (all_csv | community.general.json_query("resources[?contains(metadata.name, `" + op.op_pkg + ".`)]")) }}'
- when:
- - all_csv.resources is defined
- - (all_csv.resources | length) > 0
- - name: Get details about the CSV if found
- set_fact:
- csv_ns: "{{ found_csv[0] | community.general.json_query('metadata.namespace') }}"
- csv_name: "{{ found_csv[0] | community.general.json_query('metadata.name') }}"
- when:
- - found_csv is defined
- - (found_csv | length) > 0
- - debug:
- msg: Operator {{ op.op_pkg }} is already installed in {{ csv_ns }} as {{ csv_name }} (desired_csv == {{ op.desired_csv }}).
- when:
- - csv_ns is defined
- - csv_name is defined
- - name: Only proceed here if the CSV was not found anywhere yet
- block:
-
- - name: Get packagemanifest
- k8s_info:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: packages.operators.coreos.com/v1
- kind: packagemanifest
- namespace: openshift-marketplace
- name: "{{ op.op_pkg }}"
- register: pkg_mft
- - name: Search for any channels that provide desired_csv
- set_fact:
- found_chn: '{{ (pkg_mft | community.general.json_query("resources[0].status.channels[?currentCSV == `" + op.desired_csv + "`].name")) }}'
- when:
- - pkg_mft is defined
- - pkg_mft.resources | length > 0
- - name: Fail if no channel provides the desired_csv
- fail:
- msg: No {{ op.op_pkg }} channel provides {{ op.desired_csv }}
- when:
- - found_chn is defined
- - found_chn | length == 0
- - name: Fail if selected channel does not provide the desired_csv
- fail:
- msg: Operator {{ op.op_pkg }} selected channel {{ op.op_chn }} does not provide {{ op.desired_csv }} - {{ found_chn }}
- when:
- - found_chn is defined
- - found_chn | length > 0
- - op.op_chn not in found_chn
-
- - name: Make sure the namespace is there
- k8s:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: v1
- kind: namespace
- name: "{{ op.op_nsp }}"
-
- - name: See if there are any OperatorGroups
- k8s_info:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: operators.coreos.com/v1
- kind: operatorgroup
- namespace: "{{ op.op_nsp }}"
- register: found_opgrp
- - name: Die if more than one OG
- ansible.builtin.fail:
- msg: More than one OperatorGroup found in project.
- when: (found_opgrp.resources | length) > 1
- - name: Die if op_mod is not recognised
- ansible.builtin.fail:
- msg: Unrecognised op.op_mod ({{ op.op_mod }})
- when: op.op_mod not in ["all", "self"]
- - name: Die if op_mod does not match found OG mode
- ansible.builtin.fail:
- msg: Found OG mode does not match required ({{ op.op_mod }})
- when: |
- ((found_opgrp.resources | length) == 1 and op.op_mod == "all" and found_opgrp.resources[0].status.namespaces != [""]) or
- ((found_opgrp.resources | length) == 1 and op.op_mod == "self" and found_opgrp.resources[0].status.namespaces != [op.op_nsp])
- - name: Set fact for namespaces of OG if we require all
- set_fact:
- og_spec: []
- when:
- - op.op_mod == "all"
- - (found_opgrp.resources | length) == 0
- - name: Set fact for namespaces of OG if we require self
- set_fact:
- og_spec: ["{{op.op_nsp}}"]
- when:
- - op.op_mod == "self"
- - (found_opgrp.resources | length) == 0
- - name: Create the OperatorGroup if not there
- k8s:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: operators.coreos.com/v1
- kind: operatorgroup
- namespace: "{{ op.op_nsp }}"
- name: "{{ op.op_nsp }}"
- definition:
- spec:
- targetNamespaces: "{{ og_spec }}"
- when: (found_opgrp.resources | length) == 0
-
- - name: Also make sure there is a subscription
- k8s:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: operators.coreos.com/v1alpha1
- kind: subscription
- namespace: "{{ op.op_nsp }}"
- name: "{{ op.op_pkg }}"
- definition:
- spec:
- source: "{{ op.op_cat }}"
- sourceNamespace: openshift-marketplace
- name: "{{ op.op_pkg }}"
- channel: "{{ op.op_chn }}"
- installPlanApproval: Automatic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - name: Wait for CSV to show up and complete
- k8s_info:
- kubeconfig: tmp/kubeconfig-ocp4
- validate_certs: no
- api_version: operators.coreos.com/v1alpha1
- kind: clusterserviceversion
- namespace: "{{ op.op_nsp }}"
- name: "{{ op.desired_csv }}"
- register: new_csv
- until:
- - new_csv.resources is defined
- - (new_csv.resources | length) > 0
- - new_csv.resources[0].status is defined
- - new_csv.resources[0].status.phase == "Succeeded"
- retries: 30
- delay: 10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - debug:
- msg: Operator {{ op.op_pkg }} deployed in namespace {{ op.op_nsp }} with CSV {{ op.desired_csv }}!
- when: found_csv is not defined or (found_csv | length) == 0
- ...
|