From 29fb2ad52f41adbea751215308e3db3d9112af9f Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Fri, 24 Jun 2016 16:55:38 +0000 Subject: [PATCH 01/10] Add access to push to docker registry to compose-x86-01, Infra Ticket#5368 Signed-off-by: Adam Miller --- playbooks/groups/docker-registry.yml | 21 +++++++++++++++ playbooks/groups/osbs-master.yml | 38 ++++++++++------------------ roles/push-docker/tasks/main.yml | 23 +++++++++++++++++ 3 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 roles/push-docker/tasks/main.yml diff --git a/playbooks/groups/docker-registry.yml b/playbooks/groups/docker-registry.yml index e9d33e2461..1de2af7f9c 100644 --- a/playbooks/groups/docker-registry.yml +++ b/playbooks/groups/docker-registry.yml @@ -91,3 +91,24 @@ }, when: env == "production" } + +- name: Setup compose-x86-01 push docker images to registry + hosts: compose-x86-01.phx2.fedoraproject.org + user: root + gather_facts: True + tags: + - releng-compose + + roles: + - { + role: push-docker, + docker_cert_dir: "/etc/docker/certs.d/registry.stg.fedoraproject.org", + private: {{private}}, + when: env == "staging" + } + - { + role: push-docker, + docker_cert_dir: "/etc/docker/certs.d/registry.fedoraproject.org", + private: {{private}}, + when: env == "production" + } diff --git a/playbooks/groups/osbs-master.yml b/playbooks/groups/osbs-master.yml index 4ea9392045..6127fe95d3 100644 --- a/playbooks/groups/osbs-master.yml +++ b/playbooks/groups/osbs-master.yml @@ -45,30 +45,6 @@ src: "{{files}}/osbs/docker-storage-setup" dest: "/etc/sysconfig/docker-storage-setup" - - name: install docker - action: "{{ ansible_pkg_mgr }} name=docker state=installed" - - - name: ensure docker daemon cert dir exists - file: - path: "{{docker_cert_dir}}" - state: directory - - - name: install docker client cert for registry - copy: - src: "{{private}}/files/koji/containerbuild.cert.pem" - dest: "{{docker_cert_dir}}/client.cert" - - - name: install docker client key for registry - copy: - src: "{{private}}/files/koji/containerbuild.key.pem" - dest: "{{docker_cert_dir}}/client.key" - - - name: run docker-storage-setup - shell: "docker-storage-setup" - - - name: start and enable docker - service: name=docker state=started enabled=yes - - name: create cert dir for openshift public facing REST API SSL file: path: "/etc/origin/master/named_certificates" @@ -94,6 +70,20 @@ src: "{{private}}/files/httpd/osbs.htpasswd" dest: /etc/origin/htpasswd + roles: + - { + role: push-docker, + docker_cert_dir: "/etc/docker/certs.d/registry.stg.fedoraproject.org", + private: {{private}}, + when: env == "staging" + } + - { + role: push-docker, + docker_cert_dir: "/etc/docker/certs.d/registry.fedoraproject.org", + private: {{private}}, + when: env == "production" + } + - name: setup osbs hosts: osbs:osbs-stg vars_files: diff --git a/roles/push-docker/tasks/main.yml b/roles/push-docker/tasks/main.yml new file mode 100644 index 0000000000..204c0bfd4e --- /dev/null +++ b/roles/push-docker/tasks/main.yml @@ -0,0 +1,23 @@ +--- +# tasks file for push-docker +# +- name: install docker + action: "{{ ansible_pkg_mgr }} name=docker state=installed" + +- name: ensure docker daemon cert dir exists + file: + path: "{{docker_cert_dir}}" + state: directory + +- name: install docker client cert for registry + copy: + src: "{{private}}/files/koji/containerbuild.cert.pem" + dest: "{{docker_cert_dir}}/client.cert" + +- name: install docker client key for registry + copy: + src: "{{private}}/files/koji/containerbuild.key.pem" + dest: "{{docker_cert_dir}}/client.key" + +- name: start and enable docker + service: name=docker state=started enabled=yes From 6d11a5b10caeec638bf457182e4159baf814cf77 Mon Sep 17 00:00:00 2001 From: Kevin Fenzi Date: Fri, 24 Jun 2016 17:10:45 +0000 Subject: [PATCH 02/10] Add missing "s --- playbooks/groups/docker-registry.yml | 4 ++-- playbooks/groups/osbs-master.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/playbooks/groups/docker-registry.yml b/playbooks/groups/docker-registry.yml index 1de2af7f9c..e4a1f02723 100644 --- a/playbooks/groups/docker-registry.yml +++ b/playbooks/groups/docker-registry.yml @@ -103,12 +103,12 @@ - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.stg.fedoraproject.org", - private: {{private}}, + private: "{{private}}", when: env == "staging" } - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.fedoraproject.org", - private: {{private}}, + private: "{{private}}", when: env == "production" } diff --git a/playbooks/groups/osbs-master.yml b/playbooks/groups/osbs-master.yml index 6127fe95d3..8e70a257a6 100644 --- a/playbooks/groups/osbs-master.yml +++ b/playbooks/groups/osbs-master.yml @@ -74,13 +74,13 @@ - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.stg.fedoraproject.org", - private: {{private}}, + private: "{{private}}", when: env == "staging" } - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.fedoraproject.org", - private: {{private}}, + private: "{{private}}", when: env == "production" } From fb6f3f4a808e33e70469c40c1e6bb1471a670973 Mon Sep 17 00:00:00 2001 From: Kevin Fenzi Date: Fri, 24 Jun 2016 19:53:56 +0000 Subject: [PATCH 03/10] Update flock staff alias --- roles/fas_client/files/aliases.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/fas_client/files/aliases.template b/roles/fas_client/files/aliases.template index 91cef5f6de..c7d39af304 100644 --- a/roles/fas_client/files/aliases.template +++ b/roles/fas_client/files/aliases.template @@ -144,7 +144,7 @@ fudcon-paper: fudcon-cfp # flock flockpress: rsuehle,spot,fpl flockinfo: rsuehle,spot,fpl -flock-staff: rsuehle,spot,fpl,jwboyer,decause +flock-staff: rsuehle,spot,fpl,jwboyer,jzb@redhat.com # gnome backups gnomebackup: backups@gnome.org From 236dbb814eb5354f5453f72e054c2b41525ac77f Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Fri, 24 Jun 2016 19:57:58 +0000 Subject: [PATCH 04/10] pull required docker images for openshift from our registry Signed-off-by: Adam Miller --- playbooks/groups/osbs-master.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/playbooks/groups/osbs-master.yml b/playbooks/groups/osbs-master.yml index 8e70a257a6..0e71042653 100644 --- a/playbooks/groups/osbs-master.yml +++ b/playbooks/groups/osbs-master.yml @@ -284,3 +284,11 @@ src: /usr/share/atomic-reactor/atomic-reactor.tar.gz dest: /etc/osbs/buildroot/atomic-reactor.tar.gz state: hardlink + + - name: pull openshift required docker images and tag locally + shell: "docker pull {{docker_registry}}/{{item}}:v$(rpm -q origin --qf '%{Version}') && docker tag {{docker_registry}}/{{item}}:v$(rpm -q origin --qf '%{Version}') {{item}}:v$(rpm -q origin --qf '%{Version}')" + with_items: + - "openshift/origin-pod" + + - name: refresh fedora image streams + shell: "oc import-image fedora --all" From 8eb4dc5ba9009e6ac3868e0b8f81627be63a3935 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Fri, 24 Jun 2016 20:41:50 +0000 Subject: [PATCH 05/10] remove recursive private var definition Signed-off-by: Adam Miller --- playbooks/groups/docker-registry.yml | 2 -- playbooks/groups/osbs-master.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/playbooks/groups/docker-registry.yml b/playbooks/groups/docker-registry.yml index e4a1f02723..dec00520e8 100644 --- a/playbooks/groups/docker-registry.yml +++ b/playbooks/groups/docker-registry.yml @@ -103,12 +103,10 @@ - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.stg.fedoraproject.org", - private: "{{private}}", when: env == "staging" } - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.fedoraproject.org", - private: "{{private}}", when: env == "production" } diff --git a/playbooks/groups/osbs-master.yml b/playbooks/groups/osbs-master.yml index 0e71042653..0f1c2a7642 100644 --- a/playbooks/groups/osbs-master.yml +++ b/playbooks/groups/osbs-master.yml @@ -74,13 +74,11 @@ - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.stg.fedoraproject.org", - private: "{{private}}", when: env == "staging" } - { role: push-docker, docker_cert_dir: "/etc/docker/certs.d/registry.fedoraproject.org", - private: "{{private}}", when: env == "production" } From f18762fce00563ae7fa51bf11c83e65b4d5629e2 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Fri, 24 Jun 2016 21:57:45 +0000 Subject: [PATCH 06/10] fix typo for osbs atomic-reactor buildroot conf hardlink Signed-off-by: Adam Miller --- playbooks/groups/osbs-master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playbooks/groups/osbs-master.yml b/playbooks/groups/osbs-master.yml index 0f1c2a7642..4f3cddc2e2 100644 --- a/playbooks/groups/osbs-master.yml +++ b/playbooks/groups/osbs-master.yml @@ -281,7 +281,7 @@ file: src: /usr/share/atomic-reactor/atomic-reactor.tar.gz dest: /etc/osbs/buildroot/atomic-reactor.tar.gz - state: hardlink + state: hard - name: pull openshift required docker images and tag locally shell: "docker pull {{docker_registry}}/{{item}}:v$(rpm -q origin --qf '%{Version}') && docker tag {{docker_registry}}/{{item}}:v$(rpm -q origin --qf '%{Version}') {{item}}:v$(rpm -q origin --qf '%{Version}')" From a0bb154ac4574fd7172fdfd1010be4099eb837b9 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Fri, 24 Jun 2016 22:24:39 +0000 Subject: [PATCH 07/10] remove osbs copr repos, no longer needed Signed-off-by: Adam Miller --- playbooks/groups/osbs-master.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/playbooks/groups/osbs-master.yml b/playbooks/groups/osbs-master.yml index 4f3cddc2e2..cc3bbce5d9 100644 --- a/playbooks/groups/osbs-master.yml +++ b/playbooks/groups/osbs-master.yml @@ -38,8 +38,6 @@ - /srv/web/infra/ansible/vars/{{ ansible_distribution }}.yml tasks: - - include: "{{tasks}}/osbs_repos.yml" - - name: copy docker-storage-setup config copy: src: "{{files}}/osbs/docker-storage-setup" From b110a98d10dd19f75cfb8fcbe6ef5a53d00021b2 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Fri, 24 Jun 2016 22:38:27 +0000 Subject: [PATCH 08/10] remove copr all together from openshift install role Signed-off-by: Adam Miller --- roles/osbs-install-openshift/defaults/main.yml | 4 ++-- roles/osbs-install-openshift/tasks/main.yml | 3 +++ roles/osbs-install-openshift/tasks/method_fedora.yml | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 roles/osbs-install-openshift/tasks/method_fedora.yml diff --git a/roles/osbs-install-openshift/defaults/main.yml b/roles/osbs-install-openshift/defaults/main.yml index fefe12d70e..463f6530dd 100644 --- a/roles/osbs-install-openshift/defaults/main.yml +++ b/roles/osbs-install-openshift/defaults/main.yml @@ -1,6 +1,6 @@ --- -# methods: copr, source -install_openshift_method: copr +# methods: copr, source, fedora +install_openshift_method: fedora # copr-specific variables diff --git a/roles/osbs-install-openshift/tasks/main.yml b/roles/osbs-install-openshift/tasks/main.yml index 2bcd73c73d..ad0f13ee8c 100644 --- a/roles/osbs-install-openshift/tasks/main.yml +++ b/roles/osbs-install-openshift/tasks/main.yml @@ -1,4 +1,7 @@ --- +- include: method_fedora.yml + when: install_openshift_method == 'fedora' + - include: method_copr.yml when: install_openshift_method == 'copr' diff --git a/roles/osbs-install-openshift/tasks/method_fedora.yml b/roles/osbs-install-openshift/tasks/method_fedora.yml new file mode 100644 index 0000000000..ee11fde1ad --- /dev/null +++ b/roles/osbs-install-openshift/tasks/method_fedora.yml @@ -0,0 +1,6 @@ +--- +- name: install openshift + action: "{{ ansible_pkg_mgr }} name={{ item }} state={{ osbs_update_packages | ternary('latest', 'present') }}" + with_items: + - origin-master + - origin-node From 8363f3aa6731341ef99fc11a33b6c8af2198f046 Mon Sep 17 00:00:00 2001 From: Kevin Fenzi Date: Fri, 24 Jun 2016 22:41:21 +0000 Subject: [PATCH 09/10] Add ansible 2.2pre version of lvol to avoid issues with the openstack-compute playbooks trying to shrink a lvol. --- library/lvol.py | 401 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 library/lvol.py diff --git a/library/lvol.py b/library/lvol.py new file mode 100644 index 0000000000..75d8c56ac9 --- /dev/null +++ b/library/lvol.py @@ -0,0 +1,401 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2013, Jeroen Hoekx , Alexander Bulimov +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +DOCUMENTATION = ''' +--- +author: + - "Jeroen Hoekx (@jhoekx)" + - "Alexander Bulimov (@abulimov)" +module: lvol +short_description: Configure LVM logical volumes +description: + - This module creates, removes or resizes logical volumes. +version_added: "1.1" +options: + vg: + description: + - The volume group this logical volume is part of. + required: true + lv: + description: + - The name of the logical volume. + required: true + size: + description: + - The size of the logical volume, according to lvcreate(8) --size, by + default in megabytes or optionally with one of [bBsSkKmMgGtTpPeE] units; or + according to lvcreate(8) --extents as a percentage of [VG|PVS|FREE]; + Float values must begin with a digit. + Resizing using percentage values was not supported prior to 2.1. + state: + choices: [ "present", "absent" ] + default: present + description: + - Control if the logical volume exists. If C(present) the C(size) option + is required. + required: false + force: + version_added: "1.5" + choices: [ "yes", "no" ] + default: "no" + description: + - Shrink or remove operations of volumes requires this switch. Ensures that + that filesystems get never corrupted/destroyed by mistake. + required: false + opts: + version_added: "2.0" + description: + - Free-form options to be passed to the lvcreate command + snapshot: + version_added: "2.1" + description: + - The name of the snapshot volume + required: false + pvs: + version_added: "2.2" + description: + - Comma separated list of physical volumes e.g. /dev/sda,/dev/sdb + required: false + shrink: + version_added: "2.2" + description: + - shrink if current size is higher than size requested + required: false + default: yes +notes: + - Filesystems on top of the volume are not resized. +''' + +EXAMPLES = ''' +# Create a logical volume of 512m. +- lvol: vg=firefly lv=test size=512 + +# Create a logical volume of 512m with disks /dev/sda and /dev/sdb +- lvol: vg=firefly lv=test size=512 pvs=/dev/sda,/dev/sdb + +# Create cache pool logical volume +- lvol: vg=firefly lv=lvcache size=512m opts='--type cache-pool' + +# Create a logical volume of 512g. +- lvol: vg=firefly lv=test size=512g + +# Create a logical volume the size of all remaining space in the volume group +- lvol: vg=firefly lv=test size=100%FREE + +# Create a logical volume with special options +- lvol: vg=firefly lv=test size=512g opts="-r 16" + +# Extend the logical volume to 1024m. +- lvol: vg=firefly lv=test size=1024 + +# Extend the logical volume to consume all remaining space in the volume group +- lvol: vg=firefly lv=test size=+100%FREE + +# Extend the logical volume to take all remaining space of the PVs +- lvol: vg=firefly lv=test size=100%PVS + +# Resize the logical volume to % of VG +- lvol: vg-firefly lv=test size=80%VG force=yes + +# Reduce the logical volume to 512m +- lvol: vg=firefly lv=test size=512 force=yes + +# Set the logical volume to 512m and do not try to shrink if size is lower than current one +- lvol: vg=firefly lv=test size=512 shrink=no + +# Remove the logical volume. +- lvol: vg=firefly lv=test state=absent force=yes + +# Create a snapshot volume of the test logical volume. +- lvol: vg=firefly lv=test snapshot=snap1 size=100m +''' + +import re + +decimal_point = re.compile(r"(\d+)") + +def mkversion(major, minor, patch): + return (1000 * 1000 * int(major)) + (1000 * int(minor)) + int(patch) + +def parse_lvs(data): + lvs = [] + for line in data.splitlines(): + parts = line.strip().split(';') + lvs.append({ + 'name': parts[0].replace('[','').replace(']',''), + 'size': int(decimal_point.match(parts[1]).group(1)) + }) + return lvs + +def parse_vgs(data): + vgs = [] + for line in data.splitlines(): + parts = line.strip().split(';') + vgs.append({ + 'name': parts[0], + 'size': int(decimal_point.match(parts[1]).group(1)), + 'free': int(decimal_point.match(parts[2]).group(1)), + 'ext_size': int(decimal_point.match(parts[3]).group(1)) + }) + return vgs + + +def get_lvm_version(module): + ver_cmd = module.get_bin_path("lvm", required=True) + rc, out, err = module.run_command("%s version" % (ver_cmd)) + if rc != 0: + return None + m = re.search("LVM version:\s+(\d+)\.(\d+)\.(\d+).*(\d{4}-\d{2}-\d{2})", out) + if not m: + return None + return mkversion(m.group(1), m.group(2), m.group(3)) + + +def main(): + module = AnsibleModule( + argument_spec=dict( + vg=dict(required=True), + lv=dict(required=True), + size=dict(type='str'), + opts=dict(type='str'), + state=dict(choices=["absent", "present"], default='present'), + force=dict(type='bool', default='no'), + shrink=dict(type='bool', default='yes'), + snapshot=dict(type='str', default=None), + pvs=dict(type='str') + ), + supports_check_mode=True, + ) + + # Determine if the "--yes" option should be used + version_found = get_lvm_version(module) + if version_found == None: + module.fail_json(msg="Failed to get LVM version number") + version_yesopt = mkversion(2, 2, 99) # First LVM with the "--yes" option + if version_found >= version_yesopt: + yesopt = "--yes" + else: + yesopt = "" + + vg = module.params['vg'] + lv = module.params['lv'] + size = module.params['size'] + opts = module.params['opts'] + state = module.params['state'] + force = module.boolean(module.params['force']) + shrink = module.boolean(module.params['shrink']) + size_opt = 'L' + size_unit = 'm' + snapshot = module.params['snapshot'] + pvs = module.params['pvs'] + + if pvs is None: + pvs = "" + else: + pvs = pvs.replace(",", " ") + + if opts is None: + opts = "" + + # Add --test option when running in check-mode + if module.check_mode: + test_opt = ' --test' + else: + test_opt = '' + + if size: + # LVCREATE(8) -l --extents option with percentage + if '%' in size: + size_parts = size.split('%', 1) + size_percent = int(size_parts[0]) + if size_percent > 100: + module.fail_json(msg="Size percentage cannot be larger than 100%") + size_whole = size_parts[1] + if size_whole == 'ORIGIN': + module.fail_json(msg="Snapshot Volumes are not supported") + elif size_whole not in ['VG', 'PVS', 'FREE']: + module.fail_json(msg="Specify extents as a percentage of VG|PVS|FREE") + size_opt = 'l' + size_unit = '' + + if not '%' in size: + # LVCREATE(8) -L --size option unit + if size[-1].lower() in 'bskmgtpe': + size_unit = size[-1].lower() + size = size[0:-1] + + try: + float(size) + if not size[0].isdigit(): raise ValueError() + except ValueError: + module.fail_json(msg="Bad size specification of '%s'" % size) + + # when no unit, megabytes by default + if size_opt == 'l': + unit = 'm' + else: + unit = size_unit + + # Get information on volume group requested + vgs_cmd = module.get_bin_path("vgs", required=True) + rc, current_vgs, err = module.run_command( + "%s --noheadings -o vg_name,size,free,vg_extent_size --units %s --separator ';' %s" % (vgs_cmd, unit, vg)) + + if rc != 0: + if state == 'absent': + module.exit_json(changed=False, stdout="Volume group %s does not exist." % vg, stderr=False) + else: + module.fail_json(msg="Volume group %s does not exist." % vg, rc=rc, err=err) + + vgs = parse_vgs(current_vgs) + this_vg = vgs[0] + + # Get information on logical volume requested + lvs_cmd = module.get_bin_path("lvs", required=True) + rc, current_lvs, err = module.run_command( + "%s -a --noheadings --nosuffix -o lv_name,size --units %s --separator ';' %s" % (lvs_cmd, unit, vg)) + + if rc != 0: + if state == 'absent': + module.exit_json(changed=False, stdout="Volume group %s does not exist." % vg, stderr=False) + else: + module.fail_json(msg="Volume group %s does not exist." % vg, rc=rc, err=err) + + changed = False + + lvs = parse_lvs(current_lvs) + + if snapshot is None: + check_lv = lv + else: + check_lv = snapshot + for test_lv in lvs: + if test_lv['name'] == check_lv: + this_lv = test_lv + break + else: + this_lv = None + + if state == 'present' and not size: + if this_lv is None: + module.fail_json(msg="No size given.") + else: + module.exit_json(changed=False, vg=vg, lv=this_lv['name'], size=this_lv['size']) + + msg = '' + if this_lv is None: + if state == 'present': + ### create LV + lvcreate_cmd = module.get_bin_path("lvcreate", required=True) + if snapshot is not None: + cmd = "%s %s %s -%s %s%s -s -n %s %s %s/%s" % (lvcreate_cmd, test_opt, yesopt, size_opt, size, size_unit, snapshot, opts, vg, lv) + else: + cmd = "%s %s %s -n %s -%s %s%s %s %s %s" % (lvcreate_cmd, test_opt, yesopt, lv, size_opt, size, size_unit, opts, vg, pvs) + rc, _, err = module.run_command(cmd) + if rc == 0: + changed = True + else: + module.fail_json(msg="Creating logical volume '%s' failed" % lv, rc=rc, err=err) + else: + if state == 'absent': + ### remove LV + if not force: + module.fail_json(msg="Sorry, no removal of logical volume %s without force=yes." % (this_lv['name'])) + lvremove_cmd = module.get_bin_path("lvremove", required=True) + rc, _, err = module.run_command("%s %s --force %s/%s" % (lvremove_cmd, test_opt, vg, this_lv['name'])) + if rc == 0: + module.exit_json(changed=True) + else: + module.fail_json(msg="Failed to remove logical volume %s" % (lv), rc=rc, err=err) + + elif size_opt == 'l': + ### Resize LV based on % value + tool = None + size_free = this_vg['free'] + if size_whole == 'VG' or size_whole == 'PVS': + size_requested = size_percent * this_vg['size'] / 100 + else: # size_whole == 'FREE': + size_requested = size_percent * this_vg['free'] / 100 + if '+' in size: + size_requested += this_lv['size'] + if this_lv['size'] < size_requested: + if (size_free > 0) and (('+' not in size) or (size_free >= (size_requested - this_lv['size']))): + tool = module.get_bin_path("lvextend", required=True) + else: + module.fail_json(msg="Logical Volume %s could not be extended. Not enough free space left (%s%s required / %s%s available)" % (this_lv['name'], (size_requested - this_lv['size']), unit, size_free, unit)) + elif shrink and this_lv['size'] > size_requested + this_vg['ext_size']: # more than an extent too large + if size_requested == 0: + module.fail_json(msg="Sorry, no shrinking of %s to 0 permitted." % (this_lv['name'])) + elif not force: + module.fail_json(msg="Sorry, no shrinking of %s without force=yes" % (this_lv['name'])) + else: + tool = module.get_bin_path("lvreduce", required=True) + tool = '%s %s' % (tool, '--force') + + if tool: + cmd = "%s %s -%s %s%s %s/%s %s" % (tool, test_opt, size_opt, size, size_unit, vg, this_lv['name'], pvs) + rc, out, err = module.run_command(cmd) + if "Reached maximum COW size" in out: + module.fail_json(msg="Unable to resize %s to %s%s" % (lv, size, size_unit), rc=rc, err=err, out=out) + elif rc == 0: + changed = True + msg="Volume %s resized to %s%s" % (this_lv['name'], size_requested, unit) + elif "matches existing size" in err: + module.exit_json(changed=False, vg=vg, lv=this_lv['name'], size=this_lv['size']) + elif "not larger than existing size" in err: + module.exit_json(changed=False, vg=vg, lv=this_lv['name'], size=this_lv['size'], msg="Original size is larger than requested size", err=err) + else: + module.fail_json(msg="Unable to resize %s to %s%s" % (lv, size, size_unit), rc=rc, err=err) + + else: + ### resize LV based on absolute values + tool = None + if int(size) > this_lv['size']: + tool = module.get_bin_path("lvextend", required=True) + elif shrink and int(size) < this_lv['size']: + if int(size) == 0: + module.fail_json(msg="Sorry, no shrinking of %s to 0 permitted." % (this_lv['name'])) + if not force: + module.fail_json(msg="Sorry, no shrinking of %s without force=yes." % (this_lv['name'])) + else: + tool = module.get_bin_path("lvreduce", required=True) + tool = '%s %s' % (tool, '--force') + + if tool: + cmd = "%s %s -%s %s%s %s/%s %s" % (tool, test_opt, size_opt, size, size_unit, vg, this_lv['name'], pvs) + rc, out, err = module.run_command(cmd) + if "Reached maximum COW size" in out: + module.fail_json(msg="Unable to resize %s to %s%s" % (lv, size, size_unit), rc=rc, err=err, out=out) + elif rc == 0: + changed = True + elif "matches existing size" in err: + module.exit_json(changed=False, vg=vg, lv=this_lv['name'], size=this_lv['size']) + elif "not larger than existing size" in err: + module.exit_json(changed=False, vg=vg, lv=this_lv['name'], size=this_lv['size'], msg="Original size is larger than requested size", err=err) + else: + module.fail_json(msg="Unable to resize %s to %s%s" % (lv, size, size_unit), rc=rc, err=err) + + module.exit_json(changed=changed, msg=msg) + +# import module snippets +from ansible.module_utils.basic import * + +if __name__ == '__main__': + main() From 13e070f91886a2e5a3d0ff01da59ae6771b55dd8 Mon Sep 17 00:00:00 2001 From: Kevin Fenzi Date: Fri, 24 Jun 2016 22:43:24 +0000 Subject: [PATCH 10/10] Also mark this shrink=no --- roles/cloud_compute/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/cloud_compute/tasks/main.yml b/roles/cloud_compute/tasks/main.yml index 2313c59539..71c722cc28 100644 --- a/roles/cloud_compute/tasks/main.yml +++ b/roles/cloud_compute/tasks/main.yml @@ -31,7 +31,7 @@ owner=root group=root mode=0644 - yum: state=present pkg=openstack-nova-common - name: create logical volume for ephemeral storage - lvol: vg=vg_guests lv=nova size=100%FREE + lvol: vg=vg_guests lv=nova size=100%FREE shrink=no - filesystem: fstype=ext4 dev=/dev/mapper/vg_guests-nova - mount: name=/var/lib/nova src=/dev/mapper/vg_guests-nova fstype=ext4 state=mounted - name: Create logical volume for Swift