public function rollbackAction() { $path = trim($this->getRequest("path", ""), "/"); $idc = $this->getRequest("idc", ""); $main_buss_id = $this->getRequest("main_buss_id", ""); $op_user = $this->userInfo["userName"]; // 1. parameter null if ($path === "" || $main_buss_id === "" || $idc === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter 'main_buss_id', 'path' or 'idc' is null!"); echo json_encode($res); return; } // 2. check node exist $path = "/" . $path; $node = NodeServ::getNodeByNodeWhole($path, $main_buss_id); if ($node === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "node({$path}) with main_buss_id({$main_buss_id}) not exist!"); echo json_encode($res); return; } $node_whole = $node["node_whole"]; //[USERPERM CHECK] $userperm_ret = UserPermServ::checkPerm($op_user, $node_whole); if ($userperm_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "Insufficient permission of {$op_user} on node {$node_whole}"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_USER_PERM_PERMISSION_DENIED); echo json_encode($res); return; } $main_buss_id = $node["main_buss_id"]; $sub_buss_id = $node["sub_buss_id"]; // 3. idc validation $cur_idcs = $node["idc"]; $check_res = self::idcValidation($idc, $cur_idcs); if ($check_res["errno"] != "0") { echo json_encode($check_res); return; } // 4. get snapshot content $snapshot_content = SnapShotUtil::getSnapShotContent($main_buss_id, $node_whole); if ($snapshot_content === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_MODULE_FAILED); QconfMgrLog::err(__FILE__, __LINE__, "failed to get snapshot by node_whole({$node_whole}), main_buss_id({$main_buss_id})"); echo json_encode($res); return; } // 5.rollback if (!array_key_exists($idc, $snapshot_content)) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_IDC_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "snapshot of node_whole({$node_whole}), main_buss_id({$main_buss_id}) do not exist on idc({$idc}) "); echo json_encode($res); return; } $result_idc = $snapshot_content[$idc]; if (!array_key_exists("conf", $result_idc) || !array_key_exists("serv", $result_idc)) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_FILE_ERROR); QconfMgrLog::err(__FILE__, __LINE__, "snapshot error of node_whole({$node_whole}), main_buss_id({$main_buss_id})"); echo json_encode($res); return; } $idc_host = ZkConf::getZkHost($idc); $zk_web = new QconfZkWebBase(Log::INFO); $zk_web->connect($idc_host); $result_conf = $result_idc["conf"]; foreach ($result_conf as $key => $value) { $set_ret = NodeController::setConfWithLink($zk_web, $key, $idc, $value); if ($set_ret != InfoDescUtil::QCONF_OK) { OpServ::insert(InfoDescUtil::OP_TYPE_MOD, $key, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); $res = InfoDescUtil::getErrorMsg($set_ret); QconfMgrLog::err(__FILE__, __LINE__, "replace node value by snapshot failed, node_whole({$node_whole}),\n main_buss_id({$main_buss_id})"); echo json_encode($res); return; } OpServ::insert(InfoDescUtil::OP_TYPE_MOD, $key, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, $value); } $result_serv = $result_idc["serv"]; foreach ($result_serv as $key => $hosts) { $current_serv_no_statu = array(); $snapshot_serv_no_statu = array_keys($hosts); $get_ret = ServiceController::getServicesWithLink($zk_web, $key, $idc, $current_serv_no_statu); if ($get_ret != InfoDescUtil::QCONF_OK) { $res = InfoDescUtil::getErrorMsg($get_ret); QconfMgrLog::err(__FILE__, __LINE__, "get service failed, key({$key})!"); echo json_encode($res); return; } $serv_to_add = array_diff($snapshot_serv_no_statu, $current_serv_no_statu); $serv_to_delete = array_diff($current_serv_no_statu, $snapshot_serv_no_statu); $serv_to_modify = array_intersect($snapshot_serv_no_statu, $current_serv_no_statu); foreach ($serv_to_add as $ser) { $show_ser_path = PathUtil::unionPath($key, $ser); $add_ret = ServiceController::addServiceWithLink($zk_web, $key, $ser, $idc, $hosts[$ser]); if ($add_ret != InfoDescUtil::QCONF_OK) { $res = InfoDescUtil::getErrorMsg($add_ret); OpServ::insert(InfoDescUtil::OP_TYPE_ADD, $show_ser_path, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); echo json_encode($res); return; } OpServ::insert(InfoDescUtil::OP_TYPE_ADD, $show_ser_path, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, ""); } foreach ($serv_to_modify as $ser) { $show_ser_path = PathUtil::unionPath($key, $ser); $snapshot_statu = $hosts[$ser]; if ($snapshot_statu === InfoDescUtil::SERV_STATUS_UP || $snapshot_statu === InfoDescUtil::SERV_STATUS_DOWN) { $modify_ret = ServiceController::upServiceWithLink($zk_web, $key, $ser, $idc); $modify_type = InfoDescUtil::OP_TYPE_UP; } else { if ($snapshot_statu === InfoDescUtil::SERV_STATUS_OFFLINE) { $modify_ret = ServiceController::offlineServiceWithLink($zk_web, $key, $ser, $idc); $modify_type = InfoDescUtil::OP_TYPE_OFFLINE; } else { QconfMgrLog::err(__FILE__, __LINE__, "service status is unknown, show_ser_path({$show_ser_path})!"); } } if ($modify_ret != InfoDescUtil::QCONF_OK) { $res = InfoDescUtil::getErrorMsg($modify_ret); OpServ::insert($modify_type, $show_ser_path, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); echo json_encode($res); return; } OpServ::insert($modify_type, $show_ser_path, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, ""); } foreach ($serv_to_delete as $ser) { $show_ser_path = PathUtil::unionPath($key, $ser); $delete_ret = ServiceController::deleteServiceWithLink($zk_web, $key, $ser, $idc); if ($delete_ret != InfoDescUtil::QCONF_OK) { $res = InfoDescUtil::getErrorMsg($delete_ret); OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $show_ser_path, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); echo json_encode($res); return; } OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $show_ser_path, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, ""); } } OpServ::insert(InfoDescUtil::OP_TYPE_SNAPSHOT_ROLLBACK, $node_whole, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, ""); $res = array("errno" => "0", "errmsg" => "", "data" => "rollback success"); $json = json_encode($res); echo $json; return; }
public function addServiceAction() { $node_id = $this->getRequest("node_id", ""); $idc = $this->getRequest("idc", ""); $service_name = $this->getRequest("service_name", ""); $op_user = $this->userInfo["userName"]; // 1. parameter is not right if ($node_id === "" || $idc === "" || $service_name === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter 'node_id', 'idc', 'service_name', is null!"); echo json_encode($res); return; } // 2. check node_id $node_row = NodeServ::getNode($node_id); if ($node_row === FALSE || count($node_row) === 0) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "'node_id : {$node_id} not exist!'"); echo json_encode($res); return; } $db_node_whole = $node_row["node_whole"]; //[USERPERM CHECK] $userperm_ret = UserPermServ::checkPerm($op_user, $db_node_whole); if ($userperm_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "Insufficient permission of {$op_user} on node {$db_node_whole}"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_USER_PERM_PERMISSION_DENIED); echo json_encode($res); return; } // 3. check node type code $node_type_code = $node_row["node_type_code"]; if ($node_type_code === InfoDescUtil::NODE_TYPE_NORMAL_FATHER) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_TYPE); QconfMgrLog::err(__FILE__, __LINE__, "node {$node_id} is not a normal father node!'"); echo json_encode($res); return; } else { if ($node_type_code === InfoDescUtil::NODE_TYPE_NORMAL) { //[SNAPSHOT CHECK] $main_buss_id = $node_row["main_buss_id"]; $snapshot_ret = SnapShotUtil::existSnapShotForNode($main_buss_id, $db_node_whole, $snapshot_path); if ($snapshot_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "snapshot operation failed"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_MODULE_FAILED); echo json_encode($res); return; } if ($snapshot_ret === InfoDescUtil::SNAPSHOT_FILE_EXIST) { QconfMgrLog::err(__FILE__, __LINE__, "snapshot existed on current node node_whole({$node_whole})"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SNAPSHOT_LOCKED_NODE); $res["errmsg"] .= ": {$snapshot_path}"; echo json_encode($res); return; } } } // 4. check idc exist $idc = trim($idc, ","); $idc_list = preg_split("/[,]+/", $idc); $failed_idcs = ""; foreach ($idc_list as $idc_each) { $idc_host = ZkConf::getZkHost($idc_each); if ($idc_host === NULL) { //idc does not exist $failed_idcs .= ",{$idc_each}"; } } if ($failed_idcs != "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_IDC_NOT_EXIST); $res["data"] .= trim($failed_idcs, ","); echo json_encode($res); return; } // 5. add add in zookeeper $failed_idcs = self::retryOperation($node_id, $idc_list, $service_name, $op_user, InfoDescUtil::OP_TYPE_BATCH_ADD_SERV); // 6. send result if (count($failed_idcs) === 0) { //success return $res = array("errno" => "0", "errmsg" => "", "data" => "add service success!"); $json = json_encode($res); echo $json; return; } else { //failed return $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BATCH_FAIL_EXIST); foreach ($failed_idcs as $fail_idc) { if ($res["data"] != "") { $res["data"] .= ","; } $res["data"] .= $fail_idc; } $json = json_encode($res); echo $json; return; } }
public function modMultiConfAction() { $node_array = $this->getRequest("node_array", ""); $main_buss_id = $this->getRequest("main_buss_id", ""); $sub_buss_id = $this->getRequest("sub_buss_id", ""); $op_user = $this->userInfo["userName"]; // 1. parameter is not right if ($node_array === "" || $idc === "" || $main_buss_id === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter 'idc'" . " 'node_array' 'main_buss_id' is null!"); echo json_encode($res); return; } $modify_nodes = json_decode($node_array); // 2. validation if ($modify_nodes === NULL || !is_array($modify_nodes)) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "node : node_array({$node_array}) format error!"); echo json_encode($res); return; } $checked_nodes = array(); foreach ($modify_nodes as $modify_node_info) { if (!is_array($modify_node_info)) { //TODO reutrn false } $cur_id = $modify_node_info["node_id"]; $cur_value = $modify_node_info["value"]; $cur_idc = $modify_node_info["idc"]; // check parameter null if ($cur_id === null || $cur_value === null || $cur_idc === null) { //TODO return false } //check node exist $cur_node = NodeServ::getNode($cur_id); if ($dbnode === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "node : {$cur_id} is not exist!"); echo json_encode($res); return; } //[USERPERM CHECK] $cur_node_whole = $cur_node["node_whole"]; $userperm_ret = UserPermServ::checkPerm($op_user, $cur_node_whole); if ($userperm_ret === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "Insufficient permission of {$op_user} on node {$cur_node_whole}"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_USER_PERM_PERMISSION_DENIED); echo json_encode($res); return; } // check idc $idc_host = ZkConf::getZkHost($cur_idc); if ($idc_host === NULL) { //TODO return false } // pass validation $item = array(); $item["idc"] = $cur_idc; $item["value"] = $cur_value; $item["node"] = $cur_node; $checked_nodes[$cur_id] = $item; } // 3. actually do modification foreach ($checked_nodes as $node_id => $item) { $idc = $item["idc"]; $node = $item["node"]; $node_val = $item["value"]; $ret = self::modNodeValue($node_id, $idc, $node["node_whole"], $node["main_buss_id"], $node["sub_buss_id"], $node_val, "", $op_user); if ($ret != 0) { $res = InfoDescUtil::getErrorMsg($ret); echo json_encode($res); return; } } // return success $res = array("errno" => "0", "errmsg" => "", "data" => "modify success!"); $json = json_encode($res); echo $json; }