Mentions légales du service

Skip to content
Snippets Groups Projects
Verified Commit c66bddbb authored by SIMONIN Matthieu's avatar SIMONIN Matthieu
Browse files

[vmong5k] Allow to choose a working dir

This working dir is used to generate all the files and disks needed by the
provider. It must be an absolute path.

This allows the user to choose whether to store the disks on the local
filesystem on the node (working_dir=/tmp/enos_vmong5k -- this is the default)
or in the site frontend (e.g. working_dir=/home/msimonin/public/enos_vmong5k).

In addition, the vms are now launched as a regular user (the current g5k user).

Be aware that the permissions on the working dir are set to 711 whereas the
permission on the actual vm disks are set to 777 (inside the working
directory).

Fix #5
parent 1c0b7339
Branches
Tags
1 merge request!3[vmong5k] Allow to choose a working dir
......@@ -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>
......
......@@ -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 }}"
......@@ -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
......
......@@ -41,3 +41,5 @@ DEFAULT_FLAVOUR = "tiny", FLAVOURS["tiny"]
DEFAULT_NETWORKS = ["enos_network"]
DEFAULT_NUMBER = 1
DEFAULT_WORKING_DIR = "/tmp/enos_vmong5k"
......@@ -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
......
......@@ -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"],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment