From e8558825334285ff0849459873f3204ee01ea0f0 Mon Sep 17 00:00:00 2001
From: Pierre Riteau <pierre@stackhpc.com>
Date: Fri, 11 Jan 2019 17:08:42 +0000
Subject: [PATCH] Support configuring LVM on the seed hypervisor

This allows operators to easily provide storage space for the seed VM.

Change-Id: Ibcb1a5b0d34f2456459604e3a0f3303d93810afb
Story: 2004756
Task: 28862
---
 ansible/group_vars/all/seed-hypervisor        | 43 +++++++++++++++++++
 ansible/group_vars/seed-hypervisor/lvm        |  6 +++
 ansible/lvm.yml                               |  2 +-
 ansible/wipe-disks.yml                        |  2 +-
 etc/kayobe/seed-hypervisor.yml                | 30 +++++++++++++
 kayobe/cli/commands.py                        | 19 +++++++-
 kayobe/tests/unit/cli/test_commands.py        |  1 +
 .../seed-hypervisor-lvm-80864721ff42f6a5.yaml | 10 +++++
 8 files changed, 109 insertions(+), 4 deletions(-)
 create mode 100644 ansible/group_vars/seed-hypervisor/lvm
 create mode 100644 releasenotes/notes/seed-hypervisor-lvm-80864721ff42f6a5.yaml

diff --git a/ansible/group_vars/all/seed-hypervisor b/ansible/group_vars/all/seed-hypervisor
index 2ead10389..8af56b02a 100644
--- a/ansible/group_vars/all/seed-hypervisor
+++ b/ansible/group_vars/all/seed-hypervisor
@@ -20,6 +20,49 @@ seed_hypervisor_default_network_interfaces: "{{ seed_default_network_interfaces
 # List of extra networks to which seed hypervisor nodes are attached.
 seed_hypervisor_extra_network_interfaces: "{{ seed_extra_network_interfaces }}"
 
+###############################################################################
+# Seed hypervisor node LVM configuration.
+
+# List of seed hypervisor volume groups. See mrlesmithjr.manage-lvm role for
+# format. Set to "{{ seed_hypervisor_lvm_groups_with_data }}" to create a
+# volume group for libvirt storage.
+seed_hypervisor_lvm_groups: []
+
+# Suggested list of seed hypervisor volume groups for libvirt. Not used by default.
+seed_hypervisor_lvm_groups_with_data:
+  - "{{ seed_hypervisor_lvm_group_data }}"
+
+# Seed LVM volume group for data. See mrlesmithjr.manage-lvm role for format.
+seed_hypervisor_lvm_group_data:
+  vgname: data
+  disks: "{{ seed_hypervisor_lvm_group_data_disks }}"
+  create: True
+  lvnames: "{{ seed_hypervisor_lvm_group_data_lvs }}"
+
+# List of disks for use by seed hypervisor LVM data volume group. Default to an
+# invalid value to require configuration.
+seed_hypervisor_lvm_group_data_disks:
+  - changeme
+
+# List of LVM logical volumes for the data volume group.
+seed_hypervisor_lvm_group_data_lvs:
+  - "{{ seed_hypervisor_lvm_group_data_lv_libvirt_storage }}"
+
+# Libvirt storage LVM backing volume.
+seed_hypervisor_lvm_group_data_lv_libvirt_storage:
+  lvname: libvirt-storage
+  size: "{{ seed_hypervisor_lvm_group_data_lv_libvirt_storage_size }}"
+  create: True
+  filesystem: "{{ seed_hypervisor_lvm_group_data_lv_libvirt_storage_fs }}"
+  mount: True
+  mntp: "{{ seed_hypervisor_libvirt_pool_path }}"
+
+# Size of libvirt storage LVM backing volume.
+seed_hypervisor_lvm_group_data_lv_libvirt_storage_size: 100%VG
+
+# Filesystem for libvirt storage LVM backing volume. ext4 allows for shrinking.
+seed_hypervisor_lvm_group_data_lv_libvirt_storage_fs: ext4
+
 ###############################################################################
 # Seed hypervisor libvirt storage pool configuration.
 
diff --git a/ansible/group_vars/seed-hypervisor/lvm b/ansible/group_vars/seed-hypervisor/lvm
new file mode 100644
index 000000000..0196af312
--- /dev/null
+++ b/ansible/group_vars/seed-hypervisor/lvm
@@ -0,0 +1,6 @@
+---
+###############################################################################
+# Seed hypervisor node LVM configuration.
+
+# List of LVM volume groups.
+lvm_groups: "{{ seed_hypervisor_lvm_groups }}"
diff --git a/ansible/lvm.yml b/ansible/lvm.yml
index a85c69e71..93d6102c6 100644
--- a/ansible/lvm.yml
+++ b/ansible/lvm.yml
@@ -1,6 +1,6 @@
 ---
 - name: Ensure LVM configuration is applied
-  hosts: seed:overcloud
+  hosts: seed-hypervisor:seed:overcloud
   tags:
     - lvm
     - upgrade-check
diff --git a/ansible/wipe-disks.yml b/ansible/wipe-disks.yml
index 224534a34..2b2c6ea23 100644
--- a/ansible/wipe-disks.yml
+++ b/ansible/wipe-disks.yml
@@ -7,7 +7,7 @@
 # any LVM or file system state from them.
 
 - name: Ensure that all unmounted block devices are wiped
-  hosts: seed:overcloud
+  hosts: seed-hypervisor:seed:overcloud
   tags:
     - wipe-disks
   roles:
diff --git a/etc/kayobe/seed-hypervisor.yml b/etc/kayobe/seed-hypervisor.yml
index 93ccd5d3b..341b6da1c 100644
--- a/etc/kayobe/seed-hypervisor.yml
+++ b/etc/kayobe/seed-hypervisor.yml
@@ -18,6 +18,36 @@
 # List of extra networks to which seed hypervisor nodes are attached.
 #seed_hypervisor_extra_network_interfaces:
 
+###############################################################################
+# Seed hypervisor node LVM configuration.
+
+# List of seed hypervisor volume groups. See mrlesmithjr.manage-lvm role for
+# format. Set to "{{ seed_hypervisor_lvm_groups_with_data }}" to create a
+# volume group for libvirt storage.
+#seed_hypervisor_lvm_groups:
+
+# Suggested list of seed hypervisor volume groups for libvirt. Not used by default.
+#seed_hypervisor_lvm_groups_with_data:
+
+# Seed LVM volume group for data. See mrlesmithjr.manage-lvm role for format.
+#seed_hypervisor_lvm_group_data:
+
+# List of disks for use by seed hypervisor LVM data volume group. Default to an
+# invalid value to require configuration.
+#seed_hypervisor_lvm_group_data_disks:
+
+# List of LVM logical volumes for the data volume group.
+#seed_hypervisor_lvm_group_data_lvs:
+
+# Libvirt storage LVM backing volume.
+#seed_hypervisor_lvm_group_data_lv_libvirt_storage:
+
+# Size of libvirt storage LVM backing volume.
+#seed_hypervisor_lvm_group_data_lv_libvirt_storage_size:
+
+# Filesystem for libvirt storage LVM backing volume. ext4 allows for shrinking.
+#seed_hypervisor_lvm_group_data_lv_libvirt_storage_fs:
+
 ###############################################################################
 # Seed hypervisor libvirt storage pool configuration.
 
diff --git a/kayobe/cli/commands.py b/kayobe/cli/commands.py
index 44472b710..709007c1f 100644
--- a/kayobe/cli/commands.py
+++ b/kayobe/cli/commands.py
@@ -270,15 +270,26 @@ class SeedHypervisorHostConfigure(KollaAnsibleMixin, KayobeAnsibleMixin,
     * Add the host to SSH known hosts.
     * Configure a user account for use by kayobe for SSH access.
     * Optionally, create a virtualenv for remote target hosts.
+    * Optionally, wipe unmounted disk partitions (--wipe-disks).
     * Configure user accounts, group associations, and authorised SSH keys.
     * Configure a PyPI mirror.
     * Configure Yum repos.
     * Configure the host's network interfaces.
     * Set sysctl parameters.
     * Configure NTP.
+    * Configure LVM volumes.
     * Configure the host as a libvirt hypervisor.
     """
 
+    def get_parser(self, prog_name):
+        parser = super(SeedHypervisorHostConfigure, self).get_parser(prog_name)
+        group = parser.add_argument_group("Host Configuration")
+        group.add_argument("--wipe-disks", action='store_true',
+                           help="wipe partition and LVM data from all disks "
+                                "that are not mounted. Warning: this can "
+                                "result in the loss of data")
+        return parser
+
     def take_action(self, parsed_args):
         self.app.LOG.debug("Configuring seed hypervisor host OS")
         # Explicitly request the dump-config tag to ensure this play runs even
@@ -292,8 +303,12 @@ class SeedHypervisorHostConfigure(KollaAnsibleMixin, KayobeAnsibleMixin,
             sys.exit(1)
         playbooks = _build_playbook_list(
             "ip-allocation", "ssh-known-host", "kayobe-ansible-user",
-            "pip", "kayobe-target-venv", "users", "yum", "dev-tools",
-            "network", "sysctl", "ntp", "seed-hypervisor-libvirt-host")
+            "pip", "kayobe-target-venv")
+        if parsed_args.wipe_disks:
+            playbooks += _build_playbook_list("wipe-disks")
+        playbooks += _build_playbook_list(
+            "users", "yum", "dev-tools", "network", "sysctl", "ntp", "lvm",
+            "seed-hypervisor-libvirt-host")
         self.run_kayobe_playbooks(parsed_args, playbooks,
                                   limit="seed-hypervisor")
 
diff --git a/kayobe/tests/unit/cli/test_commands.py b/kayobe/tests/unit/cli/test_commands.py
index 52c0b9714..e5dac2279 100644
--- a/kayobe/tests/unit/cli/test_commands.py
+++ b/kayobe/tests/unit/cli/test_commands.py
@@ -254,6 +254,7 @@ class TestCase(unittest.TestCase):
                     "ansible/network.yml",
                     "ansible/sysctl.yml",
                     "ansible/ntp.yml",
+                    "ansible/lvm.yml",
                     "ansible/seed-hypervisor-libvirt-host.yml",
                 ],
                 limit="seed-hypervisor",
diff --git a/releasenotes/notes/seed-hypervisor-lvm-80864721ff42f6a5.yaml b/releasenotes/notes/seed-hypervisor-lvm-80864721ff42f6a5.yaml
new file mode 100644
index 000000000..20ba5bc92
--- /dev/null
+++ b/releasenotes/notes/seed-hypervisor-lvm-80864721ff42f6a5.yaml
@@ -0,0 +1,10 @@
+---
+features:
+  - |
+    Adds support for configuring LVM volume groups on the seed hypervisor.
+    Setting the ``seed_hypervisor_lvm_groups`` variable in
+    ``$KAYOBE_CONFIG_PATH/seed-hypervisor.yml`` to
+    ``"{{ seed_hypervisor_lvm_groups_with_data }}"`` and providing a list of
+    storage devices via the ``seed_hypervisor_lvm_group_data_disks`` variable
+    will configure a logical volume mounted to ``/var/lib/libvirt/images``. No
+    LVM volume groups are configured by default.