k8s.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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. name string,
  34. ) (*types.NamespaceResponse, error) {
  35. resp := &types.NamespaceResponse{}
  36. err := c.postRequest(
  37. fmt.Sprintf(
  38. "/projects/%d/clusters/%d/namespaces/create",
  39. projectID, clusterID,
  40. ),
  41. &types.CreateNamespaceRequest{
  42. Name: name,
  43. },
  44. resp,
  45. )
  46. return resp, err
  47. }
  48. func (c *Client) GetKubeconfig(
  49. ctx context.Context,
  50. projectID uint,
  51. clusterID uint,
  52. localKubeconfigPath string,
  53. ) (*types.GetTemporaryKubeconfigResponse, error) {
  54. resp := &types.GetTemporaryKubeconfigResponse{}
  55. if localKubeconfigPath != "" {
  56. color.New(color.FgBlue).Printf("using local kubeconfig: %s\n", localKubeconfigPath)
  57. if _, err := os.Stat(localKubeconfigPath); !os.IsNotExist(err) {
  58. file, err := os.Open(localKubeconfigPath)
  59. if err != nil {
  60. return nil, err
  61. }
  62. data, err := io.ReadAll(file)
  63. if err != nil {
  64. return nil, err
  65. }
  66. resp.Kubeconfig = append(resp.Kubeconfig, data...)
  67. return resp, nil
  68. }
  69. }
  70. color.New(color.FgBlue).Println("using remote kubeconfig")
  71. err := c.getRequest(
  72. fmt.Sprintf(
  73. "/projects/%d/clusters/%d/kubeconfig",
  74. projectID, clusterID,
  75. ),
  76. nil,
  77. resp,
  78. )
  79. return resp, err
  80. }
  81. func (c *Client) GetEnvGroup(
  82. ctx context.Context,
  83. projectID, clusterID uint,
  84. namespace string,
  85. req *types.GetEnvGroupRequest,
  86. ) (*types.GetEnvGroupResponse, error) {
  87. resp := &types.GetEnvGroupResponse{}
  88. err := c.getRequest(
  89. fmt.Sprintf(
  90. "/projects/%d/clusters/%d/namespaces/%s/envgroup",
  91. projectID, clusterID,
  92. namespace,
  93. ),
  94. req,
  95. resp,
  96. )
  97. return resp, err
  98. }
  99. func (c *Client) CreateEnvGroup(
  100. ctx context.Context,
  101. projectID, clusterID uint,
  102. namespace string,
  103. req *types.CreateEnvGroupRequest,
  104. ) (*types.EnvGroup, error) {
  105. resp := &types.EnvGroup{}
  106. err := c.postRequest(
  107. fmt.Sprintf(
  108. "/projects/%d/clusters/%d/namespaces/%s/envgroup/create",
  109. projectID, clusterID,
  110. namespace,
  111. ),
  112. req,
  113. resp,
  114. )
  115. return resp, err
  116. }
  117. func (c *Client) CloneEnvGroup(
  118. ctx context.Context,
  119. projectID, clusterID uint,
  120. namespace string,
  121. req *types.CloneEnvGroupRequest,
  122. ) (*types.EnvGroup, error) {
  123. resp := &types.EnvGroup{}
  124. err := c.postRequest(
  125. fmt.Sprintf(
  126. "/projects/%d/clusters/%d/namespaces/%s/envgroup/clone",
  127. projectID, clusterID,
  128. namespace,
  129. ),
  130. req,
  131. resp,
  132. )
  133. return resp, err
  134. }
  135. func (c *Client) GetRelease(
  136. ctx context.Context,
  137. projectID, clusterID uint,
  138. namespace, name string,
  139. ) (*types.GetReleaseResponse, error) {
  140. resp := &types.GetReleaseResponse{}
  141. err := c.getRequest(
  142. fmt.Sprintf(
  143. "/projects/%d/clusters/%d/namespaces/%s/releases/%s/0",
  144. projectID, clusterID,
  145. namespace, name,
  146. ),
  147. nil,
  148. resp,
  149. )
  150. return resp, err
  151. }
  152. func (c *Client) GetJobs(
  153. ctx context.Context,
  154. projectID, clusterID uint,
  155. namespace, name string,
  156. ) ([]v1.Job, error) {
  157. respArr := make([]v1.Job, 0)
  158. resp := &respArr
  159. err := c.getRequest(
  160. fmt.Sprintf(
  161. "/projects/%d/clusters/%d/namespaces/%s/releases/%s/0/jobs",
  162. projectID, clusterID,
  163. namespace, name,
  164. ),
  165. nil,
  166. resp,
  167. )
  168. return *resp, err
  169. }
  170. // GetK8sAllPods gets all pods for a given release
  171. func (c *Client) GetK8sAllPods(
  172. ctx context.Context,
  173. projectID, clusterID uint,
  174. namespace, name string,
  175. ) (*types.GetReleaseAllPodsResponse, error) {
  176. resp := &types.GetReleaseAllPodsResponse{}
  177. err := c.getRequest(
  178. fmt.Sprintf(
  179. "/projects/%d/clusters/%d/namespaces/%s/releases/%s/0/pods/all",
  180. projectID, clusterID,
  181. namespace, name,
  182. ),
  183. nil,
  184. resp,
  185. )
  186. return resp, err
  187. }