public function deleteConfAction() { // 1.receive arguments $res = ""; $argus = self::commonArgusProcess($res); if ($argus == FALSE) { echo json_encode($res); return false; } $user = $argus["user"]; $path = $argus["path"]; $idc = $argus["idc"]; $main_buss_id = $argus["main_buss_id"]; $sub_buss_id = $argus["sub_buss_id"]; $desc = $argus["desc"]; // 2.get node $cur_node = NodeServ::getNodeByNodeWhole($path, $main_buss_id); if ($cur_node === FALSE) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_NODE_NOT_EXIST); QconfMgrLog::err(__FILE__, __LINE__, "node:{$path} didn't exist in database"); echo json_encode($res); return; } // 3.validate path $node_type = $cur_node["node_type_code"]; $qconf_node_path = PathUtil::getQconfPath($path); $zk_web = new QconfZkWebBase(Log::INFO); $idc_list = preg_split("/[,]+/", $idc); if ($node_type == InfoDescUtil::NODE_TYPE_NORMAL_FATHER) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SUB_NODE_NOT_NULL); QconfMgrLog::err(__FILE__, __LINE__, "node:{$path} has children who is normal node"); echo json_encode($res); return; } else { if ($node_type == InfoDescUtil::NODE_TYPE_SERV_FATHER) { foreach ($idc_list as $idc_each) { $idc_host = ZkConf::getZkHost($idc_each); $zk_web->connect($idc_host); $children = $zk_web->get_children($qconf_node_path); if ($children == -1) { $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_ZOOKEEPER_FAIL); echo json_encode($res); OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $path, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $user, ""); return; } //children exist if (count($children) > 0) { QconfMgrLog::err(__FILE__, __LINE__, "node:{$path} has service node as its children!"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_SUB_NODE_NOT_NULL); echo json_encode($res); return; } } } } $node_id = $cur_node["node_id"]; foreach ($idc_list as $idc_each) { mysql_query("BEGIN"); // 4.delete from database $ret_db = NodeServ::delNodeByIdc($node_id, $idc_each); if ($ret_db === TRUE && $cur_node["node_level"] == 1) { $ret_db = PermServ::delPermByIdc(trim($path, "\\/"), $main_buss_id, $idc); if ($ret_db === TRUE) { // notify admins AdminConf::notifyAdmin("Delete root node " . $path . " for {$user} on {$idc_each}", $user, FALSE); } } if ($ret_db === FALSE) { mysql_query("ROLLBACK"); QconfMgrLog::err(__FILE__, __LINE__, "delete from database for node:{$path}, idc:{$idc_each} failed!"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_MYSQL_FAIL); echo json_encode($res); OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $path, $idc, InfoDescUtil::OP_STATUS_MYSQL_FAILED, $main_buss_id, $sub_buss_id, $user, ""); return; } // 5.delete from zookeeper $idc_host = ZkConf::getZkHost($idc_each); $zk_web->connect($idc_host); $retry_time = 0; $ret_zk = -1; while ($retry_time++ < 3 && $ret_zk === -1) { if ($node_type == InfoDescUtil::NODE_TYPE_SERV_FATHER) { $ret_zk = $zk_web->delete_group_path($qconf_node_path); } else { $ret_zk = $zk_web->delete_conf($qconf_node_path); } if ($ret_zk === -1) { QconfMgrLog::err(__FILE__, __LINE__, "fail to delete conf from zookeeper! retry time {$retry_time}"); } } if ($retry_time >= 3) { mysql_query("ROLLBACK"); QconfMgrLog::err(__FILE__, __LINE__, "delete from zookeeper for node:{$path}, idc:{$idc_each} failed!"); $res = InfoDescUtil::getErrorMsg(InfoDescUtil::ERR_ZOOKEEPER_FAIL); echo json_encode($res); OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $path, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $user, ""); return; } mysql_query("COMMIT"); } OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $path, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $user, ""); $res = array("errno" => "0", "errmsg" => "", "data" => "delete success"); $json = json_encode($res); echo $json; }
private function deleteNode($db_node_whole, $main_buss_id, $idc, $op_user, $zk_web, $del_flags) { $node = NodeServ::getNodeByNodeWhole($db_node_whole, $main_buss_id); if ($node === FALSE) { return InfoDescUtil::ERR_NODE_NOT_EXIST; } $db_node_type = $node["node_type_code"]; $sub_buss_id = $node["sub_buss_id"]; // 1. check whether current node has sub nodes $qconf_node_path = PathUtil::getQconfPath($db_node_whole); $children = -1; $retry_time = 0; while ($children === -1 && $retry_time <= InfoDescUtil::ZK_MAX_RETRY_TIME) { QconfMgrLog::err(__FILE__, __LINE__, "retry {$retry_time} of " . InfoDescUtil::ZK_MAX_RETRY_TIME . " to get children of {$db_node_whole} on {$idc}"); $children = $zk_web->get_children($qconf_node_path); $retry_time++; } if ($children === -1) { QconfMgrLog::err(__FILE__, __LINE__, "Failed to get children of {$db_node_whole} on {$idc}"); return InfoDescUtil::ERR_ZOOKEEPER_FAIL; } // 2. delete children nodes or services if needed if (count($children) > 0) { if ($del_flags === InfoDescUtil::DELETE_TYPE_WHOLE) { if ($db_node_type === InfoDescUtil::NODE_TYPE_SERV_FATHER) { $clear_ret = ServiceController::clearServiceWithLink($zk_web, $db_node_whole, $idc, $main_buss_id, $sub_buss_id, $op_user); if ($clear_ret != InfoDescUtil::QCONF_OK) { QconfMgrLog::err(__FILE__, __LINE__, "Failed to clear services of {$db_node_whole} on {$idc}"); return $clear_ret; } } else { // delete include children foreach ($children as $child) { $child_node_whole = PathUtil::unionPath($db_node_whole, $child); $del_ret = self::deleteNode($child_node_whole, $main_buss_id, $idc, $op_user, $zk_web, InfoDescUtil::DELETE_TYPE_WHOLE); if ($del_ret != InfoDescUtil::QCONF_OK) { QconfMgrLog::err(__FILE__, __LINE__, "Failed to delete children of {$db_node_whole} on {$idc}"); return $del_ret; } } } } else { // delete only self QconfMgrLog::err(__FILE__, __LINE__, "Exist children nodes of {$db_node_whole} on {$idc}"); return InfoDescUtil::ERR_SUB_NODE_NOT_NULL; } } // 3. delete conf from zookeeper if ($db_node_type === InfoDescUtil::NODE_TYPE_SERV_FATHER) { $ret = -1; $retry_time = 0; while ($ret === -1 && $retry_time <= InfoDescUtil::ZK_MAX_RETRY_TIME) { QconfMgrLog::err(__FILE__, __LINE__, "retry {$retry_time} of " . InfoDescUtil::ZK_MAX_RETRY_TIME . " to delete group path for {$db_node_whole} on {$idc}"); $ret = $zk_web->delete_group_path($qconf_node_path); $retry_time++; } } else { $ret = -1; $retry_time = 0; while ($ret === -1 && $retry_time <= InfoDescUtil::ZK_MAX_RETRY_TIME) { QconfMgrLog::err(__FILE__, __LINE__, "retry {$retry_time} of " . InfoDescUtil::ZK_MAX_RETRY_TIME . " to delete {$db_node_whole} on {$idc}"); $ret = $zk_web->delete_conf($qconf_node_path); $retry_time++; } } if ($ret === -1) { OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $db_node_whole, $idc, InfoDescUtil::OP_STATUS_ZOO_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); return InfoDescUtil::ERR_ZOOKEEPER_FAIL; } // 4. delete in mysql $ret = NodeServ::delNodeByIdc($node["node_id"], $idc); if ($ret === TRUE && $node["node_level"] == 1) { $ret = PermServ::delPermByIdc(trim($db_node_whole, "\\/"), $main_buss_id, $idc); if ($ret === TRUE) { // notify admins AdminConf::notifyAdmin("Delete root node " . $db_node_whole . " for {$op_user} on {$idc}", $op_user, FALSE); } } if ($ret === -1) { OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $db_node_whole, $idc, InfoDescUtil::OP_STATUS_MYSQL_FAILED, $main_buss_id, $sub_buss_id, $op_user, ""); QconfMgrLog::err(__FILE__, __LINE__, "failed to delete {$db_node_whole} from {$idc} in mysql"); return InfoDescUtil::ERR_MYSQL_FAIL; } // 6. delete the feedback items $fd_res = FeedbackServ::deleteFeedbackByNode($qconf_node_path, $idc); if ($fd_res === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "failed to delete feedbacks of qconf_node_path({$qconf_node_path}), idc({$idc})"); } else { $update_time = date('Y-m-d H:i:s', time()); $fd_op_res = FeedbackOpServ::recordOp(InfoDescUtil::OP_TYPE_FEEDBACK_DELETE_BY_NODE, "", $qconf_node_path, $idc, "", "", $update_time); if ($fd_op_res === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "failed to add feedback operation of qconf_node_path({$qconf_node_path}), idc({$idc})"); } } // 7. delete normal user permision if (trim($node["idc"], ",") === $idc) { // last idc of the node has been deleted $delete_res = UserPermServ::deleteNormalByDeleteOp($db_node_whole); if ($delete_res === FALSE) { QconfMgrLog::err(__FILE__, __LINE__, "failed to delete user perm items on db_node_whole({$db_node_whole})"); OpServ::insert(InfoDescUtil::OP_TYPE_USER_PERM_NORMAL_DELETE, $db_node_whole, $idc, InfoDescUtil::OP_STATUS_MYSQL_FAILED, $main_buss_id, $sub_buss_id, $op_user, "delete all user perm on {$db_node_whole} failed"); } else { QconfMgrLog::err(__FILE__, __LINE__, "delete all normal perm items on db_node_whole({$db_node_whole})"); OpServ::insert(InfoDescUtil::OP_TYPE_USER_PERM_NORMAL_DELETE, $db_node_whole, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, "delete all user perm on {$db_node_whole} success"); } } OpServ::insert(InfoDescUtil::OP_TYPE_DEL, $db_node_whole, $idc, InfoDescUtil::OP_STATUS_SUCCESS, $main_buss_id, $sub_buss_id, $op_user, ""); return InfoDescUtil::QCONF_OK; }