• Łukasz Nowak's avatar
    software/kvm: Implement downloadable images · 0d3e8749
    Łukasz Nowak authored
    Downloadable images are enabled when key image-url-list (described in
    instance-kvm-input-schema.json) is present.
    
    Images are downloaded outside of partition processing, as this can take a lot
    of time by template/image-download-controller.py
    
    Configuration is checked and cleaned up by
    template/image-download-config-creator.py
    
    Promises are used for:
    
     * checking if the current configuration from the request has been processed
     * checking status of configuration generation, image download process and
       checksum validity
    
    Details about errors are exposed by using monitor stack provided HTTP server,
    so that user is able to take informed decision about how to fix the problem.
    0d3e8749
software.cfg 5.6 KB
[buildout]

extends =
  ../../component/6tunnel/buildout.cfg
  ../../component/curl/buildout.cfg
  ../../component/dash/buildout.cfg
  ../../component/qemu-kvm/buildout.cfg
  ../../component/noVNC/buildout.cfg
  ../../component/openssl/buildout.cfg
  ../../component/netcat/buildout.cfg
  ../../component/lxml-python/buildout.cfg
  ../../component/pycurl/buildout.cfg
  ../../component/gzip/buildout.cfg
  ../../stack/slapos.cfg
  ../../component/nodejs/buildout.cfg
  ../../stack/resilient/buildout.cfg
  buildout.hash.cfg

# stacks are listed from most generic to most specific,
# to avoid versioning issues
common-parts =
  template

# XXX: we have to manually add this for resilience
  rdiff-backup
  pbs-recipe-egg


parts = ${:common-parts}

#XXX-Cedric : Currently, one can only access to KVM using noVNC.
#             Ideally one should be able to access KVM by using either NoVNC or VNC.
#             Problem is : no native crypto support in web browsers. So we have to disable ssl
#             In qemu builtin vnc server, and make it available only for localhost
#             so that only novnc can listen to it.

#XXX-Cedric: Check status of https://github.com/kanaka/noVNC/issues/13 to see
#            When qemu has builtin support for websockets in vnc server to get rid of
#            Websockify (socket <-> websocket proxy server) when it is ready.
#            May solve previous XXX depending on the implementation.

#XXX-Cedric : add list of keyboard layouts (azerty/us querty/...) parameter to qemu

[python-with-eggs]
recipe = zc.recipe.egg
interpreter = ${:_buildout_section_name_}
eggs =
  ${slapos-toolbox:eggs}
  ${python-cffi:egg}
  ${lxml-python:egg}
  websockify
  slapos.cookbook
  erp5.util
# BBB: eggs used as recipe should be kept otherwise sections depending
# on it can't be uninstalled
  collective.recipe.shelloutput
scripts =
  websockify

[http-proxy]
# https://github.com/nodejitsu/node-http-proxy
recipe = slapos.recipe.build:download-unpacked
#XXX-Cedric : use upstream when merged
url = https://nodeload.github.com/desaintmartin/node-http-proxy/zipball/20120621
md5sum = 20204d0b29c2cef26e1c91e99eedca6b

[proxy-by-url]
# https://github.com/dominictarr/proxy-by-url
recipe = slapos.recipe.build:download-unpacked
#XXX-Cedric : use upstream when merged
url = https://nodeload.github.com/desaintmartin/proxy-by-url/zipball/20120621
md5sum = c2609948aa708581f93b981b23880314

[npm-modules]
recipe = plone.recipe.command
destination = ${buildout:parts-directory}/${:_buildout_section_name_}
location = ${buildout:parts-directory}/${:_buildout_section_name_}
command =
  export HOME=${:location};
  rm -fr ${:destination} &&
  mkdir -p ${:destination} &&
  cd ${:destination} &&
  ${nodejs:location}/bin/node ${nodejs:location}/bin/npm install colors@0.6.0-1 &&
  ${nodejs:location}/bin/node ${nodejs:location}/bin/npm install socket.io@0.8.7 &&
  ${nodejs:location}/bin/node ${nodejs:location}/bin/npm install socket.io-client@0.8.7 &&
  ${nodejs:location}/bin/node ${nodejs:location}/bin/npm install optimist@0.3.1 &&
  ${nodejs:location}/bin/node ${nodejs:location}/bin/npm install pkginfo@0.2.3


# Create all templates that will be used to deploy instances
[download-base]
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/${:filename}
mode = 0644

[download-file-base]
<= download-base
ignore-existing = true
download-only = true

[download-template-base]
<= download-file-base
url = ${:_profile_base_location_}/template/${:path}
path = ${:filename}

[template-file-base]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/${:filename}
mode = 0644

[template]
<= template-file-base
output = ${buildout:directory}/template.cfg

[template-kvm]
<= download-file-base
on-update = true

[template-kvm-cluster]
<= download-file-base
on-update = true

[template-kvm-resilient]
<= download-file-base
on-update = true

[template-kvm-import]
<= download-file-base
on-update = true

[template-kvm-import-script]
<= download-template-base
filename = kvm-import.sh.jinja2
mode = 0755

[template-kvm-export]
<= download-file-base
on-update = true

[template-kvm-export-script]
<= download-template-base
filename = kvm-export.sh.jinja2
mode = 0755

[template-nbd]
<= download-file-base
on-update = true

[template-ansible-promise]
<= download-template-base
filename = ansible-promise.in

[template-kvm-run]
<= download-template-base
filename = template-kvm-run.in
on-update = true

[template-kvm-controller]
<= download-template-base
filename = kvm-controller-run.in
on-update = true

[template-apache-conf]
<= download-template-base
filename = apache.conf.in
on-update = true

[template-content]
<= download-template-base
filename = template-content.in
on-update = true

[template-qemu-ready]
<= download-template-base
filename = qemu-is-ready.in
on-update = true

[file-download-script]
<= download-template-base
path = download_file.in
filename = download_file
on-update = true

[template-httpd]
recipe = slapos.recipe.template:jinja2
template = ${:_profile_base_location_}/instance-kvm-http.cfg.in
rendered = ${buildout:parts-directory}/${:_buildout_section_name_}/instance-kvm-http.cfg
context =
    key apache_location apache:location
    raw openssl_executable_location ${openssl:location}/bin/openssl
    raw template_apache_conf ${template-apache-conf:location}/${template-apache-conf:filename}

[image-download-controller]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/${:_update_hash_filename_}
mode = 640

[image-download-config-creator]
<= image-download-controller

[versions]
websockify = 0.9.0

collective.recipe.environment = 0.2.0
gitdb = 0.6.4
pycurl = 7.43.0
slapos.recipe.template = 4.4
smmap = 0.9.0
numpy = 1.16.4