k8s.go 3.8 KB

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