Ejemplo n.º 1
0
def soap_login(options):
    run_delay(options)

    if "--ssl" in options or "--ssl-secure" in options or "--ssl-insecure" in options:
        if "--ssl-insecure" in options:
            import ssl
            import urllib3
            if hasattr(ssl, '_create_unverified_context'):
                ssl._create_default_https_context = ssl._create_unverified_context
            urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
            verify = False
        else:
            verify = True
        url = "https://"
    else:
        verify = False
        url = "http://"

    url += options["--ip"] + ":" + str(options["--ipport"]) + "/sdk"

    tmp_dir = tempfile.mkdtemp()
    tempfile.tempdir = tmp_dir
    atexit.register(remove_tmp_dir, tmp_dir)

    try:
        headers = {
            "Content-Type": "text/xml;charset=UTF-8",
            "SOAPAction": "vim25"
        }
        login_timeout = int(options["--login-timeout"]) or 60
        conn = Client(url + "/vimService.wsdl",
                      location=url,
                      transport=RequestsTransport(verify=verify),
                      headers=headers,
                      timeout=login_timeout)

        mo_ServiceInstance = Property('ServiceInstance')
        mo_ServiceInstance._type = 'ServiceInstance'
        ServiceContent = conn.service.RetrieveServiceContent(
            mo_ServiceInstance)
        mo_SessionManager = Property(ServiceContent.sessionManager.value)
        mo_SessionManager._type = 'SessionManager'

        conn.service.Login(mo_SessionManager, options["--username"],
                           options["--password"])
    except requests.exceptions.SSLError as ex:
        fail_usage("Server side certificate verification failed: %s" % ex)
    except Exception as e:
        logging.error("Server side certificate verification failed: {}".format(
            str(e)))
        fail(EC_LOGIN_DENIED)

    options["ServiceContent"] = ServiceContent
    options["mo_SessionManager"] = mo_SessionManager
    return conn
Ejemplo n.º 2
0
    def connect(self, timeout=1800):
        from .client import Client
        from .transport import HttpAuthenticated
        if self.connected:
            return

        self.client = Client(self.server, timeout=timeout)
        transport = HttpAuthenticated(proxy=self.proxy,
                                      certfile=self.certfile,
                                      keyfile=self.keyfile)
        self.client.client.set_options(transport=transport)
        # create the Service Instance managed object
        ref = Property('ServiceInstance')
        ref._type = 'ServiceInstance'
        self.service_instance = ServiceInstance(self,
                                                name='ServiceInstance',
                                                ref=ref)

        # get the service content
        self.service_content = self.service_instance.RetrieveServiceContent()
        self.property_collector = self.service_content.propertyCollector
        self.session_manager = self.service_content.sessionManager

        self.root = self.service_content.rootFolder
        self.connected = True
Ejemplo n.º 3
0
def soap_login(options):
    run_delay(options)

    if "--ssl" in options or "--ssl-secure" in options or "--ssl-insecure" in options:
        if "--ssl-insecure" in options:
            from requests.packages.urllib3.exceptions import InsecureRequestWarning
            requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
            verify = False
        else:
            verify = True
        url = "https://"
    else:
        verify = False
        url = "http://"

    url += options["--ip"] + ":" + str(options["--ipport"]) + "/sdk"

    tmp_dir = tempfile.mkdtemp()
    tempfile.tempdir = tmp_dir
    atexit.register(remove_tmp_dir, tmp_dir)

    try:
        headers = {"Content-Type": "text/xml;charset=UTF-8", "SOAPAction": ""}
        conn = Client(url + "/vimService.wsdl",
                      location=url,
                      transport=RequestsTransport(verify=verify),
                      headers=headers)

        mo_ServiceInstance = Property('ServiceInstance')
        mo_ServiceInstance._type = 'ServiceInstance'
        ServiceContent = conn.service.RetrieveServiceContent(
            mo_ServiceInstance)
        mo_SessionManager = Property(ServiceContent.sessionManager.value)
        mo_SessionManager._type = 'SessionManager'

        conn.service.Login(mo_SessionManager, options["--username"],
                           options["--password"])
    except requests.exceptions.SSLError as ex:
        fail_usage("Server side certificate verification failed")
    except Exception:
        fail(EC_LOGIN_DENIED)

    options["ServiceContent"] = ServiceContent
    options["mo_SessionManager"] = mo_SessionManager
    return conn
Ejemplo n.º 4
0
 def _build_property(property_name, value=None):
     """
     Create a property object with given name and value
     """
     new_property = Property(property_name)
     new_property._type = property_name
     if value is not None:
         new_property.value = value
     return new_property
Ejemplo n.º 5
0
 def get_mor(mor_type):
     '''
     Fetch the VIM Managed Object Reference
     :param mor_type: The type of the object
     :return:
     '''
     mor = Property(mor_type)
     mor._type = mor_type
     return mor
Ejemplo n.º 6
0
def soap_login(options):
    run_delay(options)

    if options.has_key("--ssl") or options.has_key(
            "--ssl-secure") or options.has_key("--ssl-insecure"):
        if options.has_key("--ssl-insecure"):
            verify = False
        else:
            verify = True
        url = "https://"
    else:
        verify = False
        url = "http://"

    url += options["--ip"] + ":" + str(options["--ipport"]) + "/sdk"

    tmp_dir = tempfile.mkdtemp()
    tempfile.tempdir = tmp_dir
    atexit.register(remove_tmp_dir, tmp_dir)

    try:
        headers = {"Content-Type": "text/xml;charset=UTF-8", "SOAPAction": ""}
        conn = Client(url + "/vimService.wsdl",
                      location=url,
                      transport=RequestsTransport(verify=verify),
                      headers=headers)

        mo_ServiceInstance = Property('ServiceInstance')
        mo_ServiceInstance._type = 'ServiceInstance'
        ServiceContent = conn.service.RetrieveServiceContent(
            mo_ServiceInstance)
        mo_SessionManager = Property(ServiceContent.sessionManager.value)
        mo_SessionManager._type = 'SessionManager'

        conn.service.Login(mo_SessionManager, options["--username"],
                           options["--password"])
    except requests.exceptions.SSLError, ex:
        fail_usage("Server side certificate verification failed")
Ejemplo n.º 7
0
def set_power_status(conn, options):
    mo_SearchIndex = Property(options["ServiceContent"].searchIndex.value)
    mo_SearchIndex._type = "SearchIndex"
    vm = conn.service.FindByUuid(mo_SearchIndex,
                                 vmSearch=1,
                                 uuid=options["--uuid"])

    mo_machine = Property(vm.value)
    mo_machine._type = "VirtualMachine"

    try:
        if options["--action"] == "on":
            conn.service.PowerOnVM_Task(mo_machine)
        else:
            conn.service.PowerOffVM_Task(mo_machine)
    except suds.WebFault as ex:
        if (str(ex).find("Permission to perform this operation was denied")
            ) >= 0:
            fail(EC_INVALID_PRIVILEGES)
        else:
            if options["--action"] == "on":
                fail(EC_WAITING_ON)
            else:
                fail(EC_WAITING_OFF)
Ejemplo n.º 8
0
 def connect(self):
     from .client import SmsClient
     from suds.sax.element import Element
     self.client = SmsClient("{0}:8443".format(self._vim.server_fqdn))
     session = eval(
         list(self._vim.client.client.options.transport.cookiejar)[0].value)
     cookie = Element("vcSessionCookie")
     cookie.setText(session)
     self.client.wsdl.options.__pts__.set("soapheaders", cookie)
     ref = Property('ServiceInstance')
     ref._type = 'ServiceInstance'
     self.service_instance = SmsServiceInstance(self,
                                                name='ServiceInstance',
                                                ref=ref)
     self.connected = True
Ejemplo n.º 9
0
def get_power_status(conn, options):
    mo_ViewManager = Property(options["ServiceContent"].viewManager.value)
    mo_ViewManager._type = "ViewManager"

    mo_RootFolder = Property(options["ServiceContent"].rootFolder.value)
    mo_RootFolder._type = "Folder"

    mo_PropertyCollector = Property(
        options["ServiceContent"].propertyCollector.value)
    mo_PropertyCollector._type = 'PropertyCollector'

    ContainerView = conn.service.CreateContainerView(mo_ViewManager,
                                                     recursive=1,
                                                     container=mo_RootFolder,
                                                     type=['VirtualMachine'])
    mo_ContainerView = Property(ContainerView.value)
    mo_ContainerView._type = "ContainerView"

    FolderTraversalSpec = conn.factory.create('ns0:TraversalSpec')
    FolderTraversalSpec.name = "traverseEntities"
    FolderTraversalSpec.path = "view"
    FolderTraversalSpec.skip = False
    FolderTraversalSpec.type = "ContainerView"

    objSpec = conn.factory.create('ns0:ObjectSpec')
    objSpec.obj = mo_ContainerView
    objSpec.selectSet = [FolderTraversalSpec]
    objSpec.skip = True

    propSpec = conn.factory.create('ns0:PropertySpec')
    propSpec.all = False
    propSpec.pathSet = ["name", "summary.runtime.powerState", "config.uuid"]
    propSpec.type = "VirtualMachine"

    propFilterSpec = conn.factory.create('ns0:PropertyFilterSpec')
    propFilterSpec.propSet = [propSpec]
    propFilterSpec.objectSet = [objSpec]

    try:
        raw_machines = conn.service.RetrievePropertiesEx(
            mo_PropertyCollector, propFilterSpec)
    except Exception as e:
        logging.error("Failed: {}".format(str(e)))
        fail(EC_STATUS)

    (machines, uuid, mappingToUUID) = process_results(raw_machines, {}, {}, {})

    # Probably need to loop over the ContinueRetreive if there are more results after 1 iteration.
    while hasattr(raw_machines, 'token'):
        try:
            raw_machines = conn.service.ContinueRetrievePropertiesEx(
                mo_PropertyCollector, raw_machines.token)
        except Exception as e:
            logging.error("Failed: {}".format(str(e)))
            fail(EC_STATUS)
        (more_machines, more_uuid,
         more_mappingToUUID) = process_results(raw_machines, {}, {}, {})
        machines.update(more_machines)
        uuid.update(more_uuid)
        mappingToUUID.update(more_mappingToUUID)
        # Do not run unnecessary SOAP requests
        if "--uuid" in options and options["--uuid"] in uuid:
            break

    if ["list", "monitor"].count(options["--action"]) == 1:
        return machines
    else:
        if "--uuid" not in options:
            if options["--plug"].startswith('/'):
                ## Transform InventoryPath to UUID
                mo_SearchIndex = Property(
                    options["ServiceContent"].searchIndex.value)
                mo_SearchIndex._type = "SearchIndex"

                vm = conn.service.FindByInventoryPath(mo_SearchIndex,
                                                      options["--plug"])

                try:
                    options["--uuid"] = mappingToUUID[vm.value]
                except KeyError:
                    fail(EC_STATUS)
                except AttributeError:
                    fail(EC_STATUS)
            else:
                ## Name of virtual machine instead of path
                ## warning: if you have same names of machines this won't work correctly
                try:
                    (options["--uuid"], _) = machines[options["--plug"]]
                except KeyError:
                    fail(EC_STATUS)
                except AttributeError:
                    fail(EC_STATUS)

        try:
            if uuid[options["--uuid"]] == "poweredOn":
                return "on"
            else:
                return "off"
        except KeyError:
            fail(EC_STATUS)