api.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. import { baseApi } from "./baseApi";
  2. import { StorageType } from "./types";
  3. /**
  4. * Generic api call format
  5. * @param {string} token - Bearer token.
  6. * @param {Object} params - Body params.
  7. * @param {Object} pathParams - Path params.
  8. * @param {(err: Object, res: Object) => void} callback - Callback function.
  9. */
  10. const checkAuth = baseApi("GET", "/api/auth/check");
  11. const connectECRRegistry = baseApi<
  12. {
  13. name: string;
  14. aws_integration_id: string;
  15. },
  16. { id: number }
  17. >("POST", pathParams => {
  18. return `/api/projects/${pathParams.id}/registries`;
  19. });
  20. const connectGCRRegistry = baseApi<
  21. {
  22. name: string;
  23. gcp_integration_id: string;
  24. url: string;
  25. },
  26. { id: number }
  27. >("POST", pathParams => {
  28. return `/api/projects/${pathParams.id}/registries`;
  29. });
  30. const createAWSIntegration = baseApi<
  31. {
  32. aws_region: string;
  33. aws_cluster_id?: string;
  34. aws_access_key_id: string;
  35. aws_secret_access_key: string;
  36. },
  37. { id: number }
  38. >("POST", pathParams => {
  39. return `/api/projects/${pathParams.id}/integrations/aws`;
  40. });
  41. const createDOCR = baseApi<
  42. {
  43. do_integration_id: number;
  44. docr_name: string;
  45. docr_subscription_tier: string;
  46. },
  47. {
  48. project_id: number;
  49. }
  50. >("POST", pathParams => {
  51. return `/api/projects/${pathParams.project_id}/provision/docr`;
  52. });
  53. const createDOKS = baseApi<
  54. {
  55. do_integration_id: number;
  56. doks_name: string;
  57. do_region: string;
  58. },
  59. {
  60. project_id: number;
  61. }
  62. >("POST", pathParams => {
  63. return `/api/projects/${pathParams.project_id}/provision/doks`;
  64. });
  65. const createEmailVerification = baseApi<{}, {}>("POST", pathParams => {
  66. return `/api/email/verify/initiate`;
  67. });
  68. const createGCPIntegration = baseApi<
  69. {
  70. gcp_region: string;
  71. gcp_key_data: string;
  72. gcp_project_id: string;
  73. },
  74. {
  75. project_id: number;
  76. }
  77. >("POST", pathParams => {
  78. return `/api/projects/${pathParams.project_id}/integrations/gcp`;
  79. });
  80. const createGCR = baseApi<
  81. {
  82. gcp_integration_id: number;
  83. },
  84. {
  85. project_id: number;
  86. }
  87. >("POST", pathParams => {
  88. return `/api/projects/${pathParams.project_id}/provision/gcr`;
  89. });
  90. const createGHAction = baseApi<
  91. {
  92. git_repo: string;
  93. registry_id: number;
  94. image_repo_uri: string;
  95. dockerfile_path: string;
  96. folder_path: string;
  97. git_repo_id: number;
  98. env: any;
  99. },
  100. {
  101. project_id: number;
  102. CLUSTER_ID: number;
  103. RELEASE_NAME: string;
  104. RELEASE_NAMESPACE: string;
  105. }
  106. >("POST", pathParams => {
  107. let { project_id, CLUSTER_ID, RELEASE_NAME, RELEASE_NAMESPACE } = pathParams;
  108. return `/api/projects/${project_id}/ci/actions?cluster_id=${CLUSTER_ID}&name=${RELEASE_NAME}&namespace=${RELEASE_NAMESPACE}`;
  109. });
  110. const createGKE = baseApi<
  111. {
  112. gcp_integration_id: number;
  113. gke_name: string;
  114. },
  115. {
  116. project_id: number;
  117. }
  118. >("POST", pathParams => {
  119. return `/api/projects/${pathParams.project_id}/provision/gke`;
  120. });
  121. const createInvite = baseApi<
  122. {
  123. email: string;
  124. },
  125. {
  126. id: number;
  127. }
  128. >("POST", pathParams => {
  129. return `/api/projects/${pathParams.id}/invites`;
  130. });
  131. const createPasswordReset = baseApi<
  132. {
  133. email: string;
  134. },
  135. {}
  136. >("POST", pathParams => {
  137. return `/api/password/reset/initiate`;
  138. });
  139. const createPasswordResetVerify = baseApi<
  140. {
  141. email: string;
  142. token: string;
  143. token_id: number;
  144. },
  145. {}
  146. >("POST", pathParams => {
  147. return `/api/password/reset/verify`;
  148. });
  149. const createPasswordResetFinalize = baseApi<
  150. {
  151. email: string;
  152. token: string;
  153. token_id: number;
  154. new_password: string;
  155. },
  156. {}
  157. >("POST", pathParams => {
  158. return `/api/password/reset/finalize`;
  159. });
  160. const createProject = baseApi<{ name: string }, {}>("POST", pathParams => {
  161. return `/api/projects`;
  162. });
  163. const createSubdomain = baseApi<
  164. {
  165. release_name: string;
  166. },
  167. {
  168. id: number;
  169. cluster_id: number;
  170. }
  171. >("POST", pathParams => {
  172. let { cluster_id, id } = pathParams;
  173. return `/api/projects/${id}/k8s/subdomain?cluster_id=${cluster_id}`;
  174. });
  175. const deleteCluster = baseApi<
  176. {},
  177. {
  178. project_id: number;
  179. cluster_id: number;
  180. }
  181. >("DELETE", pathParams => {
  182. return `/api/projects/${pathParams.project_id}/clusters/${pathParams.cluster_id}`;
  183. });
  184. const deleteGitRepoIntegration = baseApi<
  185. {},
  186. {
  187. project_id: number;
  188. git_repo_id: number;
  189. }
  190. >("DELETE", pathParams => {
  191. return `/api/projects/${pathParams.project_id}/gitrepos/${pathParams.git_repo_id}`;
  192. });
  193. const deleteInvite = baseApi<{}, { id: number; invId: number }>(
  194. "DELETE",
  195. pathParams => {
  196. return `/api/projects/${pathParams.id}/invites/${pathParams.invId}`;
  197. }
  198. );
  199. const deletePod = baseApi<
  200. {
  201. cluster_id: number;
  202. },
  203. { name: string; namespace: string; id: number }
  204. >("DELETE", pathParams => {
  205. return `/api/projects/${pathParams.id}/k8s/pods`;
  206. });
  207. const deleteProject = baseApi<{}, { id: number }>("DELETE", pathParams => {
  208. return `/api/projects/${pathParams.id}`;
  209. });
  210. const deleteRegistryIntegration = baseApi<
  211. {},
  212. {
  213. project_id: number;
  214. registry_id: number;
  215. }
  216. >("DELETE", pathParams => {
  217. return `/api/projects/${pathParams.project_id}/registries/${pathParams.registry_id}`;
  218. });
  219. const deployTemplate = baseApi<
  220. {
  221. templateName: string;
  222. imageURL?: string;
  223. formValues?: any;
  224. storage: StorageType;
  225. namespace: string;
  226. name: string;
  227. },
  228. {
  229. id: number;
  230. cluster_id: number;
  231. name: string;
  232. version: string;
  233. repo_url?: string;
  234. }
  235. >("POST", pathParams => {
  236. let { cluster_id, id, name, version, repo_url } = pathParams;
  237. if (repo_url) {
  238. return `/api/projects/${id}/deploy/${name}/${version}?cluster_id=${cluster_id}&repo_url=${repo_url}`;
  239. }
  240. return `/api/projects/${id}/deploy/${name}/${version}?cluster_id=${cluster_id}`;
  241. });
  242. const destroyCluster = baseApi<
  243. {
  244. eks_name: string;
  245. },
  246. {
  247. project_id: number;
  248. infra_id: number;
  249. }
  250. >("POST", pathParams => {
  251. return `/api/projects/${pathParams.project_id}/infra/${pathParams.infra_id}/eks/destroy`;
  252. });
  253. const getBranchContents = baseApi<
  254. {
  255. dir: string;
  256. },
  257. {
  258. project_id: number;
  259. git_repo_id: number;
  260. kind: string;
  261. owner: string;
  262. name: string;
  263. branch: string;
  264. }
  265. >("GET", pathParams => {
  266. return `/api/projects/${pathParams.project_id}/gitrepos/${pathParams.git_repo_id}/repos/${pathParams.kind}/${pathParams.owner}/${pathParams.name}/${pathParams.branch}/contents`;
  267. });
  268. const getBranches = baseApi<
  269. {},
  270. {
  271. project_id: number;
  272. git_repo_id: number;
  273. kind: string;
  274. owner: string;
  275. name: string;
  276. }
  277. >("GET", pathParams => {
  278. return `/api/projects/${pathParams.project_id}/gitrepos/${pathParams.git_repo_id}/repos/${pathParams.kind}/${pathParams.owner}/${pathParams.name}/branches`;
  279. });
  280. const getChart = baseApi<
  281. {
  282. namespace: string;
  283. cluster_id: number;
  284. storage: StorageType;
  285. },
  286. { id: number; name: string; revision: number }
  287. >("GET", pathParams => {
  288. return `/api/projects/${pathParams.id}/releases/${pathParams.name}/${pathParams.revision}`;
  289. });
  290. const getCharts = baseApi<
  291. {
  292. namespace: string;
  293. cluster_id: number;
  294. storage: StorageType;
  295. limit: number;
  296. skip: number;
  297. byDate: boolean;
  298. statusFilter: string[];
  299. },
  300. { id: number }
  301. >("GET", pathParams => {
  302. return `/api/projects/${pathParams.id}/releases`;
  303. });
  304. const getChartComponents = baseApi<
  305. {
  306. namespace: string;
  307. cluster_id: number;
  308. storage: StorageType;
  309. },
  310. { id: number; name: string; revision: number }
  311. >("GET", pathParams => {
  312. return `/api/projects/${pathParams.id}/releases/${pathParams.name}/${pathParams.revision}/components`;
  313. });
  314. const getChartControllers = baseApi<
  315. {
  316. namespace: string;
  317. cluster_id: number;
  318. storage: StorageType;
  319. },
  320. { id: number; name: string; revision: number }
  321. >("GET", pathParams => {
  322. return `/api/projects/${pathParams.id}/releases/${pathParams.name}/${pathParams.revision}/controllers`;
  323. });
  324. const getClusterIntegrations = baseApi("GET", "/api/integrations/cluster");
  325. const getClusters = baseApi<{}, { id: number }>("GET", pathParams => {
  326. return `/api/projects/${pathParams.id}/clusters`;
  327. });
  328. const getGitRepoList = baseApi<
  329. {},
  330. {
  331. project_id: number;
  332. git_repo_id: number;
  333. }
  334. >("GET", pathParams => {
  335. return `/api/projects/${pathParams.project_id}/gitrepos/${pathParams.git_repo_id}/repos`;
  336. });
  337. const getGitRepos = baseApi<
  338. {},
  339. {
  340. project_id: number;
  341. }
  342. >("GET", pathParams => {
  343. return `/api/projects/${pathParams.project_id}/gitrepos`;
  344. });
  345. const getImageRepos = baseApi<
  346. {},
  347. {
  348. project_id: number;
  349. registry_id: number;
  350. }
  351. >("GET", pathParams => {
  352. return `/api/projects/${pathParams.project_id}/registries/${pathParams.registry_id}/repositories`;
  353. });
  354. const getImageTags = baseApi<
  355. {},
  356. {
  357. project_id: number;
  358. registry_id: number;
  359. repo_name: string;
  360. }
  361. >("GET", pathParams => {
  362. return `/api/projects/${pathParams.project_id}/registries/${pathParams.registry_id}/repositories/${pathParams.repo_name}`;
  363. });
  364. const getInfra = baseApi<
  365. {},
  366. {
  367. project_id: number;
  368. }
  369. >("GET", pathParams => {
  370. return `/api/projects/${pathParams.project_id}/infra`;
  371. });
  372. const getIngress = baseApi<
  373. {
  374. cluster_id: number;
  375. },
  376. { name: string; namespace: string; id: number }
  377. >("GET", pathParams => {
  378. return `/api/projects/${pathParams.id}/k8s/${pathParams.namespace}/ingress/${pathParams.name}`;
  379. });
  380. const getInvites = baseApi<{}, { id: number }>("GET", pathParams => {
  381. return `/api/projects/${pathParams.id}/invites`;
  382. });
  383. const getMatchingPods = baseApi<
  384. {
  385. cluster_id: number;
  386. selectors: string[];
  387. },
  388. { id: number }
  389. >("GET", pathParams => {
  390. return `/api/projects/${pathParams.id}/k8s/pods`;
  391. });
  392. const getMetrics = baseApi<
  393. {
  394. cluster_id: number;
  395. metric: string;
  396. shouldsum: boolean;
  397. pods: string[];
  398. namespace: string;
  399. startrange: number;
  400. endrange: number;
  401. resolution: string;
  402. },
  403. { id: number }
  404. >("GET", pathParams => {
  405. return `/api/projects/${pathParams.id}/k8s/metrics`;
  406. });
  407. const getNamespaces = baseApi<
  408. {
  409. cluster_id: number;
  410. },
  411. { id: number }
  412. >("GET", pathParams => {
  413. return `/api/projects/${pathParams.id}/k8s/namespaces`;
  414. });
  415. const getNGINXIngresses = baseApi<
  416. {
  417. cluster_id: number;
  418. },
  419. { id: number }
  420. >("GET", pathParams => {
  421. return `/api/projects/${pathParams.id}/k8s/prometheus/ingresses`;
  422. });
  423. const getOAuthIds = baseApi<
  424. {},
  425. {
  426. project_id: number;
  427. }
  428. >("GET", pathParams => {
  429. return `/api/projects/${pathParams.project_id}/integrations/oauth`;
  430. });
  431. const getProjectClusters = baseApi<{}, { id: number }>("GET", pathParams => {
  432. return `/api/projects/${pathParams.id}/clusters`;
  433. });
  434. const getProjectRegistries = baseApi<{}, { id: number }>("GET", pathParams => {
  435. return `/api/projects/${pathParams.id}/registries`;
  436. });
  437. const getProjectRepos = baseApi<{}, { id: number }>("GET", pathParams => {
  438. return `/api/projects/${pathParams.id}/repos`;
  439. });
  440. const getProjects = baseApi<{}, { id: number }>("GET", pathParams => {
  441. return `/api/users/${pathParams.id}/projects`;
  442. });
  443. const getPrometheusIsInstalled = baseApi<
  444. {
  445. cluster_id: number;
  446. },
  447. { id: number }
  448. >("GET", pathParams => {
  449. return `/api/projects/${pathParams.id}/k8s/prometheus/detect`;
  450. });
  451. const getRegistryIntegrations = baseApi("GET", "/api/integrations/registry");
  452. const getReleaseToken = baseApi<
  453. {
  454. namespace: string;
  455. cluster_id: number;
  456. storage: StorageType;
  457. },
  458. { name: string; id: number }
  459. >("GET", pathParams => {
  460. return `/api/projects/${pathParams.id}/releases/${pathParams.name}/webhook_token`;
  461. });
  462. const destroyEKS = baseApi<
  463. {
  464. eks_name: string;
  465. },
  466. {
  467. project_id: number;
  468. infra_id: number;
  469. }
  470. >("POST", pathParams => {
  471. return `/api/projects/${pathParams.project_id}/infra/${pathParams.infra_id}/eks/destroy`;
  472. });
  473. const destroyGKE = baseApi<
  474. {
  475. gke_name: string;
  476. },
  477. {
  478. project_id: number;
  479. infra_id: number;
  480. }
  481. >("POST", pathParams => {
  482. return `/api/projects/${pathParams.project_id}/infra/${pathParams.infra_id}/gke/destroy`;
  483. });
  484. const destroyDOKS = baseApi<
  485. {
  486. doks_name: string;
  487. },
  488. {
  489. project_id: number;
  490. infra_id: number;
  491. }
  492. >("POST", pathParams => {
  493. return `/api/projects/${pathParams.project_id}/infra/${pathParams.infra_id}/doks/destroy`;
  494. });
  495. const getRepoIntegrations = baseApi("GET", "/api/integrations/repo");
  496. const getRepos = baseApi<{}, { id: number }>("GET", pathParams => {
  497. return `/api/projects/${pathParams.id}/repos`;
  498. });
  499. const getRevisions = baseApi<
  500. {
  501. namespace: string;
  502. cluster_id: number;
  503. storage: StorageType;
  504. },
  505. { id: number; name: string }
  506. >("GET", pathParams => {
  507. return `/api/projects/${pathParams.id}/releases/${pathParams.name}/history`;
  508. });
  509. const getTemplateInfo = baseApi<
  510. {
  511. repo_url?: string;
  512. },
  513. { name: string; version: string }
  514. >("GET", pathParams => {
  515. return `/api/templates/${pathParams.name}/${pathParams.version}`;
  516. });
  517. const getAddonTemplates = baseApi("GET", "/api/templates");
  518. const getApplicationTemplates = baseApi<
  519. {
  520. repo_url?: string;
  521. },
  522. {}
  523. >("GET", "/api/templates");
  524. const getUser = baseApi<{}, { id: number }>("GET", pathParams => {
  525. return `/api/users/${pathParams.id}`;
  526. });
  527. const linkGithubProject = baseApi<
  528. {},
  529. {
  530. project_id: number;
  531. }
  532. >("GET", pathParams => {
  533. return `/api/oauth/projects/${pathParams.project_id}/github`;
  534. });
  535. const logInUser = baseApi<{
  536. email: string;
  537. password: string;
  538. }>("POST", "/api/login");
  539. const logOutUser = baseApi("POST", "/api/logout");
  540. const provisionECR = baseApi<
  541. {
  542. ecr_name: string;
  543. aws_integration_id: string;
  544. },
  545. { id: number }
  546. >("POST", pathParams => {
  547. return `/api/projects/${pathParams.id}/provision/ecr`;
  548. });
  549. const provisionEKS = baseApi<
  550. {
  551. eks_name: string;
  552. aws_integration_id: string;
  553. },
  554. { id: number }
  555. >("POST", pathParams => {
  556. return `/api/projects/${pathParams.id}/provision/eks`;
  557. });
  558. const registerUser = baseApi<{
  559. email: string;
  560. password: string;
  561. }>("POST", "/api/users");
  562. const rollbackChart = baseApi<
  563. {
  564. namespace: string;
  565. storage: StorageType;
  566. revision: number;
  567. },
  568. {
  569. id: number;
  570. name: string;
  571. cluster_id: number;
  572. }
  573. >("POST", pathParams => {
  574. let { id, name, cluster_id } = pathParams;
  575. return `/api/projects/${id}/releases/${name}/rollback?cluster_id=${cluster_id}`;
  576. });
  577. const uninstallTemplate = baseApi<
  578. {},
  579. {
  580. id: number;
  581. name: string;
  582. cluster_id: number;
  583. namespace: string;
  584. storage: StorageType;
  585. }
  586. >("POST", pathParams => {
  587. let { id, name, cluster_id, storage, namespace } = pathParams;
  588. return `/api/projects/${id}/delete/${name}?cluster_id=${cluster_id}&namespace=${namespace}&storage=${storage}`;
  589. });
  590. const updateUser = baseApi<
  591. {
  592. rawKubeConfig?: string;
  593. allowedContexts?: string[];
  594. },
  595. { id: number }
  596. >("PUT", pathParams => {
  597. return `/api/users/${pathParams.id}`;
  598. });
  599. const upgradeChartValues = baseApi<
  600. {
  601. namespace: string;
  602. storage: StorageType;
  603. values: string;
  604. },
  605. {
  606. id: number;
  607. name: string;
  608. cluster_id: number;
  609. }
  610. >("POST", pathParams => {
  611. let { id, name, cluster_id } = pathParams;
  612. return `/api/projects/${id}/releases/${name}/upgrade?cluster_id=${cluster_id}`;
  613. });
  614. // Bundle export to allow default api import (api.<method> is more readable)
  615. export default {
  616. checkAuth,
  617. connectECRRegistry,
  618. connectGCRRegistry,
  619. createAWSIntegration,
  620. createDOCR,
  621. createDOKS,
  622. createEmailVerification,
  623. createGCPIntegration,
  624. createGCR,
  625. createGHAction,
  626. createGKE,
  627. createInvite,
  628. createPasswordReset,
  629. createPasswordResetVerify,
  630. createPasswordResetFinalize,
  631. createProject,
  632. deleteCluster,
  633. deleteGitRepoIntegration,
  634. deleteInvite,
  635. deletePod,
  636. deleteProject,
  637. deleteRegistryIntegration,
  638. createSubdomain,
  639. deployTemplate,
  640. destroyEKS,
  641. destroyGKE,
  642. destroyDOKS,
  643. getBranchContents,
  644. getBranches,
  645. getChart,
  646. getCharts,
  647. getChartComponents,
  648. getChartControllers,
  649. getClusterIntegrations,
  650. getClusters,
  651. getGitRepoList,
  652. getGitRepos,
  653. getImageRepos,
  654. getImageTags,
  655. getInfra,
  656. getIngress,
  657. getInvites,
  658. getMatchingPods,
  659. getMetrics,
  660. getNamespaces,
  661. getNGINXIngresses,
  662. getOAuthIds,
  663. getProjectClusters,
  664. getProjectRegistries,
  665. getProjectRepos,
  666. getProjects,
  667. getPrometheusIsInstalled,
  668. getRegistryIntegrations,
  669. getReleaseToken,
  670. getRepoIntegrations,
  671. getRepos,
  672. getRevisions,
  673. getTemplateInfo,
  674. getAddonTemplates,
  675. getApplicationTemplates,
  676. getUser,
  677. linkGithubProject,
  678. logInUser,
  679. logOutUser,
  680. provisionECR,
  681. provisionEKS,
  682. registerUser,
  683. rollbackChart,
  684. uninstallTemplate,
  685. updateUser,
  686. upgradeChartValues
  687. };