[PATCH 0/3 V2] Make Template defaults configurable
by Aline Manera
v1 -> v2:
- Fix error message format
Aline Manera (3):
Make Template defaults configurable
Verify all networks set as Template defaults prior to server start up
Verify storage pool set as Template default prior to server starts up
contrib/DEBIAN/control.in | 1 +
contrib/kimchi.spec.fedora.in | 2 ++
contrib/kimchi.spec.suse.in | 2 ++
docs/README.md | 8 ++---
src/Makefile.am | 2 +-
src/kimchi/model/model.py | 44 +----------------------
src/kimchi/model/networks.py | 63 +++++++++++++++-----------------
src/kimchi/model/storagepools.py | 66 ++++++++++++++++++++++++++++++++++
src/kimchi/model/templates.py | 2 --
src/kimchi/osinfo.py | 78 ++++++++++++++++++++++++++++++++++------
src/template.conf | 47 ++++++++++++++++++++++++
11 files changed, 220 insertions(+), 95 deletions(-)
create mode 100644 src/template.conf
--
2.1.0
9 years, 7 months
[RFC] Split Kimchi into Base Framework and Virtualization layers
by Lucio Correia
Hi,
Gustavo (on cc) and me have been analyzing how to split Kimchi
Virtualization layer form its Base web framework. We would like to
leverage all infrastructure kimchi base framework provides (URI routing,
error handling, i18n, authentication, API validation, plugin tabs
loading) in other projects, and contribute this back to kimchi-ginger
project.
The general idea for the web framework is that it provides basic UI with
login and tabs menu, and each plugin installed extends the menu with
some tabs.
We started by making kimchi a plugin, like ginger is. We are way
advanced on that and already have most of kimchi's UI running as a
plugin over an almost fully running base web framework.
Ginger needs minimal changes, mainly on import statements. We can
provide changes needed back to ginger too.
Currently, we are splitting kimchi specific stuff like this way: (after
renaming the dir src/kimchi to src/backend *)
* we are using the name "backend" just for disambiguation from
virtualization layer (plugins/kimchi). We will need to define a better
name for that basic framework. One suggestion is to call it "wok", the
base where kimchi is cooked.
{src/backend => plugins/kimchi}/API.json | 0
{src/backend/control/vm => plugins/kimchi/control}/Makefile.am | 7 +-
{src/backend/control/vm => plugins/kimchi/control}/__init__.py | 2 +-
{src/backend => plugins/kimchi}/control/config.py | 0
{src/backend => plugins/kimchi}/control/cpuinfo.py | 0
{src/backend => plugins/kimchi}/control/debugreports.py | 0
{src/backend => plugins/kimchi}/control/groups.py | 0
{src/backend => plugins/kimchi}/control/host.py | 0
{src/backend => plugins/kimchi}/control/interfaces.py | 0
{src/backend => plugins/kimchi}/control/networks.py | 0
{src/backend => plugins/kimchi}/control/peers.py | 0
{src/backend => plugins/kimchi}/control/storagepools.py | 0
{src/backend => plugins/kimchi}/control/storageservers.py | 0
{src/backend => plugins/kimchi}/control/storagevolumes.py | 0
{src/backend => plugins/kimchi}/control/templates.py | 0
{src/backend => plugins/kimchi}/control/users.py | 0
{src/backend => plugins/kimchi}/control/vm/Makefile.am | 0
{src/backend => plugins/kimchi}/control/vm/__init__.py | 0
{src/backend => plugins/kimchi}/control/vm/hostdevs.py | 0
{src/backend => plugins/kimchi}/control/vm/ifaces.py | 0
{src/backend => plugins/kimchi}/control/vm/snapshots.py | 0
{src/backend => plugins/kimchi}/control/vm/storages.py | 0
{src/backend => plugins/kimchi}/control/vms.py | 0
{src/backend => plugins/kimchi}/disks.py | 0
{src/backend => plugins/kimchi}/imageinfo.py | 0
{src/backend => plugins/kimchi}/iscsi.py | 0
{src/backend => plugins/kimchi}/isoinfo.py | 0
{src/backend => plugins/kimchi}/kvmusertests.py | 0
{src/backend => plugins/kimchi}/mockmodel.py | 0
{src/backend/control/vm => plugins/kimchi/model}/Makefile.am | 7 +-
{src/backend/control/vm => plugins/kimchi/model}/__init__.py | 8 ---
{src/backend => plugins/kimchi}/model/config.py | 0
{src/backend => plugins/kimchi}/model/cpuinfo.py | 0
{src/backend => plugins/kimchi}/model/debugreports.py | 0
{src/backend => plugins/kimchi}/model/diskutils.py | 0
{src/backend => plugins/kimchi}/model/featuretests.py | 0
{src/backend => plugins/kimchi}/model/groups.py | 0
{src/backend => plugins/kimchi}/model/host.py | 0
{src/backend => plugins/kimchi}/model/hostdev.py | 0
{src/backend => plugins/kimchi}/model/interfaces.py | 0
{src/backend => plugins/kimchi}/model/libvirtconnection.py | 0
{src/backend => plugins/kimchi}/model/libvirtstoragepool.py | 0
plugins/kimchi/model/model.py | 93
++++++++++++++++++++++++++++
{src/backend => plugins/kimchi}/model/networks.py | 0
{src/backend => plugins/kimchi}/model/peers.py | 0
{src/backend => plugins/kimchi}/model/storagepools.py | 0
{src/backend => plugins/kimchi}/model/storageservers.py | 0
{src/backend => plugins/kimchi}/model/storagetargets.py | 0
{src/backend => plugins/kimchi}/model/storagevolumes.py | 0
{src/backend => plugins/kimchi}/model/templates.py | 0
{src/backend => plugins/kimchi}/model/users.py | 0
{src/backend => plugins/kimchi}/model/utils.py | 0
{src/backend => plugins/kimchi}/model/vmhostdevs.py | 0
{src/backend => plugins/kimchi}/model/vmifaces.py | 0
{src/backend => plugins/kimchi}/model/vms.py | 0
{src/backend => plugins/kimchi}/model/vmsnapshots.py | 0
{src/backend => plugins/kimchi}/model/vmstorages.py | 0
{src/backend => plugins/kimchi}/osinfo.py | 0
{src/backend => plugins/kimchi}/scan.py | 0
{config => plugins/kimchi/ui}/Makefile.am | 0
{config/ui => plugins/kimchi/ui/config}/Makefile.am | 0
config/ui/tabs.xml => plugins/kimchi/ui/config/tab-ext.xml | 0
{src/backend => plugins/kimchi}/vmtemplate.py | 0
The remaining generic stuff on the "backend" side, usable or already in
use by other plugins, would be:
backend
|___model
| |___model.py
| |___plugins.py
| |___tasks.py
|___control
| |___base.py
| |___plugins.py
| |___tasks.py
| |___utils.py
|___xmlutils
| |___network.py
| |___disk.py
| |___utils.py
| |___graphics.py
| |___qemucmdline.py
| |___interface.py
|___asynctask.py
|___auth.py
|___basemodel.py
|___cachebust.py
|___distroloader.py
|___exception.py
|___i18n.py
|___netinfo.py
|___network.py
|___objectstore.py
|___proxy.py
|___repositories.py
|___rollbackcontext.py
|___root.py
|___screenshot.py
|___server.py
|___sslcert.py
|___swupdate.py
|___template.py
|___utils.py
|___vnc.py
We don't want to make this a too long e-mail and lose the focus on the
idea. We have further technical details to discuss in a follow up.
Please let us know your thoughts on that, any directions and
requirements you have on this, and how could we proceed with that plan.
--
Lucio Correia
Software Engineer
IBM LTC Brazil
9 years, 7 months
[kimchi-devel][PATCHv4 0/7] Upload storage volume
by lvroyce@linux.vnet.ibm.com
From: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
How to upload:
POST /storagepools/<pool-name>/storagevolumes/
{'capacity':size-of-the-volume,'name':name-of-the-volume,'format':'raw'}
PUT /storagepools/<pool-name>/storagevolumes/<volume-name>
{'chunk':chunk-data,'chunk_size':size-of-chunk,'index':index-of-the-chunk-of-uploaded-file}
PATCH 7/7 is a script against real model server,
you can use it to verify the logic of upload.
Royce Lv (7):
Update docs and json schema of storage volume upload
Update controller to make update accept formdata params
Add lock facility for storage volume upload
Update model for storage volume update
Fix incomplete record when uploading
update test case for storage volume upload
A test script against real model server
docs/API.md | 7 ++-
src/kimchi/API.json | 22 ++++++++
src/kimchi/control/base.py | 6 +--
src/kimchi/i18n.py | 4 ++
src/kimchi/isoinfo.py | 5 +-
src/kimchi/model/storagevolumes.py | 61 ++++++++++-----------
src/kimchi/model/utils.py | 46 ++++++++++++++++
tests/test_api.py | 108 +++++++++++++++++++++++++++++++++++++
tests/test_model_storagevolume.py | 95 ++++++++++++++++++++++++--------
9 files changed, 291 insertions(+), 63 deletions(-)
create mode 100644 tests/test_api.py
--
2.1.0
9 years, 7 months
[PATCH 0/5] Support vm name with special characters
by Ramon Medeiros
Ramon Medeiros (5):
Create title tag
Change the way that get_vm() and vm_list() search for VMs
Use get_vm() instead of conn.lookupByName
Encode vm_name to generate VNC token
Reflect the unicode conversion on token creation
src/kimchi/model/vms.py | 50 +++++++++++++++++++++++++++++++++---------
src/kimchi/model/vmstorages.py | 4 ++--
src/kimchi/vmtemplate.py | 4 +++-
ui/js/src/kimchi.api.js | 4 ++--
4 files changed, 47 insertions(+), 15 deletions(-)
--
2.1.0
9 years, 7 months
[PATCH v2] Supress error messages while checking vm metadata
by Ramon Medeiros
Changes
v2: Use parse functions present on model/utils.py
The function FeatureTests.disable_libvirt_error_logging only removes the
error message that will be displayed on the console. Libvirt also logs
errors on messages log. To avoid flood messages log with metadata
errors, it will be verified manually if the xml has the tag.
Signed-off-by: Ramon Medeiros <ramonn(a)linux.vnet.ibm.com>
---
src/kimchi/model/utils.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/kimchi/model/utils.py b/src/kimchi/model/utils.py
index b2739b2..1b114f6 100644
--- a/src/kimchi/model/utils.py
+++ b/src/kimchi/model/utils.py
@@ -95,6 +95,9 @@ def _kimchi_set_metadata_node(dom, node):
def libvirt_get_kimchi_metadata_node(dom, mode="current"):
+ if _kimchi_get_metadata_node(dom, "metadata") == None:
+ return
+
FeatureTests.disable_libvirt_error_logging()
try:
xml = dom.metadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT,
--
2.1.0
9 years, 7 months
[PATCH 0/3] Snapshot enhancements
by Crístian Deives
Crístian Deives (3):
snapshot: Handle non-existing snapshots in mock lookup
snapshot: Change the action 'revert' to a Task
snapshot: Allow creating a snapshot of a domain in any state
src/kimchi/control/vm/snapshots.py | 2 +-
src/kimchi/i18n.py | 1 -
src/kimchi/mockmodel.py | 14 ++++++++++++++
src/kimchi/model/vmsnapshots.py | 36 ++++++++++++++++++++++--------------
tests/test_model.py | 15 +++++++++++----
tests/test_rest.py | 13 +++++++++++++
6 files changed, 61 insertions(+), 20 deletions(-)
--
2.1.0
9 years, 7 months
[PATCH] Do not resolve hostname to IP in using remote ISOs
by Aline Manera
Due a limitation in old versions of qemu-io (qemu-io was not able to resolve
hostnames preveting the ISO streaming support), Kimchi automatically
resolved the hostname to IP to workaround this problem.
As all the most used Linux distributions (RHEl7.1, Ubuntu 14.10, Fedora
21 and openSUSE 13.2) have a working version of qemu-io, Kimchi does not
need to care about it anymore.
It also fixes the issue #436
Signed-off-by: Aline Manera <alinefm(a)linux.vnet.ibm.com>
Signed-off-by: Daniel Henrique Barboza <danielhb(a)linux.vnet.ibm.com>
---
src/kimchi/model/config.py | 2 --
src/kimchi/model/featuretests.py | 26 --------------------------
src/kimchi/model/utils.py | 11 -----------
src/kimchi/model/vms.py | 1 -
src/kimchi/model/vmstorages.py | 10 +++-------
src/kimchi/vmtemplate.py | 12 ++----------
tests/test_model.py | 11 +----------
7 files changed, 6 insertions(+), 67 deletions(-)
diff --git a/src/kimchi/model/config.py b/src/kimchi/model/config.py
index a417c9b..ca0a74b 100644
--- a/src/kimchi/model/config.py
+++ b/src/kimchi/model/config.py
@@ -51,7 +51,6 @@ class CapabilitiesModel(object):
def __init__(self, **kargs):
self.conn = kargs['conn']
self.qemu_stream = False
- self.qemu_stream_dns = False
self.libvirt_stream_protocols = []
self.fc_host_support = False
self.metadata_support = False
@@ -88,7 +87,6 @@ class CapabilitiesModel(object):
kimchi_log.info("*** Running feature tests ***")
conn = self.conn.get()
self.qemu_stream = FeatureTests.qemu_supports_iso_stream()
- self.qemu_stream_dns = FeatureTests.qemu_iso_stream_dns()
self.nfs_target_probe = FeatureTests.libvirt_support_nfs_probe(conn)
self.fc_host_support = FeatureTests.libvirt_support_fc_host(conn)
self.metadata_support = FeatureTests.has_metadata_support(conn)
diff --git a/src/kimchi/model/featuretests.py b/src/kimchi/model/featuretests.py
index 8cbe31d..9400151 100644
--- a/src/kimchi/model/featuretests.py
+++ b/src/kimchi/model/featuretests.py
@@ -21,9 +21,7 @@ import cherrypy
import libvirt
import lxml.etree as ET
import platform
-import socket
import subprocess
-import threading
from lxml.builder import E
@@ -153,30 +151,6 @@ class FeatureTests(object):
return len(stderr) == 0
@staticmethod
- @servermethod
- def qemu_iso_stream_dns():
- host = socket.getfqdn(cherrypy.server.socket_host)
- port = cherrypy.server.socket_port
- cmd = ["qemu-io", "-r", "http://%s:%d/images/icon-fedora.png" %
- (host, port), "-c", "'read -v 0 512'"]
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
-
- thread = threading.Thread(target=proc.communicate)
- thread.start()
- thread.join(5)
-
- if thread.is_alive():
- proc.kill()
- thread.join()
- return False
-
- if proc.returncode != 0:
- return False
-
- return True
-
- @staticmethod
def libvirt_support_fc_host(conn):
try:
FeatureTests.disable_libvirt_error_logging()
diff --git a/src/kimchi/model/utils.py b/src/kimchi/model/utils.py
index b2739b2..0c9d519 100644
--- a/src/kimchi/model/utils.py
+++ b/src/kimchi/model/utils.py
@@ -18,8 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import libvirt
-import socket
-import urlparse
from lxml import etree, objectify
from lxml.builder import E, ElementMaker
@@ -41,15 +39,6 @@ def get_vm_name(vm_name, t_name, name_list):
raise OperationFailed("KCHUTILS0003E")
-def check_remote_disk_path(path, qemu_stream_dns):
- hostname = urlparse.urlparse(path).hostname
- if hostname is not None and not qemu_stream_dns:
- ip = socket.gethostbyname(hostname)
- return path.replace(hostname, ip)
-
- return path
-
-
def get_vm_config_flag(dom, mode="persistent"):
# libvirt.VIR_DOMAIN_AFFECT_CURRENT is 0
# VIR_DOMAIN_AFFECT_LIVE is 1, VIR_DOMAIN_AFFECT_CONFIG is 2
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index c8267c1..a6ca27b 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -125,7 +125,6 @@ class VMsModel(object):
stream_protocols = self.caps.libvirt_stream_protocols
xml = t.to_vm_xml(name, vm_uuid,
libvirt_stream_protocols=stream_protocols,
- qemu_stream_dns=self.caps.qemu_stream_dns,
graphics=graphics,
volumes=vol_list)
diff --git a/src/kimchi/model/vmstorages.py b/src/kimchi/model/vmstorages.py
index 37aca64..87c6b3d 100644
--- a/src/kimchi/model/vmstorages.py
+++ b/src/kimchi/model/vmstorages.py
@@ -1,7 +1,7 @@
#
# Project Kimchi
#
-# Copyright IBM, Corp. 2014
+# Copyright IBM, Corp. 2014-2015
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@ from kimchi.exception import OperationFailed
from kimchi.model.config import CapabilitiesModel
from kimchi.model.vms import DOM_STATE_MAP, VMModel
from kimchi.model.storagevolumes import StorageVolumeModel
-from kimchi.model.utils import check_remote_disk_path, get_vm_config_flag
+from kimchi.model.utils import get_vm_config_flag
from kimchi.osinfo import lookup
from kimchi.model.diskutils import get_disk_ref_cnt, set_disk_ref_cnt
from kimchi.utils import kimchi_log
@@ -131,8 +131,6 @@ class VMStoragesModel(object):
params['disk'] = vol_info['type']
params.update(self._get_available_bus_address(params['bus'], vm_name))
- params['path'] = check_remote_disk_path(params['path'],
- self.caps.qemu_stream_dns)
# Add device to VM
dev, xml = get_disk_xml(params)
@@ -215,9 +213,7 @@ class VMStorageModel(object):
if dev_info['type'] != 'cdrom':
raise InvalidOperation("KCHVMSTOR0006E")
- params['path'] = check_remote_disk_path(params.get('path', ''),
- self.caps.qemu_stream_dns)
-
+ params['path'] = params.get('path', '')
old_disk_path = dev_info['path']
new_disk_path = params['path']
if new_disk_path != old_disk_path:
diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py
index ef97d83..e047228 100644
--- a/src/kimchi/vmtemplate.py
+++ b/src/kimchi/vmtemplate.py
@@ -18,7 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import os
-import socket
import stat
import time
import urlparse
@@ -128,7 +127,7 @@ class VMTemplate(object):
except IsoFormatError:
raise InvalidParameter("KCHISO0001E", {'filename': iso})
- def _get_cdrom_xml(self, libvirt_stream_protocols, qemu_stream_dns):
+ def _get_cdrom_xml(self, libvirt_stream_protocols):
if 'cdrom' not in self.info:
return ''
@@ -139,11 +138,6 @@ class VMTemplate(object):
params['index'] = self.info['cdrom_index']
params['path'] = self.info['cdrom']
- hostname = urlparse.urlparse(params['path']).hostname
- if hostname is not None and not qemu_stream_dns:
- ip = socket.gethostbyname(hostname)
- params['path'] = params['path'].replace(hostname, ip)
-
if self.info.get('iso_stream', False):
protocol = urlparse.urlparse(params['path']).scheme
if protocol not in libvirt_stream_protocols:
@@ -304,10 +298,8 @@ class VMTemplate(object):
graphics.update(kwargs.get('graphics', {}))
params['graphics'] = get_graphics_xml(graphics)
- qemu_stream_dns = kwargs.get('qemu_stream_dns', False)
libvirt_stream_protocols = kwargs.get('libvirt_stream_protocols', [])
- cdrom_xml = self._get_cdrom_xml(libvirt_stream_protocols,
- qemu_stream_dns)
+ cdrom_xml = self._get_cdrom_xml(libvirt_stream_protocols)
if not urlparse.urlparse(self.info.get('cdrom', "")).scheme in \
libvirt_stream_protocols and \
diff --git a/tests/test_model.py b/tests/test_model.py
index 210adfd..bd195b5 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -23,9 +23,7 @@ import os
import pwd
import re
import shutil
-import socket
import time
-import urlparse
import unittest
import uuid
@@ -564,14 +562,7 @@ class ModelTests(unittest.TestCase):
{'path': valid_remote_iso_path})
cdrom_info = inst.vmstorage_lookup(vm_name, cdrom_dev)
cur_cdrom_path = re.sub(":80/", '/', cdrom_info['path'])
-
- # As Kimchi server is not running during this test case
- # CapabilitiesModel.qemu_stream_dns will be always False
- # so we need to convert the hostname to IP
- output = urlparse.urlparse(valid_remote_iso_path)
- hostname = socket.gethostbyname(output.hostname)
- url = valid_remote_iso_path.replace(output.hostname, hostname)
- self.assertEquals(url, cur_cdrom_path)
+ self.assertEquals(valid_remote_iso_path, cur_cdrom_path)
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_vm_storage_provisioning(self):
--
2.1.0
9 years, 7 months