k8s.go 3.8 KB

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