k8s.go 4.2 KB

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