Commit 80b99e40 authored by Alain Takoudjou's avatar Alain Takoudjou

kvm: fix kvm_run script, add qed in external disk format and improve http server

parent a55d0291
...@@ -24,10 +24,10 @@ default_disk_image = '%(default-disk-image)s' ...@@ -24,10 +24,10 @@ default_disk_image = '%(default-disk-image)s'
disk_path = '%(disk-path)s' disk_path = '%(disk-path)s'
virtual_hard_drive_url = '%(virtual-hard-drive-url)s'.strip() virtual_hard_drive_url = '%(virtual-hard-drive-url)s'.strip()
virtual_hard_drive_md5sum = '%(virtual-hard-drive-md5sum)s'.strip() virtual_hard_drive_md5sum = '%(virtual-hard-drive-md5sum)s'.strip()
virtual_hard_drive_gzipped = '%(virtual-hard-drive-gzipped)s'.strip() virtual_hard_drive_gzipped = '%(virtual-hard-drive-gzipped)s'.strip().lower()
nat_rules = '%(nat-rules)s'.strip() nat_rules = '%(nat-rules)s'.strip()
use_tap = '%(use-tap)s' use_tap = '%(use-tap)s'.lower()
use_nat = '%(use-nat)s' use_nat = '%(use-nat)s'.lower()
tap_interface = '%(tap-interface)s' tap_interface = '%(tap-interface)s'
listen_ip = '%(ipv4)s' listen_ip = '%(ipv4)s'
mac_address = '%(mac-address)s' mac_address = '%(mac-address)s'
...@@ -119,7 +119,7 @@ if not os.path.exists(disk_path) and virtual_hard_drive_url != '': ...@@ -119,7 +119,7 @@ if not os.path.exists(disk_path) and virtual_hard_drive_url != '':
print('Downloading virtual hard drive...') print('Downloading virtual hard drive...')
try: try:
downloaded_disk = disk_path downloaded_disk = disk_path
if virtual_hard_drive_gzipped == 'True': if virtual_hard_drive_gzipped == 'true':
downloaded_disk = '%%s.gz' %% disk_path downloaded_disk = '%%s.gz' %% disk_path
urllib.urlretrieve(virtual_hard_drive_url, downloaded_disk) urllib.urlretrieve(virtual_hard_drive_url, downloaded_disk)
except: except:
...@@ -162,7 +162,7 @@ for storage in disk_storage_list: ...@@ -162,7 +162,7 @@ for storage in disk_storage_list:
key, val = storage.split(' ') key, val = storage.split(' ')
disk_storage_dict[key.strip()] = val.strip() disk_storage_dict[key.strip()] = val.strip()
if not external_disk_format in ['qcow2', 'raw', 'vdi', 'vmdk', 'cloop']: if not external_disk_format in ['qcow2', 'raw', 'vdi', 'vmdk', 'cloop', 'qed']:
external_disk_format = 'qcow2' external_disk_format = 'qcow2'
map_storage_list, external_disk_number = getMapStorageList(disk_storage_dict, map_storage_list, external_disk_number = getMapStorageList(disk_storage_dict,
...@@ -197,7 +197,7 @@ tap_network_parameter = [] ...@@ -197,7 +197,7 @@ tap_network_parameter = []
nat_network_parameter = [] nat_network_parameter = []
numa_parameter = [] numa_parameter = []
number = -1 number = -1
if use_nat == 'True': if use_nat == 'true':
number += 1 number += 1
rules = 'user,id=lan%%s,' %% number + ','.join('hostfwd=tcp:%%s:%%s-:%%s' %% (listen_ip, rules = 'user,id=lan%%s,' %% number + ','.join('hostfwd=tcp:%%s:%%s-:%%s' %% (listen_ip,
int(port) + 10000, port) for port in nat_rules.split()) int(port) + 10000, port) for port in nat_rules.split())
...@@ -209,7 +209,7 @@ if use_nat == 'True': ...@@ -209,7 +209,7 @@ if use_nat == 'True':
cluster_doc_host, cluster_doc_port) cluster_doc_host, cluster_doc_port)
nat_network_parameter = ['-netdev', rules, nat_network_parameter = ['-netdev', rules,
'-device', 'e1000,netdev=lan%%s,mac=%%s' %% (number, mac_address)] '-device', 'e1000,netdev=lan%%s,mac=%%s' %% (number, mac_address)]
if use_tap == 'True': if use_tap == 'true':
number += 1 number += 1
tap_network_parameter = ['-netdev', tap_network_parameter = ['-netdev',
'tap,id=lan%%s,ifname=%%s,script=no,downscript=no' %% (number, 'tap,id=lan%%s,ifname=%%s,script=no,downscript=no' %% (number,
......
...@@ -95,7 +95,7 @@ mode = 0644 ...@@ -95,7 +95,7 @@ mode = 0644
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/instance-kvm.cfg.jinja2 url = ${:_profile_base_location_}/instance-kvm.cfg.jinja2
mode = 644 mode = 644
md5sum = fb2dcca424fa0bf4d6ec445965a8bc81 md5sum = 55eb9cb0d85dedbda0f03986cef261db
download-only = true download-only = true
on-update = true on-update = true
...@@ -103,7 +103,7 @@ on-update = true ...@@ -103,7 +103,7 @@ on-update = true
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/instance-kvm-cluster.cfg.jinja2.in url = ${:_profile_base_location_}/instance-kvm-cluster.cfg.jinja2.in
mode = 644 mode = 644
md5sum = 36d9ea062c13f88eadd6f635eed36b7e md5sum = 1e4d8eade6d291480e5112ef9f31f031
download-only = true download-only = true
on-update = true on-update = true
......
...@@ -266,7 +266,7 @@ ...@@ -266,7 +266,7 @@
"description": "Type of QEMU disk drive, to create.", "description": "Type of QEMU disk drive, to create.",
"type": "string", "type": "string",
"default": "qcow2", "default": "qcow2",
"enum": ["qcow2", "raw", "vdi", "vmdk", "cloop"] "enum": ["qcow2", "raw", "vdi", "vmdk", "cloop", "qed"]
}, },
"use-tap": { "use-tap": {
"title": "Use QEMU TAP network interface", "title": "Use QEMU TAP network interface",
......
...@@ -22,7 +22,7 @@ config-use-ipv6 = {{ dumps(slapparameter_dict.get('use-ipv6', False)) }} ...@@ -22,7 +22,7 @@ config-use-ipv6 = {{ dumps(slapparameter_dict.get('use-ipv6', False)) }}
# Request kvm instances # Request kvm instances
{% for instance_name, kvm_parameter_dict in slapparameter_dict.get('kvm-partition-dict', {'kvm-default': {}}).items() -%} {% for instance_name, kvm_parameter_dict in slapparameter_dict.get('kvm-partition-dict', {'kvm-default': {}}).items() -%}
{% set section = 'request-' ~ instance_name -%} {% set section = 'request-' ~ instance_name -%}
{% set use_nat = kvm_parameter_dict.get('use-nat', True) -%} {% set use_nat = kvm_parameter_dict.get('use-nat', 'True') -%}
[{{ section }}] [{{ section }}]
<= request-common <= request-common
software-type = kvm software-type = kvm
...@@ -73,12 +73,12 @@ config-document-path = ${http-server:path} ...@@ -73,12 +73,12 @@ config-document-path = ${http-server:path}
return = return =
backend-url backend-url
url url
{% if use_nat -%} {% if use_nat.lower() -%}
{% for port in nat_rules_list -%} {% for port in nat_rules_list -%}
{{ ' ' }}nat-rule-url-{{ port }} {{ ' ' }}nat-rule-url-{{ port }}
{% endfor -%} {% endfor -%}
{% endif -%} {% endif -%}
{% if kvm_parameter_dict.get('use-tap', True) -%} {% if kvm_parameter_dict.get('use-tap', 'True').lower() == 'true' -%}
{{ ' ' }}tap-ipv4 {{ ' ' }}tap-ipv4
{% do publish_dict.__setitem__('lan-' ~ instance_name, '${' ~ section ~ ':connection-tap-ipv4}') -%} {% do publish_dict.__setitem__('lan-' ~ instance_name, '${' ~ section ~ ':connection-tap-ipv4}') -%}
...@@ -86,7 +86,7 @@ return = ...@@ -86,7 +86,7 @@ return =
{% endif -%} {% endif -%}
{% do publish_dict.__setitem__(instance_name ~ '-backend-url', '${' ~ section ~ ':connection-backend-url}') -%} {% do publish_dict.__setitem__(instance_name ~ '-backend-url', '${' ~ section ~ ':connection-backend-url}') -%}
{% do publish_dict.__setitem__(instance_name ~ '-url', '${' ~ section ~ ':connection-url}') -%} {% do publish_dict.__setitem__(instance_name ~ '-url', '${' ~ section ~ ':connection-url}') -%}
{% do kvm_instance_dict.__setitem__(instance_name, (kvm_parameter_dict.get('use-nat', True), nat_rules_list)) -%} {% do kvm_instance_dict.__setitem__(instance_name, (use_nat, nat_rules_list)) -%}
{% endfor %} {% endfor %}
...@@ -145,6 +145,7 @@ log = ${:var}/log ...@@ -145,6 +145,7 @@ log = ${:var}/log
scripts = ${:etc}/run scripts = ${:etc}/run
services = ${:etc}/service services = ${:etc}/service
document = ${:srv}/document document = ${:srv}/document
promises = ${:etc}/promise
ssl = ${:etc}/ssl ssl = ${:etc}/ssl
[http-ssl] [http-ssl]
...@@ -164,8 +165,16 @@ wrapper = ${directory:services}/simple-http-server ...@@ -164,8 +165,16 @@ wrapper = ${directory:services}/simple-http-server
log-file = ${directory:log}/http.log log-file = ${directory:log}/http.log
cert-file = ${http-ssl:cert} cert-file = ${http-ssl:cert}
key-file = ${http-ssl:key} key-file = ${http-ssl:key}
{% do publish_dict.__setitem__('http-file-server', 'https://' ~ '[${http-server:host}]:' ~ '${http-server:port}/' ~ '${http-server:path}') -%} use-hash-url = true
[http-promise]
recipe = slapos.cookbook:check_port_listening
path = ${directory:promises}/http-server
hostname = ${http-server:host}
port = ${http-server:port}
{% if len(kvm_hostname_list) -%}
{% do part_list.append('write-vm-hostname') -%}
[write-vm-hostname] [write-vm-hostname]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
template = {{ template_content }} template = {{ template_content }}
...@@ -174,6 +183,7 @@ rendered = ${http-server:root-dir}/${:filename} ...@@ -174,6 +183,7 @@ rendered = ${http-server:root-dir}/${:filename}
context = context =
raw content_list {{ kvm_hostname_list | join('#') }} raw content_list {{ kvm_hostname_list | join('#') }}
raw sep # raw sep #
{% endif -%}
{% macro writefile(section_name, file_path, content, mode='') -%} {% macro writefile(section_name, file_path, content, mode='') -%}
{% do part_list.append(section_name) -%} {% do part_list.append(section_name) -%}
...@@ -199,7 +209,7 @@ recipe = slapos.cookbook:publish ...@@ -199,7 +209,7 @@ recipe = slapos.cookbook:publish
[buildout] [buildout]
parts = parts =
http-server http-server
write-vm-hostname http-promise
publish publish
# Complete parts with sections # Complete parts with sections
{{ part_list | join('\n ') }} {{ part_list | join('\n ') }}
......
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
"description": "Type of QEMU disk drive, to create.", "description": "Type of QEMU disk drive, to create.",
"type": "string", "type": "string",
"default": "qcow2", "default": "qcow2",
"enum": ["qcow2", "raw", "vdi", "vmdk", "cloop"] "enum": ["qcow2", "raw", "vdi", "vmdk", "cloop", "qed"]
}, },
"use-tap": { "use-tap": {
......
{% set enable_http = slapparameter_dict.get('enable-http-server', 'False') -%} {% set enable_http = slapparameter_dict.get('enable-http-server', 'False').lower() -%}
{% set use_tap = slapparameter_dict.get('use-tap', 'False').lower() -%}
{% set use_nat = slapparameter_dict.get('use-nat', 'True').lower() -%}
############################# #############################
# #
# Instanciate kvm # Instanciate kvm
...@@ -19,7 +21,7 @@ parts = ...@@ -19,7 +21,7 @@ parts =
{% if slapparameter_dict.get('document-host', '') %} {% if slapparameter_dict.get('document-host', '') %}
cluster-url-path cluster-url-path
{% endif -%} {% endif -%}
{% if slapparameter_dict.get('enable-http-server', 'False') == 'True' %} {% if enable_http == 'true' %}
httpd httpd
httpd-promise httpd-promise
publish-host-config publish-host-config
...@@ -30,8 +32,8 @@ parts = ...@@ -30,8 +32,8 @@ parts =
get-authorized-key get-authorized-key
{% endif -%} {% endif -%}
extends = # extends =
{{ template_httpd_cfg }} # {{ template_httpd_cfg }}
{% endif -%} {% endif -%}
eggs-directory = {{ eggs_directory }} eggs-directory = {{ eggs_directory }}
...@@ -133,7 +135,7 @@ external-disk-number = ${slap-parameter:external-disk-number} ...@@ -133,7 +135,7 @@ external-disk-number = ${slap-parameter:external-disk-number}
external-disk-size = ${slap-parameter:external-disk-size} external-disk-size = ${slap-parameter:external-disk-size}
external-disk-format = ${slap-parameter:external-disk-format} external-disk-format = ${slap-parameter:external-disk-format}
{% if slapparameter_dict.get('enable-http-server', 'False') == 'True' or ( slapparameter_dict.get('use-tap', 'False') == 'True' and tap_network_dict.has_key('ipv4') ) -%} {% if enable_http == 'tue' or ( use_tap == 'true' and tap_network_dict.has_key('ipv4') ) -%}
httpd-port = ${slap-parameter:httpd-port} httpd-port = ${slap-parameter:httpd-port}
{% else -%} {% else -%}
httpd-port = 0 httpd-port = 0
...@@ -270,6 +272,23 @@ dash_path = {{ dash_executable_location }} ...@@ -270,6 +272,23 @@ dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }} curl_path = {{ curl_executable_location }}
{% if enable_http == 'true' %}
[httpd]
recipe = slapos.cookbook:simplehttpserver
host = ${slap-network-information:local-ipv4}
port = ${slap-parameter:httpd-port}
base-path = ${directory:public}
wrapper = ${directory:services}/http-server
log-file = ${directory:log}/httpd.log
use-hash-url = false
[httpd-promise]
recipe = slapos.cookbook:check_port_listening
path = ${directory:promises}/httpd
hostname = ${httpd:host}
port = ${httpd:port}
{% endif %}
[publish-connection-information] [publish-connection-information]
recipe = slapos.cookbook:publish recipe = slapos.cookbook:publish
ipv6 = ${slap-network-information:global-ipv6} ipv6 = ${slap-network-information:global-ipv6}
...@@ -278,7 +297,7 @@ url = ${request-slave-frontend:connection-url}/vnc_auto.html?host=${request-slav ...@@ -278,7 +297,7 @@ url = ${request-slave-frontend:connection-url}/vnc_auto.html?host=${request-slav
{% set disk_number = len(storage_dict) -%} {% set disk_number = len(storage_dict) -%}
maximum-extra-disk-amount = {{ disk_number }} maximum-extra-disk-amount = {{ disk_number }}
{% set iface = 'eth0' -%} {% set iface = 'eth0' -%}
{% if slapparameter_dict.get('use-nat', 'True') == 'True' -%} {% if use_nat == 'true' -%}
{% set iface = 'eth1' -%} {% set iface = 'eth1' -%}
# Publish NAT port mapping status # Publish NAT port mapping status
# XXX: hardcoded value from [slap-parameter] # XXX: hardcoded value from [slap-parameter]
...@@ -291,13 +310,13 @@ nat-rule-url-{{port}} = [${slap-network-information:global-ipv6}]:{{external_por ...@@ -291,13 +310,13 @@ nat-rule-url-{{port}} = [${slap-network-information:global-ipv6}]:{{external_por
{% endif -%} {% endif -%}
{% endfor -%} {% endfor -%}
{% endif -%} {% endif -%}
{% if slapparameter_dict.get('use-tap', 'False') == 'True' -%} {% if use_tap == 'true' -%}
tap-ipv4 = ${slap-network-information:tap-ipv4} tap-ipv4 = ${slap-network-information:tap-ipv4}
{% endif -%} {% endif -%}
{% set kvm_http = 'http://${slap-network-information:local-ipv4}:' ~ slapparameter_dict.get('httpd-port', 8081) -%} {% set kvm_http = 'http://${slap-network-information:local-ipv4}:' ~ slapparameter_dict.get('httpd-port', 8081) -%}
{% if enable_http == 'True' %} {% if enable_http == 'True' %}
{% if slapparameter_dict.get('use-nat', 'True') == 'True' -%} {% if use_nat == 'true' -%}
{% set kvm_http = 'http://10.0.2.100' -%} {% set kvm_http = 'http://10.0.2.100' -%}
{% endif %} {% endif %}
{% if slapparameter_dict.get('authorized-key', '') -%} {% if slapparameter_dict.get('authorized-key', '') -%}
...@@ -305,13 +324,13 @@ tap-ipv4 = ${slap-network-information:tap-ipv4} ...@@ -305,13 +324,13 @@ tap-ipv4 = ${slap-network-information:tap-ipv4}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if slapparameter_dict.get('use-tap', 'False') == 'True' and tap_network_dict.has_key('ipv4') -%} {% if use_tap == 'true' and tap_network_dict.has_key('ipv4') -%}
1_info = Use these configurations below to configure interface {{ iface }} in your VM. 1_info = Use these configurations below to configure interface {{ iface }} in your VM.
2_info = ${network-config:ifconfig} 2_info = ${network-config:ifconfig}
3_info = ${network-config:route-iface} 3_info = ${network-config:route-iface}
4_info = ${network-config:route-network} 4_info = ${network-config:route-network}
5_info = ${network-config:route-default} 5_info = ${network-config:route-default}
{% if enable_http == 'True' %} {% if enable_http == 'true' %}
6_info = Or run in your VM the command: wget -O- {{ kvm_http }}/netconfig.sh | /bin/sh - 6_info = Or run in your VM the command: wget -O- {{ kvm_http }}/netconfig.sh | /bin/sh -
{% endif %} {% endif %}
...@@ -357,7 +376,7 @@ mode = {{ mode }} ...@@ -357,7 +376,7 @@ mode = {{ mode }}
[publish-host-config] [publish-host-config]
recipe = plone.recipe.command recipe = plone.recipe.command
name = {{ slapparameter_dict.get('name', 'localhost') }} name = {{ slapparameter_dict.get('name', 'localhost') }}
{% if slapparameter_dict.get('use-tap', 'False') == 'True' and tap_network_dict.has_key('ipv4') -%} {% if use_tap == 'true' and tap_network_dict.has_key('ipv4') -%}
local-ipv4 = ${slap-network-information:tap-ipv4} local-ipv4 = ${slap-network-information:tap-ipv4}
{% else -%} {% else -%}
local-ipv4 = 127.0.0.1 local-ipv4 = 127.0.0.1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment