Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2016
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.22 KB | None | 0 0
  1. #!/usr/bin/env python
  2. """
  3. Written by Dann Bohn
  4. Github: https://github.com/whereismyjetpack
  5. Email: dannbohn@gmail.com
  6.  
  7. Clone a VM from template example
  8. """
  9. from pyVmomi import vim
  10. from pyVim.connect import SmartConnect, Disconnect
  11. import atexit
  12. import argparse
  13. import getpass
  14. import requests
  15.  
  16. import ssl
  17. context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
  18. context.verify_mode = ssl.CERT_NONE
  19.  
  20.  
  21. def get_args():
  22.     """ Get arguments from CLI """
  23.     parser = argparse.ArgumentParser(
  24.         description='Arguments for talking to vCenter')
  25.  
  26.     parser.add_argument('-s', '--host',
  27.                         required=True,
  28.                         action='store',
  29.                         help='vSpehre service to connect to')
  30.  
  31.     parser.add_argument('-o', '--port',
  32.                         type=int,
  33.                         default=443,
  34.                         action='store',
  35.                         help='Port to connect on')
  36.  
  37.     parser.add_argument('-u', '--user',
  38.                         required=True,
  39.                         action='store',
  40.                         help='Username to use')
  41.  
  42.     parser.add_argument('-p', '--password',
  43.                         required=False,
  44.                         action='store',
  45.                         help='Password to use')
  46.  
  47.     parser.add_argument('-v', '--vm-name',
  48.                         required=True,
  49.                         action='store',
  50.                         help='Name of the VM you wish to make')
  51.  
  52.     parser.add_argument('--template',
  53.                         required=True,
  54.                         action='store',
  55.                         help='Name of the template/VM \
  56.                            you are cloning from')
  57.  
  58.     parser.add_argument('--datacenter-name',
  59.                         required=False,
  60.                         action='store',
  61.                         default=None,
  62.                         help='Name of the Datacenter you\
  63.                            wish to use. If omitted, the first\
  64.                            datacenter will be used.')
  65.  
  66.     parser.add_argument('--vm-folder',
  67.                         required=False,
  68.                         action='store',
  69.                         default=None,
  70.                         help='Name of the VMFolder you wish\
  71.                            the VM to be dumped in. If left blank\
  72.                            The datacenter VM folder will be used')
  73.  
  74.     parser.add_argument('--datastore-name',
  75.                         required=False,
  76.                         action='store',
  77.                         default=None,
  78.                         help='Datastore you wish the VM to end up on\
  79.                            If left blank, VM will be put on the same \
  80.                            datastore as the template')
  81.  
  82.     parser.add_argument('--cluster-name',
  83.                         required=False,
  84.                         action='store',
  85.                         default=None,
  86.                         help='Name of the cluster you wish the VM to\
  87.                            end up on. If left blank the first cluster found\
  88.                            will be used')
  89.  
  90.     parser.add_argument('--resource-pool',
  91.                         required=False,
  92.                         action='store',
  93.                         default=None,
  94.                         help='Resource Pool to use. If left blank the first\
  95.                            resource pool found will be used')
  96.  
  97.     parser.add_argument('--power-on',
  98.                         dest='power_on',
  99.                         required=False,
  100.                         action='store_true',
  101.                         help='power on the VM after creation')
  102.  
  103.     parser.add_argument('--no-power-on',
  104.                         dest='power_on',
  105.                         required=False,
  106.                         action='store_false',
  107.                         help='do not power on the VM after creation')
  108.  
  109.     parser.set_defaults(power_on=True)
  110.  
  111.     args = parser.parse_args()
  112.  
  113.     if not args.password:
  114.         args.password = getpass.getpass(
  115.             prompt='Enter password')
  116.  
  117.     return args
  118.  
  119.  
  120. def wait_for_task(task):
  121.     """ wait for a vCenter task to finish """
  122.     task_done = False
  123.     while not task_done:
  124.         if task.info.state == 'success':
  125.             return task.info.result
  126.  
  127.         if task.info.state == 'error':
  128.             print "there was an error"
  129.             task_done = True
  130.  
  131.  
  132. def get_obj(content, vimtype, name):
  133.     """
  134.    Return an object by name, if name is None the
  135.    first found object is returned
  136.    """
  137.     obj = None
  138.     container = content.viewManager.CreateContainerView(
  139.         content.rootFolder, vimtype, True)
  140.     for c in container.view:
  141.         if name:
  142.             if c.name == name:
  143.                 obj = c
  144.                 break
  145.         else:
  146.             obj = c
  147.             break
  148.  
  149.     return obj
  150.  
  151.  
  152. def clone_vm(
  153.         content, template, vm_name, si,
  154.         datacenter_name, vm_folder, datastore_name,
  155.         cluster_name, resource_pool, power_on):
  156.     """
  157.    Clone a VM from a template/VM, datacenter_name, vm_folder, datastore_name
  158.    cluster_name, resource_pool, and power_on are all optional.
  159.    """
  160.  
  161.     # if none git the first one
  162.     datacenter = get_obj(content, [vim.Datacenter], datacenter_name)
  163.  
  164.     if vm_folder:
  165.         destfolder = get_obj(content, [vim.Folder], vm_folder)
  166.     else:
  167.         destfolder = datacenter.vmFolder
  168.  
  169.     if datastore_name:
  170.         datastore = get_obj(content, [vim.Datastore], datastore_name)
  171.     else:
  172.         datastore = get_obj(
  173.             content, [vim.Datastore], template.datastore[0].info.name)
  174.  
  175.     # if None, get the first one
  176.     cluster = get_obj(content, [vim.ClusterComputeResource], cluster_name)
  177.  
  178.     if resource_pool:
  179.         resource_pool = get_obj(content, [vim.ResourcePool], resource_pool)
  180.     else:
  181.         resource_pool = cluster.resourcePool
  182.  
  183.     # set relospec
  184.     relospec = vim.vm.RelocateSpec()
  185.     relospec.datastore = datastore
  186.     relospec.pool = resource_pool
  187.     relospec.diskMoveType = 'createNewChildDiskBacking'
  188.  
  189.     clonespec = vim.vm.CloneSpec(template = False,
  190.                                  location = relospec,
  191.                                  snapshot = vim.vm.snapshot.rootSnapshotList[0].snapshot)
  192.    
  193.     clonespec.location = relospec
  194.     clonespec.powerOn = power_on
  195.  
  196.     print "cloning VM..."
  197.     task = template.Clone(folder=destfolder, name=vm_name, spec=clonespec)
  198.     wait_for_task(task)
  199.  
  200.  
  201. def main():
  202.     """
  203.    Let this thing fly
  204.    """
  205.     args = get_args()
  206.  
  207.     # connect this thing
  208.     si = SmartConnect(
  209.         host=args.host,
  210.         user=args.user,
  211.         pwd='!Passw0rd',
  212.         port=args.port,
  213.         sslContext=context)
  214.     # disconnect this thing
  215.     atexit.register(Disconnect, si)
  216.  
  217.     content = si.RetrieveContent()
  218.     template = None
  219.  
  220.     template = get_obj(content, [vim.VirtualMachine], args.template)
  221.  
  222.     if template:
  223.         clone_vm(
  224.             content, template, args.vm_name, si,
  225.             args.datacenter_name, args.vm_folder,
  226.             args.datastore_name, args.cluster_name,
  227.             args.resource_pool, args.power_on)
  228.     else:
  229.         print "template not found"
  230.  
  231.  
  232. # start this thing
  233. if __name__ == "__main__":
  234.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement