Skip to content

Commit 879f3a1

Browse files
authored
Merge pull request #15 from mhjacks/test_byoc
Add BYOC
2 parents 99b4afd + 1c11631 commit 879f3a1

7 files changed

Lines changed: 231 additions & 5 deletions

File tree

Changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,4 @@ v1.1 - April 2026
3030
* Change submariner to use vxlan mode by default, for compatibility reasons
3131
* Default to OCP 4.20+. The subscription for OADP requires "stable" channel not "stable-1.4".
3232
* Numerous small changes to deal with race conditions and other potential issues
33+
* Introduce "BYOC" (bring-your-own-cluster) as an option for cluster provisioning (thanks @darkdoc)

Makefile

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

overrides/values-cluster-names.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,10 @@ clusterOverrides:
2727
# DRPC overrides (preferredCluster defaults to primary if unset)
2828
drpc:
2929
preferredCluster: ocp-primary
30+
31+
# Set this to "true", provision clusters, and add their kubeconfigs
32+
# as described in the values-secret template; then run
33+
# ./pattern.sh make install-byoc.
34+
# That target will run a validation play to ensure the cluster
35+
# setup will work with ramen patterns
36+
byoc: false

requirements.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
---
22
collections:
33
- kubernetes.core
4+
- name: https://github.com/mhjacks/rhvp.cluster_utils
5+
type: git
6+
version: v1

values-hub.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,10 @@ clusterGroup:
110110
name: regional-dr
111111
namespace: regional-dr
112112
project: opp
113-
repoURL: https://github.com/validatedpatterns/regionaldr-with-virt-chart.git
114-
chartVersion: main
113+
#repoURL: https://github.com/validatedpatterns/regionaldr-with-virt-chart.git
114+
#chartVersion: main
115+
repoURL: https://github.com/mhjacks/regionaldr-with-virt-chart.git
116+
chartVersion: test_byoc
115117
path: "."
116118
annotations:
117119
argocd.argoproj.io/sync-wave: "10"

values-secret.yaml.template

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# NEVER COMMIT THESE VALUES TO GIT
33
version: "2.0"
44
secrets:
5-
# This is to make the secrets available to spoke clusters
5+
# This is to make the secrets available to spoke clusters
66
- name: vm-ssh
77
vaultPrefixes:
88
- global
@@ -16,7 +16,7 @@ secrets:
1616
- name: publickey
1717
value: 'Public ssh key of the user who will be able to elevate to root to provision kiosks'
1818

19-
# This is to make the secrets available to spoke clusters
19+
# This is to make the secrets available to spoke clusters
2020
- name: cloud-init
2121
vaultPrefixes:
2222
- global
@@ -49,3 +49,14 @@ secrets:
4949
fields:
5050
- name: .dockerconfigjson
5151
value: "A standard OpenShift pull secret"
52+
53+
# These are needed if you want to use and import your own regional clusters
54+
# by setting byoc: true in rdr chart
55+
# - name: ocp-primary_cluster_kubeconfig
56+
# fields:
57+
# - name: kubeconfig
58+
# path: path to kubeconfig for the cluster
59+
# - name: ocp-secondary_cluster_kubeconfig
60+
# fields:
61+
# - name: kubeconfig
62+
# path: path to kubeconfig for the cluster

0 commit comments

Comments
 (0)