summaryrefslogtreecommitdiff
path: root/create-vm
blob: 519b019a2c1ffbd559c9ffbc9e1be8eb9ec76546 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/sh
#
# Create a new VM for liw.


set -eu


verbose()
{
    echo "INFO: $@"
}


die()
{
    echo "$@" 1>&2
    exit 1
}


get_ip()
{
    python -c '
import sys, json
leases = json.load(open(sys.argv[1]))
for lease in leases:
    if lease["mac-address"] ==  sys.argv[2]:
        print lease["ip-address"]
' "$1" "$2"
}


xz_uncompressed_size()
{
    xz --robot --verbose --list "$1" | awk '/^file/ { print $5 }'
}


# Check parameters.

if [ "$#" != 2 ]
then
    die "Usage: $0 NAME BASE"
fi



# Config variables.
. "$HOME/.config/ansibleness/vm.conf"

# Command line parameters: name of VM and base image (no .img.xz suffix).
name="$1"
case "$2" in
    */*) basepath="$2" ;;
    *)   basepath="$imagedir/base-$2.img.xz" ;;
esac

# Does the base image exist?
if [ ! -e "$basepath" ]
then
    echo "$basepath does not exist" 1>&2
    exit 1
fi

# How large is the (uncompressed) image? In bytes.
size="$(xz_uncompressed_size "$basepath")"

# Create new LV.
sudo lvcreate --name "$name" --size "${size}b" \
     --zero y --wipesignatures y --activate y "$vg"
lvpath="/dev/$vg/$name"

# Copy uncompressed image to LV.
unxz < "$basepath" |
    pv --size "$size" |
    sudo ionice -c3 tee "$lvpath" > /dev/null

# Create VM.
virt-install --connect qemu:///system \
             --quiet \
             --name="$name" \
             --memory=1024 \
             --cpu=host-model-only \
             --import \
             --os-variant=debianwheezy \
             --disk="path=$lvpath,cache=none" \
             --network="$vmnetwork" \
             --graphics=spice \
             --noautoconsole

# If we're using the virtual network "default", wait for the VM to get
# a DHCP response and add it to /etc/hosts. We don't do it for other
# types of network (e.g., bridge=br0), since we ... can't.

if [ "$vmnetwork" = "network=default" ]
then
    # Get the MAC address.
    mac="$(virsh -c qemu:///system dumpxml "$name" |
           sed -n "/<mac address=/s/^.*'\(.*\)'.*/\1/p")"
    verbose "MAC: $mac"

    # Get IP address related to the MAC address. Append that to /etc/hosts.
    leases=/var/lib/libvirt/dnsmasq/virbr0.status
    
    ip=""
    while [ "$ip" = "" ]
    do
        sleep 1
        ip="$(get_ip "$leases" "$mac")"
    done
    echo "$ip $name" | sudo tee -a /etc/hosts > /dev/null

    # Done.
    echo "Virtual machine $name ($ip) has been created and started."
else
    echo "Virtual machine $name has been created and started, and may be ready soon."
fi