blob: ff2962f3fe37c84aabac634db6d389923c203831 [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';
$dbPath = $GLOBALS["DB_PATH"];
header("Content-type: application/json");
$logger = new HMCLogger("FetchClusterServices");
$dbAccessor = new HMCDBAccessor($dbPath);
$clusterName = $_GET['clusterName'];
if (isset($_GET['getComponents'])) {
$getComponents = $_GET['getComponents'];
} else {
$getComponents = "false";
}
if (isset($_GET['getConfigs'])) {
$getConfigs = $_GET['getConfigs'];
} else {
$getConfigs = "false";
}
if (isset($_GET['serviceName'])) {
$forService = $_GET['serviceName'];
} else {
$forService = "all";
}
function getAllComponentsForService ($serviceName)
{
global $logger, $dbAccessor, $clusterName;
$logger->log_debug("Get all the service components for service $serviceName");
$returnComponentsArray = array();
// populate all components for the services
// includes the isMaster information
$componentResult = $dbAccessor->getAllServiceComponents($serviceName);
if ($componentResult["result"] == 0) {
foreach($componentResult["components"] as $componentName => $component) {
$hostsForComponentDBResult = $dbAccessor->getHostsForComponent($clusterName, $componentName);
if ($hostsForComponentDBResult["result"] != 0 ) {
$logger->log_error("Got error while getting hosts for component ".$hostsForComponentDBResult["error"]);
print json_encode($hostsForComponentDBResult);
return;
}
$allHosts = array_keys($hostsForComponentDBResult["hosts"]);
$component["hostNames"] = $allHosts;
array_push($returnComponentsArray, $component);
}
} else {
$gotError = "Error while getting component info: " . $componentResult["error"];
$logger->log_error($gotError);
print (json_encode( array("result" => 1, "error" => $gotError)));
}
return $returnComponentsArray;
}
/* The Main Event. */
$services = array();
$allServicesInfo = $dbAccessor->getAllServicesList();
if( $allServicesInfo['result'] == 0 ) {
/* This needs to be retrieved once at the beginning for repeatedly passing
* in to getRecursiveServiceDependency() below.
*/
$allServiceDependencies = $dbAccessor->getAllServiceDependencies();
if( $allServiceDependencies['result'] == 0 ) {
$clusterServicesInfo = $dbAccessor->getAllServicesInfo($clusterName);
if( $clusterServicesInfo['result'] == 0 ) {
/* Loop through the static catalog of services. */
foreach( $allServicesInfo['services'] as $serviceName => $serviceInfo ) {
/* Initialize each entry in $services with that from the static
* services catalog.
*/
if (($forService !== "all") && ($serviceName !== $forService)) {
continue;
}
$services[$serviceName] = $serviceInfo;
/* Next, augment the entry for $serviceName with the dependency list. */
$services[$serviceName]['dependencies'] =
$dbAccessor->getRecursiveServiceDependency
( $allServiceDependencies['serviceDependencies'], $serviceName );
/* Next, augment the entry for $serviceName with the dependents list. */
$services[$serviceName]['dependents'] =
$dbAccessor->getRecursiveServiceDependents
( $allServiceDependencies['serviceDependencies'], $serviceName );
/* Finally, if $serviceName has an entry in $clusterServicesInfo (which
* means $serviceName has been selected for $clusterName), tack on some
* additional install-specific data.
*/
if( isset($clusterServicesInfo['services'][$serviceName]) ) {
$services[$serviceName]['state'] = $clusterServicesInfo['services'][$serviceName]['state'];
$services[$serviceName]['desiredState'] = $clusterServicesInfo['services'][$serviceName]['desiredState'];
$services[$serviceName]['isEnabled'] = $clusterServicesInfo['services'][$serviceName]['isEnabled'];
if ($getComponents == "true") {
$services[$serviceName]["components"] = getAllComponentsForService($serviceName);
}
}
}
} else {
$gotError = "Error while getting cluster services info: " . $clusterServicesInfo['error'] ;
$logger->log_error($gotError);
print (json_encode( array("result" => 1, "error" => $gotError)));
return;
}
} else {
$gotError = "Error while getting all service dependencies: " . $allServiceDependencies['error'] ;
$logger->log_error($gotError);
print (json_encode( array("result" => 1, "error" => $gotError)));
return;
}
} else {
$gotError = "Error while getting all services info: " . $allServicesInfo['error'] ;
$logger->log_error($gotError);
print (json_encode( array("result" => 1, "error" => $gotError)));
return;
}
if ($getConfigs == "true") {
// populating the properties for the services.
$staticConfigProps = $dbAccessor->getConfigPropertiesMetaInfo();
if ($staticConfigProps["result"] != 0) {
$logger->log_error("Failed to get config properties");
return;
} else { // success case we found the meta info
$dynamicConfigTableResult = $dbAccessor->getServiceConfig($clusterName);
if ($dynamicConfigTableResult["result"] != 0) {
print ("Error in getting configured properties for services"
.$dynamicConfigTableResult["error"]);
return;
} else { // success case we found the configured properties.
$dynamicConfigTable = $dynamicConfigTableResult["properties"];
foreach ($staticConfigProps["configs"] as $key => $propInfo) {
$serviceName = $propInfo["serviceName"];
// if service specific config needs to be passed back,
// bypass all other services.
if (($forService !== "all") && ($forService !== $serviceName)) {
continue;
}
/*
$logger->log_debug("Service static config $serviceName keys ".
json_encode($key));
*/
if (!array_key_exists("properties", $services[$serviceName])) {
$services[$serviceName]["properties"] = array();
}
if (isset($dynamicConfigTable[$key])) {
$value = $dynamicConfigTable[$key];
// $logger->log_debug("$value from service config for $key");
} else {
$value = $propInfo["value"];
}
$services[$serviceName]["properties"][$key] = array(
"displayName" => $propInfo["displayName"],
"description" => $propInfo["description"],
"type" => $propInfo["displayType"],
"unit" => (isset($propInfo["displayAttributes"]["unit"]) ? $propInfo["displayAttributes"]["unit"] : null),
"value" => $value,
"displayAttributes" => $propInfo["displayAttributes"]
);
}
}
}
}
$result = 0;
$error = "";
/* Create the output data... */
$jsonOutput = array(
'result' => $result,
'error' => $error,
'response' => array(
'clusterName' => $clusterName,
'managerHostName' => strtolower(exec('hostname -f')),
'services' => $services )
);
/* ...and spit it out. */
print (json_encode($jsonOutput));
?>