Skip to content

Commit 15a93c0

Browse files
vakwetuclaude
authored andcommitted
[federation] Make OpenStack resource creation idempotent
When deploy-architecture.sh is re-run against an existing deployment, the federation domain, identity provider, mapping, group, project and protocol may already exist in Keystone. The plain 'openstack X create' commands fail with HTTP 409 Conflict in that case. Fix by checking for the existence of each resource with 'openstack X show' (failed_when: false, changed_when: false) before attempting to create it. The create task is only run when the show returned rc != 0 (i.e. the resource was not found). Role-add is repeated unconditionally with failed_when: false because the Keystone API makes it idempotent already. Signed-off-by: Ade Lee <alee@redhat.com> Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 398d55b commit 15a93c0

1 file changed

Lines changed: 92 additions & 5 deletions

File tree

roles/federation/tasks/run_openstack_setup.yml

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,38 @@
2121
mode: "0640"
2222
when: cifmw_federation_deploy_type == "crc"
2323

24+
- name: Check if federation domain already exists
25+
environment:
26+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
27+
PATH: "{{ cifmw_path }}"
28+
ansible.builtin.command:
29+
cmd: >-
30+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
31+
openstack domain show {{ cifmw_federation_keystone_domain }} -f value -c id
32+
register: _federation_domain_check
33+
failed_when: false
34+
changed_when: false
35+
2436
- name: Run federation create domain
37+
when: _federation_domain_check.rc != 0
2538
vars:
2639
_osp_cmd: "openstack domain create {{ cifmw_federation_keystone_domain }}"
2740
ansible.builtin.include_tasks: run_osp_cmd.yml
2841

42+
- name: Check if federation identity provider already exists
43+
environment:
44+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
45+
PATH: "{{ cifmw_path }}"
46+
ansible.builtin.command:
47+
cmd: >-
48+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
49+
openstack identity provider show {{ cifmw_federation_IdpName }} -f value -c id
50+
register: _federation_idp_check
51+
failed_when: false
52+
changed_when: false
53+
2954
- name: Run federation identity provider create
55+
when: _federation_idp_check.rc != 0
3056
vars:
3157
_osp_cmd: "openstack identity provider create
3258
--remote-id {{ cifmw_federation_remote_id }}
@@ -47,38 +73,99 @@
4773
remote_path: "/home/cloud-admin/{{ cifmw_federation_rules_file }}"
4874
local_path: "{{ [ ansible_user_dir, 'ci-framework-data', 'tmp', cifmw_federation_rules_file ] | path_join }}"
4975

76+
- name: Check if federation mapping already exists
77+
environment:
78+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
79+
PATH: "{{ cifmw_path }}"
80+
ansible.builtin.command:
81+
cmd: >-
82+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
83+
openstack mapping show {{ cifmw_federation_mapping_name }} -f value -c id
84+
register: _federation_mapping_check
85+
failed_when: false
86+
changed_when: false
87+
5088
- name: Run federation mapping create
89+
when: _federation_mapping_check.rc != 0
5190
vars:
5291
_osp_cmd: "openstack mapping create
5392
--rules {{ cifmw_federation_rules_file }}
5493
{{ cifmw_federation_mapping_name }}"
5594
ansible.builtin.include_tasks: run_osp_cmd.yml
5695

96+
- name: Check if federation group already exists
97+
environment:
98+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
99+
PATH: "{{ cifmw_path }}"
100+
ansible.builtin.command:
101+
cmd: >-
102+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
103+
openstack group show --domain {{ cifmw_federation_keystone_domain }}
104+
{{ cifmw_federation_group_name }} -f value -c id
105+
register: _federation_group_check
106+
failed_when: false
107+
changed_when: false
108+
57109
- name: Run federation group create
110+
when: _federation_group_check.rc != 0
58111
vars:
59112
_osp_cmd: "openstack group create
60113
--domain {{ cifmw_federation_keystone_domain }}
61114
{{ cifmw_federation_group_name }}"
62115
ansible.builtin.include_tasks: run_osp_cmd.yml
63116

117+
- name: Check if federation project already exists
118+
environment:
119+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
120+
PATH: "{{ cifmw_path }}"
121+
ansible.builtin.command:
122+
cmd: >-
123+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
124+
openstack project show --domain {{ cifmw_federation_keystone_domain }}
125+
{{ cifmw_federation_project_name }} -f value -c id
126+
register: _federation_project_check
127+
failed_when: false
128+
changed_when: false
129+
64130
- name: Run federation project create
131+
when: _federation_project_check.rc != 0
65132
vars:
66133
_osp_cmd: "openstack project create
67134
--domain {{ cifmw_federation_keystone_domain }}
68135
{{ cifmw_federation_project_name }}"
69136
ansible.builtin.include_tasks: run_osp_cmd.yml
70137

71-
- name: Run federation rule add
72-
vars:
73-
_osp_cmd: "openstack role add
138+
- name: Run federation role add (safe to repeat - role add is idempotent)
139+
environment:
140+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
141+
PATH: "{{ cifmw_path }}"
142+
ansible.builtin.command:
143+
cmd: >-
144+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
145+
openstack role add
74146
--group {{ cifmw_federation_group_name }}
75147
--group-domain {{ cifmw_federation_keystone_domain }}
76148
--project {{ cifmw_federation_project_name }}
77149
--project-domain {{ cifmw_federation_keystone_domain }}
78-
member"
79-
ansible.builtin.include_tasks: run_osp_cmd.yml
150+
member
151+
failed_when: false
152+
changed_when: true
153+
154+
- name: Check if federation protocol already exists
155+
environment:
156+
KUBECONFIG: "{{ cifmw_openshift_kubeconfig }}"
157+
PATH: "{{ cifmw_path }}"
158+
ansible.builtin.command:
159+
cmd: >-
160+
oc exec -n {{ cifmw_federation_run_osp_cmd_namespace }} -t openstackclient --
161+
openstack federation protocol show openid
162+
--identity-provider {{ cifmw_federation_IdpName }} -f value -c id
163+
register: _federation_protocol_check
164+
failed_when: false
165+
changed_when: false
80166

81167
- name: Run federation protocol create
168+
when: _federation_protocol_check.rc != 0
82169
vars:
83170
_osp_cmd: "openstack federation protocol create openid
84171
--mapping {{ cifmw_federation_mapping_name }}

0 commit comments

Comments
 (0)