Browse code

Move install responsibilities to domU

As we are moving forward to test XenAPI in the gate, it is necessary to
move dom0 related modifications to be performed from domU. For this
purpose, a new user is created, and that user should be used to talk to
dom0 from domU. This change creates that user, makes it possible for
dom0 to log in to domU with that account, and configure that account to
be able to talk down to dom0.

Also move several steps to the nova xenserver plugin:
- dom0 plugin installation
- create kernels and images directory
- install console rotate script
- configure a cron to execute console rotate script

Configuration changes:
A new configuration option, DOMZERO_USER has been created, that
specifies a user account that is configured to be able to do
passwordless ssh to dom0.

Change-Id: If9de0b297a67b7cdb5de78d8dd0e8b2ca578b601

Mate Lakat authored on 2014/02/04 21:38:14
Showing 6 changed files
... ...
@@ -56,6 +56,34 @@ function configure_nova_hypervisor() {
56 56
     # Need to avoid crash due to new firewall support
57 57
     XEN_FIREWALL_DRIVER=${XEN_FIREWALL_DRIVER:-"nova.virt.firewall.IptablesFirewallDriver"}
58 58
     iniset $NOVA_CONF DEFAULT firewall_driver "$XEN_FIREWALL_DRIVER"
59
+
60
+    local dom0_ip
61
+    dom0_ip=$(echo "$XENAPI_CONNECTION_URL" | cut -d "/" -f 3-)
62
+
63
+    local ssh_dom0
64
+    ssh_dom0="sudo -u $DOMZERO_USER ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@$dom0_ip"
65
+
66
+    # install nova plugins to dom0
67
+    tar -czf - -C $NOVA_DIR/plugins/xenserver/xenapi/etc/xapi.d/plugins/ ./ |
68
+        $ssh_dom0 'tar -xzf - -C /etc/xapi.d/plugins/ && chmod a+x /etc/xapi.d/plugins/*'
69
+
70
+    # install console logrotate script
71
+    tar -czf - -C $NOVA_DIR/tools/xenserver/ rotate_xen_guest_logs.sh |
72
+        $ssh_dom0 'tar -xzf - -C /root/ && chmod +x /root/rotate_xen_guest_logs.sh && mkdir -p /var/log/xen/guest'
73
+
74
+    # Create a cron job that will rotate guest logs
75
+    $ssh_dom0 crontab - << CRONTAB
76
+* * * * * /root/rotate_xen_guest_logs.sh
77
+CRONTAB
78
+
79
+    # Create directories for kernels and images
80
+    {
81
+        echo "set -eux"
82
+        cat $TOP_DIR/tools/xen/functions
83
+        echo "create_directory_for_images"
84
+        echo "create_directory_for_kernels"
85
+    } | $ssh_dom0
86
+
59 87
 }
60 88
 
61 89
 # install_nova_hypervisor() - Install external components
... ...
@@ -245,6 +245,10 @@ case "$VIRT_DRIVER" in
245 245
     xenserver)
246 246
         # Xen config common to nova and neutron
247 247
         XENAPI_USER=${XENAPI_USER:-"root"}
248
+        # This user will be used for dom0 - domU communication
249
+        #   should be able to log in to dom0 without a password
250
+        #   will be used to install the plugins
251
+        DOMZERO_USER=${DOMZERO_USER:-"domzero"}
248 252
         ;;
249 253
     *)
250 254
         ;;
... ...
@@ -336,3 +336,11 @@ function max_vcpus() {
336 336
     xe vm-param-set uuid=$vm VCPUs-max=$cpu_count
337 337
     xe vm-param-set uuid=$vm VCPUs-at-startup=$cpu_count
338 338
 }
339
+
340
+function get_domid() {
341
+    local vm_name_label
342
+
343
+    vm_name_label="$1"
344
+
345
+    xe vm-list name-label="$vm_name_label" params=dom-id minimal=true
346
+}
... ...
@@ -67,21 +67,6 @@ fi
67 67
 
68 68
 # Install plugins
69 69
 
70
-## Nova plugins
71
-NOVA_ZIPBALL_URL=${NOVA_ZIPBALL_URL:-$(zip_snapshot_location $NOVA_REPO $NOVA_BRANCH)}
72
-EXTRACTED_NOVA=$(extract_remote_zipball "$NOVA_ZIPBALL_URL")
73
-install_xapi_plugins_from "$EXTRACTED_NOVA"
74
-
75
-LOGROT_SCRIPT=$(find "$EXTRACTED_NOVA" -name "rotate_xen_guest_logs.sh" -print)
76
-if [ -n "$LOGROT_SCRIPT" ]; then
77
-    mkdir -p "/var/log/xen/guest"
78
-    cp "$LOGROT_SCRIPT" /root/consolelogrotate
79
-    chmod +x /root/consolelogrotate
80
-    echo "* * * * * /root/consolelogrotate" | crontab
81
-fi
82
-
83
-rm -rf "$EXTRACTED_NOVA"
84
-
85 70
 ## Install the netwrap xapi plugin to support agent control of dom0 networking
86 71
 if [[ "$ENABLED_SERVICES" =~ "q-agt" && "$Q_PLUGIN" = "openvswitch" ]]; then
87 72
     NEUTRON_ZIPBALL_URL=${NEUTRON_ZIPBALL_URL:-$(zip_snapshot_location $NEUTRON_REPO $NEUTRON_BRANCH)}
... ...
@@ -90,9 +75,6 @@ if [[ "$ENABLED_SERVICES" =~ "q-agt" && "$Q_PLUGIN" = "openvswitch" ]]; then
90 90
     rm -rf "$EXTRACTED_NEUTRON"
91 91
 fi
92 92
 
93
-create_directory_for_kernels
94
-create_directory_for_images
95
-
96 93
 #
97 94
 # Configure Networking
98 95
 #
... ...
@@ -188,7 +170,7 @@ function wait_for_VM_to_halt() {
188 188
     set +x
189 189
     echo "Waiting for the VM to halt.  Progress in-VM can be checked with vncviewer:"
190 190
     mgmt_ip=$(echo $XENAPI_CONNECTION_URL | tr -d -c '1234567890.')
191
-    domid=$(xe vm-list name-label="$GUEST_NAME" params=dom-id minimal=true)
191
+    domid=$(get_domid "$GUEST_NAME")
192 192
     port=$(xenstore-read /local/domain/$domid/console/vnc-port)
193 193
     echo "vncviewer -via root@$mgmt_ip localhost:${port:2}"
194 194
     while true
... ...
@@ -361,6 +343,37 @@ else
361 361
     fi
362 362
 fi
363 363
 
364
+# Create an ssh-keypair, and set it up for dom0 user
365
+rm -f /root/dom0key /root/dom0key.pub
366
+ssh-keygen -f /root/dom0key -P "" -C "dom0"
367
+DOMID=$(get_domid "$GUEST_NAME")
368
+
369
+xenstore-write /local/domain/$DOMID/authorized_keys/$DOMZERO_USER "$(cat /root/dom0key.pub)"
370
+xenstore-chmod -u /local/domain/$DOMID/authorized_keys/$DOMZERO_USER r$DOMID
371
+
372
+function run_on_appliance() {
373
+    ssh \
374
+        -i /root/dom0key \
375
+        -o UserKnownHostsFile=/dev/null \
376
+        -o StrictHostKeyChecking=no \
377
+        -o BatchMode=yes \
378
+        "$DOMZERO_USER@$OS_VM_MANAGEMENT_ADDRESS" "$@"
379
+}
380
+
381
+# Wait until we can log in to the appliance
382
+while ! run_on_appliance true; do
383
+    sleep 1
384
+done
385
+
386
+# Remove authenticated_keys updater cronjob
387
+echo "" | run_on_appliance crontab -
388
+
389
+# Generate a passwordless ssh key for domzero user
390
+echo "ssh-keygen -f /home/$DOMZERO_USER/.ssh/id_rsa -C $DOMZERO_USER@appliance -N \"\" -q" | run_on_appliance
391
+
392
+# Authenticate that user to dom0
393
+run_on_appliance cat /home/$DOMZERO_USER/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
394
+
364 395
 # If we have copied our ssh credentials, use ssh to monitor while the installation runs
365 396
 WAIT_TILL_LAUNCH=${WAIT_TILL_LAUNCH:-1}
366 397
 COPYENV=${COPYENV:-1}
... ...
@@ -18,6 +18,57 @@ set -o xtrace
18 18
 GUEST_PASSWORD="$1"
19 19
 XS_TOOLS_PATH="$2"
20 20
 STACK_USER="$3"
21
+DOMZERO_USER="$4"
22
+
23
+
24
+function setup_domzero_user() {
25
+    local username
26
+
27
+    username="$1"
28
+
29
+    local key_updater_script
30
+    local sudoers_file
31
+    key_updater_script="/home/$username/update_authorized_keys.sh"
32
+    sudoers_file="/etc/sudoers.d/allow_$username"
33
+
34
+    # Create user
35
+    adduser --disabled-password --quiet "$username" --gecos "$username"
36
+
37
+    # Give passwordless sudo
38
+    cat > $sudoers_file << EOF
39
+    $username ALL = NOPASSWD: ALL
40
+EOF
41
+    chmod 0440 $sudoers_file
42
+
43
+    # A script to populate this user's authenticated_keys from xenstore
44
+    cat > $key_updater_script << EOF
45
+#!/bin/bash
46
+set -eux
47
+
48
+DOMID=\$(sudo xenstore-read domid)
49
+sudo xenstore-exists /local/domain/\$DOMID/authorized_keys/$username
50
+sudo xenstore-read /local/domain/\$DOMID/authorized_keys/$username > /home/$username/xenstore_value
51
+cat /home/$username/xenstore_value > /home/$username/.ssh/authorized_keys
52
+EOF
53
+
54
+    # Give the key updater to the user
55
+    chown $username:$username $key_updater_script
56
+    chmod 0700 $key_updater_script
57
+
58
+    # Setup the .ssh folder
59
+    mkdir -p /home/$username/.ssh
60
+    chown $username:$username /home/$username/.ssh
61
+    chmod 0700 /home/$username/.ssh
62
+    touch /home/$username/.ssh/authorized_keys
63
+    chown $username:$username /home/$username/.ssh/authorized_keys
64
+    chmod 0600 /home/$username/.ssh/authorized_keys
65
+
66
+    # Setup the key updater as a cron job
67
+    crontab -u $username - << EOF
68
+* * * * * $key_updater_script
69
+EOF
70
+
71
+}
21 72
 
22 73
 # Install basics
23 74
 apt-get update
... ...
@@ -48,6 +99,8 @@ useradd $STACK_USER -s /bin/bash -d /opt/stack -G libvirtd
48 48
 echo $STACK_USER:$GUEST_PASSWORD | chpasswd
49 49
 echo "$STACK_USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
50 50
 
51
+setup_domzero_user "$DOMZERO_USER"
52
+
51 53
 # Add an udev rule, so that new block devices could be written by stack user
52 54
 cat > /etc/udev/rules.d/50-openstack-blockdev.rules << EOF
53 55
 KERNEL=="xvd[b-z]", GROUP="$STACK_USER", MODE="0660"
... ...
@@ -76,7 +76,7 @@ cp $STAGING_DIR/etc/rc.local $STAGING_DIR/etc/rc.local.preparebackup
76 76
 cat <<EOF >$STAGING_DIR/etc/rc.local
77 77
 #!/bin/sh -e
78 78
 bash /opt/stack/prepare_guest.sh \\
79
-    "$GUEST_PASSWORD" "$XS_TOOLS_PATH" "$STACK_USER" \\
79
+    "$GUEST_PASSWORD" "$XS_TOOLS_PATH" "$STACK_USER" "$DOMZERO_USER" \\
80 80
     > /opt/stack/prepare_guest.log 2>&1
81 81
 EOF
82 82