/*
 * Copyright (c) 2024 Huawei Technologies Co., Ltd.
 * openFuyao is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

package service

var clusterLevelMetrics = []string{
	"cluster_cpu_total",
	"cluster_memory_total",
	"cluster_total_cpu_usage",
	"cluster_total_memory_usage",
	"cluster_hls_cpu_usage",
	"cluster_hls_memory_usage",
	"cluster_ls_cpu_usage",
	"cluster_ls_memory_usage",
	"cluster_be_cpu_usage",
	"cluster_be_memory_usage",
	"cluster_noncolo_cpu_usage",
	"cluster_noncolo_memory_usage",
	"cluster_be_cpu_allocatable",
	"cluster_be_memory_allocatable",
	"cluster_be_cpu_request",
	"cluster_be_memory_request",
	"cluster_hls_cpu_request",
	"cluster_hls_memory_request",
	"cluster_ls_cpu_request",
	"cluster_ls_memory_request",
	"cluster_noncolo_cpu_request",
	"cluster_noncolo_memory_request",
}

var nodeLevelMetrics = []string{
	"node_cpu_total",
	"node_memory_total",
	"node_total_cpu_usage",
	"node_total_memory_usage",
	"node_hls_cpu_usage",
	"node_hls_memory_usage",
	"node_ls_cpu_usage",
	"node_ls_memory_usage",
	"node_be_cpu_usage",
	"node_be_memory_usage",
	"node_noncolo_cpu_usage",
	"node_noncolo_memory_usage",
	"node_be_cpu_allocatable",
	"node_be_memory_allocatable",
	"node_be_cpu_request",
	"node_be_memory_request",
	"node_hls_cpu_request",
	"node_hls_memory_request",
	"node_ls_cpu_request",
	"node_ls_memory_request",
	"node_noncolo_cpu_request",
	"node_noncolo_memory_request",
}

var prometheusQLSet = map[string]string{
	"cluster_cpu_total":    `sum(machine_cpu_cores) by (cluster)`,
	"cluster_memory_total": `sum(node_memory_MemTotal_bytes{job="node-exporter"}) by (cluster)`,
	"cluster_total_cpu_usage": `sum(rate(node_cpu_seconds_total{mode!="idle", mode!="iowait", ` +
		`mode!="steal"}[5m])) by (cluster)`,
	"cluster_total_memory_usage": `sum(node_memory_MemTotal_bytes{job="node-exporter"}) by (cluster) - ` +
		`sum(:node_memory_MemAvailable_bytes:sum) by (cluster)`,
	"cluster_hls_cpu_usage":         `sum(pod_cpu_usage_by_colocation{type="HLS"})`,
	"cluster_hls_memory_usage":      `sum(pod_memory_usage_by_colocation{type="HLS"})`,
	"cluster_ls_cpu_usage":          `sum(pod_cpu_usage_by_colocation{type="LS"})`,
	"cluster_ls_memory_usage":       `sum(pod_memory_usage_by_colocation{type="LS"})`,
	"cluster_be_cpu_usage":          `sum(pod_cpu_usage_by_colocation{type="BE"})`,
	"cluster_be_memory_usage":       `sum(pod_memory_usage_by_colocation{type="BE"})`,
	"cluster_noncolo_cpu_usage":     `sum(pod_cpu_usage_by_colocation{type="None"})`,
	"cluster_noncolo_memory_usage":  `sum(pod_memory_usage_by_colocation{type="None"})`,
	"cluster_be_cpu_allocatable":    `sum(node_overquota_cpu_allocatable) / 1000`,
	"cluster_be_memory_allocatable": `sum(node_overquota_memory_allocatable)`,
	"cluster_be_cpu_request":        `sum(pod_overquota_cpu_request) / 1000`,
	"cluster_be_memory_request":     `sum(pod_overquota_memory_request)`,
	"cluster_hls_cpu_request": `sum (
	kube_pod_container_resource_requests{resource="cpu", unit="core"}
	and on(pod, namespace)
	label_replace(
		label_replace(
			pod_cpu_usage_by_colocation{type="HLS"},
			"namespace", "$1", "exported_namespace", "(.*)"
		),
	"pod", "$1", "pod_name", "(.*)"
	)
)`,
	"cluster_hls_memory_request": `sum (
	kube_pod_container_resource_requests{resource="memory", unit="byte"}
	and on(pod, namespace)
	label_replace(
		label_replace(
			pod_memory_usage_by_colocation{type="HLS"},
			"namespace", "$1", "exported_namespace", "(.*)"
		),
	"pod", "$1", "pod_name", "(.*)"
	)
)`,
	"cluster_ls_cpu_request": `sum (
	kube_pod_container_resource_requests{resource="cpu", unit="core"}
	and on(pod, namespace)
	label_replace(
		label_replace(
			pod_cpu_usage_by_colocation{type="LS"},
			"namespace", "$1", "exported_namespace", "(.*)"
		),
	"pod", "$1", "pod_name", "(.*)"
	)
)`,
	"cluster_ls_memory_request": `sum (
	kube_pod_container_resource_requests{resource="memory", unit="byte"}
	and on(pod, namespace)
	label_replace(
		label_replace(
			pod_memory_usage_by_colocation{type="LS"},
			"namespace", "$1", "exported_namespace", "(.*)"
		),
	"pod", "$1", "pod_name", "(.*)"
	)
)`,
	"cluster_noncolo_cpu_request": `sum (
	kube_pod_container_resource_requests{resource="cpu", unit="core"}
	and on(namespace, pod)
	label_replace(
		label_replace(
			pod_cpu_usage_by_colocation{type="None"},
			"namespace", "$1", "exported_namespace", "(.*)"
		),
	"pod", "$1", "pod_name", "(.*)"
	)
)`,
	"cluster_noncolo_memory_request": `sum (
	kube_pod_container_resource_requests{resource="memory", unit="byte"}
	and on(pod, namespace)
	label_replace(
		label_replace(
			pod_memory_usage_by_colocation{type="None"},
			"namespace", "$1", "exported_namespace", "(.*)"
		),
	"pod", "$1", "pod_name", "(.*)"
	)
)`,
	"node_cpu_total": `sum(label_replace(sum(machine_cpu_cores) by (cluster, node), "instance", "$1", ` +
		`"node", "(.*)")) by (cluster, instance)`,
	"node_memory_total": `sum(node_memory_MemTotal_bytes{job="node-exporter"}) by (cluster, instance)`,
	"node_total_cpu_usage": `sum(label_replace(sum(machine_cpu_cores) by (cluster, node), "instance", "$1", ` +
		`"node", "(.*)")) by (cluster, instance) * (1 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) ` +
		`by (cluster, instance)))`,
	"node_total_memory_usage": `sum(node_memory_MemTotal_bytes{job="node-exporter"}) by (cluster, instance) - ` +
		`sum(node_memory_MemFree_bytes{job="node-exporter"} + node_memory_Buffers_bytes{job="node-exporter"} + ` +
		`node_memory_Cached_bytes{job="node-exporter"}) by (cluster, instance)`,
	"node_hls_cpu_usage": `sum by (instance) (label_replace(` +
		`pod_cpu_usage_by_colocation{type="HLS"}, "instance", "$1", "node", "(.*)"))`,
	"node_hls_memory_usage": `sum by (instance) (label_replace(` +
		`pod_memory_usage_by_colocation{type="HLS"}, "instance", "$1", "node", "(.*)"))`,
	"node_ls_cpu_usage": `sum by (instance) (label_replace(` +
		`pod_cpu_usage_by_colocation{type="LS"}, "instance", "$1", "node", "(.*)"))`,
	"node_ls_memory_usage": `sum by (instance) (label_replace(` +
		`pod_memory_usage_by_colocation{type="LS"}, "instance", "$1", "node", "(.*)"))`,
	"node_be_cpu_usage": `sum by (instance) (label_replace(` +
		`pod_cpu_usage_by_colocation{type="BE"}, "instance", "$1", "node", "(.*)"))`,
	"node_be_memory_usage": `sum by (instance) (label_replace(` +
		`pod_memory_usage_by_colocation{type="BE"}, "instance", "$1", "node", "(.*)"))`,
	"node_noncolo_cpu_usage": `sum by (instance) (label_replace(` +
		`pod_cpu_usage_by_colocation{type="None"}, "instance", "$1", "node", "(.*)"))`,
	"node_noncolo_memory_usage": `sum by (instance) (label_replace(` +
		`pod_memory_usage_by_colocation{type="None"}, "instance", "$1", "node", "(.*)"))`,
	"node_be_cpu_allocatable": `sum(label_replace(node_overquota_cpu_allocatable, ` +
		`"instance", "$1", "node_name", "(.*)")) by (instance) / 1000`,
	"node_be_memory_allocatable": `sum(label_replace(node_overquota_memory_allocatable, ` +
		`"instance", "$1", "node_name", "(.*)")) by (instance)`,
	"node_be_cpu_request": `sum(label_replace(pod_overquota_cpu_request, "instance", ` +
		`"$1", "node", "(.*)")) by (instance) / 1000`,
	"node_be_memory_request": `sum(label_replace(pod_overquota_memory_request, "instance", ` +
		`"$1", "node", "(.*)")) by (instance)`,
	"node_hls_cpu_request": `sum by (instance) (
    label_replace(
      kube_pod_container_resource_requests{resource="cpu", unit="core"}
	  and on(pod, namespace)
      label_replace(
        label_replace(
          pod_cpu_usage_by_colocation{type="HLS"},
          "namespace", "$1", "exported_namespace", "(.*)"
        ),
        "pod", "$1", "pod_name", "(.*)"
      ),
      "instance", "$1", "node", "(.*)"
    )
  )`,
	"node_hls_memory_request": `sum by (instance) (
    label_replace(
      kube_pod_container_resource_requests{resource="memory", unit="byte"}
	  and on(pod, namespace)
      label_replace(
        label_replace(
          pod_memory_usage_by_colocation{type="HLS"},
          "namespace", "$1", "exported_namespace", "(.*)"
        ),
        "pod", "$1", "pod_name", "(.*)"
      ),
      "instance", "$1", "node", "(.*)"
    )
  )`,
	"node_ls_cpu_request": `sum by (instance) (
    label_replace(
      kube_pod_container_resource_requests{resource="cpu", unit="core"}
	  and on(pod, namespace)
      label_replace(
        label_replace(
          pod_cpu_usage_by_colocation{type="LS"},
          "namespace", "$1", "exported_namespace", "(.*)"
        ),
        "pod", "$1", "pod_name", "(.*)"
      ),
      "instance", "$1", "node", "(.*)"
    )
  )`,
	"node_ls_memory_request": `sum by (instance) (
    label_replace(
      kube_pod_container_resource_requests{resource="memory", unit="byte"}
	  and on(pod, namespace)
      label_replace(
        label_replace(
          pod_memory_usage_by_colocation{type="LS"},
          "namespace", "$1", "exported_namespace", "(.*)"
        ),
        "pod", "$1", "pod_name", "(.*)"
      ),
      "instance", "$1", "node", "(.*)"
    )
  )`,
	"node_noncolo_cpu_request": `sum by (instance) (
    label_replace(
      kube_pod_container_resource_requests{resource="cpu", unit="core"}
	  and on(pod, namespace)
      label_replace(
        label_replace(
          pod_cpu_usage_by_colocation{type="None"},
          "namespace", "$1", "exported_namespace", "(.*)"
        ),
        "pod", "$1", "pod_name", "(.*)"
      ),
      "instance", "$1", "node", "(.*)"
    )
  )`,
	"node_noncolo_memory_request": `sum by (instance) (
    label_replace(
      kube_pod_container_resource_requests{resource="memory", unit="byte"}
	  and on(pod, namespace)
      label_replace(
        label_replace(
          pod_memory_usage_by_colocation{type="None"},
          "namespace", "$1", "exported_namespace", "(.*)"
        ),
        "pod", "$1", "pod_name", "(.*)"
      ),
      "instance", "$1", "node", "(.*)"
    )
  )`,
}