[[rule]]
id = 7
name = "log-level"
description = "日志等级。可选值：\"trace\"，\"debug\"，\"info\"，\"warning\"，\"error\"，\"critical\"。默认值：\"info\""
variation =  "log-level"
execute_rule = """
rule "log-level" "log level of tikv"  salience 6
begin
    if ToString(config.GetValueByTagPath("log-level")) == "debug" || ToString(config.GetValueByTagPath("log-level")) == "trace" {
        return false
    } else {
        return true
    }
end
"""
name_struct = "TikvConfig"
expect_res = ""   #
warn_level = "info"
version = ""

# todo check if TiFlash exist
[[rule]]
id = 8
name = "gc.enable-compaction-filter"
description = "是否开启 GC in Compaction Filter 特性"
variation =  "gc.enable-compaction-filter"
execute_rule = """
rule "gc.enable-compaction-filter"
begin
    if ToBool(config.GetValueByTagPath("gc.enable-compaction-filter")) == true && config.Extra.TiFlashCnt > 0 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "TikvConfig"
expect_res = ""   #
warn_level = "warning"
version = "v5.0.1"

[[rule]]
id = 100
name = "max-days"
description = "日志保留的最长天数"
variation =  "log.file.max-days"
execute_rule = """
rule "max-days"
begin
    if ToInt(config.GetValueByTagPath("log.file.max-days")) < 1 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "TidbConfig"
expect_res = ""   #
warn_level = "warning"
version = ""

[[rule]]
id = 101
name = "max-backups"
description = "日志文件保留的最大个数"
variation = "log.file.max-backups"
execute_rule = """
rule "max-backups"
begin
    if ToInt(config.GetValueByTagPath("log.file.max-backups")) < 1 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "TidbConfig"
expect_res = ""   #
warn_level = "warning"
version = ""

[[rule]]
id = 102
name = "log-level"
description = "日志等级。可选值：\"trace\"，\"debug\"，\"info\"，\"warning\"，\"error\"，\"critical\"。默认值：\"info\""
variation = "log.level"
execute_rule = """
rule "log-level"
begin
    if ToString(config.GetValueByTagPath("log.level")) == "debug" {
        return false
    } else {
        return true
    }
end
"""
name_struct = "TidbConfig"
expect_res = ""   #
warn_level = "info"
version = ""

[[rule]]
id = 103
name = "enable-stream"
description = "3.0.20, 4.0.9, 5.2.0 已废弃"
variation = "enable-streaming"
execute_rule = """
rule "enable-stream"
begin
    if ToBool(config.GetValueByTagPath("enable-streaming")) == true {
        return false
    } else {
        return true
    }
end
"""
name_struct = "TidbConfig"
expect_res = ""   #
warn_level = "info"
version = ""

[[rule]]
id = 200
name = "max-snapshot-count"
description = "控制单个 store 最多同时接收或发送的 snapshot 数量，调度受制于这个配置来防止抢占正常业务的资源。"
variation = "schedule.max-snapshot-count"
execute_rule = """
rule "max-snapshot-count"
begin
    if ToInt(config.GetValueByTagPath("schedule.max-snapshot-count")) <= 0 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 201
name = "max-pending-peer-count"
description = "控制单个 store 的 pending peer 上限，调度受制于这个配置来防止在部分节点产生大量日志落后的 Region。"
variation = "schedule.max-pending-peer-count"
execute_rule = """
rule "max-pending-peer-count"
begin
    if ToInt(config.GetValueByTagPath("schedule.max-pending-peer-count")) <= 0 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 202
name = "leader-schedule-limit"
description = "同时进行 leader 调度的任务个数。"
variation = "schedule.leader-schedule-limit"
execute_rule = """
rule "leader-schedule-limit"
begin
    if ToInt(config.GetValueByTagPath("schedule.leader-schedule-limit")) <= 0 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 203
name = "replica-schedule-limit-a"
description = "同时进行 replica 调度的任务个数。"
variation =  "schedule.replica-schedule-limit,schedule.replica-schedule-limit"
execute_rule = """
rule "replica-schedule-limit-a"
begin
    if ToInt(config.GetValueByTagPath("schedule.replica-schedule-limit")) <= 0
       || ToInt(config.GetValueByTagPath("schedule.replica-schedule-limit")) > 64 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 204
name = "merge-schedule-limit"
description = "同时进行的 Region Merge 调度的任务，设置为 0 则关闭 Region Merge。"
variation = "schedule.merge-schedule-limit"
execute_rule = """
rule "merge-schedule-limit"
begin
    if ToInt(config.GetValueByTagPath("schedule.merge-schedule-limit")) <= 0
       || ToInt(config.GetValueByTagPath("schedule.merge-schedule-limit")) > 16 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 205
name = "hot-region-schedule-limit"
description = "控制同时进行的 hot Region 任务。该配置项独立于 Region 调度。"
variation = "schedule.hot-region-schedule-limit"
execute_rule = """
rule "hot-region-schedule-limit"
begin
    if ToInt(config.GetValueByTagPath("schedule.hot-region-schedule-limit")) <= 0
       || ToInt(config.GetValueByTagPath("schedule.hot-region-schedule-limit")) > 8 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

# todo add store limit rule

[[rule]]
id = 206
name = "store limit-n-add-peer"
description = "Store Limit 限制的主要是 operator 的消费速度，{n} 指 store id，这里对所有 store limit 都有同样的限制。"
variation = "schedule.store-limit"
execute_rule = """
rule "store limit-n-add-peer"
begin
    if ElemInRange(FlatMap(config.GetValueByTagPath("schedule.store-limit"),"add-peer"),0, 100) {
        return true
    }else {
        return false
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 206
name = "store limit-n-remove-peer"
description = "Store Limit 限制的主要是 operator 的消费速度，{n} 指 store id，这里对所有 store limit 都有同样的限制。"
variation = "schedule.store-limit"
execute_rule = """
rule "store limit-n-remove-peer"
begin
    if ElemInRange(FlatMap(config.GetValueByTagPath("schedule.store-limit"),"remove-peer"),0, 100) {
        return true
    }else {
        return false
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"

[[rule]]
id = 208
name = "replica-schedule-limit-b"
description = "用来控制 replica 相关 operator 的产生速度（涉及到下线、补副本的操作都与该参数有关）。"
variation = "schedule.replica-schedule-limit,schedule.region-schedule-limit"
execute_rule = """
rule "replica-schedule-limit-b"
begin
    if ToInt(config.GetValueByTagPath("schedule.replica-schedule-limit"))
        > ToInt(config.GetValueByTagPath("schedule.region-schedule-limit")) {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "warning"
version = "> v4.0.0"

[[rule]]
id = 209
name = "max-days"
description = "日志保留的最长天数。"
variation = "log.file.max-days"
execute_rule = """
rule "max-days"
begin
    if ToInt(config.GetValueByTagPath("log.file.max-days")) <= 0 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "warning"
version = "> v4.0.0"

[[rule]]
id = 210
name = "max-backups"
description = "日志文件保留的最大个数。"
variation = "log.file.max-backups"
execute_rule = """
rule "max-backups"
begin
    if ToInt(config.GetValueByTagPath("log.file.max-backups")) <= 0 {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "warning"
version = "> v4.0.0"

[[rule]]
id = 211
name = "log-level"
description = "Log 级别。默认：\"info\" 我们能选择 debug, info, warn, error 或者 fatal。"
variation = "log.level"
execute_rule = """
rule "log-level"
begin
    if ToString(config.GetValueByTagPath("log.level")) == "debug" {
        return false
    } else {
        return true
    }
end
"""
name_struct = "PdConfig"
expect_res = ""   #
warn_level = "info"
version = "> v4.0.0"