]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
rgw: multisite refact
authorGuillaume Abrioux <gabrioux@redhat.com>
Thu, 14 Jan 2021 16:52:39 +0000 (17:52 +0100)
committerDimitri Savineau <savineau.dimitri@gmail.com>
Thu, 28 Jan 2021 21:37:32 +0000 (16:37 -0500)
Add the possibility to deploy rgw multisite configuration with a mix of
secondary and primary zones on a same rgw node.
Before that, on a same node, all instances were either primary
zones *OR* secondary.

Now you can define a rgw instance like following:

```
rgw_instances:
  - instance_name: 'rgw0'
    rgw_zonemaster: false
    rgw_zonesecondary: true
    rgw_zonegroupmaster: false
    rgw_realm: 'france'
    rgw_zonegroup: 'zonegroup-france'
    rgw_zone: paris-00
    radosgw_address: "{{ _radosgw_address }}"
    radosgw_frontend_port: 8080
    rgw_zone_user: jacques.chirac
    rgw_zone_user_display_name: "Jacques Chirac"
    system_access_key: P9Eb6S8XNyo4dtZZUUMy
    system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
    endpoint: http://192.168.101.12:8080
```

Basically it's now possible to define `rgw_zonemaster`,
`rgw_zonesecondary` and `rgw_zonegroupmaster` at the intsance
level instead of the whole node level.

Also, this commit adds an option `deploy_secondary_zones` (default True)
which can be set to `False` in order to explicitly ask the playbook to
not deploy secondary zones in case where the corresponding endpoint are
not deployed yet.

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1915478
Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
(cherry picked from commit 71a5e666e39b11cd7945afa28a9f6fbe7de8c2b7)

33 files changed:
roles/ceph-config/templates/ceph.conf.j2
roles/ceph-rgw/tasks/multisite/create_realm_zonegroup_zone_lists.yml [deleted file]
roles/ceph-rgw/tasks/multisite/create_zone_user.yml
roles/ceph-rgw/tasks/multisite/main.yml
roles/ceph-rgw/tasks/multisite/secondary.yml
roles/ceph-rgw/tasks/start_radosgw.yml
roles/ceph-validate/tasks/check_rgw_multisite.yml
tests/functional/rgw-multisite/container/group_vars/all
tests/functional/rgw-multisite/container/group_vars/rgws
tests/functional/rgw-multisite/container/host_vars/osd0
tests/functional/rgw-multisite/container/host_vars/rgw0 [new file with mode: 0644]
tests/functional/rgw-multisite/container/hosts
tests/functional/rgw-multisite/container/secondary/group_vars/all
tests/functional/rgw-multisite/container/secondary/group_vars/rgws
tests/functional/rgw-multisite/container/secondary/host_vars/osd0
tests/functional/rgw-multisite/container/secondary/host_vars/rgw0 [new file with mode: 0644]
tests/functional/rgw-multisite/container/secondary/hosts
tests/functional/rgw-multisite/container/secondary/vagrant_variables.yml
tests/functional/rgw-multisite/container/vagrant_variables.yml
tests/functional/rgw-multisite/group_vars/all
tests/functional/rgw-multisite/group_vars/rgws
tests/functional/rgw-multisite/host_vars/osd0
tests/functional/rgw-multisite/host_vars/rgw0 [new file with mode: 0644]
tests/functional/rgw-multisite/hosts
tests/functional/rgw-multisite/secondary/group_vars/all
tests/functional/rgw-multisite/secondary/group_vars/rgws
tests/functional/rgw-multisite/secondary/host_vars/osd0
tests/functional/rgw-multisite/secondary/host_vars/rgw0 [new file with mode: 0644]
tests/functional/rgw-multisite/secondary/hosts
tests/functional/rgw-multisite/secondary/vagrant_variables.yml
tests/functional/rgw-multisite/vagrant_variables.yml
tests/functional/rgw_multisite.yml
tox.ini

index d00f3b9827828e5df7e1cb64f701eec0b6399a26..acc889a61fad58597e1d197fa87a118d9ed95af7 100644 (file)
@@ -125,10 +125,12 @@ rgw frontends = {{ frontend_line(radosgw_frontend_type) }} {{ radosgw_frontend_o
 rgw thread pool size = {{ radosgw_thread_pool_size }}
 {% endif %}
 {% if rgw_multisite | bool %}
+{% if ((instance['rgw_zonemaster'] | default(rgw_zonemaster) | bool) or (deploy_secondary_zones | default(True) | bool)) %}
 rgw_realm = {{ instance['rgw_realm'] }}
 rgw_zonegroup = {{ instance['rgw_zonegroup'] }}
 rgw_zone = {{ instance['rgw_zone'] }}
 {% endif %}
+{% endif %}
 {% endfor %}
 {% endif %}
 {% endif %}
diff --git a/roles/ceph-rgw/tasks/multisite/create_realm_zonegroup_zone_lists.yml b/roles/ceph-rgw/tasks/multisite/create_realm_zonegroup_zone_lists.yml
deleted file mode 100644 (file)
index b645bc2..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
----
-- name: set_fact realms
-  set_fact:
-    realms: '{{ realms | default([]) | union([item.rgw_realm]) }}'
-  loop: "{{ rgw_instances_all }}"
-  run_once: true
-
-- name: create list secondary_realms
-  set_fact:
-    secondary_realms: "{{ secondary_realms | default([]) | union([{ 'realm': item.rgw_realm, 'endpoint': item.endpoint, 'system_access_key': item.system_access_key, 'system_secret_key': item.system_secret_key, 'is_master': hostvars[item.host]['rgw_zonemaster'] }]) }}"
-  loop: "{{ rgw_instances_all }}"
-  run_once: true
-  when: not hostvars[item.host]['rgw_zonemaster'] | bool
-
-- name: create list zonegroups
-  set_fact:
-    zonegroups: "{{ zonegroups | default([]) | union([{ 'realm': item.rgw_realm, 'zonegroup': item.rgw_zonegroup, 'is_master': hostvars[item.host]['rgw_zonegroupmaster'] }]) }}"
-  loop: "{{ rgw_instances_all }}"
-  run_once: true
-  when:
-    - hostvars[item.host]['rgw_zonemaster'] | bool
-
-- name: create list zones
-  set_fact:
-    zones: "{{ zones | default([]) | union([{ 'realm': item.rgw_realm, 'zonegroup': item.rgw_zonegroup, 'zone': item.rgw_zone, 'is_master': hostvars[item.host]['rgw_zonemaster'], 'system_access_key': item.system_access_key, 'system_secret_key': item.system_secret_key }]) }}"
-  loop: "{{ rgw_instances_all }}"
-  run_once: true
-
-- name: create a list of dicts with each rgw endpoint and it's zone
-  set_fact:
-    zone_endpoint_pairs: "{{ zone_endpoint_pairs | default([]) | union([{ 'endpoint': hostvars[item.host]['rgw_multisite_proto'] + '://' + item.radosgw_address + ':' + item.radosgw_frontend_port | string, 'rgw_zone': item.rgw_zone, 'rgw_realm': item.rgw_realm, 'rgw_zonegroup': item.rgw_zonegroup, 'rgw_zonemaster': hostvars[item.host]['rgw_zonemaster']}]) }}"
-  loop: "{{ rgw_instances_all }}"
-  run_once: true
-
-- name: create a list of zones and all their endpoints
-  set_fact:
-    zone_endpoints_list: "{{ zone_endpoints_list | default([]) | union([{'zone': item.rgw_zone, 'zonegroup': item.rgw_zonegroup, 'realm': item.rgw_realm, 'is_master': item.rgw_zonemaster, 'endpoints': ','.join(zone_endpoint_pairs | selectattr('rgw_zone','match','^'+item.rgw_zone+'$') | selectattr('rgw_realm','match','^'+item.rgw_realm+'$') | selectattr('rgw_zonegroup', 'match','^'+item.rgw_zonegroup+'$') | map(attribute='endpoint'))}]) }}"
-  loop: "{{ zone_endpoint_pairs }}"
-  run_once: true
index a335bc45e67e25e145233165bf411f36c17e2a56..d18cfb696e5415fe84152d56d515c8cbd9865fdb 100644 (file)
@@ -5,8 +5,8 @@
   loop: "{{ rgw_instances_all }}"
   run_once: true
   when:
-    - hostvars[item.host]['rgw_zonemaster'] | bool
-    - hostvars[item.host]['rgw_zonegroupmaster'] | bool
+    - item.rgw_zonemaster | default(hostvars[item.host]['rgw_zonemaster']) | bool
+    - item.rgw_zonegroupmaster | default(hostvars[item.host]['rgw_zonegroupmaster']) | bool
 
 - name: create the zone user(s)
   radosgw_user:
@@ -22,6 +22,7 @@
   delegate_to: "{{ groups[mon_group_name][0] }}"
   run_once: true
   loop: "{{ zone_users }}"
+  when: zone_users is defined
   environment:
     CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
     CEPH_CONTAINER_BINARY: "{{ container_binary }}"
index 37a4496e6f8b498ca20ba9f31035510c674030f8..e0308ba680a1da7d4d2b557a9263a646598b0ca2 100644 (file)
@@ -1,44 +1,50 @@
 ---
-- name: include_tasks create_realm_zonegroup_zone_lists.yml
-  include_tasks: create_realm_zonegroup_zone_lists.yml
+- name: set_fact realms
+  set_fact:
+    realms: '{{ realms | default([]) | union([item.rgw_realm]) }}'
+  run_once: true
+  loop: "{{ rgw_instances_all }}"
+  when: item.rgw_zonemaster | default(hostvars[item.host]['rgw_zonemaster']) | bool
+
+- name: create list zonegroups
+  set_fact:
+    zonegroups: "{{ zonegroups | default([]) | union([{ 'realm': item.rgw_realm, 'zonegroup': item.rgw_zonegroup, 'is_master': item.rgw_zonegroupmaster | default(hostvars[item.host]['rgw_zonegroupmaster']) }]) }}"
+  run_once: true
+  loop: "{{ rgw_instances_all }}"
+  when: item.rgw_zonegroupmaster | default(hostvars[item.host]['rgw_zonemaster']) | bool
+
+- name: create list zones
+  set_fact:
+    zones: "{{ zones | default([]) | union([{ 'realm': item.rgw_realm, 'zonegroup': item.rgw_zonegroup, 'zone': item.rgw_zone, 'is_master': item.rgw_zonemaster | default(hostvars[item.host]['rgw_zonemaster']), 'system_access_key': item.system_access_key, 'system_secret_key': item.system_secret_key }]) }}"
+  run_once: true
+  loop: "{{ rgw_instances_all }}"
+
+- name: create a list of dicts with each rgw endpoint and it's zone
+  set_fact:
+    zone_endpoint_pairs: "{{ zone_endpoint_pairs | default([]) | union([{ 'endpoint': hostvars[item.host]['rgw_multisite_proto'] + '://' + item.radosgw_address + ':' + item.radosgw_frontend_port | string, 'rgw_zone': item.rgw_zone, 'rgw_realm': item.rgw_realm, 'rgw_zonegroup': item.rgw_zonegroup, 'rgw_zonemaster': item.rgw_zonemaster | default(hostvars[item.host]['rgw_zonemaster']) }]) }}"
+  loop: "{{ rgw_instances_all }}"
+  run_once: true
+
+- name: create a list of zones and all their endpoints
+  set_fact:
+    zone_endpoints_list: "{{ zone_endpoints_list | default([]) | union([{'zone': item.rgw_zone, 'zonegroup': item.rgw_zonegroup, 'realm': item.rgw_realm, 'is_master': item.rgw_zonemaster, 'endpoints': ','.join(zone_endpoint_pairs | selectattr('rgw_zone','match','^'+item.rgw_zone+'$') | selectattr('rgw_realm','match','^'+item.rgw_realm+'$') | selectattr('rgw_zonegroup', 'match','^'+item.rgw_zonegroup+'$') | map(attribute='endpoint'))}]) }}"
+  loop: "{{ zone_endpoint_pairs }}"
+  run_once: true
 
 # Include the tasks depending on the zone type
 - name: include_tasks master.yml
   include_tasks: master.yml
-  when:
-    - rgw_zonemaster | bool
-    - not rgw_zonesecondary | bool
-
-- name: include_tasks start_radosgw.yml for zonemaster rgws
-  include_tasks: ../start_radosgw.yml
-  when:
-    - rgw_zonemaster | bool
-    - not rgw_zonesecondary | bool
-    - not containerized_deployment | bool
-
-- name: include_tasks start_docker_rgw.yml for zonemaster rgws
-  include_tasks: ../start_docker_rgw.yml
-  when:
-    - rgw_zonemaster | bool
-    - not rgw_zonesecondary | bool
-    - containerized_deployment | bool
 
 - name: include_tasks secondary.yml
   include_tasks: secondary.yml
-  when:
-    - not rgw_zonemaster | bool
-    - rgw_zonesecondary | bool
+  when: deploy_secondary_zones | default(True) | bool
 
-- name: include_tasks start_radosgw.yml for zonesecondary rgws
+- name: include_tasks start_radosgw.yml
   include_tasks: ../start_radosgw.yml
   when:
-    - not rgw_zonemaster | bool
-    - rgw_zonesecondary | bool
     - not containerized_deployment | bool
 
-- name: include_tasks start_docker_rgw.yml for zonesecondary rgws
+- name: include_tasks start_docker_rgw.yml
   include_tasks: ../start_docker_rgw.yml
   when:
-    - not rgw_zonemaster | bool
-    - rgw_zonesecondary | bool
     - containerized_deployment | bool
index 4d9230c479f2564e1ff220253fb5aca1d1216476..128ff6cac2c687b45469e18f5e16094a983d83ab 100644 (file)
@@ -1,4 +1,11 @@
 ---
+- name: create list secondary_realms
+  set_fact:
+    secondary_realms: "{{ secondary_realms | default([]) | union([{ 'realm': item.rgw_realm, 'zonegroup': item.rgw_zonegroup, 'zone': item.rgw_zone, 'endpoint': item.endpoint, 'system_access_key': item.system_access_key, 'system_secret_key': item.system_secret_key, 'is_master': item.rgw_zonemaster | default(hostvars[item.host]['rgw_zonemaster']) }]) }}"
+  loop: "{{ rgw_instances_all }}"
+  run_once: true
+  when: not item.rgw_zonemaster | default(hostvars[item.host]['rgw_zonemaster']) | bool
+
 - name: ensure connection to primary cluster from mon
   uri:
     url: "{{ item.endpoint }}"
@@ -11,6 +18,7 @@
   uri:
     url: "{{ item.endpoint }}"
   loop: "{{ rgw_instances }}"
+  when: not item.rgw_zonemaster | default(rgw_zonemaster) | bool
 
 - name: fetch the realm(s)
   command: "{{ container_exec_cmd }} radosgw-admin realm pull --cluster={{ cluster }} --rgw-realm={{ item.realm }} --url={{ item.endpoint }} --access-key={{ item.system_access_key }} --secret={{ item.system_secret_key }}"
index 39102e82f5325e93d63d7fe03d14f64ee2adece6..1431d988b4a133f164b117e7d1ed1ff90d790894 100644 (file)
     enabled: yes
     masked: no
   with_items: "{{ rgw_instances }}"
+  when:
+    - not rgw_multisite | bool or
+      ((rgw_multisite | bool and item.rgw_zonesecondary | default(rgw_zonesecondary) | bool and deploy_secondary_zones | default(True)) or
+      (rgw_multisite | bool and item.rgw_zonemaster | default(rgw_zonemaster)))
 
 - name: enable the ceph-radosgw.target service
   systemd:
index 84ffcd45ed61ac2af6620259eb9ff4dbdccc79a6..6693f00b3206b9255a454b18fe76678ef57c78c1 100644 (file)
@@ -8,14 +8,16 @@
 - name: fail if either rgw_zonemaster or rgw_zonesecondary is undefined
   fail:
     msg: "rgw_zonemaster and rgw_zonesecondary must be defined"
-  when: rgw_zonemaster is undefined or rgw_zonesecondary is undefined
+  loop: "{{ rgw_instances }}"
+  when: item.rgw_zonemaster | default(rgw_zonemaster) is undefined or item.rgw_zonesecondary | default(rgw_zonesecondary) is undefined
 
 - name: fail if rgw_zonemaster and rgw_zonesecondary are both true
   fail:
     msg: "rgw_zonemaster and rgw_zonesecondary cannot both be true"
+  loop: "{{ rgw_instances }}"
   when:
-    - rgw_zonemaster | bool
-    - rgw_zonesecondary | bool
+    - item.rgw_zonemaster | default(rgw_zonemaster) | bool
+    - item.rgw_zonesecondary | default(rgw_zonesecondary) | bool
 
 - name: fail if rgw_zonegroup is not set
   fail:
@@ -58,6 +60,7 @@
     msg: "endpoint has not been set by the user"
   loop: "{{ rgw_instances }}"
   when:
-    - rgw_zonesecondary | bool
-    - rgw_pull_port is undefined and rgw_pullhost is undefined and rgw_pull_proto is undefined
-    - item.endpoint is undefined
\ No newline at end of file
+    - item.rgw_zonesecondary | default(rgw_zonesecondary) | bool
+    - rgw_pull_port is undefined and rgw_pullhost is undefined and item.rgw_pull_proto | default(rgw_pull_proto) is undefined
+    - item.endpoint is undefined
+
index 5d421e12499726f5fb3470140ccd8829b88e32ee..7e2781dda502a854aee1be727ef18387fc4aca95 100644 (file)
@@ -29,4 +29,4 @@ ceph_conf_overrides:
 dashboard_enabled: False
 ceph_docker_registry: quay.ceph.io
 ceph_docker_image: ceph-ci/daemon
-ceph_docker_image_tag: latest-octopus
\ No newline at end of file
+ceph_docker_image_tag: latest-octopus
index 949999d52f355e3289b877099d66981415837ebe..1a9ee64288635c21d2acf8812353aed9dc0762fb 100644 (file)
@@ -2,6 +2,7 @@
 copy_admin_key: true
 # Enable Multisite support
 rgw_multisite: true
+rgw_multisite_proto: http
 rgw_create_pools:
   foo:
     pg_num: 16
@@ -10,7 +11,3 @@ rgw_create_pools:
     pg_num: 16
 rgw_override_bucket_index_max_shards: 16
 rgw_bucket_default_quota_max_objects: 1638400
-rgw_zonemaster: True
-rgw_zonesecondary: False
-rgw_zonegroupmaster: True
-rgw_multisite_proto: http
index a2b979a96f3febacf9449435924cfae8f1acc768..15941276f5141d0e33c00d06870b74427cf4acb4 100644 (file)
@@ -1,8 +1,12 @@
+---
 rgw_instances:
   - instance_name: 'rgw0'
-    rgw_realm: 'france'
-    rgw_zonegroup: 'idf'
-    rgw_zone: 'paris'
+    rgw_zonemaster: True
+    rgw_zonesecondary: False
+    rgw_zonegroupmaster: True
+    rgw_realm: 'canada'
+    rgw_zonegroup: 'zonegroup-canada'
+    rgw_zone: montreal-00
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8080
     rgw_zone_user: jacques.chirac
@@ -10,15 +14,19 @@ rgw_instances:
     system_access_key: P9Eb6S8XNyo4dtZZUUMy
     system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
   - instance_name: 'rgw1'
-    rgw_realm: 'usa'
-    rgw_zonegroup: 'alaska'
-    rgw_zone: 'juneau'
+    rgw_zonemaster: false
+    rgw_zonesecondary: true
+    rgw_zonegroupmaster: false
+    rgw_realm: 'france'
+    rgw_zonegroup: 'zonegroup-france'
+    rgw_zone: montreal-01
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8081
     rgw_zone_user: edward.lewis
     rgw_zone_user_display_name: "Edward Lewis"
     system_access_key: yu17wkvAx3B8Wyn08XoF
     system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
+    endpoint: http://192.168.107.12:8081
 # functional testing
-rgw_multisite_endpoint_addr: 192.168.105.11
-radosgw_num_instances: 2
\ No newline at end of file
+rgw_multisite_endpoint_addr: 192.168.105.12
+radosgw_num_instances: 2
diff --git a/tests/functional/rgw-multisite/container/host_vars/rgw0 b/tests/functional/rgw-multisite/container/host_vars/rgw0
new file mode 100644 (file)
index 0000000..92624d1
--- /dev/null
@@ -0,0 +1,29 @@
+---
+rgw_zonemaster: true
+rgw_zonesecondary: false
+rgw_zonegroupmaster: true
+rgw_multisite_proto: http
+rgw_instances:
+  - instance_name: 'rgw0'
+    rgw_realm: 'foo'
+    rgw_zonegroup: 'zonegroup123'
+    rgw_zone: 'gotham_city'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8080
+    rgw_zone_user: batman
+    rgw_zone_user_display_name: "Batman"
+    system_access_key: 9WA1GN33IUYC717S8KB2
+    system_secret_key: R2vWXyboYw9nluehMgtATBGDBZSuWLnR0M4xNa1W
+  - instance_name: 'rgw1'
+    rgw_realm: 'bar'
+    rgw_zonegroup: 'zonegroup456'
+    rgw_zone: 'metropolis'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8081
+    rgw_zone_user: superman
+    rgw_zone_user_display_name: "Superman"
+    system_access_key: S96CJL44E29AN91Y3ZC5
+    system_secret_key: ha7yWiIi7bSV2vAqMBfKjYIVKMfOBaGkWrUZifRt
+# functional testing
+rgw_multisite_endpoint_addr: 192.168.105.11
+radosgw_num_instances: 2
index 6a04f961014a3ae095c66c212774cd69897b6f2c..2aeb021d7c9b1df6f7fb777d7c7ffcab27034794 100644 (file)
@@ -6,3 +6,4 @@ osd0
 
 [rgws]
 osd0
+rgw0
\ No newline at end of file
index 3f7ca7bb39e58833f3dc11a5581b6587be7ea6d1..ed7e70259c6d8dc3d3315f0f94cabd8fd9b6fe16 100644 (file)
@@ -29,4 +29,4 @@ ceph_conf_overrides:
 dashboard_enabled: False
 ceph_docker_registry: quay.ceph.io
 ceph_docker_image: ceph-ci/daemon
-ceph_docker_image_tag: latest-octopus
\ No newline at end of file
+ceph_docker_image_tag: latest-octopus
index a902ad633606daad014519c155e4000607a23eab..4a30a9f46806e4204d48d44553859cabab8adbb3 100644 (file)
@@ -1,6 +1,7 @@
 ---
 # Enable Multisite support
 rgw_multisite: true
+rgw_multisite_proto: http
 rgw_create_pools:
   foo:
     pg_num: 16
@@ -9,7 +10,3 @@ rgw_create_pools:
     pg_num: 16
 rgw_override_bucket_index_max_shards: 16
 rgw_bucket_default_quota_max_objects: 1638400
-rgw_zonemaster: False
-rgw_zonesecondary: True
-rgw_zonegroupmaster: True
-rgw_multisite_proto: http
index 0f63a3e563563335a907bb1ddfa802aed766365b..5b7403534bfda6762332aaad61d802b2e9b83faf 100644 (file)
@@ -1,26 +1,32 @@
+---
 rgw_instances:
   - instance_name: 'rgw0'
-    rgw_realm: 'france'
-    rgw_zonegroup: 'idf'
-    rgw_zone: 'versailles'
+    rgw_zonemaster: false
+    rgw_zonesecondary: true
+    rgw_zonegroupmaster: false
+    rgw_realm: 'canada'
+    rgw_zonegroup: 'zonegroup-canada'
+    rgw_zone: paris-00
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8080
     rgw_zone_user: jacques.chirac
     rgw_zone_user_display_name: "Jacques Chirac"
     system_access_key: P9Eb6S8XNyo4dtZZUUMy
     system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
-    endpoint: http://192.168.105.11:8080
+    endpoint: http://192.168.105.12:8080
   - instance_name: 'rgw1'
-    rgw_realm: 'usa'
-    rgw_zonegroup: 'alaska'
-    rgw_zone: 'anchorage'
+    rgw_zonemaster: True
+    rgw_zonesecondary: False
+    rgw_zonegroupmaster: True
+    rgw_realm: 'france'
+    rgw_zonegroup: 'zonegroup-france'
+    rgw_zone: paris-01
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8081
     rgw_zone_user: edward.lewis
     rgw_zone_user_display_name: "Edward Lewis"
     system_access_key: yu17wkvAx3B8Wyn08XoF
     system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
-    endpoint: http://192.168.105.11:8081
 # functional testing
-rgw_multisite_endpoint_addr: 192.168.107.11
-radosgw_num_instances: 2
\ No newline at end of file
+rgw_multisite_endpoint_addr: 192.168.107.12
+radosgw_num_instances: 2
diff --git a/tests/functional/rgw-multisite/container/secondary/host_vars/rgw0 b/tests/functional/rgw-multisite/container/secondary/host_vars/rgw0
new file mode 100644 (file)
index 0000000..b95ca72
--- /dev/null
@@ -0,0 +1,31 @@
+---
+rgw_zonemaster: false
+rgw_zonesecondary: true
+rgw_zonegroupmaster: false
+rgw_multisite_proto: http
+rgw_instances:
+  - instance_name: 'rgw0'
+    rgw_realm: 'foo'
+    rgw_zonegroup: 'zonegroup123'
+    rgw_zone: 'gotham_city-secondary'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8080
+    rgw_zone_user: batman
+    rgw_zone_user_display_name: "Batman"
+    system_access_key: 9WA1GN33IUYC717S8KB2
+    system_secret_key: R2vWXyboYw9nluehMgtATBGDBZSuWLnR0M4xNa1W
+    endpoint: http://192.168.105.11:8080
+  - instance_name: 'rgw1'
+    rgw_realm: 'bar'
+    rgw_zonegroup: 'zonegroup456'
+    rgw_zone: 'metropolis-secondary'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8081
+    rgw_zone_user: superman
+    rgw_zone_user_display_name: "Superman"
+    system_access_key: S96CJL44E29AN91Y3ZC5
+    system_secret_key: ha7yWiIi7bSV2vAqMBfKjYIVKMfOBaGkWrUZifRt
+    endpoint: http://192.168.105.11:8081
+# functional testing
+rgw_multisite_endpoint_addr: 192.168.107.11
+radosgw_num_instances: 2
index 6a04f961014a3ae095c66c212774cd69897b6f2c..2aeb021d7c9b1df6f7fb777d7c7ffcab27034794 100644 (file)
@@ -6,3 +6,4 @@ osd0
 
 [rgws]
 osd0
+rgw0
\ No newline at end of file
index 8b89f3a41d27c21ffd17350713657b51b50982c8..d6d710b9e9dd800945c44cb67d5066329a3fb57e 100644 (file)
@@ -7,7 +7,7 @@ docker: true
 mon_vms: 1
 osd_vms: 1
 mds_vms: 0
-rgw_vms: 0
+rgw_vms: 1
 nfs_vms: 0
 grafana_server_vms: 0
 rbd_mirror_vms: 0
index b58593cbe76f2d7d9278c5d12cb5924e2c613719..db65bd1ee668a8ecb856730aaff03be99c350bf4 100644 (file)
@@ -7,7 +7,7 @@ docker: true
 mon_vms: 1
 osd_vms: 1
 mds_vms: 0
-rgw_vms: 0
+rgw_vms: 1
 nfs_vms: 0
 grafana_server_vms: 0
 rbd_mirror_vms: 0
index dd92070b0e67324b0b912d4dc6315737af87b55a..352fed3832101e9a1e887b56094b3b709d539251 100644 (file)
@@ -24,4 +24,4 @@ ceph_conf_overrides:
     mon_allow_pool_size_one: true
     mon_warn_on_pool_no_redundancy: false
     osd_pool_default_size: 1
-dashboard_enabled: False
\ No newline at end of file
+dashboard_enabled: False
index 949999d52f355e3289b877099d66981415837ebe..1a9ee64288635c21d2acf8812353aed9dc0762fb 100644 (file)
@@ -2,6 +2,7 @@
 copy_admin_key: true
 # Enable Multisite support
 rgw_multisite: true
+rgw_multisite_proto: http
 rgw_create_pools:
   foo:
     pg_num: 16
@@ -10,7 +11,3 @@ rgw_create_pools:
     pg_num: 16
 rgw_override_bucket_index_max_shards: 16
 rgw_bucket_default_quota_max_objects: 1638400
-rgw_zonemaster: True
-rgw_zonesecondary: False
-rgw_zonegroupmaster: True
-rgw_multisite_proto: http
index 131d6448365f6e428901f1ca34d57e8022ec56e9..7ab79b2c203cfd42fecd426539e7807731b0b5b6 100644 (file)
@@ -1,8 +1,12 @@
+---
 rgw_instances:
   - instance_name: 'rgw0'
-    rgw_realm: 'france'
-    rgw_zonegroup: 'idf'
-    rgw_zone: 'paris'
+    rgw_zonemaster: True
+    rgw_zonesecondary: False
+    rgw_zonegroupmaster: True
+    rgw_realm: 'canada'
+    rgw_zonegroup: 'zonegroup-canada'
+    rgw_zone: montreal-00
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8080
     rgw_zone_user: jacques.chirac
@@ -10,15 +14,19 @@ rgw_instances:
     system_access_key: P9Eb6S8XNyo4dtZZUUMy
     system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
   - instance_name: 'rgw1'
-    rgw_realm: 'usa'
-    rgw_zonegroup: 'alaska'
-    rgw_zone: 'juneau'
+    rgw_zonemaster: false
+    rgw_zonesecondary: true
+    rgw_zonegroupmaster: false
+    rgw_realm: 'france'
+    rgw_zonegroup: 'zonegroup-france'
+    rgw_zone: montreal-01
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8081
     rgw_zone_user: edward.lewis
     rgw_zone_user_display_name: "Edward Lewis"
     system_access_key: yu17wkvAx3B8Wyn08XoF
     system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
+    endpoint: http://192.168.103.12:8081
 # functional testing
-rgw_multisite_endpoint_addr: 192.168.101.11
-radosgw_num_instances: 2
\ No newline at end of file
+rgw_multisite_endpoint_addr: 192.168.101.12
+radosgw_num_instances: 2
diff --git a/tests/functional/rgw-multisite/host_vars/rgw0 b/tests/functional/rgw-multisite/host_vars/rgw0
new file mode 100644 (file)
index 0000000..b0d1b6d
--- /dev/null
@@ -0,0 +1,28 @@
+rgw_zonemaster: true
+rgw_zonesecondary: false
+rgw_zonegroupmaster: true
+rgw_multisite_proto: http
+rgw_instances:
+  - instance_name: 'rgw0'
+    rgw_realm: 'foo'
+    rgw_zonegroup: 'zonegroup123'
+    rgw_zone: 'gotham_city'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8080
+    rgw_zone_user: batman
+    rgw_zone_user_display_name: "Batman"
+    system_access_key: 9WA1GN33IUYC717S8KB2
+    system_secret_key: R2vWXyboYw9nluehMgtATBGDBZSuWLnR0M4xNa1W
+  - instance_name: 'rgw1'
+    rgw_realm: 'bar'
+    rgw_zonegroup: 'zonegroup456'
+    rgw_zone: 'metropolis'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8081
+    rgw_zone_user: superman
+    rgw_zone_user_display_name: "Superman"
+    system_access_key: S96CJL44E29AN91Y3ZC5
+    system_secret_key: ha7yWiIi7bSV2vAqMBfKjYIVKMfOBaGkWrUZifRt
+# functional testing
+rgw_multisite_endpoint_addr: 192.168.101.11
+radosgw_num_instances: 2
index 6a04f961014a3ae095c66c212774cd69897b6f2c..4f571a34997be407fc3cc21a2b837757174606e2 100644 (file)
@@ -6,3 +6,4 @@ osd0
 
 [rgws]
 osd0
+rgw0
index 1329c28ba74f9ed2b69c37ad9d1334ae0316ce42..962b0a3a6f2f1a18a3e84d45b98822eb60d416d9 100644 (file)
@@ -24,4 +24,4 @@ ceph_conf_overrides:
     mon_allow_pool_size_one: true
     mon_warn_on_pool_no_redundancy: false
     osd_pool_default_size: 1
-dashboard_enabled: False
\ No newline at end of file
+dashboard_enabled: False
index a902ad633606daad014519c155e4000607a23eab..4a30a9f46806e4204d48d44553859cabab8adbb3 100644 (file)
@@ -1,6 +1,7 @@
 ---
 # Enable Multisite support
 rgw_multisite: true
+rgw_multisite_proto: http
 rgw_create_pools:
   foo:
     pg_num: 16
@@ -9,7 +10,3 @@ rgw_create_pools:
     pg_num: 16
 rgw_override_bucket_index_max_shards: 16
 rgw_bucket_default_quota_max_objects: 1638400
-rgw_zonemaster: False
-rgw_zonesecondary: True
-rgw_zonegroupmaster: True
-rgw_multisite_proto: http
index 5b7d5306b4b2faaf339f456d4652d214906a765f..9a324e6de5b7db238e9ef1cde7994495c9741da5 100644 (file)
@@ -1,26 +1,32 @@
+---
 rgw_instances:
   - instance_name: 'rgw0'
-    rgw_realm: 'france'
-    rgw_zonegroup: 'idf'
-    rgw_zone: 'versailles'
+    rgw_zonemaster: false
+    rgw_zonesecondary: true
+    rgw_zonegroupmaster: false
+    rgw_realm: 'canada'
+    rgw_zonegroup: 'zonegroup-canada'
+    rgw_zone: paris-00
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8080
     rgw_zone_user: jacques.chirac
     rgw_zone_user_display_name: "Jacques Chirac"
     system_access_key: P9Eb6S8XNyo4dtZZUUMy
     system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
-    endpoint: http://192.168.101.11:8080
+    endpoint: http://192.168.101.12:8080
   - instance_name: 'rgw1'
-    rgw_realm: 'usa'
-    rgw_zonegroup: 'alaska'
-    rgw_zone: 'anchorage'
+    rgw_zonemaster: True
+    rgw_zonesecondary: False
+    rgw_zonegroupmaster: True
+    rgw_realm: 'france'
+    rgw_zonegroup: 'zonegroup-france'
+    rgw_zone: paris-01
     radosgw_address: "{{ _radosgw_address }}"
     radosgw_frontend_port: 8081
     rgw_zone_user: edward.lewis
     rgw_zone_user_display_name: "Edward Lewis"
     system_access_key: yu17wkvAx3B8Wyn08XoF
     system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
-    endpoint: http://192.168.101.11:8081
 # functional testing
-rgw_multisite_endpoint_addr: 192.168.103.11
-radosgw_num_instances: 2
\ No newline at end of file
+rgw_multisite_endpoint_addr: 192.168.103.12
+radosgw_num_instances: 2
diff --git a/tests/functional/rgw-multisite/secondary/host_vars/rgw0 b/tests/functional/rgw-multisite/secondary/host_vars/rgw0
new file mode 100644 (file)
index 0000000..1c09fd0
--- /dev/null
@@ -0,0 +1,31 @@
+---
+rgw_zonemaster: false
+rgw_zonesecondary: true
+rgw_zonegroupmaster: false
+rgw_multisite_proto: http
+rgw_instances:
+  - instance_name: 'rgw0'
+    rgw_realm: 'foo'
+    rgw_zonegroup: 'zonegroup123'
+    rgw_zone: 'gotham_city-secondary'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8080
+    rgw_zone_user: batman
+    rgw_zone_user_display_name: "Batman"
+    system_access_key: 9WA1GN33IUYC717S8KB2
+    system_secret_key: R2vWXyboYw9nluehMgtATBGDBZSuWLnR0M4xNa1W
+    endpoint: http://192.168.101.11:8080
+  - instance_name: 'rgw1'
+    rgw_realm: 'bar'
+    rgw_zonegroup: 'zonegroup456'
+    rgw_zone: 'metropolis-secondary'
+    radosgw_address: "{{ _radosgw_address }}"
+    radosgw_frontend_port: 8081
+    rgw_zone_user: superman
+    rgw_zone_user_display_name: "Superman"
+    system_access_key: S96CJL44E29AN91Y3ZC5
+    system_secret_key: ha7yWiIi7bSV2vAqMBfKjYIVKMfOBaGkWrUZifRt
+    endpoint: http://192.168.101.11:8081
+# functional testing
+rgw_multisite_endpoint_addr: 192.168.103.11
+radosgw_num_instances: 2
index 6a04f961014a3ae095c66c212774cd69897b6f2c..4f571a34997be407fc3cc21a2b837757174606e2 100644 (file)
@@ -6,3 +6,4 @@ osd0
 
 [rgws]
 osd0
+rgw0
index 54573d9bcbb0567e58f12319214c3d49c2ea5b30..5baecbb4ce5375a58e6b13c75e3feaac266f4b05 100644 (file)
@@ -7,7 +7,7 @@ docker: false
 mon_vms: 1
 osd_vms: 1
 mds_vms: 0
-rgw_vms: 0
+rgw_vms: 1
 nfs_vms: 0
 grafana_server_vms: 0
 rbd_mirror_vms: 0
index 3c7a8d3e66561a384e971e13264fe0582edbb63c..03115ef284e1ae6809cbca3871f97df32fe93a76 100644 (file)
@@ -7,7 +7,7 @@ docker: false
 mon_vms: 1
 osd_vms: 1
 mds_vms: 0
-rgw_vms: 0
+rgw_vms: 1
 nfs_vms: 0
 grafana_server_vms: 0
 rbd_mirror_vms: 0
index ac27dcead8d6d5dab8436b7a43ba8233ed1353ac..a995fd0d4a6922b34e2e11f3cc8351d2f74694eb 100644 (file)
@@ -29,8 +29,9 @@
         s3cmd --no-ssl --access_key={{ item.system_access_key }} --secret_key={{ item.system_secret_key }} --host={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} --host-bucket={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} mb s3://testinfra-{{ item.rgw_realm }};
         s3cmd --no-ssl --access_key={{ item.system_access_key }} --secret_key={{ item.system_secret_key }} --host={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} --host-bucket={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} put /tmp/testinfra-{{ item.rgw_realm }}.img s3://testinfra-{{ item.rgw_realm }}'
       with_items: "{{ rgw_instances_host }}"
+      tags: upload
       when:
-        - rgw_zonemaster | bool
+        - item.rgw_zonemaster | default(rgw_zonemaster) | bool
         - containerized_deployment | bool
 
     - name: generate and upload a random a 10Mb file - non containerized
@@ -39,8 +40,9 @@
         s3cmd --no-ssl --access_key={{ item.system_access_key }} --secret_key={{ item.system_secret_key }} --host={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} --host-bucket={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} mb s3://testinfra-{{ item.rgw_realm }};
         s3cmd --no-ssl --access_key={{ item.system_access_key }} --secret_key={{ item.system_secret_key }} --host={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} --host-bucket={{ item.radosgw_address }}:{{ item.radosgw_frontend_port }} put /tmp/testinfra-{{ item.rgw_realm }}.img s3://testinfra-{{ item.rgw_realm }};
       with_items: "{{ rgw_instances_host }}"
+      tags: upload
       when:
-        - rgw_zonemaster | bool
+        - item.rgw_zonemaster | default(rgw_zonemaster) | bool
         - not containerized_deployment | bool
 
     - name: get info from replicated file - containerized deployment
@@ -51,8 +53,9 @@
       retries: 60
       delay: 1
       until: result is succeeded
+      tags: download
       when:
-        - not rgw_zonemaster | bool
+        - not item.rgw_zonemaster | default(rgw_zonemaster) | bool
         - containerized_deployment | bool
 
     - name: get info from replicated file - non containerized
@@ -63,6 +66,7 @@
       retries: 60
       delay: 1
       until: result is succeeded
+      tags: download
       when:
-        - not rgw_zonemaster | bool
+        - not item.rgw_zonemaster | default(rgw_zonemaster) | bool
         - not containerized_deployment | bool
diff --git a/tox.ini b/tox.ini
index 01d686557d7a6c916e14c1a87ed7451aeeef5864..f5533716cd19b0bc46a2bc76033879c7e466e82d 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -43,7 +43,7 @@ commands=
       ceph_stable_release={env:CEPH_STABLE_RELEASE:luminous} \
       ceph_docker_registry={env:CEPH_DOCKER_REGISTRY:docker.io} \
       ceph_docker_image={env:CEPH_DOCKER_IMAGE:ceph/daemon} \
-      ceph_docker_image_tag={env:CEPH_DOCKER_IMAGE_TAG:latest-master} \
+      ceph_docker_image_tag={env:CEPH_DOCKER_IMAGE_TAG:latest-octopus} \
   "
 
   # wait 30sec for services to be ready
@@ -51,7 +51,7 @@ commands=
   # test cluster state using ceph-ansible tests
   py.test --reruns 5 --reruns-delay 1 -n 8 --durations=0 --sudo -v --connection=ansible --ansible-inventory={changedir}/hosts --ssh-config={changedir}/vagrant_ssh_config {envdir}/tmp/ceph-ansible/tests/functional/tests
 
-  # install ceph-ansible@master requirements
+  # install ceph-ansible@octopus requirements
   pip install -r {toxinidir}/tests/requirements.txt
 
   # migrate osds to ceph-volume and upgrade to nautilus
@@ -60,7 +60,7 @@ commands=
       fetch_directory={env:FETCH_DIRECTORY:{changedir}/fetch} \
       ceph_docker_registry={env:CEPH_DOCKER_REGISTRY:docker.io} \
       ceph_docker_image={env:UPDATE_CEPH_DOCKER_IMAGE:ceph/daemon} \
-      ceph_docker_image_tag={env:UPDATE_CEPH_DOCKER_IMAGE_TAG:latest-master} \
+      ceph_docker_image_tag={env:UPDATE_CEPH_DOCKER_IMAGE_TAG:latest-octopus} \
       ceph_stable_release=nautilus \
       osd_scenario=lvm \
   "
@@ -282,8 +282,16 @@ commands=
       ceph_docker_registry_username={env:DOCKER_HUB_USERNAME} \
       ceph_docker_registry_password={env:DOCKER_HUB_PASSWORD} \
       "
-  ansible-playbook -vv -i {changedir}/hosts {toxinidir}/tests/functional/rgw_multisite.yml --extra-vars "ceph_docker_registry={env:CEPH_DOCKER_REGISTRY:quay.ceph.io} ceph_docker_image={env:CEPH_DOCKER_IMAGE:ceph-ci/daemon} ceph_docker_image_tag={env:CEPH_DOCKER_IMAGE_TAG:latest}"
-  ansible-playbook --ssh-common-args='-F {changedir}/secondary/vagrant_ssh_config -o ControlMaster=auto -o ControlPersist=600s -o PreferredAuthentications=publickey' -vv -i {changedir}/secondary/hosts {toxinidir}/tests/functional/rgw_multisite.yml --extra-vars "ceph_docker_registry={env:CEPH_DOCKER_REGISTRY:quay.ceph.io} ceph_docker_image={env:CEPH_DOCKER_IMAGE:ceph-ci/daemon} ceph_docker_image_tag={env:CEPH_DOCKER_IMAGE_TAG:latest}"
+  ansible-playbook -vv -i {changedir}/{env:INVENTORY} {toxinidir}/{env:PLAYBOOK:site.yml.sample} --limit rgws --extra-vars "\
+      ceph_stable_release={env:CEPH_STABLE_RELEASE:octopus} \
+      ceph_docker_registry_auth=True \
+      ceph_docker_registry_username={env:DOCKER_HUB_USERNAME} \
+      ceph_docker_registry_password={env:DOCKER_HUB_PASSWORD} \
+  "
+  ansible-playbook -vv -i {changedir}/hosts {toxinidir}/tests/functional/rgw_multisite.yml --skip-tags download
+  ansible-playbook --ssh-common-args='-F {changedir}/secondary/vagrant_ssh_config -o ControlMaster=auto -o ControlPersist=600s -o PreferredAuthentications=publickey' -vv -i {changedir}/secondary/hosts {toxinidir}/tests/functional/rgw_multisite.yml --skip-tags download
+  ansible-playbook -vv -i {changedir}/hosts {toxinidir}/tests/functional/rgw_multisite.yml --skip-tags upload
+  ansible-playbook --ssh-common-args='-F {changedir}/secondary/vagrant_ssh_config -o ControlMaster=auto -o ControlPersist=600s -o PreferredAuthentications=publickey' -vv -i {changedir}/secondary/hosts {toxinidir}/tests/functional/rgw_multisite.yml --skip-tags upload
   bash -c "cd {changedir}/secondary && vagrant destroy --force"
   # clean rule after the scenario is complete
   ansible -i localhost, all -c local -b -m iptables -a 'chain=FORWARD protocol=tcp source=192.168.0.0/16 destination=192.168.0.0/16 jump=ACCEPT action=insert rule_num=1 state=absent'
@@ -389,6 +397,7 @@ commands=
       delegate_facts_host={env:DELEGATE_FACTS_HOST:True} \
       fetch_directory={env:FETCH_DIRECTORY:{changedir}/fetch} \
       ceph_stable_release={env:CEPH_STABLE_RELEASE:octopus} \
+      deploy_secondary_zones=False \
       ceph_docker_registry_auth=True \
       ceph_docker_registry_username={env:DOCKER_HUB_USERNAME} \
       ceph_docker_registry_password={env:DOCKER_HUB_PASSWORD} \