k8s.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package client
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "os"
  7. "strings"
  8. "github.com/fatih/color"
  9. "github.com/porter-dev/porter/api/types"
  10. v1 "k8s.io/api/batch/v1"
  11. )
  12. // GetK8sNamespaces gets a namespaces list in a k8s cluster
  13. func (c *Client) GetK8sNamespaces(
  14. ctx context.Context,
  15. projectID uint,
  16. clusterID uint,
  17. ) (*types.ListNamespacesResponse, error) {
  18. resp := &types.ListNamespacesResponse{}
  19. err := c.getRequest(
  20. fmt.Sprintf(
  21. "/projects/%d/clusters/%d/namespaces",
  22. projectID, clusterID,
  23. ),
  24. nil,
  25. resp,
  26. )
  27. return resp, err
  28. }
  29. // CreateNewK8sNamespace creates a new namespace in a k8s cluster
  30. func (c *Client) CreateNewK8sNamespace(
  31. ctx context.Context,
  32. projectID uint,
  33. clusterID uint,
  34. req *types.CreateNamespaceRequest,
  35. ) (*types.NamespaceResponse, error) {
  36. if req == nil {
  37. return nil, fmt.Errorf("invalid request body for creating namespace")
  38. }
  39. resp := &types.NamespaceResponse{}
  40. err := c.postRequest(
  41. fmt.Sprintf(
  42. "/projects/%d/clusters/%d/namespaces/create",
  43. projectID, clusterID,
  44. ),
  45. req,
  46. resp,
  47. )
  48. return resp, err
  49. }
  50. func (c *Client) GetKubeconfig(
  51. ctx context.Context,
  52. projectID uint,
  53. clusterID uint,
  54. localKubeconfigPath string,
  55. ) (*types.GetTemporaryKubeconfigResponse, error) {
  56. resp := &types.GetTemporaryKubeconfigResponse{}
  57. if localKubeconfigPath != "" {
  58. color.New(color.FgBlue).Fprintf(os.Stderr, "using local kubeconfig: %s\n", localKubeconfigPath)
  59. if _, err := os.Stat(localKubeconfigPath); !os.IsNotExist(err) {
  60. file, err := os.Open(localKubeconfigPath)
  61. if err != nil {
  62. return nil, err
  63. }
  64. data, err := io.ReadAll(file)
  65. if err != nil {
  66. return nil, err
  67. }
  68. resp.Kubeconfig = append(resp.Kubeconfig, data...)
  69. return resp, nil
  70. }
  71. }
  72. color.New(color.FgBlue).Fprintln(os.Stderr, "using remote kubeconfig")
  73. err := c.getRequest(
  74. fmt.Sprintf(
  75. "/projects/%d/clusters/%d/kubeconfig",
  76. projectID, clusterID,
  77. ),
  78. nil,
  79. resp,
  80. )
  81. if err != nil && strings.Contains(err.Error(), "404") {
  82. return nil, fmt.Errorf("temporary kubeconfig generation is disabled, please use a local kubeconfig")
  83. }
  84. return resp, err
  85. }
  86. func (c *Client) GetEnvGroup(
  87. ctx context.Context,
  88. projectID, clusterID uint,
  89. namespace string,
  90. req *types.GetEnvGroupRequest,
  91. ) (*types.GetEnvGroupResponse, error) {
  92. resp := &types.GetEnvGroupResponse{}
  93. err := c.getRequest(
  94. fmt.Sprintf(
  95. "/projects/%d/clusters/%d/namespaces/%s/envgroup",
  96. projectID, clusterID,
  97. namespace,
  98. ),
  99. req,
  100. resp,
  101. )
  102. return resp, err
  103. }
  104. func (c *Client) CreateEnvGroup(
  105. ctx context.Context,
  106. projectID, clusterID uint,
  107. namespace string,
  108. req *types.CreateEnvGroupRequest,
  109. ) (*types.EnvGroup, error) {
  110. resp := &types.EnvGroup{}
  111. err := c.postRequest(
  112. fmt.Sprintf(
  113. "/projects/%d/clusters/%d/namespaces/%s/envgroup/create",
  114. projectID, clusterID,
  115. namespace,
  116. ),
  117. req,
  118. resp,
  119. )
  120. return resp, err
  121. }
  122. func (c *Client) CloneEnvGroup(
  123. ctx context.Context,
  124. projectID, clusterID uint,
  125. namespace string,
  126. req *types.CloneEnvGroupRequest,
  127. ) (*types.EnvGroup, error) {
  128. resp := &types.EnvGroup{}
  129. err := c.postRequest(
  130. fmt.Sprintf(
  131. "/projects/%d/clusters/%d/namespaces/%s/envgroup/clone",
  132. projectID, clusterID,
  133. namespace,
  134. ),
  135. req,
  136. resp,
  137. )
  138. return resp, err
  139. }
  140. func (c *Client) GetRelease(
  141. ctx context.Context,
  142. projectID, clusterID uint,
  143. namespace, name string,
  144. ) (*types.GetReleaseResponse, error) {
  145. resp := &types.GetReleaseResponse{}
  146. err := c.getRequest(
  147. fmt.Sprintf(
  148. "/projects/%d/clusters/%d/namespaces/%s/releases/%s/0",
  149. projectID, clusterID,
  150. namespace, name,
  151. ),
  152. nil,
  153. resp,
  154. )
  155. return resp, err
  156. }
  157. func (c *Client) GetJobs(
  158. ctx context.Context,
  159. projectID, clusterID uint,
  160. namespace, name string,
  161. ) ([]v1.Job, error) {
  162. respArr := make([]v1.Job, 0)
  163. resp := &respArr
  164. err := c.getRequest(
  165. fmt.Sprintf(
  166. "/projects/%d/clusters/%d/namespaces/%s/releases/%s/0/jobs",
  167. projectID, clusterID,
  168. namespace, name,
  169. ),
  170. nil,
  171. resp,
  172. )
  173. return *resp, err
  174. }
  175. // GetK8sAllPods gets all pods for a given release
  176. func (c *Client) GetK8sAllPods(
  177. ctx context.Context,
  178. projectID, clusterID uint,
  179. namespace, name string,
  180. ) (*types.GetReleaseAllPodsResponse, error) {
  181. resp := &types.GetReleaseAllPodsResponse{}
  182. err := c.getRequest(
  183. fmt.Sprintf(
  184. "/projects/%d/clusters/%d/namespaces/%s/releases/%s/0/pods/all",
  185. projectID, clusterID,
  186. namespace, name,
  187. ),
  188. nil,
  189. resp,
  190. )
  191. return resp, err
  192. }