diff --git a/enoslib/infra/enos_vmong5k/ansible/domain.xml.j2 b/enoslib/infra/enos_vmong5k/ansible/domain.xml.j2 index 3e701c65a3fa368b6717009c388ddec8b7e86119..7f71e87e96b0c7ab10ebe97d3ea887879c211e8c 100644 --- a/enoslib/infra/enos_vmong5k/ansible/domain.xml.j2 +++ b/enoslib/infra/enos_vmong5k/ansible/domain.xml.j2 @@ -17,11 +17,11 @@ <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> - <source file='/tmp/disks/{{ item.alias}}'/> + <source file='{{working_dir}}/{{ item.alias}}'/> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='cdrom'> - <source file='/tmp/cloud-init-data-{{ item.alias }}.iso'/> + <source file='{{ working_dir }}/cloud-init-data-{{ item.alias }}.iso'/> <target dev='vdb' bus='virtio'/> <readonly/> </disk> diff --git a/enoslib/infra/enos_vmong5k/ansible/site.yml b/enoslib/infra/enos_vmong5k/ansible/site.yml index 4e962f8b79be58b48647ebb82eceecccfdeb8174..e8558624e3c75f553697f507a71b46949110bf3d 100644 --- a/enoslib/infra/enos_vmong5k/ansible/site.yml +++ b/enoslib/infra/enos_vmong5k/ansible/site.yml @@ -4,6 +4,16 @@ vars: pubkey: "{{lookup('file', '~/.ssh/id_rsa.pub')}}" tasks: + - name: Enable nested virtualization + shell: | + modprobe -r kvm_intel + modprobe kvm_intel nested=1 + + - name: Add g5k_user to libvirt group + user: + name: msimonin + groups: libvirt + append: yes - name: Destroy running virtual machines (vm -1 / 1) virt: @@ -11,6 +21,8 @@ state: destroyed ignore_errors: yes with_items: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Unregister existing virtual machines (vm -0 / 1) virt: @@ -18,74 +30,67 @@ command: undefine ignore_errors: yes with_items: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - - name: Enable nested virtualization - shell: | - modprobe -r kvm_intel - modprobe kvm_intel nested=1 - - - name: Unmount the tmpfs - mount: - path: /tmp/disks - state: unmounted - when: - - tmpfs is defined - - tmpfs - - - name: Remove a tmpfs for the vms + - name: Create the working directory file: - path: /tmp/disks - state: absent - when: - - tmpfs is defined - - tmpfs - - - name: Create a directory for hosting the virtual disks - file: - path: /tmp/disks + path: "{{ working_dir }}" state: directory - mode: 777 - - - name: Mount the tmpfs - shell: "mount -t tmpfs -o size={{ tmpfs }} tmpfs /tmp/disks" - when: - - tmpfs is defined - - tmpfs + mode: 0711 + recurse: true + become: yes + become_user: "{{ g5k_user }}" - name: Removing previous cloud init data file: - path: "/tmp/cloud-init-data-{{ item.alias }}" + path: "{{ working_dir }}/cloud-init-data-{{ item.alias }}" state: absent loop: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Removing previous cloud init data iso file: - path: "/tmp/cloud-init-data-{{ item.alias }}.iso" + path: "{{ working_dir }}/cloud-init-data-{{ item.alias }}.iso" state: absent loop: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Creating cloud init data directory file: - path: "/tmp/cloud-init-data-{{ item.alias }}" + path: "{{ working_dir }}/cloud-init-data-{{ item.alias }}" state: directory loop: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Generate meta-data for cloud-init template: src: meta-data.j2 - dest: "/tmp/cloud-init-data-{{ item.alias }}/meta-data" + dest: "{{ working_dir }}/cloud-init-data-{{ item.alias }}/meta-data" loop: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - - name: Generate user data for cloud-init + - name: Generate g5k_user data for cloud-init template: src: user-data.j2 - dest: "/tmp/cloud-init-data-{{ item.alias }}/user-data" + dest: "{{ working_dir }}/cloud-init-data-{{ item.alias }}/user-data" loop: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" # Create one iso per vm - name: Create the iso for cloud-init - shell: "cd /tmp && genisoimage -output cloud-init-data-{{ item.alias }}.iso -volid cidata -joliet -rock cloud-init-data-{{ item.alias }}/user-data cloud-init-data-{{ item.alias }}/meta-data" + shell: > + cd {{ working_dir }} + && + genisoimage -output cloud-init-data-{{ item.alias }}.iso -volid cidata -joliet -rock cloud-init-data-{{ item.alias }}/user-data cloud-init-data-{{ item.alias }}/meta-data loop: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Check base image stat: @@ -97,13 +102,30 @@ msg: "Base image does not exist. Verify this path is valid: {{ base_image }}" when: p.stat.exists == False - # NOTE(msimonin): We don't copy in the ramfs in a first iteration - name: Copy base image - shell: "cp {{ base_image }} /tmp/kenan-base-image.qcow2" + shell: > + ls {{ working_dir }}/enos_vmong5k-base-image.qcow2 + || + cp {{ base_image }} {{ working_dir }}/enos_vmong5k-base-image.qcow2 + become: yes + become_user: "{{ g5k_user }}" + + - name: Removing previous disk + file: + path: "{{ working_dir }}/{{ item.alias }}" + state: absent + with_items: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Link virtual image to base image - shell: "qemu-img create -f qcow2 -o backing_file=/tmp/kenan-base-image.qcow2 /tmp/disks/{{ item.alias }}" + shell: | + qemu-img create -f qcow2 -o backing_file={{ working_dir}}/enos_vmong5k-base-image.qcow2 {{ working_dir }}/{{ item.alias }} + # I know ... + chmod 777 {{ working_dir }}/{{ item.alias }} with_items: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Define virtual machines (vm 0 / 1) virt: @@ -111,9 +133,13 @@ command: define xml: "{{ lookup('template', 'domain.xml.j2') }}" with_items: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" - name: Launch virtual machines (vm 1 / 1) virt: name: "{{ item.alias }}" state: running with_items: "{{ vms[inventory_hostname] }}" + become: yes + become_user: "{{ g5k_user }}" diff --git a/enoslib/infra/enos_vmong5k/configuration.py b/enoslib/infra/enos_vmong5k/configuration.py index da4bc49bb7765bfba64933639701f6e2a24694a1..1a21841064e798cef69960cdcb30b7d3d40de94e 100644 --- a/enoslib/infra/enos_vmong5k/configuration.py +++ b/enoslib/infra/enos_vmong5k/configuration.py @@ -3,7 +3,7 @@ import uuid from ..configuration import BaseConfiguration from .constants import (DEFAULT_FLAVOUR, DEFAULT_IMAGE, DEFAULT_JOB_NAME, DEFAULT_NETWORKS, DEFAULT_NUMBER, DEFAULT_QUEUE, - DEFAULT_WALLTIME, FLAVOURS) + DEFAULT_WALLTIME, DEFAULT_WORKING_DIR, FLAVOURS) from .schema import SCHEMA @@ -17,6 +17,7 @@ class Configuration(BaseConfiguration): self.queue = DEFAULT_QUEUE self.walltime = DEFAULT_WALLTIME self.image = DEFAULT_IMAGE + self.working_dir = DEFAULT_WORKING_DIR self._machine_cls = MachineConfiguration self._network_cls = str diff --git a/enoslib/infra/enos_vmong5k/constants.py b/enoslib/infra/enos_vmong5k/constants.py index 525514c7230df6f26b32f9632cb8e50893e8f804..fe0db87c12fb92c484925d7d88ae7a0313ebc32c 100644 --- a/enoslib/infra/enos_vmong5k/constants.py +++ b/enoslib/infra/enos_vmong5k/constants.py @@ -41,3 +41,5 @@ DEFAULT_FLAVOUR = "tiny", FLAVOURS["tiny"] DEFAULT_NETWORKS = ["enos_network"] DEFAULT_NUMBER = 1 + +DEFAULT_WORKING_DIR = "/tmp/enos_vmong5k" diff --git a/enoslib/infra/enos_vmong5k/provider.py b/enoslib/infra/enos_vmong5k/provider.py index 95d20f86886358ace642968b3641554ba3fba652..8f6380c328f9af1cdf7d69af089b7168ee978abe 100644 --- a/enoslib/infra/enos_vmong5k/provider.py +++ b/enoslib/infra/enos_vmong5k/provider.py @@ -147,7 +147,11 @@ def start_virtualmachines(provider_conf, g5k_roles, vmong5k_roles): vms_by_host = _index_by_host(vmong5k_roles) extra_vars = {'vms': vms_by_host, - 'base_image': provider_conf.image} + 'base_image': provider_conf.image, + # push the g5k user in the env + 'g5k_user': os.environ.get('USER'), + 'working_dir': provider_conf.working_dir + } #pm_inventory_path = os.path.join(os.getcwd(), "pm_hosts") #generate_inventory(*g5k_init, pm_inventory_path) # deploy virtual machines with ansible playbook diff --git a/enoslib/infra/enos_vmong5k/schema.py b/enoslib/infra/enos_vmong5k/schema.py index 90d18f2acef9733726ea359dda44146f0a808990..d300e30481f2d90469f2d4209b119f90a4fd4380 100644 --- a/enoslib/infra/enos_vmong5k/schema.py +++ b/enoslib/infra/enos_vmong5k/schema.py @@ -9,7 +9,8 @@ SCHEMA = { "job_name": {"type": "string"}, "queue": {"type": "string", "enum": QUEUE_TYPES}, "walltime": {"type": "string"}, - "image": {"type": "string"} + "image": {"type": "string"}, + "working_dir": {"type": "string"} }, "additionalProperties": False, "required": ["resources"],