summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEthan Lynn <ethanlynnl@vmware.com>2019-02-28 15:21:12 +0800
committerEthan Lynn <ethanlynnl@vmware.com>2019-03-01 11:31:33 +0800
commit47c6a606d9a518d89911ddb84e414230cc342fae (patch)
treefc141c39be30225be8b504a03488cbe2c2001c3b
parent112dd7070ba925e4cc80191aac86e33696aea5ef (diff)
Init patch for vsphere plugin
Add vsphere support. Change-Id: I99e4c7f084af9909735d55786e8771996bfc4149 Issue-ID: MULTICLOUD-488 Signed-off-by: Ethan Lynn <ethanlynnl@vmware.com>
-rw-r--r--vio/requirements.txt4
-rw-r--r--vio/vio/vsphere/__init__.py0
-rw-r--r--vio/vio/vsphere/utils.py94
3 files changed, 98 insertions, 0 deletions
diff --git a/vio/requirements.txt b/vio/requirements.txt
index c972b0c..b76f9c3 100644
--- a/vio/requirements.txt
+++ b/vio/requirements.txt
@@ -37,3 +37,7 @@ oslo.config>=4.11.0
oslo.service>=1.25.0
eventlet>=0.20.0
PyYAML>=3.1.0
+
+pyvmomi
+pyvim
+fire
diff --git a/vio/vio/vsphere/__init__.py b/vio/vio/vsphere/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vio/vio/vsphere/__init__.py
diff --git a/vio/vio/vsphere/utils.py b/vio/vio/vsphere/utils.py
new file mode 100644
index 0000000..8d2a648
--- /dev/null
+++ b/vio/vio/vsphere/utils.py
@@ -0,0 +1,94 @@
+from pyVim import connect
+from pyVmomi import vim
+
+import os
+# import json
+import yaml
+
+vcontent = None
+
+
+def get_obj(content, vimtype, name):
+ """
+ Return an object by name, if name is None the
+ first found object is returned
+ """
+ obj = None
+ container = content.viewManager.CreateContainerView(
+ content.rootFolder, vimtype, True)
+ for c in container.view:
+ if name:
+ if c.name == name:
+ obj = c
+ break
+ else:
+ obj = c
+ break
+
+ return obj
+
+
+def get_objs(content, vimtype):
+ """
+ Get all the vsphere objects associated with a given type
+ """
+ obj = {}
+ container = content.viewManager.CreateContainerView(
+ content.rootFolder, vimtype, True)
+ for c in container.view:
+ obj.update({c: c.name})
+ return obj
+
+
+def wait_for_task(task):
+ """ wait for a vCenter task to finish """
+ task_done = False
+ while not task_done:
+ if task.info.state == 'success':
+ return task.info.result
+
+ if task.info.state == 'error':
+ print("there was an error")
+ task_done = True
+
+
+def GetClient():
+ global vcontent
+ if vcontent is not None:
+ return vcontent
+ vsphere_conf_path = os.getenv("VSPHERE_CONF", "/opt/etc/vsphere.yml")
+ vsphere_conf = yaml.load(open(vsphere_conf_path, "r"))['vsphere']
+ # vsphere_conf = json.load(open(vsphere_conf_path, "r"))['vsphere']
+ host = vsphere_conf['host']
+ username = vsphere_conf['username']
+ password = vsphere_conf['password']
+ insecure = vsphere_conf.get("insecure", True)
+ if insecure:
+ service_instance = connect.SmartConnectNoSSL(
+ host=host, user=username, pwd=password)
+ else:
+ service_instance = connect.SmartConnect(
+ host=host, user=username, pwd=password, port=443)
+ vcontent = service_instance.RetrieveContent()
+ return vcontent
+
+
+def CloneVM(src, dst, power_on=False, wait=True):
+ assert src != dst
+ vcontent = GetClient()
+ vm = get_obj(vcontent, [vim.VirtualMachine], src)
+ print("src vm:", vm)
+ relospec = vim.vm.RelocateSpec(pool=vm.resourcePool)
+ clonespec = vim.vm.CloneSpec(location=relospec)
+ clonespec.powerOn = power_on
+ task = vm.Clone(name=dst, folder=vm.parent, spec=clonespec)
+ print("clone task:", task)
+ if wait:
+ print("wait for task:", task)
+ result = wait_for_task(task)
+ print("task result:", result)
+ return task
+
+
+def DeployOVA(src, datacenter, resource_pool, datastore):
+ pass