package resource

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/require"

	commM "github.com/pingcap/test-infra/common/model"
)

func TestEstimateTestbedRequest(t *testing.T) {
	testbedSpec := `
{
  "generateName": "endless-oltp-",
  "resourcePool": "default",
  "physicalResourceRequest": {
    "cpu": {},
    "memory": {}
  },
  "items": [
    {
      "name": "tc",
      "type": "TIDB_CLUSTER",
      "spec": {
        "pd": {
          "baseImage": "hub-new.pingcap.net/qa/pd",
          "config": "[dashboard]\n  internal-proxy = true  \n",
          "limits": {
            "cpu": "2000m",
            "memory": "4Gi"
          },
          "replicas": 2,
          "maxReplicas":3,
          "requests": {
            "cpu": "2000m",
            "memory": "4Gi"
          },
          "service": {
            "type": "NodePort"
          },
          "storageClassName": "fast-disks"
        },
        "tidb": {
          "baseImage": "hub-new.pingcap.net/qa/tidb",
          "config": "[log]\n# Log level: debug, info, warn, error, fatal.\nlevel = \"info\"\n",
          "limits": {
            "cpu": "8000m",
            "memory": "16Gi"
          },
          "replicas": 1,
          "requests": {
            "cpu": "2000m",
            "memory": "4Gi"
          }
        },
        "tikv": {
          "baseImage": "hub-new.pingcap.net/qa/tikv",
          "config": "## Log levels: trace, debug, info, warning, error, critical.\n## Note that debug and trace are only available in development builds.\nlog-level = \"info\"\n[storage]\nreserve-space = \"0\"\n",
          "limits": {
            "cpu": "8000m",
            "memory": "16Gi",
            "storage": "2018Gi"
          },
          "replicas": 3,
          "requests": {
            "cpu": "4000m",
            "memory": "8Gi",
            "storage": "2048Gi"
          },
          "storageClassName": "fast-disks"
        },
        "timezone": "UTC",
        "version": "v5.3.1-pre"
      }
    },
    {
      "name": "tc2",
      "type": "TIDB_CLUSTER",
      "spec": {
        "cluster": {
          "name": "tc"
        },
        "pd": {
          "baseImage": "hub-new.pingcap.net/qa/pd",
          "config": "[dashboard]\ninternal-proxy = true  \n",
          "limits": {
            "cpu": "2000m",
            "memory": "4Gi"
          },
          "replicas": 1,
          "requests": {
            "cpu": "2000m",
            "memory": "4Gi"
          }
        },
        "tidb": {
          "baseImage": "hub-new.pingcap.net/qa/tidb",
          "config": "[log]\n# Log level: debug, info, warn, error, fatal.\nlevel = \"info\"\n",
          "limits": {
            "cpu": "8000m",
            "memory": "16Gi"
          },
          "replicas": 1,
          "requests": {
            "cpu": "2000m",
            "memory": "4Gi"
          }
        },
        "tikv": {
          "baseImage": "hub-new.pingcap.net/qa/tikv",
          "config": "## Log levels: trace, debug, info, warning, error, critical.\n## Note that debug and trace are only available in development builds.\nlog-level = \"info\"\n[storage]\nreserve-space = \"0\"\n",
          "limits": {
            "cpu": "8000m",
            "memory": "16Gi",
            "storage": "1024Gi"
          },
          "replicas": 2,
          "requests": {
            "cpu": "4000m",
            "memory": "8Gi",
            "storage": "1024Gi"
          },
          "storageClassName": "fast-disks"
        },
        "timezone": "UTC",
        "version": "v5.3.1-pre"
      }
    },
    {
      "name": "br",
      "type": "BR_NODE",
      "spec": {
        "artifact": {
          "artifactPaths": [
            "/tmp/br.log*"
          ]
        },
        "image": "hub-new.pingcap.net/qa/br:master"
      }
    },
    {
      "name": "benchtoolset",
      "type": "WORKLOAD_NODE",
      "spec": {
        "container": {
          "command": [
            "tail",
            "-f",
            "/dev/null"
          ],
          "image": "hub.pingcap.net/perf_testing/bench-toolset:latest",
          "name": "benchtoolset",
          "resources": {
            "requests": {
              "cpu": "8000m",
              "memory": "16Gi"
            }
          }
        }
      }
    }
  ],
  "reclaimPolicy": {
    "lease": "48h",
    "gcStrategy": {
      "onFailure": {
        "artifact": {
          "monitor": true,
          "log": true
        },
        "reserveEnv": {
          "durationOnWorkingHour": "0h",
          "scaleIn": false,
          "scaleDown": false
        },
        "notification": {
          "feishu": "https://open.feishu.cn/open-apis/bot/v2/hook/259e813d-7676-4876-8de2-962df96f4d8e"
        }
      },
      "onSuccess": {
        "artifact": {
          "monitor": true,
          "log": true
        },
        "reserveEnv": {
          "durationOnWorkingHour": "0h",
          "scaleIn": false,
          "scaleDown": false
        }
      },
      "onCompletion": {
        "artifact": {
          "monitor": true,
          "log": true
        },
        "reserveEnv": {
          "durationOnWorkingHour": "0h",
          "scaleIn": false,
          "scaleDown": false
        }
      }
    }
  }
}
`
	td := commM.TestBed{}
	err := json.Unmarshal([]byte(testbedSpec), &td)
	require.NoError(t, err)
	req := EstimateRequest(td)
	expected := PhysicalResource{CPU: commM.CPUResource{Core: 41}, Memory: commM.MemoryResource{Byte: 85899345920}}
	require.Equal(t, expected, req)
}
