main.yml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. ---
  2. # Fixes the openshift-marketplace catalogs by recreating them from original images.
  3. #
  4. # IMPORTANT: Wherever this role is applied, there must be a files/pull-secret.yml!
  5. #
  6. # REQUIRED:
  7. #
  8. # ocp_maj OpenShift version (x.y; re catalogsource image)
  9. #
  10. # registry_server the server catalogs come from (vars/main.yml, used in
  11. # catalog_sources, but in pull secret check, too)
  12. # removed_sources the catalog sources we remove (vars/main.yml)
  13. # catalog_sources the catalog sources we recreate (vars/main.yml)
  14. #
  15. # OPTIONAL:
  16. #
  17. # kubeadmin_config kubeadmin (or other admin) credentials (tmp/kubeconfig-ocp4)
  18. #
  19. # These would usually come from inventory, and should point to a single
  20. # manifest and its CSV that we can use to verify catalog sources were created
  21. # and populated successfully:
  22. #
  23. # vrfy_cat catalog source
  24. # vrfy_pkg operator package name
  25. # vrfy_chn channel we look in
  26. # vrfy_csv csv we look for
  27. #
  28. # NOTE: Fixing existing subscriptions, patching their catalogs, changing CSVs,
  29. # etc., is performed by deploy-operators role.
  30. #
  31. # This is necessary immediately after lab create.
  32. - name: Wait for the marketplace-operator to be up
  33. kubernetes.core.k8s_info:
  34. kubeconfig: "{{ kubeadmin_config }}"
  35. validate_certs: no
  36. api_version: v1
  37. kind: pod
  38. namespace: openshift-marketplace
  39. label_selectors:
  40. - name=marketplace-operator
  41. register: mktplc_pod
  42. until:
  43. - (mktplc_pod.resources | length) == 1
  44. - mktplc_pod.resources[0].status.containerStatuses[0].ready
  45. retries: 30
  46. delay: 10
  47. - name: Make sure the course catalog is not there
  48. kubernetes.core.k8s:
  49. kubeconfig: "{{ kubeadmin_config }}"
  50. validate_certs: no
  51. api_version: operators.coreos.com/v1alpha1
  52. kind: catalogsource
  53. namespace: openshift-marketplace
  54. name: "{{ item }}"
  55. state: absent
  56. loop: "{{ removed_sources }}"
  57. - name: Extract the pull-secret in openshift-config namespace
  58. kubernetes.core.k8s_info:
  59. kubeconfig: "{{ kubeadmin_config }}"
  60. validate_certs: no
  61. api_version: v1
  62. kind: secret
  63. namespace: openshift-config
  64. name: pull-secret
  65. register: existing_pull_secret
  66. - name: Try to extract the credential for registry_server
  67. ansible.builtin.set_fact:
  68. regsvr_cred: |
  69. {{ existing_pull_secret.resources[0].data['.dockerconfigjson'] | b64decode | from_json |
  70. community.general.json_query('auths."' + registry_server + '".auth') }}
  71. - name: Make sure the pull secret will do for online sources if the existing one does not suffice
  72. kubernetes.core.k8s:
  73. kubeconfig: "{{ kubeadmin_config }}"
  74. validate_certs: no
  75. api_version: v1
  76. kind: secret
  77. namespace: openshift-config
  78. name: pull-secret
  79. state: present
  80. definition: "{{ lookup('file', 'files/pull-secret.yml') | from_yaml }}"
  81. when: regsvr_cred is not defined or regsvr_cred == None or regsvr_cred == ''
  82. - name: Try to obtain cluster version if not set by ocp_maj
  83. block:
  84. - name: Read clusterversion/version
  85. kubernetes.core.k8s_info:
  86. kubeconfig: "{{ kubeadmin_config }}"
  87. validate_certs: no
  88. api_version: config.openshift.io/v1
  89. kind: clusterversion
  90. name: version
  91. register: clusterversion
  92. - name: Store it as a fact
  93. ansible.builtin.set_fact:
  94. ocp_z: "{{ clusterversion.resources[0].status.desired.version }}"
  95. - name: Store the major version as well
  96. ansible.builtin.set_fact:
  97. ocp_maj: "{{ ocp_z | ansible.builtin.regex_replace('\\.\\d+$', '') }}"
  98. when: ocp_maj is not defined
  99. # TODO: switch to patch operatorhubs/cluster?
  100. - name: Ensure the standard catalog sources are there
  101. kubernetes.core.k8s:
  102. kubeconfig: "{{ kubeadmin_config }}"
  103. validate_certs: no
  104. api_version: operators.coreos.com/v1alpha1
  105. kind: catalogsource
  106. namespace: openshift-marketplace
  107. name: "{{ item.name }}"
  108. state: present
  109. definition:
  110. spec:
  111. displayName: "{{ item.displ }}"
  112. image: "{{ item.image }}"
  113. publisher: "Red Hat"
  114. sourceType: "grpc"
  115. grpcPodConfig:
  116. extractContent:
  117. cacheDir: /tmp/cache
  118. catalogDir: /configs
  119. memoryTarget: 120Mi
  120. nodeSelector:
  121. kubernetes.io/os: linux
  122. node-role.kubernetes.io/master: ""
  123. priorityClassName: system-cluster-critical
  124. securityContextConfig: restricted
  125. tolerations:
  126. - effect: NoSchedule
  127. key: node-role.kubernetes.io/master
  128. operator: Exists
  129. - effect: NoExecute
  130. key: node.kubernetes.io/unreachable
  131. operator: Exists
  132. tolerationSeconds: 120
  133. - effect: NoExecute
  134. key: node.kubernetes.io/not-ready
  135. operator: Exists
  136. tolerationSeconds: 120
  137. loop: "{{ catalog_sources }}"
  138. loop_control:
  139. label: "{{ item.displ }}"
  140. - name: Wait for the catalogsources to be ready.
  141. kubernetes.core.k8s_info:
  142. kubeconfig: "{{ kubeadmin_config }}"
  143. validate_certs: no
  144. api_version: operators.coreos.com/v1alpha1
  145. kind: catalogsource
  146. namespace: openshift-marketplace
  147. name: "{{ item.name }}"
  148. register: cat_stat
  149. until:
  150. - (cat_stat.resources | length) == 1
  151. - cat_stat.resources[0].status is defined
  152. - cat_stat.resources[0].status.connectionState.lastObservedState == "READY"
  153. retries: 30
  154. delay: 10
  155. loop: "{{ catalog_sources }}"
  156. loop_control:
  157. label: "{{ item.displ }}"
  158. - name: Verify correct deployment
  159. block:
  160. - name: Wait for the operator packagemanifest to appear.
  161. kubernetes.core.k8s_info:
  162. kubeconfig: "{{ kubeadmin_config }}"
  163. validate_certs: no
  164. api_version: packages.operators.coreos.com/v1
  165. kind: packagemanifest
  166. namespace: openshift-marketplace
  167. name: "{{ vrfy_pkg }}"
  168. register: vrfy_mft
  169. until:
  170. - (vrfy_mft.resources | length) == 1
  171. - vrfy_mft.resources[0].status.catalogSource == vrfy_cat
  172. - vrfy_mft.resources[0].status.packageName == vrfy_pkg
  173. retries: 60
  174. delay: 10
  175. - ansible.builtin.assert:
  176. that:
  177. - vrfy_mft.resources is defined
  178. - (vrfy_mft.resources | length) > 0
  179. - vrfy_mft.resources[0].status.catalogSource == vrfy_cat
  180. - 'vrfy_csv in (vrfy_mft.resources[0] | community.general.json_query("status.channels[?name==`" + vrfy_chn + "`].entries[*].name") | list)[0]'
  181. fail_msg: "ERROR: {{ vrfy_pkg }} package manifest not deployed correctly."
  182. success_msg: "OK: {{ vrfy_pkg }} package manifest configured correctly."
  183. when:
  184. - vrfy_cat is defined
  185. - vrfy_pkg is defined
  186. - vrfy_chn is defined
  187. - vrfy_csv is defined
  188. ...