public static function addConfAfterParamValidation($user, $path, $idc, $main_buss_id, $sub_buss_id, $desc, $node_val) { // 1.check whether node already exist $add_node = NodeServ::getNodeByNodeWhole($path, $main_buss_id); if ($add_node != FALSE) { $current_idc_array = explode(",", $add_node["idc"]); $new_idc_array = explode(",", $idc); $intersect = array_intersect($current_idc_array, $new_idc_array); if (count($intersect) != 0) { return InfoDescUtil::ERR_NODE_EXIST; } } // 2.cascade add node in database mysql_query("BEGIN"); $cur_path = ""; $parent_id = 0; $ret = TRUE; $path = "/" . trim($path, "/"); $node_list = preg_split("/[\\/]+/", trim($path, "/")); for ($i = 0; $i < count($node_list); $i++) { $currentp = $node_list[$i]; $cur_path .= "/" . $node_list[$i]; $exist = NodeServ::checkNode($cur_path, $main_buss_id); if ($exist == FALSE) { if ($i === 0) { // root path $perm_path = $node_list[$i]; QconfMgrLog::err(__FILE__, __LINE__, "root node :{$perm_path} is not exist on {$main_buss_id} "); return InfoDescUtil::ERR_NODE_NOT_EXIST; } else { //normal path if ($i == count($node_list) - 1) { $ret = NodeServ::insert($parent_id, $node_list[$i], InfoDescUtil::NODE_TYPE_NORMAL, $cur_path, $main_buss_id, $sub_buss_id, $idc, $desc); } else { $ret = NodeServ::insert($parent_id, $node_list[$i], InfoDescUtil::NODE_TYPE_NORMAL, $cur_path, $main_buss_id, $sub_buss_id, $idc, ""); } $cur_node = NodeServ::getNodeByNodeWhole($cur_path, $main_buss_id); if ($cur_node != FALSE) { $parent_id = $cur_node["node_id"]; } else { $ret = FALSE; QconfMgrLog::err(__FILE__, __LINE__, "get node with path:{$cur_path} and " . "main_buss_id:{$main_buss_id} after insert node, failed!"); break; } } } else { //already exist $cur_node = NodeServ::getNodeByNodeWhole($cur_path, $main_buss_id); if ($cur_node === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "get node of path:{$cur_path}, main_buss_id:{$main_buss_id} failed!"); $ret = FALSE; break; } else { // judge node type $cur_node_type = $cur_node["node_type_code"]; if ($cur_node_type == InfoDescUtil::NODE_TYPE_SERV_FATHER && $cur_path != $path) { mysql_query("ROLLBACK"); QconfMgrLog::err(__FILE__, __LINE__, "path:{$cur_path} " . "is already service father type of main_buss_id:{$main_buss_id} "); return InfoDescUtil::ERR_IMPORT_ADD_UNDER_SERV_FATHER; } //modify idc since idc expansion may happened $current_id = $cur_node["node_id"]; $current_idc_array = explode(",", $cur_node["idc"]); $new_idc_array = explode(",", $idc); $set_idc_array = array_merge($current_idc_array, $new_idc_array); $set_idc = implode(",", $set_idc_array); if (NodeServ::modIdc($current_id, $set_idc) === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "modify Idc:{$set_idc} of node_id:{$current_id} failed!"); } $parent_id = $current_id; } } } // any mysql error happened in current loop if ($ret === FALSE) { mysql_query("ROLLBACK"); //$res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_MYSQL_FAIL); QconfMgrLog::err(__FILE__, __LINE__, "node:{$path} didn't exist in database"); //echo json_encode($res); return InfoDescUtil::ERR_MYSQL_FAIL; } // 3.add node into each idc $idc_list = preg_split("/[,]+/", $idc); $zk_web = new QconfZkWebBase(Log::INFO); foreach ($idc_list as $idc_each) { // certainly exist which has been validation in the CommonArgusProcess function $idc_host = ZkConf::getZkHost($idc_each); $zk_web->connect($idc_host); $qconf_path = PathUtil::getQconfPath($path); $retry_time = 0; while ($retry_time++ < 3 && $zk_web->add_conf($qconf_path, $node_val) === -1) { QconfMgrLog::err(__FILE__, __LINE__, "fail to add conf into zookeeper! retry time {$retry_time}"); } if ($retry_time >= 3) { mysql_query("ROLLBACK"); //$res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_ZOOKEEPER_FAIL); QconfMgrLog::err(__FILE__, __LINE__, "add in zookeeper failed on idc: {$idc_each}"); OpServ::insert(InfoDescUtil::OP_TYPE_ADD, $path, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $user, $node_val); //echo json_encode($res); return InfoDescUtil::ERR_ZOOKEEPER_FAIL; } } OpServ::insert(InfoDescUtil::OP_TYPE_ADD, $path, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $user, $node_val); mysql_query("COMMIT"); return 0; }
private function addOrUpdateConfInternal($node_whole, $idc, $node_val, $main_buss_id, $sub_buss_id, $note, $op_user, $value_overwrite) { //echo "node_whole($node_whole), idc($idc), node_val($node_val), main_buss_id($main_buss_id)"; // 1. parameter is not right if ($node_whole === "" || $idc === "" || $main_buss_id === "" || $sub_buss_id === "") { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_BAD_ARGS); QconfMgrLog::err(__FILE__, __LINE__, "parameter 'node_whole' 'idc' 'main_buss_id' or 'sub_buss_id' is null!"); return $res; } // 1. check whether node already exist $cur_node = NodeServ::getNodeByNodeWhole($node_whole, $main_buss_id); $node_id = $cur_node["node_id"]; $idc = trim($idc, ","); $idc_list = preg_split("/[,]+/", $idc); if ($cur_node === FALSE) { // 2.1 add conf $ret = ExtraController::addConfAfterParamValidation($op_user, $node_whole, $idc, $main_buss_id, $sub_buss_id, $note, $node_val); if ($ret != 0) { $res = InfoDescUtil::getErrorMsg($ret); return $res; } } else { //distinguish idcs need to be add or modified $need_addidc_idcs = array(); $need_modify_idcs = ""; $cur_idcs = $cur_node["idc"]; $cur_idcs_array = explode(',', $cur_idcs); foreach ($idc_list as $idc_each) { $exist_idc = in_array($idc_each, $cur_idcs_array); if ($exist_idc === FALSE) { $need_addidc_idcs[$idc_each] = $node_val; } else { $need_modify_idcs .= $idc_each . ","; } } $need_modify_idcs = trim($need_modify_idcs, ","); // 2.2 add idc if (count($need_addidc_idcs) > 0) { $qconf_node_type = $cur_node["node_type_code"]; $failed_idcs = self::retryOperation($need_addidc_idcs, $node_whole, $qconf_node_type, $main_buss_id, $sub_buss_id, $op_user); if (count($failed_idcs) != 0) { //failed return $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_ZOOKEEPER_FAIL); foreach ($failed_idcs as $fail_idc => $value) { OpServ::insert(InfoDescUtil::OP_TYPE_EXPANSION, $node_whole, $add_idcs, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); if ($res["data"] != "") { $res["data"] .= ","; } $res["data"] .= "{$fail_idc}"; } return $res; } $add_idcs = ""; foreach ($need_addidc_idcs as $one_idc => $value) { $add_idcs .= ",{$one_idc}"; } $add_idcs = trim($add_idcs, ","); $ret = NodeServ::modIdc($node_id, $add_idcs); if ($ret === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_MYSQL_FAIL); OpServ::insert(InfoDescUtil::OP_TYPE_EXPANSION, $node_whole, $add_idcs, InfoDescUtil::OP_STATUS_MYSQL_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); return $res; } foreach ($need_addidc_idcs as $one_idc => $value) { OpServ::insert(InfoDescUtil::OP_TYPE_EXPANSION, $node_whole, $one_idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, $value); } } if ($need_modify_idcs != "" && $value_overwrite === TRUE) { // 3.3 modify conf $res = ExtraController::modifyConfAfterParamValidation($op_user, $node_whole, $need_modify_idcs, $main_buss_id, $sub_buss_id, $note, $node_val); if ($res["errno"] != "0") { return $res; } } } // 6. return success $res = array("errno" => "0", "errmsg" => "", "data" => "add or update node success!"); return $res; }