k8s.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package k8s
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "text/template"
  7. )
  8. const (
  9. ServiceTypeApi ServiceType = "api"
  10. ServiceTypeRpc ServiceType = "rpc"
  11. ServiceTypeJob ServiceType = "job"
  12. envDev = "dev"
  13. )
  14. var errUnknownServiceType = errors.New("unknown service type")
  15. type (
  16. ServiceType string
  17. K8sRequest struct {
  18. Env string
  19. ServiceName string
  20. ServiceType ServiceType
  21. Namespace string
  22. Schedule string
  23. Replicas int
  24. RevisionHistoryLimit int
  25. Port int
  26. LimitCpu int
  27. LimitMem int
  28. RequestCpu int
  29. RequestMem int
  30. SuccessfulJobsHistoryLimit int
  31. HpaMinReplicas int
  32. HpaMaxReplicas int
  33. }
  34. )
  35. func Gen(req K8sRequest) (string, error) {
  36. switch req.ServiceType {
  37. case ServiceTypeApi, ServiceTypeRpc:
  38. return genApiRpc(req)
  39. case ServiceTypeJob:
  40. return genJob(req)
  41. default:
  42. return "", errUnknownServiceType
  43. }
  44. }
  45. func genApiRpc(req K8sRequest) (string, error) {
  46. t, err := template.New("api_rpc").Parse(apiRpcTmeplate)
  47. if err != nil {
  48. return "", err
  49. }
  50. buffer := new(bytes.Buffer)
  51. err = t.Execute(buffer, map[string]interface{}{
  52. "name": fmt.Sprintf("%s-%s", req.ServiceName, req.ServiceType),
  53. "namespace": req.Namespace,
  54. "replicas": req.Replicas,
  55. "revisionHistoryLimit": req.RevisionHistoryLimit,
  56. "port": req.Port,
  57. "limitCpu": req.LimitCpu,
  58. "limitMem": req.LimitMem,
  59. "requestCpu": req.RequestCpu,
  60. "requestMem": req.RequestMem,
  61. "serviceName": req.ServiceName,
  62. "env": req.Env,
  63. "envIsPreOrPro": req.Env != envDev,
  64. "envIsDev": req.Env == envDev,
  65. "minReplicas": req.HpaMinReplicas,
  66. "maxReplicas": req.HpaMaxReplicas,
  67. })
  68. if err != nil {
  69. return "", nil
  70. }
  71. return buffer.String(), nil
  72. }
  73. func genJob(req K8sRequest) (string, error) {
  74. t, err := template.New("job").Parse(jobTmeplate)
  75. if err != nil {
  76. return "", err
  77. }
  78. buffer := new(bytes.Buffer)
  79. err = t.Execute(buffer, map[string]interface{}{
  80. "name": fmt.Sprintf("%s-%s", req.ServiceName, req.ServiceType),
  81. "namespace": req.Namespace,
  82. "schedule": req.Schedule,
  83. "successfulJobsHistoryLimit": req.SuccessfulJobsHistoryLimit,
  84. "limitCpu": req.LimitCpu,
  85. "limitMem": req.LimitMem,
  86. "requestCpu": req.RequestCpu,
  87. "requestMem": req.RequestMem,
  88. "serviceName": req.ServiceName,
  89. "env": req.Env,
  90. })
  91. if err != nil {
  92. return "", nil
  93. }
  94. return buffer.String(), nil
  95. }