log_info("List of hosts to BootStrap ".json_encode($hosts)); $logger->log_info("Run script for pdsh ".$rscript); $scpCmd = "scp -o StrictHostKeyChecking=no "; foreach ($hosts as $host) { $host = trim($host); $filesToCopy = array_merge ( array ($rscript, $repoFile), $gpgKeyFiles); /* Copy puppet run script to all nodes */ // Copy repo file to each node // Copy gpg keys to each node if (!empty($filesToCopy)) { $cmd = "$scpCmd -i $sshkey " . implode(" ", $filesToCopy) . " $user@$host:/tmp/ "; $logger->log_debug("Running scp command $cmd"); exec($cmd); } } $remoteRepoFilePath = trim("/tmp/" . basename(trim($repoFile))); $remoteGpgKeyPaths = ""; foreach ($gpgKeyFiles as $kFile) { $dFile = trim("/tmp/" . basename(trim($kFile))); if ($remoteGpgKeyPaths != "") { $remoteGpgKeyPaths .= ","; } $remoteGpgKeyPaths .= $dFile; } $rcmd = "/tmp/puppet_agent_install.sh --puppet-master=" . $master . " --repo-file=" . $remoteRepoFilePath . " --gpg-key-files=" . $remoteGpgKeyPaths; if ("true" == strtolower($usingLocalRepo)) { $rcmd .= " --using-local-repo "; } $logger->log_info("Running $rcmd to bootstrap each node"); runPdsh($clusterName, "bootstrapNodes", $user, $readFromFile, $rcmd); $result = parseAndUpdateNodeInfo ($clusterName, "bootstrapNodes", $logger); $logger->log_debug("Puppet agent install pdsh result: " . print_r($result, true)); $errNodes = array(); foreach ($result["allHosts"] as $hostInfo) { $errNodes[$hostInfo["hostName"]] = array ( "discoveryStatus" => $hostInfo["discoveryStatus"], "badHealthReason" => $hostInfo["badHealthReason"] ); } return $errNodes; } $clusterName = $argv[1]; $deployUser = $argv[2]; $rootTxnId = $argv[3]; $mySubTxnId = $argv[4]; $parentSubTxnId = $argv[5]; $readFromFile = $argv[6]; $hosts = readHostsFile($readFromFile); $hosts = convertToLowerCase($hosts); $totalHosts = count($hosts); $opStatus = "STARTED"; $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, $opStatus); if ($subTransactionReturnValue["result"] != 0 ) { $logger->log_error("Got error while updating subTxn: ".$subTransactionReturnValue["error"]); print json_encode($subTransactionReturnValue); return; } $sshkey = getSshKeyFilePath($clusterName); // $rscript = "/var/www/html/KickAssHDPUI/ShellScripts/puppet_agent_install.sh"; $rscript = realpath("../../ShellScripts/puppet_agent_install.sh"); $repository=array(); $configs = $dbAccessor->getServiceConfig($clusterName); if ($configs["result"] != 0) { $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, "TOTALFAILURE"); $logger->log_error("Got error when trying to retrieve configs from DB"); return; } $repoFile = $configs["properties"]["yum_repo_file"]; $usingLocalRepo = $configs["properties"]["using_local_repo"]; $gpgKeyLocations = getEnabledGpgKeyLocations($repoFile); if ($gpgKeyLocations === FALSE) { $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, "TOTALFAILURE"); $logger->log_error("Got error when trying to parse yum repo config"); return; } $tmpDir = "/tmp/hmcDownloads-".time()."/"; $retVal = 0; $output = array(); exec("mkdir -p ".$tmpDir, $output, $retVal); if ($retVal != 0) { $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, "TOTALFAILURE"); $logger->log_error("Got error when trying to create tmp download dir" . ", dir=" . $tmpDir . ", output=" . print_r($output, true)); return; } $gpgKeyFiles = array(); foreach ($gpgKeyLocations as $repoId => $gpgInfo) { if (!isset($gpgInfo["gpgkey"])) { continue; } $loc = $gpgInfo["gpgkey"]; $logger->log_info("Fetching gpg key for $repoId from location $loc"); $info = parse_url($loc); if ($info === FALSE || !isset($info["path"])) { $logger->log_error("Skipping invalid url $loc"); continue; } $fileName = basename($info["path"]); $destFilePath = $tmpDir . "/" . $fileName; $fetchCurlCmd = "curl --connect-timeout 30 --fail -s -o " . $destFilePath . " " . $loc; $logger->log_info("Fetching gpg key for $repoId from location $loc using " . $fetchCurlCmd); $retVal = 0; $output = array(); exec($fetchCurlCmd, $output, $retVal); if ($retVal != 0) { $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, "TOTALFAILURE"); $logger->log_error("Error when trying to download gpg key using " . $fetchCurlCmd . ", output=" . print_r($output, true)); return; } array_push($gpgKeyFiles, $destFilePath); } $repository = array( "yumRepoFilePath" => $repoFile, "usingLocalRepo" => $usingLocalRepo, "gpgKeyFiles" => $gpgKeyFiles); $logger->log_debug("BootStrapping with puppet"); $boot_result = bootstrap($clusterName, $deployUser, $rscript, $sshkey, $repository); $logger->log_debug("Boot Result \n".print_r($boot_result, true)); $nodeFileOut = fopen($readFromFile, "w"); if ($nodeFileOut == FALSE) { $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, "TOTALFAILURE"); $logger->log_error("Got error while trying to rewrite hosts file"); return; } $updateHosts = array(); $failedHosts = 0; $successfulHosts = 0; foreach ($boot_result as $hostName => $hostInfo) { if ($hostInfo["discoveryStatus"] == "FAILED") { $updateHosts[$hostName] = $hostInfo; $failedHosts++; } else { $successfulHosts++; // write the nodename to the readFromFile file. fwrite($nodeFileOut, $hostName."\n"); } } fclose($nodeFileOut); $ret = $dbAccessor->updateHostDiscoveryStatus($clusterName, $updateHosts); if ($ret["result"] != 0) { $logger->log_error("Failed to update DB for hosts status, error=" . $ret["error"]); // TODO - handle failure? } $opStatus = "SUCCESS"; if ($totalHosts > 0) { if ($successfulHosts == 0) { $opStatus = "TOTALFAILURE"; } else if ($failedHosts > 0) { $opStatus = "FAILED"; } } $subTransactionReturnValue = $dbAccessor->updateSubTransactionOpStatus($clusterName, $parentSubTxnId, $mySubTxnId, $opStatus); if ($subTransactionReturnValue["result"] != 0 ) { $logger->log_error("Got error while updating subTxn: ".$subTransactionReturnValue["error"]); print json_encode($subTransactionReturnValue); return; } $logger->log_info("Completed bootstrapping puppet agents, opStatus=" . $opStatus); ?>