My question is hos to I use PHP / SOAP calls to enable Lockdown mode? The ESXi host is controlled via a vCenter Server and I'm able to connect to the system and perform other tasks.
Hers a quick snippet:
$soapmsg['this'] = new soapval('_this','SearchIndex','SearchIndex'); | |
$soapmsg['dnsName'] = "esxi1"; | |
$soapmsg['vmSearch'] = "false"; | |
// $result2 = $client->call('FindByIp',$soapmsg,$namespace); | |
$result2 = $client->call('FindByDnsName',$soapmsg,$namespace); |
This works fine. Just to test my code I run the following.
unset($soapmsg); | |
$soapmsg['this'] = new soapval('_this','HostSystem',$result2); |
$soapmsg['timeout'] = 10; |
$result3 = $client->call('ExitMaintenanceMode_Task',$soapmsg,$namespace);
-----------------
Now when I runs the next piece of code it fails.
$soapmsg['task'] = $result3; |
$result4 = $client->call('EnterLockdownMode',$soapmsg,$namespace)
-----------------
This is the error I receive when I execute the query.
host-78 <= This is good .. It found the ESXi host
----------
task-81060 <= This is good as well . It tried to take the ESXiout of Maintenance mode.
----------
Array
(
[faultcode] => ServerFaultCode
[faultstring] => Unable to resolve WSDL method name EnterLockdownMode for namespace name urn:vim25
while parsing SOAP body
at line 1, column 346
while parsing SOAP envelope
at line 1, column 43
while parsing HTTP request before method was determined
at line 1, column 0
[detail] => Array
(
[InvalidRequestFault] =>
)
)
-----
Has anyone had any luck with using the EnterLockdownMode method???
I was able to get this to work on my own...
If you want to connect to VMware vcenter server or ESXi hosts (5.x0 then do the following;
1 ) Download the NuSoap files sourceforge.
Here's a sample of how to connect and "do something:. You will have to use the SDK to create your own XML blocks of code to do what you want.
---------
// login example via serviceinstance
require_once('assets/lib/nusoap.php');
$wsdl = "https://$vcenter/sdk/vimService.wsdl";
# SOAP settings
ini_set("soap.wsdl_cache_enabled", "0");
# SOAP object
$client = new \SoapClient($wsdl,
array(
'trace'=> 1,
'exceptions' => 0,
'encoding' => 'UTF-8',
'location' => "https://$vcenter/sdk" ,
'passphrase' => ''
)
);
// --------------------------------------------------------------------- \\
$soapmsg['_this'] = new \soapvar('ServiceInstance', XSD_STRING,'ServiceInstance');
$result = $client->RetrieveServiceContent($soapmsg);
$service_instance = $result->returnval;
//print "<textarea cols=120 rows=20>";
// print_r($result);
//print "</textarea>";
// --------------------------------------------------------------------- \\
// Login to the vCenter Server
// --------------------------------------------------------------------- \\
$soapmsg1["_this"] = $service_instance->sessionManager;
$soapmsg1["userName"] = "$admin_username";
$soapmsg1["password"] = "$admin_password";
$result = $client->Login($soapmsg1);
if ( isset($result->faultstring) ) {
$err=$result->faultstring;
return ("Login Failed. " . $err );
};
$soap_session = $result->returnval;
//print "<textarea cols=120 rows=20>";
// print_r($soap_session);
//print "</textarea>";
// --------------------------------------------------------------------- \\
// Seacrh for and retirn the ESXi Host Object
// --------------------------------------------------------------------- \\
$soapmsg2["_this"] = $service_instance->searchIndex;
$soapmsg2["dnsName"]="$esxi_hostname";
$soapmsg2["vmSearch"]='0';
$result = $client->FindByDnsName($soapmsg2);
if ( isset($result->faultstring) ) {
$err=$result->faultstring;
return ("Search for Hostname Failed. " . $err );
};
$host_entity = $result->returnval;
// print "<textarea cols=120 rows=20>";
// print_r($host_entity);
// print "</textarea>";
// --------------------------------------------------------------------- \\
// Disable the lockdownMode
// --------------------------------------------------------------------- \\
$soapmsg3['_this'] = $host_entity;
$result = $client->ExitLockdownMode($soapmsg3);
if ( isset($result->faultstring) ) {
$err=$result->faultstring;
//return ("ExitLockDownMode Failed. " . $err );
};
//print "<textarea cols=120 rows=5>";
// print_r($result);
//print "</textarea>";
// --------------------------------------
That's it... for connecting to the vcenter server and executing a method.
Now if you want to do queries you have to add blocks of XML code. I did the following against the ESXi host. But I guess it should also work with the vcenter server.
----------------------------------
function get_path($client,$objectid,$type,$path)
{
$xml = "
<specSet>
<propSet>
<type>$type</type>
<pathSet>$path</pathSet>
</propSet>
<objectSet>
<obj type='$type'>".$objectid."</obj>
</objectSet>
</specSet>";
$soapmsg = NULL; // Reset the $soapmsg array..
$soapmsg["_this"] = array( "_" => 'propertyCollector', "type" => "PropertyCollector");
$soapmsg["specSet"] = new \SoapVar($xml,XSD_ANYXML);
return $client->RetrieveProperties($soapmsg);
}
$rtr=get_path($client,$service_instance->rootFolder->_ ,'Folder','childEntity');
$datacenter_ = $rtr->returnval->propSet->val->ManagedObjectReference->_; // This returns the DATACENTER NAME
$rtr=get_path($client,$datacenter_,'Datacenter','hostFolder');
$hostFolder_ = $rtr->returnval->propSet->val->_; // This returns the hostFolder that holds the CLUSTER NAME
$rtr=get_path($client,$hostFolder_,'Folder','childEntity');
$cluster_ = $rtr->returnval->propSet->val->ManagedObjectReference->_; // This returns CLUSTER NAME
--------------------------------------
It took me forever to find out how to connect to VMware using PHP. This information should be more readily available since PHP has been around for A-bazillion years.
Good luck!