project.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package client
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/porter-dev/porter/internal/models"
  10. )
  11. // GetProjectResponse is the response returned after querying for a
  12. // given project
  13. type GetProjectResponse types.Project
  14. // GetProject retrieves a project by id
  15. func (c *Client) GetProject(ctx context.Context, projectID uint) (*GetProjectResponse, error) {
  16. req, err := http.NewRequest(
  17. "GET",
  18. fmt.Sprintf("%s/projects/%d", c.BaseURL, projectID),
  19. nil,
  20. )
  21. if err != nil {
  22. return nil, err
  23. }
  24. req = req.WithContext(ctx)
  25. bodyResp := &GetProjectResponse{}
  26. if httpErr, err := c.sendRequest(req, bodyResp, true); httpErr != nil || err != nil {
  27. if httpErr != nil {
  28. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  29. }
  30. return nil, err
  31. }
  32. return bodyResp, nil
  33. }
  34. // GetProjectClusterResponse is the response returned after querying for a
  35. // given project's cluster
  36. type GetProjectClusterResponse models.ClusterExternal
  37. // GetProjectCluster retrieves a project's cluster by id
  38. func (c *Client) GetProjectCluster(
  39. ctx context.Context,
  40. projectID uint,
  41. clusterID uint,
  42. ) (*GetProjectClusterResponse, error) {
  43. req, err := http.NewRequest(
  44. "GET",
  45. fmt.Sprintf("%s/projects/%d/clusters/%d", c.BaseURL, projectID, clusterID),
  46. nil,
  47. )
  48. if err != nil {
  49. return nil, err
  50. }
  51. req = req.WithContext(ctx)
  52. bodyResp := &GetProjectClusterResponse{}
  53. if httpErr, err := c.sendRequest(req, bodyResp, true); httpErr != nil || err != nil {
  54. if httpErr != nil {
  55. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  56. }
  57. return nil, err
  58. }
  59. return bodyResp, nil
  60. }
  61. // ListProjectClustersResponse lists the linked clusters for a project
  62. type ListProjectClustersResponse []models.ClusterExternal
  63. // ListProjectClusters creates a list of clusters for a given project
  64. func (c *Client) ListProjectClusters(
  65. ctx context.Context,
  66. projectID uint,
  67. ) (ListProjectClustersResponse, error) {
  68. req, err := http.NewRequest(
  69. "GET",
  70. fmt.Sprintf("%s/projects/%d/clusters", c.BaseURL, projectID),
  71. nil,
  72. )
  73. if err != nil {
  74. return nil, err
  75. }
  76. req = req.WithContext(ctx)
  77. bodyResp := ListProjectClustersResponse{}
  78. if httpErr, err := c.sendRequest(req, &bodyResp, true); httpErr != nil || err != nil {
  79. if httpErr != nil {
  80. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  81. }
  82. return nil, err
  83. }
  84. return bodyResp, nil
  85. }
  86. // CreateProjectRequest represents the accepted fields for creating a project
  87. type CreateProjectRequest struct {
  88. Name string `json:"name" form:"required"`
  89. }
  90. // CreateProjectResponse is the resulting project after creation
  91. type CreateProjectResponse types.Project
  92. // CreateProject creates a project with the given request options
  93. func (c *Client) CreateProject(
  94. ctx context.Context,
  95. createProjectRequest *CreateProjectRequest,
  96. ) (*CreateProjectResponse, error) {
  97. data, err := json.Marshal(createProjectRequest)
  98. if err != nil {
  99. return nil, err
  100. }
  101. req, err := http.NewRequest(
  102. "POST",
  103. fmt.Sprintf("%s/projects", c.BaseURL),
  104. strings.NewReader(string(data)),
  105. )
  106. if err != nil {
  107. return nil, err
  108. }
  109. req = req.WithContext(ctx)
  110. bodyResp := &CreateProjectResponse{}
  111. if httpErr, err := c.sendRequest(req, bodyResp, true); httpErr != nil || err != nil {
  112. if httpErr != nil {
  113. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  114. }
  115. return nil, err
  116. }
  117. return bodyResp, nil
  118. }
  119. // CreateProjectCandidatesRequest creates a project service account candidate,
  120. // which can be resolved to create a service account
  121. type CreateProjectCandidatesRequest struct {
  122. Kubeconfig string `json:"kubeconfig"`
  123. IsLocal bool `json:"is_local"`
  124. }
  125. // CreateProjectCandidatesResponse is the list of candidates returned after
  126. // creating the candidates
  127. type CreateProjectCandidatesResponse []*models.ClusterCandidateExternal
  128. // CreateProjectCandidates creates a service account candidate for a given project,
  129. // accepting a kubeconfig that gets parsed into a candidate
  130. func (c *Client) CreateProjectCandidates(
  131. ctx context.Context,
  132. projectID uint,
  133. createCandidatesRequest *CreateProjectCandidatesRequest,
  134. ) (CreateProjectCandidatesResponse, error) {
  135. data, err := json.Marshal(createCandidatesRequest)
  136. if err != nil {
  137. return nil, err
  138. }
  139. req, err := http.NewRequest(
  140. "POST",
  141. fmt.Sprintf("%s/projects/%d/clusters/candidates", c.BaseURL, projectID),
  142. strings.NewReader(string(data)),
  143. )
  144. if err != nil {
  145. return nil, err
  146. }
  147. req = req.WithContext(ctx)
  148. bodyResp := CreateProjectCandidatesResponse{}
  149. if httpErr, err := c.sendRequest(req, &bodyResp, true); httpErr != nil || err != nil {
  150. if httpErr != nil {
  151. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  152. }
  153. return nil, err
  154. }
  155. return bodyResp, nil
  156. }
  157. // GetProjectCandidatesResponse is the list of service account candidates
  158. type GetProjectCandidatesResponse []*models.ClusterCandidateExternal
  159. // GetProjectCandidates returns the service account candidates for a given
  160. // project id
  161. func (c *Client) GetProjectCandidates(
  162. ctx context.Context,
  163. projectID uint,
  164. ) (GetProjectCandidatesResponse, error) {
  165. req, err := http.NewRequest(
  166. "GET",
  167. fmt.Sprintf("%s/projects/%d/clusters/candidates", c.BaseURL, projectID),
  168. nil,
  169. )
  170. if err != nil {
  171. return nil, err
  172. }
  173. req = req.WithContext(ctx)
  174. bodyResp := GetProjectCandidatesResponse{}
  175. if httpErr, err := c.sendRequest(req, &bodyResp, true); httpErr != nil || err != nil {
  176. if httpErr != nil {
  177. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  178. }
  179. return nil, err
  180. }
  181. return bodyResp, nil
  182. }
  183. // CreateProjectClusterResponse is the cluster that gets
  184. // returned after the candidate has been resolved
  185. type CreateProjectClusterResponse models.ClusterExternal
  186. // CreateProjectCluster creates a cluster given a project id
  187. // and a candidate id, which gets resolved using the list of actions
  188. func (c *Client) CreateProjectCluster(
  189. ctx context.Context,
  190. projectID uint,
  191. candidateID uint,
  192. createReq *models.ClusterResolverAll,
  193. ) (*CreateProjectClusterResponse, error) {
  194. data, err := json.Marshal(&createReq)
  195. if err != nil {
  196. return nil, err
  197. }
  198. req, err := http.NewRequest(
  199. "POST",
  200. fmt.Sprintf("%s/projects/%d/clusters/candidates/%d/resolve", c.BaseURL, projectID, candidateID),
  201. strings.NewReader(string(data)),
  202. )
  203. if err != nil {
  204. return nil, err
  205. }
  206. req = req.WithContext(ctx)
  207. bodyResp := &CreateProjectClusterResponse{}
  208. if httpErr, err := c.sendRequest(req, bodyResp, true); httpErr != nil || err != nil {
  209. if httpErr != nil {
  210. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  211. }
  212. return nil, err
  213. }
  214. return bodyResp, nil
  215. }
  216. // DeleteProjectCluster deletes a cluster given a project id and cluster id
  217. func (c *Client) DeleteProjectCluster(
  218. ctx context.Context,
  219. projectID uint,
  220. clusterID uint,
  221. ) error {
  222. req, err := http.NewRequest(
  223. "DELETE",
  224. fmt.Sprintf("%s/projects/%d/clusters/%d", c.BaseURL, projectID, clusterID),
  225. nil,
  226. )
  227. if err != nil {
  228. return err
  229. }
  230. req = req.WithContext(ctx)
  231. if httpErr, err := c.sendRequest(req, nil, true); httpErr != nil || err != nil {
  232. if httpErr != nil {
  233. return fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  234. }
  235. return err
  236. }
  237. return nil
  238. }
  239. // DeleteProjectResponse is the object returned after project deletion
  240. type DeleteProjectResponse types.Project
  241. // DeleteProject deletes a project by id
  242. func (c *Client) DeleteProject(ctx context.Context, projectID uint) (*DeleteProjectResponse, error) {
  243. req, err := http.NewRequest(
  244. "DELETE",
  245. fmt.Sprintf("%s/projects/%d", c.BaseURL, projectID),
  246. nil,
  247. )
  248. if err != nil {
  249. return nil, err
  250. }
  251. req = req.WithContext(ctx)
  252. bodyResp := &DeleteProjectResponse{}
  253. if httpErr, err := c.sendRequest(req, bodyResp, true); httpErr != nil || err != nil {
  254. if httpErr != nil {
  255. return nil, fmt.Errorf("code %d, errors %v", httpErr.Code, httpErr.Errors)
  256. }
  257. return nil, err
  258. }
  259. return bodyResp, nil
  260. }