Change in vdsm[master]: v2v: add support for importing kvm based vms from libvirt
shavivi at redhat.com
shavivi at redhat.com
Thu Apr 21 11:04:35 UTC 2016
Shahar Havivi has uploaded a new change for review.
Change subject: v2v: add support for importing kvm based vms from libvirt
......................................................................
v2v: add support for importing kvm based vms from libvirt
Change-Id: I0ddbab700f2e0c54d53ed02ec61477b92c9c7960
Signed-off-by: Shahar Havivi <shaharh at redhat.com>
---
M lib/vdsm/constants.py.in
M lib/vdsm/v2v.py
2 files changed, 69 insertions(+), 20 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/59/56459/1
diff --git a/lib/vdsm/constants.py.in b/lib/vdsm/constants.py.in
index 7f3962d..29a208d 100644
--- a/lib/vdsm/constants.py.in
+++ b/lib/vdsm/constants.py.in
@@ -152,4 +152,5 @@
EXT_CURL_IMG_WRAP = '@LIBEXECDIR@/curl-img-wrap'
EXT_FC_SCAN = '@LIBEXECDIR@/fc-scan'
+EXT_KVM_2_OVIRT = '@LIBEXECDIR@/kvm2ovirt'
EXT_SYSTEMD_RUN = '@SYSTEMD_RUN_PATH@'
diff --git a/lib/vdsm/v2v.py b/lib/vdsm/v2v.py
index f96bda6..0336102 100644
--- a/lib/vdsm/v2v.py
+++ b/lib/vdsm/v2v.py
@@ -41,7 +41,7 @@
import libvirt
from vdsm.commands import execCmd
-from vdsm.constants import P_VDSM_RUN
+from vdsm.constants import P_VDSM_RUN, EXT_KVM_2_OVIRT
from vdsm.define import errCode, doneCode
from vdsm import libvirtconnection, response, concurrent
from vdsm.infra import zombiereaper
@@ -56,6 +56,7 @@
_SSH_AGENT = CommandPath('ssh-agent', '/usr/bin/ssh-agent')
_SSH_ADD = CommandPath('ssh-add', '/usr/bin/ssh-add')
_XEN_SSH_PROTOCOL = 'xen+ssh'
+_VMWARE_PROTOCOL = 'vpx'
_SSH_AUTH_RE = '(SSH_AUTH_SOCK)=([^;]+).*;\nSSH_AGENT_PID=(\d+)'
_OVF_RESOURCE_CPU = 3
_OVF_RESOURCE_MEMORY = 4
@@ -155,8 +156,10 @@
def convert_external_vm(uri, username, password, vminfo, job_id, irs):
if uri.startswith(_XEN_SSH_PROTOCOL):
command = XenCommand(uri, vminfo, job_id, irs)
- else:
+ elif uri.startswith(_VMWARE_PROTOCOL):
command = LibvirtCommand(uri, username, password, vminfo, job_id, irs)
+ else:
+ command = KVMCommand(uri, username, password, vminfo, job_id, irs)
job = ImportVm(job_id, command)
job.start()
_add_job(job_id, job)
@@ -347,6 +350,8 @@
self._irs = irs
self._prepared_volumes = []
+ self._passwd_file = os.path.join(_V2V_DIR, "%s.tmp" % vmid)
+
def execute(self):
raise NotImplementedError("Subclass must implement this")
@@ -427,6 +432,22 @@
env['VIRTIO_WIN'] = self._vminfo['virtio_iso_path']
return env
+ @contextmanager
+ def _password_file(self):
+ fd = os.open(self._passwd_file, os.O_WRONLY | os.O_CREAT, 0o600)
+ try:
+ os.write(fd, self._password.value)
+ finally:
+ os.close(fd)
+ try:
+ yield
+ finally:
+ try:
+ os.remove(self._passwd_file)
+ except Exception:
+ logging.exception("Job %r error removing passwd file: %s",
+ self._vmid, self._passwd_file)
+
class LibvirtCommand(V2VCommand):
def __init__(self, uri, username, password, vminfo, vmid, irs):
@@ -434,8 +455,6 @@
self._uri = uri
self._username = username
self._password = password
-
- self._passwd_file = os.path.join(_V2V_DIR, "%s.tmp" % vmid)
def _command(self):
cmd = [_VIRT_V2V.cmd,
@@ -461,22 +480,6 @@
def execute(self):
with self._volumes(), self._password_file():
yield self._start_virt_v2v()
-
- @contextmanager
- def _password_file(self):
- fd = os.open(self._passwd_file, os.O_WRONLY | os.O_CREAT, 0o600)
- try:
- os.write(fd, self._password.value)
- finally:
- os.close(fd)
- try:
- yield
- finally:
- try:
- os.remove(self._passwd_file)
- except Exception:
- logging.exception("Job %r error removing passwd file: %s",
- self._vmid, self._passwd_file)
class OvaCommand(V2VCommand):
@@ -551,6 +554,51 @@
return env
+class KVMCommand(V2VCommand):
+ def __init__(self, uri, username, password, vminfo, vmid, irs):
+ super(KVMCommand, self).__init__(vminfo, vmid, irs)
+ self._uri = uri
+ self._username = username
+ self._password = password
+
+ def _command(self):
+ cmd = [EXT_KVM_2_OVIRT,
+ '--uri', self._uri,
+ '--username', self._username,
+ '--password-file', self._passwd_file,
+ '--source', self._source_images(),
+ '--dest', self._dest_images()]
+ return cmd
+
+ @contextmanager
+ def execute(self):
+ with self._volumes(), self._password_file():
+ yield self._start_virt_v2v()
+
+ def _source_images(self):
+ con = libvirtconnection.open_connection(uri=self._uri,
+ username=self._username,
+ passwd=self._password)
+
+ with closing(con):
+ vm = con.lookupByName(self._vminfo['vmName'])
+ if vm:
+ params = {}
+ root = ET.fromstring(vm.XMLDesc(0))
+ _add_disks(root, params)
+ ret = []
+ for disk in params['disks']:
+ if 'alias' in disk:
+ ret.append(disk['alias'])
+ return ' '.join(ret)
+
+ def _dest_images(self):
+ ret = []
+ for vol in self._prepared_volumes:
+ ret.append(vol['path'])
+ return ' '.join(ret)
+
+
class ImportVm(object):
TERM_DELAY = 30
PROC_WAIT_TIMEOUT = 30
--
To view, visit https://gerrit.ovirt.org/56459
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ddbab700f2e0c54d53ed02ec61477b92c9c7960
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Shahar Havivi <shavivi at redhat.com>
More information about the vdsm-patches
mailing list