project.go 6.7 KB

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