Skip to content

Commit 193aafa

Browse files
committed
[OSPRH-15434] Automate deploy of multi-namespace RHOSO
1 parent 0f6096b commit 193aafa

File tree

16 files changed

+774
-12
lines changed

16 files changed

+774
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
- name: Prepare the BGP hypervisor with needed configuration
3+
hosts: "{{ cifmw_target_host | default('localhost') }}"
4+
tasks:
5+
- name: Fetch the already deployed services for further usage
6+
environment:
7+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
8+
PATH: "{{ cifmw_path }}"
9+
ansible.builtin.command:
10+
cmd: >-
11+
oc get osdps
12+
--namespace openstack2
13+
--no-headers
14+
-o custom-columns=":metadata.name"
15+
changed_when: false
16+
register: _ci_gen_kustomize_deployed_services_stdout
17+
18+
- name: Expose the deployed services as a fact
19+
ansible.builtin.set_fact:
20+
ci_gen_kustomize_edpm_nodeset_predeployed_services2: >-
21+
{{
22+
_ci_gen_kustomize_deployed_services_stdout.stdout_lines | default ([])
23+
}}
24+
25+
- name: Feed generated content to main play
26+
ansible.builtin.copy:
27+
dest: "{{ cifmw_basedir }}/artifacts/pre_stage_9_run_get_openstackdataplaneservices.yml"
28+
content: |
29+
ci_gen_kustomize_edpm_nodeset_predeployed_services2: {{ ci_gen_kustomize_edpm_nodeset_predeployed_services2 }}
30+
mode: "0644"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
- name: Post-deployment admin setup steps for namespace {{ cifmw_os_net_setup_namespace }}
3+
hosts: "{{ cifmw_target_host | default('localhost') }}"
4+
gather_facts: false
5+
tasks:
6+
- name: Load parameters files
7+
ansible.builtin.include_vars:
8+
dir: "{{ cifmw_basedir }}/artifacts/parameters"
9+
10+
- name: Create openstack network elements
11+
vars:
12+
cifmw_os_net_setup_config:
13+
- name: public
14+
external: true
15+
shared: false
16+
is_default: true
17+
provider_network_type: flat
18+
provider_physical_network: datacentre
19+
availability_zone_hints: []
20+
subnets:
21+
- name: public_subnet
22+
cidr: "{{ cifmw_os_net_setup_public_cidr }}"
23+
allocation_pool_start: "{{ cifmw_os_net_setup_public_start }}"
24+
allocation_pool_end: "{{ cifmw_os_net_setup_public_end }}"
25+
gateway_ip: "{{ cifmw_os_net_setup_public_gateway }}"
26+
enable_dhcp: true
27+
cifmw_os_net_subnetpool_config:
28+
- name: shared-pool-ipv4
29+
default_prefix_length: 26
30+
prefixes: '10.1.0.0/20'
31+
is_default: true
32+
is_shared: true
33+
- name: shared-pool-ipv6
34+
default_prefix_length: 64
35+
prefixes: 'fdfe:391f:8400::/56'
36+
is_default: true
37+
is_shared: true
38+
ansible.builtin.import_role:
39+
name: os_net_setup
40+
when: not cifmw_skip_os_net_setup | default('false') | bool
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
- name: Validation for namespace {{ cifmw_test_operator_namespace }}
3+
hosts: "{{ cifmw_target_host | default('localhost') }}"
4+
tasks:
5+
- name: "Run tests for namespace {{ cifmw_test_operator_namespace }}"
6+
tags:
7+
- tests
8+
ansible.builtin.import_role:
9+
name: "{{ cifmw_run_test_role | default('tempest') }}"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
# source: multi-namespace/edpm-nodeset-values/values.yaml.j2
3+
{% set _ipv = cifmw_ci_gen_kustomize_values_ip_version_var_mapping %}
4+
{% set instances_names = [] %}
5+
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
6+
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
7+
{% set _original_services = _original_nodeset['services'] | default([]) %}
8+
{% set _vm_type = (_original_nodes.keys() | first).split('-')[1] %}
9+
{% for _inst in cifmw_networking_env_definition.instances.keys() %}
10+
{% if _inst.startswith(_vm_type ~ "-") %}
11+
{% set _ = instances_names.append(_inst) %}
12+
{% endif %}
13+
{% endfor %}
14+
data:
15+
ssh_keys:
16+
authorized: {{ cifmw_ci_gen_kustomize_values_ssh_authorizedkeys | b64encode }}
17+
private: {{ cifmw_ci_gen_kustomize_values_ssh_private_key | b64encode }}
18+
public: {{ cifmw_ci_gen_kustomize_values_ssh_public_key | b64encode }}
19+
nodeset:
20+
ansible:
21+
ansibleUser: "zuul"
22+
ansibleVars:
23+
edpm_fips_mode: "{{ 'enabled' if cifmw_fips_enabled|default(false)|bool else 'check' }}"
24+
timesync_ntp_servers:
25+
- hostname: "{{ cifmw_ci_gen_kustomize_values_ntp_srv | default('pool.ntp.org') }}"
26+
edpm_network_config_os_net_config_mappings:
27+
{% for instance in instances_names %}
28+
edpm-{{ instance }}:
29+
{% if hostvars[instance] is defined %}
30+
nic1: "{{ hostvars[instance][_ipv.ansible_default_ipvX].macaddress }}"
31+
{% endif %}
32+
nic2: "{{ cifmw_networking_env_definition.instances[instance].networks.ctlplane.mac_addr }}"
33+
{% endfor %}
34+
{% if cifmw_ci_gen_kustomize_values_sshd_ranges | default([]) | length > 0 %}
35+
edpm_sshd_allowed_ranges:
36+
{% for range in cifmw_ci_gen_kustomize_values_sshd_ranges %}
37+
- "{{ range }}"
38+
{% endfor %}
39+
{% endif %}
40+
nodes:
41+
{% for instance in instances_names %}
42+
edpm-{{ instance }}:
43+
ansible:
44+
host: {{ cifmw_networking_env_definition.instances[instance].networks.ctlplane[_ipv.ip_vX] }}
45+
hostName: {{ instance }}
46+
networks:
47+
{% for net in cifmw_networking_env_definition.instances[instance].networks.keys() %}
48+
- name: {{ net }}
49+
subnetName: subnet1
50+
fixedIP: {{ cifmw_networking_env_definition.instances[instance].networks[net][_ipv.ip_vX] }}
51+
{% if net is match('ctlplane') %}
52+
defaultRoute: true
53+
{% endif %}
54+
{% endfor %}
55+
{% endfor %}
56+
{% if ('repo-setup' not in _original_services) and
57+
('repo-setup' in ci_gen_kustomize_edpm_nodeset_predeployed_services) %}
58+
services:
59+
- "repo-setup"
60+
{% for svc in _original_services %}
61+
- "{{ svc }}"
62+
{% endfor %}
63+
{% endif %}
64+
65+
{% if _vm_type.startswith('compute') %}
66+
nova:
67+
migration:
68+
ssh_keys:
69+
private: {{ cifmw_ci_gen_kustomize_values_migration_priv_key | b64encode }}
70+
public: {{ cifmw_ci_gen_kustomize_values_migration_pub_key | b64encode }}
71+
{% endif %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
---
2+
# source: multi-namespace/edpm-nodeset2-values/values.yaml.j2
3+
{% set _ipv = cifmw_ci_gen_kustomize_values_ip_version_var_mapping %}
4+
{% set instances_names = [] %}
5+
{% set _original_nodeset = (original_content.data | default({})).nodeset | default({}) %}
6+
{% set _original_nodes = _original_nodeset.nodes | default({}) %}
7+
{% set _original_services = _original_nodeset['services'] | default([]) %}
8+
{% set _vm_type = (_original_nodes.keys() | first).split('-')[1] %}
9+
{{ '#vmtype: ' ~ _vm_type }}
10+
{% for _inst in cifmw_networking_env_definition.instances.keys() %}
11+
{% if _inst.startswith(_vm_type ~ "2-") %}
12+
{% set _ = instances_names.append(_inst) %}
13+
{% endif %}
14+
{{ '#' ~ _inst }}
15+
{% endfor %}
16+
data:
17+
ssh_keys:
18+
authorized: {{ cifmw_ci_gen_kustomize_values_ssh_authorizedkeys | b64encode }}
19+
private: {{ cifmw_ci_gen_kustomize_values_ssh_private_key | b64encode }}
20+
public: {{ cifmw_ci_gen_kustomize_values_ssh_public_key | b64encode }}
21+
nodeset:
22+
ansible:
23+
ansibleUser: "zuul"
24+
ansibleVars:
25+
edpm_fips_mode: "{{ 'enabled' if cifmw_fips_enabled|default(false)|bool else 'check' }}"
26+
timesync_ntp_servers:
27+
- hostname: "{{ cifmw_ci_gen_kustomize_values_ntp_srv | default('pool.ntp.org') }}"
28+
edpm_network_config_os_net_config_mappings:
29+
{% for instance in instances_names %}
30+
edpm-{{ instance }}:
31+
{% if hostvars[instance] is defined %}
32+
nic1: "{{ hostvars[instance][_ipv.ansible_default_ipvX].macaddress }}"
33+
{% endif %}
34+
nic2: "{{ cifmw_networking_env_definition.instances[instance].networks.ctlplane2.mac_addr }}"
35+
{% endfor %}
36+
{% if cifmw_ci_gen_kustomize_values_sshd_ranges | default([]) | length > 0 %}
37+
edpm_sshd_allowed_ranges:
38+
{% for range in cifmw_ci_gen_kustomize_values_sshd_ranges %}
39+
- "{{ range }}"
40+
{% endfor %}
41+
{% endif %}
42+
nodes:
43+
{% for instance in instances_names %}
44+
edpm-{{ instance }}:
45+
ansible:
46+
host: {{ cifmw_networking_env_definition.instances[instance].networks.ctlplane2[_ipv.ip_vX] }}
47+
hostName: {{ instance }}
48+
networks:
49+
{% for net in cifmw_networking_env_definition.instances[instance].networks.keys() %}
50+
- name: {{ net | replace('2', '') }}
51+
subnetName: subnet1
52+
fixedIP: {{ cifmw_networking_env_definition.instances[instance].networks[net][_ipv.ip_vX] }}
53+
{% if net is match('ctlplane2') %}
54+
defaultRoute: true
55+
{% endif %}
56+
{% endfor %}
57+
{% endfor %}
58+
{% if ('repo-setup' not in _original_services) and
59+
('repo-setup' in ci_gen_kustomize_edpm_nodeset_predeployed_services2 | default([])) %}
60+
services:
61+
- "repo-setup"
62+
{% for svc in _original_services %}
63+
- "{{ svc }}"
64+
{% endfor %}
65+
{% endif %}
66+
67+
{% if _vm_type.startswith('compute') %}
68+
nova:
69+
migration:
70+
ssh_keys:
71+
private: {{ cifmw_ci_gen_kustomize_values_migration_priv_key | b64encode }}
72+
public: {{ cifmw_ci_gen_kustomize_values_migration_pub_key | b64encode }}
73+
{% endif %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
---
2+
# source: multi-namespace/network-values2/values.yaml.j2
3+
{% set _ipv = cifmw_ci_gen_kustomize_values_ip_version_var_mapping %}
4+
{% set ns = namespace(interfaces={},
5+
ocp_index=0,
6+
lb_tools={}) %}
7+
data:
8+
{% for host in cifmw_networking_env_definition.instances.keys() -%}
9+
{% if host is match('^(ocp|crc).*') %}
10+
node_{{ ns.ocp_index }}:
11+
{% set ns.ocp_index = ns.ocp_index+1 %}
12+
name: {{ cifmw_networking_env_definition.instances[host]['hostname'] }}
13+
{% for network in cifmw_networking_env_definition.instances[host]['networks'].values() %}
14+
{% set ns.interfaces = ns.interfaces |
15+
combine({network.network_name: (network.parent_interface |
16+
default(network.interface_name)
17+
)
18+
},
19+
recursive=true) %}
20+
{% if "2" in network.network_name %}
21+
{{ network.network_name | replace("2", "") }}_ip: {{ network[_ipv.ip_vX] }}
22+
{% endif %}
23+
{% endfor %}
24+
{% endif %}
25+
{% endfor %}
26+
27+
{% for network in cifmw_networking_env_definition.networks.values() if "2" in network %}
28+
{% set ns.lb_tools = {} %}
29+
{{ network.network_name | replace("2", "") }}:
30+
dnsDomain: {{ network.search_domain }}
31+
{% if network.tools is defined and network.tools.keys() | length > 0 %}
32+
subnets:
33+
{% for tool in network.tools.keys() %}
34+
{% if tool is match('.*lb$') %}
35+
{% set _ = ns.lb_tools.update({tool: []}) %}
36+
{% endif %}
37+
{% endfor %}
38+
- allocationRanges:
39+
{% for range in network.tools.netconfig[_ipv.ipvX_ranges] %}
40+
- end: {{ range.end }}
41+
start: {{ range.start }}
42+
{% endfor %}
43+
cidr: {{ network[_ipv.network_vX] }}
44+
{% if network[_ipv.gw_vX] is defined %}
45+
gateway: {{ network[_ipv.gw_vX] }}
46+
{% endif %}
47+
name: subnet1
48+
{% if network.vlan_id is defined %}
49+
vlan: {{ network.vlan_id }}
50+
{% endif %}
51+
{% if ns.lb_tools | length > 0 %}
52+
lb_addresses:
53+
{% for tool in ns.lb_tools.keys() %}
54+
{% for lb_range in network.tools[tool][_ipv.ipvX_ranges] %}
55+
- {{ lb_range.start }}-{{ lb_range.end }}
56+
{% set _ = ns.lb_tools[tool].append(lb_range.start) %}
57+
{% endfor %}
58+
endpoint_annotations:
59+
{{ tool }}.universe.tf/address-pool: {{ network.network_name }}
60+
{{ tool }}.universe.tf/allow-shared-ip: {{ network.network_name }}
61+
{{ tool }}.universe.tf/loadBalancerIPs: {{ ','.join(ns.lb_tools[tool]) }}
62+
{% endfor %}
63+
{% endif %}
64+
{% endif %}
65+
prefix-length: {{ network[_ipv.network_vX] | ansible.utils.ipaddr('prefix') }}
66+
mtu: {{ network.mtu | default(1500) }}
67+
{% if network.vlan_id is defined %}
68+
vlan: {{ network.vlan_id }}
69+
{% if ns.interfaces[network.network_name] is defined %}
70+
iface: {{ network.network_name }}
71+
base_iface: {{ ns.interfaces[network.network_name] }}
72+
{% endif %}
73+
{% else %}
74+
{% if ns.interfaces[network.network_name] is defined %}
75+
iface: {{ ns.interfaces[network.network_name] }}
76+
{% endif %}
77+
{% endif %}
78+
{% if network.tools.multus is defined %}
79+
net-attach-def: |
80+
{
81+
"cniVersion": "0.3.1",
82+
"name": "{{ network.network_name }}",
83+
"type": "macvlan",
84+
{% if network.vlan_id is defined%}
85+
"master": "{{ network.network_name }}",
86+
{% elif network.network_name == "ctlplane" %}
87+
"master": "ospbr",
88+
{% else %}
89+
"master": "{{ ns.interfaces[network.network_name] }}",
90+
{% endif %}
91+
"ipam": {
92+
"type": "whereabouts",
93+
"range": "{{ network[_ipv.network_vX] }}",
94+
"range_start": "{{ network.tools.multus[_ipv.ipvX_ranges].0.start }}",
95+
"range_end": "{{ network.tools.multus[_ipv.ipvX_ranges].0.end }}"
96+
}
97+
}
98+
{% endif %}
99+
{% endfor %}
100+
101+
dns-resolver:
102+
config:
103+
server:
104+
- "{{ cifmw_networking_env_definition.networks.ctlplane2[_ipv.gw_vX] }}"
105+
search: []
106+
options:
107+
- key: server
108+
values:
109+
- {{ cifmw_networking_env_definition.networks.ctlplane2[_ipv.gw_vX] }}
110+
{% for nameserver in cifmw_ci_gen_kustomize_values_nameservers %}
111+
- key: server
112+
values:
113+
- {{ nameserver }}
114+
{% endfor %}
115+
116+
routes:
117+
config: []
118+
119+
# Hardcoding the last IP bit since we don't have support for endpoint_annotations in the networking_mapper output
120+
rabbitmq:
121+
endpoint_annotations:
122+
metallb.universe.tf/address-pool: internalapi2
123+
metallb.universe.tf/loadBalancerIPs: {{ cifmw_networking_env_definition.networks['internalapi2'][_ipv.network_vX] | ansible.utils.ipmath(85) }}
124+
rabbitmq-cell1:
125+
endpoint_annotations:
126+
metallb.universe.tf/address-pool: internalapi2
127+
metallb.universe.tf/loadBalancerIPs: {{ cifmw_networking_env_definition.networks['internalapi2'][_ipv.network_vX] | ansible.utils.ipmath(86) }}
128+
129+
lbServiceType: LoadBalancer
130+
storageClass: {{ cifmw_ci_gen_kustomize_values_storage_class }}

roles/os_net_setup/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ That is provided by `openshift_login` role.
1616
* `cifmw_os_net_subnetpool_config`: (list) It contains the definitions for subnet pools.
1717
See an example in roles/os_net_setup/defaults/main.yml
1818
* `cifmw_os_net_setup_dry_run`: (bool) Disable the generation of the commands.
19+
* `cifmw_os_net_setup_namespace`: (str) Namespace in which to access the OSP cloud. Defaults to `openstack`.
1920

2021
## Molecule
2122

roles/os_net_setup/defaults/main.yml

+1
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ cifmw_os_net_subnetpool_config:
3535
is_shared: true
3636

3737
cifmw_os_net_setup_dry_run: false
38+
cifmw_os_net_setup_namespace: openstack

0 commit comments

Comments
 (0)