From 205f4d31deef2b09432ba2c0e2865e3b6e45e00c Mon Sep 17 00:00:00 2001 From: Ricardo Carrillo Cruz Date: Mon, 30 May 2016 13:25:04 +0000 Subject: [PATCH] Add support for clustered servers Certain services are expected to be served by more than one server, think of git mirrors, zuul workers etc. While we could define all of them with numbered pattern manually in the resources.yaml file, this gets unwieldy and boring if the count is large, repeating on and on the same server stanzas with just <$NODE_COUNT>. This change allows to put a 'node_count' attribute to the server resource. With it, the role will create as many servers as 'node_count' by numbering the servers as <$NODE_COUNT>. e.g. servers: - name: logstash-worker.openstack.org image: ubuntu-trusty flavor: d1 node_count: 2 That would make the role to create two server instances named 'logstash-worker01.openstack.org' and 'logstash-worker02.openstack.org' Change-Id: I220a2786efe56187f60f1eed2f32e661e6d3ed3f --- tasks/create_server.yml | 3 ++- tests/resources.yml | 10 ++++++++++ tests/test.yaml | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/tasks/create_server.yml b/tasks/create_server.yml index 18788ff..fe25270 100644 --- a/tasks/create_server.yml +++ b/tasks/create_server.yml @@ -5,7 +5,7 @@ - os_server: cloud: "{{ item_cloud.oscc_cloud|default(item_cloud.name) }}" state: "{{ item_server.state|default(omit) }}" - name: "{{ item_server.name }}" + name: "{{ item_server.name.partition('.')[0] }}{{ '' if item_server.node_count is not defined else item }}{{ item_server.name.partition('.')[1] + item_server.name.partition('.')[2] }}" image: "{{ item_server.image }}" auto_ip: "{{ item_server.auto_ip|default(omit) }}" boot_from_volume: "{{ item_server.boot_from_volume|default(omit) }}" @@ -28,6 +28,7 @@ userdata: "{{ item_server.userdata|default(omit) }}" volume_size: "{{ item_server.volume_size|default(omit) }}" volumes: "{{ item_server.volumes|default(omit) }}" + with_sequence: start=1 end={{ item_server.node_count|default(1) }} format=%02x register: os_server_result - add_host: name={{ item.server.name }} groups=cl_servers_just_created ansible_ssh_host={{ item.server.public_v4 }} diff --git a/tests/resources.yml b/tests/resources.yml index c16f659..80b2cd8 100644 --- a/tests/resources.yml +++ b/tests/resources.yml @@ -29,6 +29,16 @@ clouds: image: cirros-0.3.4-x86_64-uec flavor: c1 network: test_network + - name: test_cluster + image: cirros-0.3.4-x86_64-uec + flavor: c1 + network: test_network + node_count: 2 + - name: test_cluster.testdomain + image: cirros-0.3.4-x86_64-uec + flavor: c1 + network: test_network + node_count: 2 networks: - name: test_network subnets: diff --git a/tests/test.yaml b/tests/test.yaml index b6c1be6..c0c21c5 100644 --- a/tests/test.yaml +++ b/tests/test.yaml @@ -68,3 +68,35 @@ - name: Assert test-network network has been created assert: { that: result.rc == 0 } + + - name: Querying for test_cluster01 server + command: openstack --os-cloud devstack server show test_cluster01 + register: result + changed_when: False + + - name: Assert test_cluster01 server has been created + assert: { that: result.rc == 0 } + + - name: Querying for test_cluster02 server + command: openstack --os-cloud devstack server show test_cluster02 + register: result + changed_when: False + + - name: Assert test_cluster02 server has been created + assert: { that: result.rc == 0 } + + - name: Querying for test_cluster01.testdomain server + command: openstack --os-cloud devstack server show test_cluster01.testdomain + register: result + changed_when: False + + - name: Assert test_cluster01.testdomain server has been created + assert: { that: result.rc == 0 } + + - name: Querying for test_cluster02.testdomain server + command: openstack --os-cloud devstack server show test_cluster02.testdomain + register: result + changed_when: False + + - name: Assert test_cluster02.testdomain server has been created + assert: { that: result.rc == 0 }