blob: 1b4c2e7fb8c2dc77059a67740d890a78b7ddce1a [file] [log] [blame]
<?php
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
include_once '../util/Logger.php';
include_once '../conf/Config.inc';
include_once 'localDirs.php';
include_once "../util/lock.php";
include_once '../db/HMCDBAccessor.php';
include_once "../util/clusterState.php";
include_once '../util/selectNodes.php';
// include_once 'install_puppet.php';
$logger = new HMCLogger("InitializeCluster");
$dbAccessor = new HMCDBAccessor($GLOBALS["DB_PATH"]);
$selectNodes = new SelectNodes();
header("Content-type: application/json");
$clusterName = $_GET['clusterName'];
// Validate clusterId: TODO; FIXME
/////// only persist the yum repo stuff
$serviceConfigResult = $dbAccessor->getServiceConfig($clusterName);
if ($serviceConfigResult["result"] != 0) {
$logger->log_error("Failed to get service config ".json_encode($serviceConfigResult));
print (json_encode($serviceConfigResult));
return;
}
// We need to clean up prior instances for this cluster name
$dbAccessor->cleanupServices($clusterName);
$yumInfoArray = array("using_local_repo" => $serviceConfigResult['properties']['using_local_repo'],
"yum_repo_file" => $serviceConfigResult['properties']['yum_repo_file']
);
$dbResponse = $dbAccessor->updateServiceConfigs($clusterName, $yumInfoArray);
if ($dbResponse["result"] != 0) {
$logger->log_error("Got error while persisting configs: ".$dbResponse["error"]);
print (json_encode($dbResponse));
return;
}
////// done persisting
// Read from the input
$requestdata = file_get_contents('php://input');
$requestObj = json_decode($requestdata, true);
// Persist the services enabled stuff
$servicesCheckList = $requestObj["services"];
// create local copy for easy lookup
$tempLocalServicesCopy = array();
foreach($servicesCheckList as $serviceInfo) {
$tempLocalServicesCopy[$serviceInfo["serviceName"]] = array("isEnabled" => $serviceInfo["isEnabled"]);
}
$logger->log_debug("Temp local copy for services \n".json_encode($tempLocalServicesCopy));
$svcDepsListArr = $dbAccessor->getAllServiceDependencies();
if ($svcDepsListArr["result"] != 0) {
$logger->log_error("Got error while getting service dependencies: ".$svcDepsListArr["error"]);
print json_encode($svcDepsListArr);
return;
}
$svcDepsList = $svcDepsListArr["serviceDependencies"];
// generate full svc list based on dep tree
$localServicesCopy = array();
foreach ($tempLocalServicesCopy as $svcName => $svcInfo) {
if (!$svcInfo["isEnabled"]
&& !isset($localServicesCopy[$svcName])) {
$localServicesCopy[$svcName] = $svcInfo;
continue;
}
$localServicesCopy[$svcName] = array("isEnabled" => TRUE);
$svcDeps = $dbAccessor->getRecursiveServiceDependency(
$svcDepsList, $svcName);
if (is_array($svcDeps)) {
foreach ($svcDeps as $svcDep) {
$localServicesCopy[$svcDep] = array("isEnabled" => TRUE);
}
}
}
$servicesCheckList = array();
foreach ($localServicesCopy as $svcName => $svcInfo) {
$svcInfo["serviceName"] = $svcName;
array_push($servicesCheckList, $svcInfo);
}
$logger->log_debug("svc list".json_encode($servicesCheckList)."========");
$dbResponse = $dbAccessor->addServicesToCluster($clusterName, $servicesCheckList);
if ($dbResponse["result"] != 0) {
$logger->log_error("Got error while adding service: ".$dbResponse["error"]);
print json_encode($dbResponse);
return;
}
$jsonOutput["clusterName"] = $clusterName;
// Populate all hosts for the UI
$jsonOutput["allHosts"] = array();
/*
* FIXME need to get all hosts from select Nodes script
*/
$allHostsInfo = $dbAccessor->getAllHostsInfo($clusterName,
array("=" => array ( "discoveryStatus" => "SUCCESS")),
array(
array("sortColumn" => "totalMem", "sortOrder" => "DESC"),
array("sortColumn" => "cpuCount", "sortOrder" => "DESC"),
array("sortColumn" => "hostName", "sortOrder" => "ASC")
)
);
if ($allHostsInfo["result"] != 0 ) {
$logger->log_error("Got error while getting hostsInfo ".$allHostsInfo["error"]);
print json_encode($allHostsInfo);
return;
}
$logger->log_debug("HOSTS_INFO: ".json_encode($allHostsInfo["hosts"]));
foreach($allHostsInfo["hosts"] as $hostInfo) {
$logger->log_debug("HOST: ".json_encode($hostInfo));
array_push($jsonOutput["allHosts"], $hostInfo);
}
// bootstrap($jsonOutput["allHosts"], getSshKeyFilePath($clusterName));
$suggestedNodes = $selectNodes->selectNodes($clusterName,
$dbAccessor);
//////////////////// Populate service masters for the UI ///////////////////////////
$jsonOutput["services"] = array();
$allServicesArray = $dbAccessor->getAllServicesList();
if ($allServicesArray["result"] != 0 ) {
$logger->log_error("Got error while getting all services list ".$allServicesArray["error"]);
print json_encode($allServicesArray);
return;
}
$allServicesInfo = $dbAccessor->getAllServicesInfo($clusterName);
if ($allServicesInfo["result"] != 0 ) {
$logger->log_error("Got error while getting all services list ".$allServicesInfo["error"]);
print json_encode($allServicesInfo);
return;
}
foreach($allServicesArray["services"] as $service) {
$thisService = array();
$serviceName = $service["serviceName"];
$thisService["enabled"] = $allServicesInfo["services"][$serviceName]["isEnabled"];
$thisService["masters"] = array();
$allServiceComponents = $dbAccessor->getAllServiceComponents($serviceName);
if ($allServiceComponents["result"] != 0 ) {
$logger->log_error("Got error while getting all service compoenents:".$allServiceComponents["error"]);
print json_encode($allServiceComponents);
return;
}
foreach($allServiceComponents["components"] as $componentName => $component) {
if($component["isMaster"] == 0) {
continue;
}
$thisMaster = array();
$hosts = $suggestedNodes["mastersToHosts"][$componentName]["hostNames"];
$thisMaster["name"] = $component["componentName"];
$thisMaster["displayName"] = $component["displayName"];
$thisMaster["description"] = $component["description"];
$thisMaster["hostNames"] =
$hosts;
array_push($thisService["masters"], $thisMaster);
}
array_push($jsonOutput["services"], $thisService);
}
//////////////////// End of populate service masters for the UI ///////////////////////////
$jsonOutput['managerHostName'] = strtolower(exec('hostname -f'));
// Update the state of the cluster.
$result = 0;
$error = "";
$state = "CONFIGURATION_IN_PROGRESS";
$displayName = "Configuration in progress";
$context = array (
'stage' => "SELECT_SERVICES"
);
$retval = updateClusterState($clusterName, $state, $displayName, $context);
if ($retval['result'] != 0) {
$result = $retval['result'];
$error = $retval['error'];
}
print (json_encode(array("result" => $result, "error" => $error, "response" => $jsonOutput)));
?>