kameleon-builder 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. data/.editorconfig +0 -0
  2. data/.env +63 -15
  3. data/.gitignore +1 -0
  4. data/README.rst +4 -2
  5. data/Vagrantfile +13 -52
  6. data/bin/kameleon +5 -0
  7. data/completion/_kameleon.zsh +18 -0
  8. data/completion/kameleon.bash +13 -0
  9. data/completion/kameleon.fish +10 -0
  10. data/contrib/polipo_env.sh +2 -0
  11. data/contrib/steps/export/save_as_g5k.yaml +63 -0
  12. data/contrib/steps/setup/add_to_sudoers.yaml +5 -0
  13. data/docs/Makefile +10 -6
  14. data/docs/README.md +17 -0
  15. data/docs/source/_static/kameleon-logo.png +0 -0
  16. data/docs/source/_static/kameleon-logo.xcf +0 -0
  17. data/docs/source/_static/kameleon-long.png +0 -0
  18. data/docs/source/aliases.rst +4 -2
  19. data/docs/source/checkpoint.rst +2 -0
  20. data/docs/source/commands.rst +4 -3
  21. data/docs/source/conf.py +15 -7
  22. data/docs/source/context.rst +7 -4
  23. data/docs/source/faq.rst +39 -1
  24. data/docs/source/getting_started.rst +227 -1
  25. data/docs/source/grid5000_tutorial.rst +110 -0
  26. data/docs/source/index.rst +7 -2
  27. data/docs/source/installation.rst +12 -4
  28. data/docs/source/persistent_cache.rst +34 -0
  29. data/docs/source/recipe.rst +23 -16
  30. data/docs/source/use_cases.rst +93 -0
  31. data/docs/source/workspace.rst +2 -0
  32. data/kameleon-builder.gemspec +7 -1
  33. data/lib/kameleon.rb +3 -6
  34. data/lib/kameleon/cli.rb +104 -50
  35. data/lib/kameleon/compat.rb +39 -0
  36. data/lib/kameleon/context.rb +43 -13
  37. data/lib/kameleon/engine.rb +118 -77
  38. data/lib/kameleon/environment.rb +3 -5
  39. data/lib/kameleon/error.rb +15 -9
  40. data/lib/kameleon/logger.rb +7 -4
  41. data/lib/kameleon/persistent_cache.rb +139 -0
  42. data/lib/kameleon/recipe.rb +200 -81
  43. data/lib/kameleon/shell.rb +51 -16
  44. data/omnibus/.gitignore +11 -0
  45. data/omnibus/.kitchen.yml +25 -0
  46. data/omnibus/Berksfile +9 -0
  47. data/omnibus/Berksfile.lock +25 -0
  48. data/omnibus/Gemfile +12 -0
  49. data/omnibus/README.md +94 -0
  50. data/omnibus/config/projects/kameleon.rb +23 -0
  51. data/omnibus/config/software/kameleon.rb +24 -0
  52. data/omnibus/config/software/polipo.rb +30 -0
  53. data/omnibus/config/software/ruby.rb +158 -0
  54. data/omnibus/files/mac_dmg/Resources/background.png +0 -0
  55. data/omnibus/files/mac_dmg/Resources/icon.png +0 -0
  56. data/omnibus/files/mac_pkg/Resources/background.png +0 -0
  57. data/omnibus/files/mac_pkg/Resources/license.html +1 -0
  58. data/omnibus/files/mac_pkg/Resources/welcome.html +9 -0
  59. data/omnibus/omnibus.rb +27 -0
  60. data/omnibus/package-scripts/kameleon/makeselfinst +27 -0
  61. data/omnibus/package-scripts/kameleon/postrm +9 -0
  62. data/templates/archlinux-desktop.yaml +25 -0
  63. data/templates/archlinux.yaml +106 -0
  64. data/templates/debian-testing.yaml +25 -0
  65. data/templates/debian7-desktop.yaml +25 -0
  66. data/templates/{debian-wheezy-docker.yaml → debian7-docker.yaml} +30 -16
  67. data/templates/debian7-g5k.yaml +97 -0
  68. data/templates/debian7-oar-dev.yaml +51 -0
  69. data/templates/debian7.yaml +128 -0
  70. data/templates/extend.erb +23 -0
  71. data/templates/fedora-rawhide.yaml +30 -0
  72. data/templates/fedora20-desktop.yaml +21 -0
  73. data/templates/fedora20.yaml +105 -0
  74. data/templates/{debian-wheezy-chroot.yaml → old-debian7.yaml} +51 -38
  75. data/templates/{aliases → steps/aliases}/defaults.yaml +37 -12
  76. data/templates/steps/bootstrap/archlinux/arch_bootstrap.yaml +219 -0
  77. data/templates/steps/bootstrap/archlinux/install_bootloader.yaml +46 -0
  78. data/templates/steps/bootstrap/archlinux/populate_disk.yaml +39 -0
  79. data/templates/steps/bootstrap/debian/debootstrap.yaml +18 -10
  80. data/templates/steps/bootstrap/debian/debootstrap_arm.yaml +31 -0
  81. data/templates/steps/bootstrap/fedora/liveos_bootstrap.yaml +123 -0
  82. data/templates/steps/bootstrap/g5k_reserv.yaml +70 -0
  83. data/templates/steps/bootstrap/initialize_disk_chroot.yaml +84 -0
  84. data/templates/steps/bootstrap/initialize_disk_qemu.yaml +72 -0
  85. data/templates/steps/bootstrap/install_bootloader.yaml +42 -0
  86. data/templates/steps/bootstrap/prepare_chroot.yaml +126 -0
  87. data/templates/steps/bootstrap/prepare_docker.yaml +19 -8
  88. data/templates/steps/bootstrap/prepare_qemu.yaml +47 -0
  89. data/templates/steps/bootstrap/start_chroot.yaml +11 -2
  90. data/templates/steps/bootstrap/start_docker.yaml +2 -2
  91. data/templates/steps/bootstrap/start_qemu.yaml +75 -0
  92. data/templates/steps/bootstrap/ubuntu/debootstrap.yaml +27 -0
  93. data/templates/steps/breakpoint.yaml +2 -0
  94. data/templates/{checkpoints → steps/checkpoints}/docker.yaml +0 -0
  95. data/templates/steps/checkpoints/qcow2.yaml +38 -0
  96. data/templates/steps/checkpoints/qemu.yaml +39 -0
  97. data/templates/steps/export/clean_appliance.yaml +7 -1
  98. data/templates/steps/export/compact_qcow_img.yaml +12 -0
  99. data/templates/steps/export/save_appliance.yaml +58 -0
  100. data/templates/steps/export/save_appliance_from_g5k.yaml +47 -0
  101. data/templates/steps/export/save_vagrant_box.yaml +29 -0
  102. data/templates/steps/setup/archlinux/configure_keyboard.yaml +9 -0
  103. data/templates/steps/setup/archlinux/configure_network.yaml +9 -0
  104. data/templates/steps/setup/archlinux/configure_ruby.yaml +7 -0
  105. data/templates/steps/setup/archlinux/configure_system.yaml +20 -0
  106. data/templates/steps/setup/archlinux/install_dev_tools.yaml +18 -0
  107. data/templates/steps/setup/archlinux/install_gnome.yaml +27 -0
  108. data/templates/steps/setup/archlinux/install_software.yaml +9 -0
  109. data/templates/steps/setup/archlinux/install_yaourt.yaml +29 -0
  110. data/templates/steps/setup/autologin.yaml +16 -0
  111. data/templates/steps/setup/create_group.yaml +12 -0
  112. data/templates/steps/setup/create_user.yaml +9 -10
  113. data/templates/steps/setup/debian/configure_apt.yaml +65 -0
  114. data/templates/steps/setup/debian/configure_kernel.yaml +18 -0
  115. data/templates/steps/setup/debian/{keyboard_config.yaml → configure_keyboard.yaml} +1 -1
  116. data/templates/steps/setup/debian/{network_config.yaml → configure_network.yaml} +0 -0
  117. data/templates/steps/setup/debian/{system_config.yaml → configure_system.yaml} +0 -0
  118. data/templates/steps/setup/debian/install_gnome.yaml +13 -0
  119. data/templates/steps/setup/debian/install_kde.yaml +13 -0
  120. data/templates/steps/setup/debian/install_software.yaml +2 -0
  121. data/templates/steps/setup/debian/oar/oar_debian_config_frontend.yaml +8 -0
  122. data/templates/steps/setup/debian/oar/oar_debian_config_node.yaml +5 -0
  123. data/templates/steps/setup/debian/oar/oar_debian_config_server.yaml +5 -0
  124. data/templates/steps/setup/debian/oar/oar_prereq_install.yaml +16 -0
  125. data/templates/steps/setup/debian/setup_vagrant_box.yaml +52 -0
  126. data/templates/steps/setup/debian/upgrade_system.yaml +15 -0
  127. data/templates/steps/setup/fedora/configure_network.yaml +30 -0
  128. data/templates/steps/setup/fedora/configure_system.yaml +59 -0
  129. data/templates/steps/setup/fedora/install_software.yaml +3 -0
  130. data/templates/steps/setup/fedora/update_system.yaml +10 -0
  131. data/templates/steps/setup/oar/oar_config_devel.yaml +21 -0
  132. data/templates/steps/setup/oar/oar_config_frontend.yaml +38 -0
  133. data/templates/steps/setup/oar/oar_config_node.yaml +4 -0
  134. data/templates/steps/setup/oar/oar_config_server.yaml +25 -0
  135. data/templates/steps/setup/oar/oar_config_system.yaml +34 -0
  136. data/templates/steps/setup/oar/oar_devel_prereq_install.yaml +5 -0
  137. data/templates/steps/setup/oar/oar_git_install.yaml +21 -0
  138. data/templates/steps/setup/ubuntu/configure_apt.yaml +67 -0
  139. data/templates/ubuntu-12.04-desktop.yaml +25 -0
  140. data/templates/ubuntu-12.04.yaml +128 -0
  141. data/templates/ubuntu-14.04-desktop.yaml +27 -0
  142. data/templates/ubuntu-14.04.yaml +25 -0
  143. data/templates/vagrant-debian7.yaml +31 -0
  144. data/version.txt +1 -1
  145. metadata +155 -28
  146. checksums.yaml +0 -7
  147. data/templates/checkpoints/qcow2.yaml +0 -44
  148. data/templates/fedora-docker.yaml +0 -96
  149. data/templates/steps/bootstrap/fedora/docker_bootstrap.yaml +0 -25
  150. data/templates/steps/bootstrap/fedora/yum_bootstrap.yaml +0 -22
  151. data/templates/steps/bootstrap/prepare_appliance_with_nbd.yaml +0 -93
  152. data/templates/steps/export/build_appliance_from_docker.yaml +0 -105
  153. data/templates/steps/export/save_appliance_from_nbd.yaml +0 -54
  154. data/templates/steps/setup/debian/kernel_install.yaml +0 -20
  155. data/templates/steps/setup/debian/software_install.yaml +0 -15
  156. data/templates/steps/setup/fedora/kernel_install.yaml +0 -27
  157. data/templates/steps/setup/fedora/software_install.yaml +0 -10
@@ -0,0 +1,123 @@
1
+ # # Bootstrap
2
+ - include: >
3
+ python yum rpm initscripts passwd rsyslog vim-minimal dhclient chkconfig
4
+ rootfiles policycoreutils fedora-release openssh-server net-tools nc
5
+ traceroute kernel syslinux-extlinux systemd procps-ng console-setup
6
+ bash grep coreutils findutils sed cpio cyrus-sasl file-libs gawk xz
7
+
8
+ - mirrorlist_server: mirrors.kernel.org
9
+ - mirror_distrib_path: fedora/releases/$${release}/Fedora/$$arch/os
10
+ - mirrorlist_url_rsync: $$mirrorlist_server::$$mirror_distrib_path
11
+
12
+ - download_live_os:
13
+ - check_cmd_out: rsync
14
+ - exec_out: |
15
+ if [ ! -d "$$rootfs_download_path" ]; then
16
+ if [ ! -f "./LiveOS/squashfs.img" ]; then
17
+ echo "Downloading LiveOS squashfs file system from $$mirrorlist_url_rsync ..."
18
+ rsync -avh --progress $$mirrorlist_url_rsync/LiveOS .
19
+ echo "Download of squashfs image complete."
20
+ else
21
+ echo "Using cached LiveOS squashfs file system."
22
+ fi
23
+ fi
24
+
25
+ - copy_ro_to_rw:
26
+ - exec_out: |
27
+ if [ ! -d "$$rootfs_download_path" ]; then
28
+ mkdir -p squashfs readonlyfs partial
29
+ mount -o loop ./LiveOS/squashfs.img squashfs || \
30
+ fail Mount of LiveOS squashfs image failed! You mush have squashfs support available to mount image.
31
+ mount -o loop squashfs/LiveOS/rootfs.img readonlyfs
32
+ rsync -aAHS readonlyfs/ partial/
33
+ fi
34
+ - umount_out: readonlyfs
35
+ - umount_out: squashfs
36
+
37
+ - bootstrap_partial:
38
+ - exec_out: |
39
+ if [ ! -d "$$rootfs_download_path" ]; then
40
+ mount -o bind /dev partial/dev
41
+ mount -o bind /dev/pts partial/dev/pts
42
+ mount -t proc /proc partial/proc
43
+ mount -t sysfs /sys partial/sys
44
+ test -f partial/etc/mtab || cat /proc/mounts > partial/etc/mtab
45
+ cp /etc/resolv.conf partial/etc/
46
+ rsync -av $$mirrorlist_url_rsync/Packages/r/rpm-[0-9]* $$mirrorlist_url_rsync//Packages/y/yum-[0-9]* partial
47
+ chroot partial rpm -ivh --nodeps --replacepkgs rpm-* yum-* > /dev/null
48
+ rsync -av $$mirrorlist_url_rsync/Packages/f/fedora-release-$${release}* partial
49
+ mkdir -p partial/run/install
50
+ chroot partial rpm --nodeps -ivh fedora-release-*
51
+ sed -i "s|\$basearch|$$arch|" partial/etc/yum.repos.d/*
52
+ chroot partial rpm --root /run/install --nodeps -ivh fedora-release-*
53
+ sed -i "s|\$basearch|$$arch|" partial/run/install/etc/yum.repos.d/*
54
+ chroot partial yum --installroot /run/install -y --nogpgcheck install $$include
55
+ fi
56
+ - umount_out: partial/dev/pts
57
+ - umount_out: partial/dev
58
+ - umount_out: partial/proc
59
+ - umount_out: partial/sys
60
+
61
+ - create_rootfs:
62
+ - exec_out: |
63
+ if [ ! -d "$$rootfs_download_path" ]; then
64
+ mkdir -p $$rootfs_download_path
65
+ rsync -aAX --delete --one-file-system \
66
+ --exclude '/.kameleon_timestamp' \
67
+ --exclude '/dev/*' \
68
+ --exclude '/proc/*' \
69
+ --exclude '/sys/*' \
70
+ partial/run/install/* $$rootfs_download_path
71
+ fi
72
+
73
+ - download_pxeboot_initrd:
74
+ - exec_out: |
75
+ wget -c -O $$rootfs_download_path/boot/initrd.img \
76
+ http://$$mirrorlist_server/$$mirror_distrib_path/images/pxeboot/initrd.img \
77
+ 2>&1 | tail -f
78
+
79
+ - download_pxeboot_vmlinuz:
80
+ - exec_out: |
81
+ wget -c -O $$rootfs_download_path/boot/vmlinuz \
82
+ http://$$mirrorlist_server/$$mirror_distrib_path/images/pxeboot/vmlinuz \
83
+ 2>&1 | tail -f
84
+
85
+ - enable_sshd_service:
86
+ - exec_out: |
87
+ chroot $$rootfs_download_path \
88
+ ln -sf \
89
+ '/usr/lib/systemd/system/sshd.service' \
90
+ '/etc/systemd/system/multi-user.target.wants/sshd.service'
91
+
92
+ - enable_dhcp_service:
93
+ - exec_out: |
94
+ echo -n 'root:root' | chroot $$rootfs_download_path chpasswd
95
+ chroot $$rootfs_download_path \
96
+ ln -sf \
97
+ '/usr/lib/systemd/system/network.service' \
98
+ '/etc/systemd/system/multi-user.target.wants/network.service'
99
+
100
+ - enable_networking:
101
+ - write_out:
102
+ - $$rootfs_download_path/etc/sysconfig/network-scripts/ifcfg-eth0
103
+ - |
104
+ DEVICE=eth0
105
+ BOOTPROTO=dhcp
106
+ ONBOOT=yes
107
+ HOSTNAME=fedora-$${release}
108
+ NM_CONTROLLED=no
109
+ TYPE=Ethernet
110
+ - write_out:
111
+ - $$rootfs_download_path/etc/sysconfig/network
112
+ - |
113
+ NETWORKING=yes
114
+ HOSTNAME=fedora-$${release}
115
+
116
+ - clean:
117
+ - on_bootstrap_clean:
118
+ - umount_out: partial/dev/pts
119
+ - umount_out: partial/dev
120
+ - umount_out: partial/proc
121
+ - umount_out: partial/sys
122
+ - umount_out: readonlyfs
123
+ - umount_out: squashfs
@@ -0,0 +1,70 @@
1
+ - create_local_ssh_config_base:
2
+ - write_local:
3
+ - $$ssh_config_file
4
+ - |
5
+ Host *
6
+ UserKnownHostsFile /dev/null
7
+ StrictHostKeyChecking no
8
+ ConnectTimeout 2
9
+ LogLevel FATAL
10
+ ForwardAgent yes
11
+ Protocol 2
12
+ ControlPath /tmp/$${kameleon_short_uuid}%r@%h:%p
13
+ ControlMaster auto
14
+ ControlPersist yes
15
+ Compression yes
16
+ Host g5kaccess
17
+ User $$g5k_user
18
+ Hostname access.grid5000.fr
19
+ Host $$g5k_site
20
+ User $$g5k_user
21
+ ProxyCommand ssh -F $$ssh_config_file g5kaccess "nc -q 1 $$g5k_site %p"
22
+
23
+ - deploy_image:
24
+ - exec_out: echo "Deploying image $$kenv with kadeploy"
25
+ - exec_out: sleep 1
26
+ - exec_out: echo "Submitting a job for deployment"
27
+ # We wait long to keep the job
28
+ # We submit a job only if there is no job already
29
+ - exec_out : |
30
+ oarstat | grep -q "$$kameleon_recipe_name" \
31
+ || oarsub -n "$$kameleon_recipe_name" -l walltime=$$walltime -t deploy "sleep 100000"
32
+ - exec_out : |
33
+ echo -n "Waiting for the reservation to be ready"
34
+ until $(oarstat -fu $$g5k_user | grep -q "state = Running")
35
+ do
36
+ echo -n .
37
+ sleep 2
38
+ done
39
+ sleep 1
40
+ echo " ~> OK"
41
+ - exec_out: echo "Getting the machine name"
42
+ - exec_out: export machine=`oarstat -fu $$g5k_user | grep assigned_hostnames | cut -d ' ' -f 7`
43
+ - exec_out: echo "Deploying environment $$kenv on $machine"
44
+ - exec_out: kadeploy3 -e $$kenv -m $machine -k
45
+ - pipe:
46
+ - exec_out: echo $machine
47
+ - exec_local: cat >$$kameleon_cwd/g5k_machine
48
+ - exec_out: sleep 1
49
+
50
+ - create_out_ssh_config:
51
+ - write_out:
52
+ - $$out_cwd/ssh_config
53
+ - |
54
+ Host $$kameleon_recipe_name
55
+ User root
56
+ Hostname $machine
57
+ UserKnownHostsFile /dev/null
58
+ StrictHostKeyChecking no
59
+ ConnectTimeout 2
60
+ LogLevel FATAL
61
+ ForwardAgent yes
62
+ Protocol 2
63
+
64
+ - append_ssh_node_config:
65
+ - append_local:
66
+ - $$ssh_config_file
67
+ - |
68
+ Host $$kameleon_recipe_name
69
+ User root
70
+ ProxyCommand ssh -F $$ssh_config_file $$g5k_site "nc -q 1 `cat $$kameleon_cwd/g5k_machine | awk '{print $NF}'` %p"
@@ -0,0 +1,84 @@
1
+ # Initialize disk
2
+
3
+ # this step create the appliance disk and initialize the
4
+ # checkpoint mechanism with Qemu Network Block Device (NBD)
5
+
6
+ - create_initial_image:
7
+ - check_cmd_out: qemu-img
8
+ - exec_out: mkdir -p $$kameleon_cwd/checkpoints
9
+ - exec_out: |
10
+ if [ ! -e "$$image_disk" ] ; then
11
+ qemu-img create -f qcow2 -o preallocation=metadata $$kameleon_cwd/checkpoints/base.qcow2 $$image_size
12
+ # keep a link to the last checkpoint disk
13
+ ln -sf $$kameleon_cwd/checkpoints/base.qcow2 $$image_disk
14
+ fi
15
+
16
+ - load_nbd_module:
17
+ - on_checkpoint: redo
18
+ - on_bootstrap_init:
19
+ - exec_out: |
20
+ lsmod | grep nbd >/dev/null \
21
+ || modprobe nbd max_part=63 \
22
+ || fail failed to load nbd module into kernel
23
+
24
+ - attach_nbd_device:
25
+ # this microstep must be skipped because it is already done by the
26
+ # checkpoint restore function
27
+ - on_checkpoint: redo
28
+ - check_cmd_out: qemu-nbd
29
+ - exec_out: echo Connecting $$image_disk to nbd device $$nbd_device
30
+ - exec_out: echo "sync" ; sync
31
+ - exec_out: qemu-nbd -d $$nbd_device
32
+ - exec_out: qemu-nbd -c $$nbd_device $(readlink $$image_disk) -n || fail nbd device $$nbd_device is unavailable
33
+
34
+ - detach_nbd_device:
35
+ # this miscrostep must be done again ensure that the nbd device is
36
+ # detached
37
+ - on_checkpoint: redo
38
+ - on_export_clean:
39
+ - exec_out: echo "sync" ; sync
40
+ - exec_out: qemu-nbd -d $$nbd_device
41
+ - exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
42
+
43
+ - partition_disk:
44
+ - check_cmd_out: parted
45
+ - exec_out: |
46
+ echo "Partitioning disk..."
47
+ parted $${nbd_device} mklabel msdos
48
+ parted $${nbd_device} mkpart primary 0% 100%
49
+ parted $${nbd_device} set 1 boot on
50
+ - exec_out: |
51
+ echo Creating root partition...
52
+ mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create / ext4
53
+
54
+ - mount_mountdir:
55
+ - on_checkpoint: redo
56
+ - exec_out: mkdir -p $$rootfs
57
+ - exec_out: "echo Mounting root partition... ; mount $${nbd_device}p1 $$rootfs || fail cannot mount /"
58
+ - on_export_clean:
59
+ - exec_out: "echo try umount $$rootfs... ; mountpoint -q $$rootfs && umount -f -l $$rootfs || true"
60
+
61
+ - copy_rootfs:
62
+ - check_cmd_out: rsync
63
+ - exec_out: echo "Copying rootfs to $$rootfs..."
64
+ - exec_out: |
65
+ rsync -aAX --delete --one-file-system\
66
+ --exclude '/.kameleon_timestamp' \
67
+ --exclude '/dev/*' \
68
+ --exclude '/proc/*' \
69
+ --exclude '/sys/*' \
70
+ $$rootfs_download_path/* $$rootfs
71
+ - exec_out: echo "sync..." ; sync
72
+
73
+ - create_fstab:
74
+ - write_out:
75
+ - $$rootfs/etc/fstab
76
+ - |
77
+ # /etc/fstab: static file system information.
78
+ #
79
+ # Use 'blkid' to print the universally unique identifier for a
80
+ # nbd_device; this may be used with UUID= as a more robust way to name nbd_devices
81
+ # that works even if disks are added and removed. See fstab(5).
82
+ #
83
+ # <file system> <mount point> <type> <options> <dump> <pass>
84
+ UUID=`blkid -s UUID -o value $${nbd_device}p1` / $$filesystem_type errors=remount-ro 0 1
@@ -0,0 +1,72 @@
1
+ # Initialize disk
2
+
3
+ # this step create the appliance disk and initialize the
4
+ # checkpoint mechanism with Qemu Network Block Device (NBD)
5
+
6
+ - create_initial_image:
7
+ - check_cmd_out: qemu-img
8
+ - exec_out: |
9
+ rm -f $$image_disk
10
+ qemu-img create -f qcow2 -o preallocation=metadata $$image_disk $$image_size
11
+
12
+ - load_nbd_module:
13
+ - on_checkpoint: redo
14
+ - on_bootstrap_init:
15
+ - exec_out: |
16
+ lsmod | grep nbd >/dev/null \
17
+ || modprobe nbd max_part=63 \
18
+ || fail failed to load nbd module into kernel
19
+
20
+ - attach_nbd_device:
21
+ # this microstep must be skipped because it is already done by the
22
+ # checkpoint restore function
23
+ - on_checkpoint: redo
24
+ - check_cmd_out: qemu-nbd
25
+ - exec_out: echo Connecting $$image_disk to nbd device $$nbd_device
26
+ - exec_out: qemu-nbd -c $$nbd_device $$image_disk -n || fail nbd device $$nbd_device is unavailable
27
+
28
+ - detach_nbd_device:
29
+ # this miscrostep must be done again ensure that the nbd device is
30
+ # detached
31
+ - on_checkpoint: redo
32
+ - on_bootstrap_clean:
33
+ - exec_out: echo "sync" ; sync
34
+ - exec_out: qemu-nbd -d $$nbd_device
35
+ - exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
36
+
37
+ - partition_disk:
38
+ - check_cmd_out: parted
39
+ - exec_out: |
40
+ echo "Partitioning disk..."
41
+ parted $${nbd_device} mklabel msdos
42
+ parted $${nbd_device} mkpart primary 0% 100%
43
+ parted $${nbd_device} set 1 boot on
44
+ - exec_out: |
45
+ echo Creating root partition...
46
+ mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create / ext4
47
+
48
+ - mount_mountdir:
49
+ - on_checkpoint: redo
50
+ - exec_out: mkdir -p $$rootfs
51
+ - exec_out: "echo Mounting root partition... ; mount $${nbd_device}p1 $$rootfs || fail cannot mount /"
52
+ - on_bootstrap_clean:
53
+ - exec_out: "echo try umount $$rootfs... ; mountpoint -q $$rootfs && umount -f -l $$rootfs || true"
54
+
55
+ - copy_rootfs:
56
+ - check_cmd_out: rsync
57
+ - exec_out: echo "Copying rootfs to $$rootfs..."
58
+ - exec_out: rsync -aAX --exclude '/.kameleon_timestamp' $$rootfs_download_path/* $$rootfs
59
+ - exec_out: echo "sync..." ; sync
60
+
61
+ - create_fstab:
62
+ - write_out:
63
+ - $$rootfs/etc/fstab
64
+ - |
65
+ # /etc/fstab: static file system information.
66
+ #
67
+ # Use 'blkid' to print the universally unique identifier for a
68
+ # nbd_device; this may be used with UUID= as a more robust way to name nbd_devices
69
+ # that works even if disks are added and removed. See fstab(5).
70
+ #
71
+ # <file system> <mount point> <type> <options> <dump> <pass>
72
+ UUID=`blkid -s UUID -o value $${nbd_device}p1` / $$filesystem_type errors=remount-ro 0 1
@@ -0,0 +1,42 @@
1
+ # Install extlinux bootloader
2
+
3
+ - install_bootloader:
4
+ - rescue:
5
+ - exec_out: LC_ALL=POSIX chroot $$rootfs bash -c "command -V extlinux 2> /dev/null"
6
+ - breakpoint: "extlinux is missing"
7
+ - exec_out: LC_ALL=POSIX chroot $$rootfs extlinux --install /boot/extlinux 2>&1
8
+ - exec_out: |
9
+ MBR_PATH=
10
+ PATHS=("$$rootfs/usr/share/syslinux/mbr.bin"
11
+ "$$rootfs/usr/lib/bios/syslinux/mbr.bin"
12
+ "$$rootfs/usr/lib/syslinux/bios/mbr.bin"
13
+ "$$rootfs/usr/lib/extlinux/mbr.bin"
14
+ "$$rootfs/usr/lib/syslinux/mbr.bin")
15
+ for element in "${PATHS[@]}"
16
+ do
17
+ if [ -f "$element" ]; then
18
+ MBR_PATH="$element"
19
+ break
20
+ fi
21
+ done
22
+ if [ "$MBR_PATH" == "" ]; then
23
+ fail "unable to locate the extlinux mbr"
24
+ else
25
+ dd if="$MBR_PATH" of="$$nbd_device" bs=440 2>&1
26
+ fi
27
+ - exec_out: echo " sync..." ; sync
28
+ - write_out:
29
+ - $$rootfs/boot/extlinux/extlinux.conf
30
+ - |
31
+ default linux
32
+ timeout 1
33
+
34
+ label linux
35
+ kernel ../`basename $$rootfs/boot/vmlinuz*`
36
+ append initrd=../`basename $$rootfs/boot/init*` root=UUID=`blkid -s UUID -o value $${nbd_device}p1` ro
37
+ - exec_out: echo " sync..." ; sync
38
+ - on_bootstrap_clean:
39
+ - exec_out: |
40
+ dir=$$rootfs/var/lib/os-prober/mount
41
+ test ! -d "$dir" || (umount -f -l "$dir" && rmdir "$dir")
42
+
@@ -0,0 +1,126 @@
1
+ # create the appliance disk and initialize the checkpoint mechanism with Qemu
2
+ # Network Block Device (NBD)
3
+
4
+ - create_initial_image:
5
+ - check_cmd_out: qemu-img
6
+ - exec_out: mkdir -p checkpoints
7
+ - exec_out: |
8
+ if [ $$consider_checkpoint = true ]; then
9
+ if [ ! -e "$$image_disk" ] ; then
10
+ qemu-img create -f qcow2 checkpoints/base_$$image_disk $$image_size
11
+ # keep a link to the last checkpoint disk
12
+ ln -sf checkpoints/base_$$image_disk $$image_disk
13
+ fi
14
+ else
15
+ qemu-img create -f qcow2 $$image_disk $$image_size
16
+ fi
17
+
18
+ - load_nbd_module:
19
+ - on_checkpoint: redo
20
+ - on_bootstrap_init:
21
+ - exec_out: |
22
+ lsmod | grep nbd >/dev/null \
23
+ || modprobe nbd max_part=63 \
24
+ || fail failed to load nbd module into kernel
25
+
26
+ - attach_nbd_device:
27
+ # this microstep must be skipped because it is already done by the
28
+ # checkpoint restore function
29
+ - on_checkpoint: redo
30
+ - check_cmd_out: qemu-nbd
31
+ - exec_out: echo Connecting $$image_disk to nbd device $$nbd_device
32
+ - exec_out: echo "sync" ; sync
33
+ - exec_out: qemu-nbd -d $$nbd_device
34
+ - exec_out: |
35
+ if [ $$consider_checkpoint = true ]; then
36
+ REAL_PATH="$(readlink $$image_disk)"
37
+ else
38
+ REAL_PATH="$$image_disk"
39
+ fi
40
+ qemu-nbd -c $$nbd_device $REAL_PATH -n || fail nbd device $$nbd_device is unavailable
41
+
42
+ - detach_nbd_device:
43
+ # this miscrostep must be done again ensure that the nbd device is
44
+ # detached
45
+ - on_checkpoint: redo
46
+ - on_export_clean:
47
+ - exec_out: echo "sync" ; sync
48
+ - exec_out: qemu-nbd -d $$nbd_device
49
+ - exec_out: "pgrep qemu-nbd | xargs -I {} kill -9 {} || true"
50
+
51
+ - partition_disk:
52
+ - check_cmd_out: parted
53
+ - exec_out: |
54
+ echo "Partitioning disk..."
55
+ parted $${nbd_device} mklabel msdos
56
+ parted $${nbd_device} mkpart primary 0% 100%
57
+ parted $${nbd_device} set 1 boot on
58
+ - exec_out: |
59
+ echo Creating root partition...
60
+ mkfs.$$filesystem_type -q $${nbd_device}p1 || fail cannot create / ext4
61
+
62
+ - mount_rootfs:
63
+ - exec_out: mkdir -p $$rootfs
64
+ - exec_out: "echo Mounting root partition... ; mount $${nbd_device}p1 $$rootfs || fail cannot mount /"
65
+ - on_clean:
66
+ - exec_out: "echo try umount $$rootfs... ; mountpoint -q $$rootfs && umount -f -l $$rootfs || true"
67
+
68
+ - copy_rootfs:
69
+ - check_cmd_out: rsync
70
+ - exec_out: echo "Copying rootfs to $$rootfs..."
71
+ - exec_out: rsync -aAX --exclude '/.kameleon_timestamp' $$rootfs_partial/* $$rootfs
72
+ - exec_out: echo "sync..." ; sync
73
+
74
+ - create_fstab:
75
+ - write_out:
76
+ - $$rootfs/etc/fstab
77
+ - |
78
+ # /etc/fstab: static file system information.
79
+ #
80
+ # Use 'blkid' to print the universally unique identifier for a
81
+ # device; this may be used with UUID= as a more robust way to name devices
82
+ # that works even if disks are added and removed. See fstab(5).
83
+ #
84
+ # <file system> <mount point> <type> <options> <dump> <pass>
85
+ UUID=`blkid -s UUID -o value $${nbd_device}p1` / $$filesystem_type errors=remount-ro 0 1
86
+
87
+ - mount_chroot:
88
+ - check_cmd_out: chroot
89
+ - exec_out: mount -o bind /dev $$rootfs/dev
90
+ - exec_out: mount -o bind /dev/pts $$rootfs/dev/pts
91
+ - exec_out: mount -t proc /proc $$rootfs/proc
92
+ - exec_out: mount -t sysfs /sys $$rootfs/sys
93
+ - exec_out: test -f $$rootfs/etc/mtab || cat /proc/mounts > $$rootfs/etc/mtab
94
+
95
+ - umount_chroot:
96
+ - on_clean:
97
+ - exec_out: echo try umount $$rootfs/sys... ; mountpoint -q $$rootfs/sys && umount -f -l $$rootfs/sys || true
98
+ - exec_out: echo try umount $$rootfs/proc... ; mountpoint -q $$rootfs/proc && umount -f -l $$rootfs/proc || true
99
+ - exec_out: echo try umount $$rootfs/dev/pts... ; mountpoint -q $$rootfs/dev/pts && umount -f -l $$rootfs/dev/pts || true
100
+ - exec_out: echo try umount $$rootfs/dev... ; mountpoint -q $$rootfs/dev && umount -f -l $$rootfs/dev || true
101
+
102
+ - configure_sshd:
103
+ - exec_out: echo -e 'y\n' | ssh-keygen -q -t dsa -f $$insecure_ssh_key -N ''
104
+ - exec_out: cat $$insecure_ssh_key
105
+ - exec_out: chroot $$rootfs mkdir -p /root/.ssh
106
+ - exec_out: |
107
+ cat $${insecure_ssh_key}.pub | tee -a $$rootfs/root/.ssh/authorized_keys
108
+ - write_out:
109
+ - $$ssh_config_file
110
+ - |
111
+ Host $$kameleon_recipe_name
112
+ HostName 127.0.0.1
113
+ Port $${qemu_ssh_port}
114
+ User root
115
+ IdentityFile $$insecure_ssh_key
116
+ UserKnownHostsFile /dev/null
117
+ StrictHostKeyChecking no
118
+ PasswordAuthentication no
119
+ IdentitiesOnly yes
120
+ LogLevel FATAL
121
+ ForwardAgent yes
122
+ ControlPath $(pwd)/master-%l-%r@%h:%p
123
+ ControlMaster auto
124
+ ControlPersist yes
125
+ Compression yes
126
+ Protocol 2