Skip to content

Commit 8883f50

Browse files
committed
feat: Add option to use preexisting clusters for DR clusters
Set byoc variable and add secrets to secret template
1 parent 0d2cdc8 commit 8883f50

6 files changed

Lines changed: 336 additions & 16 deletions

File tree

Makefile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,14 @@
22
# This Makefile includes the common pattern targets from Makefile-common
33
# You can add custom targets above or below the include line
44

5+
.PHONY: install
6+
install: ramen-prereq pattern-install ## Installs the pattern onto a cluster (Loads secrets as well if configured)
7+
8+
9+
510
include Makefile-common
11+
12+
.PHONY: ramen-prereq
13+
ramen-prereq: ## Check if values.byoc false do nothing, else run the precheck agains clusters accessed from values-secrets
14+
echo "Running precheck for ramendr"
15+
cd ansible && ansible-playbook -i hosts $(EXTRA_ARGS) $(EXTRA_VARS) playbooks/validate_byoc.yml
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
---
2+
- name: Validates that the regional clusters are good to use (byoc)
3+
hosts: localhost
4+
connection: local
5+
gather_facts: false
6+
roles:
7+
- role: rhvp.cluster_utils.pattern_settings
8+
vars:
9+
pattern_dir: "{{ playbook_dir }}/../../"
10+
- role: rhvp.cluster_utils.find_vp_secrets
11+
vars:
12+
byoc_enabled: false
13+
tasks:
14+
- name: Set fact for clsutergroup name
15+
ansible.builtin.set_fact:
16+
clustergroup_name: "{{ values_global.main.clusterGroupName }}"
17+
18+
- name: Load values-{clustergroup_name}.yaml
19+
ansible.builtin.set_fact:
20+
values_clustergroup: "{{ lookup('file', pattern_dir + '/values-' + clustergroup_name + '.yaml') | from_yaml }}"
21+
22+
- name: Set fact for thew rdr app
23+
ansible.builtin.set_fact:
24+
rdr_app: "{{ values_clustergroup.clusterGroup.applications.rdr }}"
25+
26+
- name: Load rdr values yaml
27+
ansible.builtin.set_fact:
28+
rdr_values: "{{ lookup('file', pattern_dir + rdr_app.path + '/values.yaml') | from_yaml }}"
29+
30+
- name: Set byoc for the playbook
31+
ansible.builtin.set_fact:
32+
byoc_enabled: true
33+
when:
34+
- ((rdr_app.overrides | default([]) | selectattr('name', 'eq', 'byoc')|first).value | default(false)) or (rdr_values.byoc)
35+
36+
- name: Set fact for secretStore backend
37+
ansible.builtin.set_fact:
38+
secrets_backing_store: "{{ values_global.global.secretStore.backend | default('vault') }}"
39+
when: byoc_enabled
40+
41+
- name: Parse secrets data
42+
no_log: "{{ hide_sensitive_output | default(true) }}"
43+
rhvp.cluster_utils.parse_secrets_info:
44+
values_secrets_plaintext: "{{ values_secrets_data }}"
45+
secrets_backing_store: "{{ secrets_backing_store }}"
46+
register: secrets_results
47+
when: byoc_enabled
48+
49+
- name: Check byoc if we need to
50+
when: byoc_enabled
51+
block:
52+
- name: Set facts for dr clusters backend
53+
ansible.builtin.set_fact:
54+
clusters:
55+
primary_cluster: "{{ secrets_results.parsed_secrets['ocp-primary_cluster_kubeconfig'].fields.kubeconfig }}"
56+
secondary_cluster: "{{ secrets_results.parsed_secrets['ocp-secondary_cluster_kubeconfig'].fields.kubeconfig }}"
57+
58+
- name: Get a tempfile for the kubeconfigs
59+
ansible.builtin.tempfile:
60+
state: directory
61+
register: kubeconfigs_tempfolder
62+
63+
- name: Store pull secrets in tempfile
64+
ansible.builtin.copy:
65+
dest: "{{ kubeconfigs_tempfolder.path }}/{{ cluster.key }}"
66+
content: "{{ cluster.value }}"
67+
mode: "0644"
68+
loop_control:
69+
loop_var: cluster
70+
label: "{{ cluster.key }}"
71+
loop: "{{ clusters | dict2items }}"
72+
73+
- name: Check that both DR clusters are reachable
74+
kubernetes.core.k8s_cluster_info:
75+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/{{ cluster.key }}"
76+
register: api_status
77+
loop_control:
78+
loop_var: cluster
79+
label: "{{ cluster.key }}"
80+
loop: "{{ clusters | dict2items }}"
81+
82+
- name: Hub cluster version
83+
kubernetes.core.k8s_info:
84+
api: config.openshift.io/v1
85+
kind: ClusterVersion
86+
name: version
87+
register: hub_clusterversion_raw
88+
89+
- name: Primary cluster version
90+
kubernetes.core.k8s_info:
91+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/primary_cluster"
92+
api: config.openshift.io/v1
93+
kind: ClusterVersion
94+
name: version
95+
register: primary_clusterversion_raw
96+
97+
- name: Secondary cluster version
98+
kubernetes.core.k8s_info:
99+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/secondary_cluster"
100+
api: config.openshift.io/v1
101+
kind: ClusterVersion
102+
name: version
103+
register: secondary_clusterversion_raw
104+
105+
- name: Set fact for cluster minor.major versions
106+
ansible.builtin.set_fact:
107+
primary_cluster_version: "{{ primary_clusterversion_raw.resources[0].status.desired.version.split('.')[:2] | join('.') }}"
108+
secondary_cluster_version: "{{ secondary_clusterversion_raw.resources[0].status.desired.version.split('.')[:2] | join('.') }}"
109+
hub_cluster_version: "{{ hub_clusterversion_raw.resources[0].status.desired.version.split('.')[:2] | join('.') }}"
110+
111+
- name: Validate BYOC DR Clusters have the same minor version between 4.18 and 4.20
112+
ansible.builtin.assert:
113+
that:
114+
- hub_cluster_version is ansible.builtin.version("4.18", ">=")
115+
- hub_cluster_version is ansible.builtin.version("4.20", "<=")
116+
- primary_cluster_version is ansible.builtin.version(hub_cluster_version)
117+
- secondary_cluster_version is ansible.builtin.version(hub_cluster_version)
118+
fail_msg: |
119+
FATAL: BYOC DR Clusters have different versions:
120+
Primary: {{ primary_cluster_version }}, Secondary: {{ secondary_cluster_version }} HUB: {{ hub_cluster_version }}).
121+
Currently only same minor verion supported by ramenDR and odf.
122+
123+
- name: Hub cluster network
124+
kubernetes.core.k8s_info:
125+
api: config.openshift.io/v1
126+
kind: Network
127+
name: cluster
128+
register: hub_clusternetwork_raw
129+
130+
- name: Primary cluster network
131+
kubernetes.core.k8s_info:
132+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/primary_cluster"
133+
api: config.openshift.io/v1
134+
kind: Network
135+
name: cluster
136+
register: primary_clusternetwork_raw
137+
138+
- name: Secondary cluster network
139+
kubernetes.core.k8s_info:
140+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/secondary_cluster"
141+
api: config.openshift.io/v1
142+
kind: Network
143+
name: cluster
144+
register: secondary_clusternetwork_raw
145+
146+
- name: Set fact for cluster network vars
147+
ansible.builtin.set_fact:
148+
hub_cluster_cluster_cidr: "{{ hub_clusternetwork_raw.resources[0].spec.clusterNetwork[0].cidr }}"
149+
hub_cluster_service_cidr: "{{ hub_clusternetwork_raw.resources[0].spec.serviceNetwork[0] }}"
150+
primary_cluster_cluster_cidr: "{{ primary_clusternetwork_raw.resources[0].spec.clusterNetwork[0].cidr }}"
151+
primary_cluster_service_cidr: "{{ primary_clusternetwork_raw.resources[0].spec.serviceNetwork[0] }}"
152+
secondary_cluster_cluster_cidr: "{{ secondary_clusternetwork_raw.resources[0].spec.clusterNetwork[0].cidr }}"
153+
secondary_cluster_service_cidr: "{{ secondary_clusternetwork_raw.resources[0].spec.serviceNetwork[0] }}"
154+
155+
- name: Validate BYOC DR Clusters have non overlapping pod networks.
156+
ansible.builtin.assert:
157+
that:
158+
- not (hub_cluster_cluster_cidr | ansible.utils.ipaddr(primary_cluster_cluster_cidr))
159+
- not (hub_cluster_cluster_cidr | ansible.utils.ipaddr(secondary_cluster_cluster_cidr))
160+
- not (primary_cluster_cluster_cidr | ansible.utils.ipaddr(secondary_cluster_cluster_cidr))
161+
fail_msg: |
162+
FATAL: BYOC DR Clusters have overlapping pod networks :
163+
Primary: {{ primary_cluster_cluster_cidr }}, Secondary: {{ secondary_cluster_cluster_cidr }} HUB: {{ hub_cluster_cluster_cidr }}).
164+
165+
- name: Validate BYOC DR Clusters have non overlapping service networks.
166+
ansible.builtin.assert:
167+
that:
168+
- not (hub_cluster_service_cidr | ansible.utils.ipaddr(primary_cluster_service_cidr))
169+
- not (hub_cluster_service_cidr | ansible.utils.ipaddr(secondary_cluster_service_cidr))
170+
- not (primary_cluster_service_cidr | ansible.utils.ipaddr(secondary_cluster_service_cidr))
171+
fail_msg: |
172+
FATAL: BYOC DR Clusters have overlapping service networks:
173+
Primary: {{ primary_cluster_service_cidr }}, Secondary: {{ secondary_cluster_service_cidr }} HUB: {{ hub_cluster_service_cidr }}).
174+
175+
- name: Get primary cluster node info
176+
kubernetes.core.k8s_info:
177+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/primary_cluster"
178+
kind: Node
179+
label_selectors:
180+
- node-role.kubernetes.io/worker
181+
register: primary_nodes_raw
182+
183+
- name: Build instance type list (primary)
184+
set_fact:
185+
primary_worker_instance_types: "{{ primary_worker_instance_types | default([]) + [ item.metadata.labels['node.kubernetes.io/instance-type'] ] }}"
186+
loop: "{{ primary_nodes_raw.resources }}"
187+
loop_control:
188+
label: "{{ item.metadata.name }}"
189+
when: item.metadata.labels is defined and
190+
'node.kubernetes.io/instance-type' in item.metadata.labels
191+
192+
- name: Make instance types unique (primary-cluster)
193+
set_fact:
194+
primary_worker_instance_types: "{{ primary_worker_instance_types | unique }}"
195+
196+
- name: Get secondary cluster node info
197+
kubernetes.core.k8s_info:
198+
kubeconfig: "{{ kubeconfigs_tempfolder.path }}/secondary_cluster"
199+
kind: Node
200+
label_selectors:
201+
- node-role.kubernetes.io/worker
202+
register: secondary_nodes_raw
203+
204+
- name: Build instance type list (secondary)
205+
set_fact:
206+
secondary_worker_instance_types: "{{ secondary_worker_instance_types | default([]) + [ item.metadata.labels['node.kubernetes.io/instance-type'] ] }}"
207+
loop_control:
208+
label: "{{ item.metadata.name }}"
209+
loop: "{{ secondary_nodes_raw.resources }}"
210+
when: item.metadata.labels is defined and
211+
'node.kubernetes.io/instance-type' in item.metadata.labels
212+
213+
- name: Make instance types unique (primary-cluster)
214+
set_fact:
215+
secondary_worker_instance_types: "{{ secondary_worker_instance_types | unique }}"
216+
217+
- name: Validate BYOC DR Clusters have metal node to run virtual machine workload
218+
ansible.builtin.assert:
219+
that:
220+
- primary_worker_instance_types | select('search', 'metal') | list | length > 0
221+
- secondary_worker_instance_types | select('search', 'metal') | list | length > 0
222+
fail_msg: |
223+
FATAL: BYOC DR Clusters have no metal nodes:
224+
Primary: {{ primary_worker_instance_types }}).
225+
Secondary: {{ primary_worker_instance_types }}).

0 commit comments

Comments
 (0)