router.go 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378
  1. package router
  2. import (
  3. "net/http"
  4. "os"
  5. "path"
  6. "strings"
  7. "github.com/go-chi/chi"
  8. "github.com/porter-dev/porter/internal/auth/token"
  9. "github.com/porter-dev/porter/server/api"
  10. "github.com/porter-dev/porter/server/requestlog"
  11. mw "github.com/porter-dev/porter/server/router/middleware"
  12. )
  13. // New creates a new Chi router instance and registers all routes supported by the
  14. // API
  15. func New(a *api.App) *chi.Mux {
  16. l := a.Logger
  17. r := chi.NewRouter()
  18. auth := mw.NewAuth(a.Store, a.ServerConf.CookieName, &token.TokenGeneratorConf{
  19. TokenSecret: a.ServerConf.TokenGeneratorSecret,
  20. }, a.Repo)
  21. r.Route("/api", func(r chi.Router) {
  22. r.Use(mw.ContentTypeJSON)
  23. // health checks
  24. r.Method("GET", "/livez", http.HandlerFunc(a.HandleLive))
  25. r.Method("GET", "/readyz", http.HandlerFunc(a.HandleReady))
  26. // /api/users routes
  27. r.Method(
  28. "GET",
  29. "/users/{user_id}",
  30. auth.DoesUserIDMatch(
  31. requestlog.NewHandler(a.HandleReadUser, l),
  32. mw.URLParam,
  33. ),
  34. )
  35. r.Method(
  36. "GET",
  37. "/users/{user_id}/projects",
  38. auth.DoesUserIDMatch(
  39. requestlog.NewHandler(a.HandleListUserProjects, l),
  40. mw.URLParam,
  41. ),
  42. )
  43. r.Method(
  44. "POST",
  45. "/users",
  46. requestlog.NewHandler(a.HandleCreateUser, l),
  47. )
  48. r.Method(
  49. "DELETE",
  50. "/users/{user_id}",
  51. auth.DoesUserIDMatch(
  52. requestlog.NewHandler(a.HandleDeleteUser, l),
  53. mw.URLParam,
  54. ),
  55. )
  56. r.Method(
  57. "GET",
  58. "/cli/login",
  59. auth.BasicAuthenticateWithRedirect(
  60. requestlog.NewHandler(a.HandleCLILoginUser, l),
  61. ),
  62. )
  63. r.Method(
  64. "GET",
  65. "/cli/login/exchange",
  66. requestlog.NewHandler(a.HandleCLILoginExchangeToken, l),
  67. )
  68. r.Method(
  69. "POST",
  70. "/login",
  71. requestlog.NewHandler(a.HandleLoginUser, l),
  72. )
  73. r.Method(
  74. "GET",
  75. "/auth/check",
  76. auth.BasicAuthenticate(
  77. requestlog.NewHandler(a.HandleAuthCheck, l),
  78. ),
  79. )
  80. r.Method(
  81. "POST",
  82. "/logout",
  83. auth.BasicAuthenticate(
  84. requestlog.NewHandler(a.HandleLogoutUser, l),
  85. ),
  86. )
  87. r.Method(
  88. "POST",
  89. "/email/verify/initiate",
  90. auth.BasicAuthenticate(
  91. requestlog.NewHandler(a.InitiateEmailVerifyUser, l),
  92. ),
  93. )
  94. r.Method(
  95. "GET",
  96. "/email/verify/finalize",
  97. auth.BasicAuthenticateWithRedirect(
  98. requestlog.NewHandler(a.FinalizEmailVerifyUser, l),
  99. ),
  100. )
  101. r.Method(
  102. "POST",
  103. "/password/reset/initiate",
  104. requestlog.NewHandler(a.InitiatePWResetUser, l),
  105. )
  106. r.Method(
  107. "POST",
  108. "/password/reset/verify",
  109. requestlog.NewHandler(a.VerifyPWResetUser, l),
  110. )
  111. r.Method(
  112. "POST",
  113. "/password/reset/finalize",
  114. requestlog.NewHandler(a.FinalizPWResetUser, l),
  115. )
  116. // /api/integrations routes
  117. r.Method(
  118. "GET",
  119. "/integrations/cluster",
  120. auth.BasicAuthenticate(
  121. requestlog.NewHandler(a.HandleListClusterIntegrations, l),
  122. ),
  123. )
  124. r.Method(
  125. "GET",
  126. "/integrations/registry",
  127. auth.BasicAuthenticate(
  128. requestlog.NewHandler(a.HandleListRegistryIntegrations, l),
  129. ),
  130. )
  131. r.Method(
  132. "GET",
  133. "/integrations/helm",
  134. auth.BasicAuthenticate(
  135. requestlog.NewHandler(a.HandleListHelmRepoIntegrations, l),
  136. ),
  137. )
  138. r.Method(
  139. "GET",
  140. "/integrations/repo",
  141. auth.BasicAuthenticate(
  142. requestlog.NewHandler(a.HandleListRepoIntegrations, l),
  143. ),
  144. )
  145. // /api/templates routes
  146. r.Method(
  147. "GET",
  148. "/templates",
  149. auth.BasicAuthenticate(
  150. requestlog.NewHandler(a.HandleListTemplates, l),
  151. ),
  152. )
  153. r.Method(
  154. "GET",
  155. "/templates/{name}/{version}",
  156. auth.BasicAuthenticate(
  157. requestlog.NewHandler(a.HandleReadTemplate, l),
  158. ),
  159. )
  160. // /api/oauth routes
  161. r.Method(
  162. "GET",
  163. "/oauth/projects/{project_id}/github",
  164. auth.DoesUserHaveProjectAccess(
  165. requestlog.NewHandler(a.HandleGithubOAuthStartProject, l),
  166. mw.URLParam,
  167. mw.WriteAccess,
  168. ),
  169. )
  170. r.Method(
  171. "GET",
  172. "/oauth/login/github",
  173. requestlog.NewHandler(a.HandleGithubOAuthStartUser, l),
  174. )
  175. r.Method(
  176. "GET",
  177. "/oauth/github/callback",
  178. requestlog.NewHandler(a.HandleGithubOAuthCallback, l),
  179. )
  180. r.Method(
  181. "GET",
  182. "/oauth/projects/{project_id}/digitalocean",
  183. auth.DoesUserHaveProjectAccess(
  184. requestlog.NewHandler(a.HandleDOOAuthStartProject, l),
  185. mw.URLParam,
  186. mw.WriteAccess,
  187. ),
  188. )
  189. r.Method(
  190. "GET",
  191. "/oauth/digitalocean/callback",
  192. requestlog.NewHandler(a.HandleDOOAuthCallback, l),
  193. )
  194. // /api/projects routes
  195. r.Method(
  196. "GET",
  197. "/projects/{project_id}",
  198. auth.DoesUserHaveProjectAccess(
  199. requestlog.NewHandler(a.HandleReadProject, l),
  200. mw.URLParam,
  201. mw.ReadAccess,
  202. ),
  203. )
  204. r.Method(
  205. "POST",
  206. "/projects",
  207. auth.BasicAuthenticate(
  208. requestlog.NewHandler(a.HandleCreateProject, l),
  209. ),
  210. )
  211. r.Method(
  212. "DELETE",
  213. "/projects/{project_id}",
  214. auth.DoesUserHaveProjectAccess(
  215. requestlog.NewHandler(a.HandleDeleteProject, l),
  216. mw.URLParam,
  217. mw.WriteAccess,
  218. ),
  219. )
  220. // /api/projects/{project_id}/ci routes
  221. r.Method(
  222. "POST",
  223. "/projects/{project_id}/ci/actions",
  224. auth.DoesUserHaveProjectAccess(
  225. auth.DoesUserHaveClusterAccess(
  226. requestlog.NewHandler(a.HandleCreateGitAction, l),
  227. mw.URLParam,
  228. mw.QueryParam,
  229. ),
  230. mw.URLParam,
  231. mw.ReadAccess,
  232. ),
  233. )
  234. // /api/projects/{project_id}/invites routes
  235. r.Method(
  236. "POST",
  237. "/projects/{project_id}/invites",
  238. auth.DoesUserHaveProjectAccess(
  239. requestlog.NewHandler(a.HandleCreateInvite, l),
  240. mw.URLParam,
  241. mw.WriteAccess,
  242. ),
  243. )
  244. r.Method(
  245. "GET",
  246. "/projects/{project_id}/invites",
  247. auth.DoesUserHaveProjectAccess(
  248. requestlog.NewHandler(a.HandleListProjectInvites, l),
  249. mw.URLParam,
  250. mw.ReadAccess,
  251. ),
  252. )
  253. r.Method(
  254. "GET",
  255. "/projects/{project_id}/invites/{token}",
  256. auth.BasicAuthenticateWithRedirect(
  257. requestlog.NewHandler(a.HandleAcceptInvite, l),
  258. ),
  259. )
  260. r.Method(
  261. "DELETE",
  262. "/projects/{project_id}/invites/{invite_id}",
  263. auth.DoesUserHaveProjectAccess(
  264. auth.DoesUserHaveInviteAccess(
  265. requestlog.NewHandler(a.HandleDeleteProjectInvite, l),
  266. mw.URLParam,
  267. mw.URLParam,
  268. ),
  269. mw.URLParam,
  270. mw.WriteAccess,
  271. ),
  272. )
  273. // /api/projects/{project_id}/infra routes
  274. r.Method(
  275. "GET",
  276. "/projects/{project_id}/infra",
  277. auth.DoesUserHaveProjectAccess(
  278. requestlog.NewHandler(a.HandleListProjectInfra, l),
  279. mw.URLParam,
  280. mw.ReadAccess,
  281. ),
  282. )
  283. // /api/projects/{project_id}/provision routes
  284. r.Method(
  285. "POST",
  286. "/projects/{project_id}/provision/test",
  287. auth.DoesUserHaveProjectAccess(
  288. requestlog.NewHandler(a.HandleProvisionTestInfra, l),
  289. mw.URLParam,
  290. mw.ReadAccess,
  291. ),
  292. )
  293. r.Method(
  294. "POST",
  295. "/projects/{project_id}/provision/ecr",
  296. auth.DoesUserHaveProjectAccess(
  297. auth.DoesUserHaveAWSIntegrationAccess(
  298. requestlog.NewHandler(a.HandleProvisionAWSECRInfra, l),
  299. mw.URLParam,
  300. mw.BodyParam,
  301. false,
  302. ),
  303. mw.URLParam,
  304. mw.ReadAccess,
  305. ),
  306. )
  307. r.Method(
  308. "POST",
  309. "/projects/{project_id}/provision/eks",
  310. auth.DoesUserHaveProjectAccess(
  311. auth.DoesUserHaveAWSIntegrationAccess(
  312. requestlog.NewHandler(a.HandleProvisionAWSEKSInfra, l),
  313. mw.URLParam,
  314. mw.BodyParam,
  315. false,
  316. ),
  317. mw.URLParam,
  318. mw.ReadAccess,
  319. ),
  320. )
  321. r.Method(
  322. "POST",
  323. "/projects/{project_id}/provision/gcr",
  324. auth.DoesUserHaveProjectAccess(
  325. auth.DoesUserHaveGCPIntegrationAccess(
  326. requestlog.NewHandler(a.HandleProvisionGCPGCRInfra, l),
  327. mw.URLParam,
  328. mw.BodyParam,
  329. false,
  330. ),
  331. mw.URLParam,
  332. mw.ReadAccess,
  333. ),
  334. )
  335. r.Method(
  336. "POST",
  337. "/projects/{project_id}/provision/gke",
  338. auth.DoesUserHaveProjectAccess(
  339. auth.DoesUserHaveGCPIntegrationAccess(
  340. requestlog.NewHandler(a.HandleProvisionGCPGKEInfra, l),
  341. mw.URLParam,
  342. mw.BodyParam,
  343. false,
  344. ),
  345. mw.URLParam,
  346. mw.ReadAccess,
  347. ),
  348. )
  349. r.Method(
  350. "POST",
  351. "/projects/{project_id}/provision/docr",
  352. auth.DoesUserHaveProjectAccess(
  353. auth.DoesUserHaveDOIntegrationAccess(
  354. requestlog.NewHandler(a.HandleProvisionDODOCRInfra, l),
  355. mw.URLParam,
  356. mw.BodyParam,
  357. false,
  358. ),
  359. mw.URLParam,
  360. mw.ReadAccess,
  361. ),
  362. )
  363. r.Method(
  364. "POST",
  365. "/projects/{project_id}/provision/doks",
  366. auth.DoesUserHaveProjectAccess(
  367. auth.DoesUserHaveDOIntegrationAccess(
  368. requestlog.NewHandler(a.HandleProvisionDODOKSInfra, l),
  369. mw.URLParam,
  370. mw.BodyParam,
  371. false,
  372. ),
  373. mw.URLParam,
  374. mw.ReadAccess,
  375. ),
  376. )
  377. r.Method(
  378. "GET",
  379. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  380. auth.DoesUserHaveProjectAccess(
  381. auth.DoesUserHaveInfraAccess(
  382. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  383. mw.URLParam,
  384. mw.URLParam,
  385. ),
  386. mw.URLParam,
  387. mw.ReadAccess,
  388. ),
  389. )
  390. r.Method(
  391. "POST",
  392. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  393. auth.DoesUserHaveProjectAccess(
  394. auth.DoesUserHaveInfraAccess(
  395. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  396. mw.URLParam,
  397. mw.URLParam,
  398. ),
  399. mw.URLParam,
  400. mw.ReadAccess,
  401. ),
  402. )
  403. r.Method(
  404. "POST",
  405. "/projects/{project_id}/infra/{infra_id}/ecr/destroy",
  406. auth.DoesUserHaveProjectAccess(
  407. auth.DoesUserHaveInfraAccess(
  408. requestlog.NewHandler(a.HandleDestroyAWSECRInfra, l),
  409. mw.URLParam,
  410. mw.URLParam,
  411. ),
  412. mw.URLParam,
  413. mw.ReadAccess,
  414. ),
  415. )
  416. r.Method(
  417. "POST",
  418. "/projects/{project_id}/infra/{infra_id}/test/destroy",
  419. auth.DoesUserHaveProjectAccess(
  420. auth.DoesUserHaveInfraAccess(
  421. requestlog.NewHandler(a.HandleDestroyTestInfra, l),
  422. mw.URLParam,
  423. mw.URLParam,
  424. ),
  425. mw.URLParam,
  426. mw.ReadAccess,
  427. ),
  428. )
  429. r.Method(
  430. "POST",
  431. "/projects/{project_id}/infra/{infra_id}/eks/destroy",
  432. auth.DoesUserHaveProjectAccess(
  433. auth.DoesUserHaveInfraAccess(
  434. requestlog.NewHandler(a.HandleDestroyAWSEKSInfra, l),
  435. mw.URLParam,
  436. mw.URLParam,
  437. ),
  438. mw.URLParam,
  439. mw.ReadAccess,
  440. ),
  441. )
  442. r.Method(
  443. "POST",
  444. "/projects/{project_id}/infra/{infra_id}/gke/destroy",
  445. auth.DoesUserHaveProjectAccess(
  446. auth.DoesUserHaveInfraAccess(
  447. requestlog.NewHandler(a.HandleDestroyGCPGKEInfra, l),
  448. mw.URLParam,
  449. mw.URLParam,
  450. ),
  451. mw.URLParam,
  452. mw.ReadAccess,
  453. ),
  454. )
  455. r.Method(
  456. "POST",
  457. "/projects/{project_id}/infra/{infra_id}/docr/destroy",
  458. auth.DoesUserHaveProjectAccess(
  459. auth.DoesUserHaveInfraAccess(
  460. requestlog.NewHandler(a.HandleDestroyDODOCRInfra, l),
  461. mw.URLParam,
  462. mw.URLParam,
  463. ),
  464. mw.URLParam,
  465. mw.ReadAccess,
  466. ),
  467. )
  468. r.Method(
  469. "POST",
  470. "/projects/{project_id}/infra/{infra_id}/doks/destroy",
  471. auth.DoesUserHaveProjectAccess(
  472. auth.DoesUserHaveInfraAccess(
  473. requestlog.NewHandler(a.HandleDestroyDODOKSInfra, l),
  474. mw.URLParam,
  475. mw.URLParam,
  476. ),
  477. mw.URLParam,
  478. mw.ReadAccess,
  479. ),
  480. )
  481. // /api/projects/{project_id}/clusters routes
  482. r.Method(
  483. "GET",
  484. "/projects/{project_id}/clusters",
  485. auth.DoesUserHaveProjectAccess(
  486. requestlog.NewHandler(a.HandleListProjectClusters, l),
  487. mw.URLParam,
  488. mw.ReadAccess,
  489. ),
  490. )
  491. r.Method(
  492. "POST",
  493. "/projects/{project_id}/clusters",
  494. auth.DoesUserHaveProjectAccess(
  495. auth.DoesUserHaveAWSIntegrationAccess(
  496. auth.DoesUserHaveGCPIntegrationAccess(
  497. requestlog.NewHandler(a.HandleCreateProjectCluster, l),
  498. mw.URLParam,
  499. mw.BodyParam,
  500. true,
  501. ),
  502. mw.URLParam,
  503. mw.BodyParam,
  504. true,
  505. ),
  506. mw.URLParam,
  507. mw.WriteAccess,
  508. ),
  509. )
  510. r.Method(
  511. "GET",
  512. "/projects/{project_id}/clusters/{cluster_id}",
  513. auth.DoesUserHaveProjectAccess(
  514. auth.DoesUserHaveClusterAccess(
  515. requestlog.NewHandler(a.HandleReadProjectCluster, l),
  516. mw.URLParam,
  517. mw.URLParam,
  518. ),
  519. mw.URLParam,
  520. mw.ReadAccess,
  521. ),
  522. )
  523. r.Method(
  524. "POST",
  525. "/projects/{project_id}/clusters/{cluster_id}",
  526. auth.DoesUserHaveProjectAccess(
  527. auth.DoesUserHaveClusterAccess(
  528. requestlog.NewHandler(a.HandleUpdateProjectCluster, l),
  529. mw.URLParam,
  530. mw.URLParam,
  531. ),
  532. mw.URLParam,
  533. mw.WriteAccess,
  534. ),
  535. )
  536. r.Method(
  537. "DELETE",
  538. "/projects/{project_id}/clusters/{cluster_id}",
  539. auth.DoesUserHaveProjectAccess(
  540. auth.DoesUserHaveClusterAccess(
  541. requestlog.NewHandler(a.HandleDeleteProjectCluster, l),
  542. mw.URLParam,
  543. mw.URLParam,
  544. ),
  545. mw.URLParam,
  546. mw.WriteAccess,
  547. ),
  548. )
  549. // /api/projects/{project_id}/clusters/candidates routes
  550. r.Method(
  551. "POST",
  552. "/projects/{project_id}/clusters/candidates",
  553. auth.DoesUserHaveProjectAccess(
  554. requestlog.NewHandler(a.HandleCreateProjectClusterCandidates, l),
  555. mw.URLParam,
  556. mw.WriteAccess,
  557. ),
  558. )
  559. r.Method(
  560. "GET",
  561. "/projects/{project_id}/clusters/candidates",
  562. auth.DoesUserHaveProjectAccess(
  563. requestlog.NewHandler(a.HandleListProjectClusterCandidates, l),
  564. mw.URLParam,
  565. mw.WriteAccess,
  566. ),
  567. )
  568. r.Method(
  569. "POST",
  570. "/projects/{project_id}/clusters/candidates/{candidate_id}/resolve",
  571. auth.DoesUserHaveProjectAccess(
  572. requestlog.NewHandler(a.HandleResolveClusterCandidate, l),
  573. mw.URLParam,
  574. mw.WriteAccess,
  575. ),
  576. )
  577. // /api/projects/{project_id}/integrations routes
  578. r.Method(
  579. "POST",
  580. "/projects/{project_id}/integrations/gcp",
  581. auth.DoesUserHaveProjectAccess(
  582. requestlog.NewHandler(a.HandleCreateGCPIntegration, l),
  583. mw.URLParam,
  584. mw.WriteAccess,
  585. ),
  586. )
  587. r.Method(
  588. "POST",
  589. "/projects/{project_id}/integrations/aws",
  590. auth.DoesUserHaveProjectAccess(
  591. requestlog.NewHandler(a.HandleCreateAWSIntegration, l),
  592. mw.URLParam,
  593. mw.WriteAccess,
  594. ),
  595. )
  596. r.Method(
  597. "POST",
  598. "/projects/{project_id}/integrations/basic",
  599. auth.DoesUserHaveProjectAccess(
  600. requestlog.NewHandler(a.HandleCreateBasicAuthIntegration, l),
  601. mw.URLParam,
  602. mw.WriteAccess,
  603. ),
  604. )
  605. r.Method(
  606. "GET",
  607. "/projects/{project_id}/integrations/oauth",
  608. auth.DoesUserHaveProjectAccess(
  609. requestlog.NewHandler(a.HandleListProjectOAuthIntegrations, l),
  610. mw.URLParam,
  611. mw.WriteAccess,
  612. ),
  613. )
  614. // /api/projects/{project_id}/helmrepos routes
  615. r.Method(
  616. "POST",
  617. "/projects/{project_id}/helmrepos",
  618. auth.DoesUserHaveProjectAccess(
  619. auth.DoesUserHaveAWSIntegrationAccess(
  620. auth.DoesUserHaveGCPIntegrationAccess(
  621. requestlog.NewHandler(a.HandleCreateHelmRepo, l),
  622. mw.URLParam,
  623. mw.BodyParam,
  624. true,
  625. ),
  626. mw.URLParam,
  627. mw.BodyParam,
  628. true,
  629. ),
  630. mw.URLParam,
  631. mw.WriteAccess,
  632. ),
  633. )
  634. r.Method(
  635. "GET",
  636. "/projects/{project_id}/helmrepos",
  637. auth.DoesUserHaveProjectAccess(
  638. requestlog.NewHandler(a.HandleListProjectHelmRepos, l),
  639. mw.URLParam,
  640. mw.WriteAccess,
  641. ),
  642. )
  643. r.Method(
  644. "GET",
  645. "/projects/{project_id}/helmrepos/{helm_id}/charts",
  646. auth.DoesUserHaveProjectAccess(
  647. requestlog.NewHandler(a.HandleListHelmRepoCharts, l),
  648. mw.URLParam,
  649. mw.WriteAccess,
  650. ),
  651. )
  652. // /api/projects/{project_id}/registries routes
  653. r.Method(
  654. "POST",
  655. "/projects/{project_id}/registries",
  656. auth.DoesUserHaveProjectAccess(
  657. auth.DoesUserHaveAWSIntegrationAccess(
  658. auth.DoesUserHaveGCPIntegrationAccess(
  659. auth.DoesUserHaveDOIntegrationAccess(
  660. requestlog.NewHandler(a.HandleCreateRegistry, l),
  661. mw.URLParam,
  662. mw.BodyParam,
  663. true,
  664. ),
  665. mw.URLParam,
  666. mw.BodyParam,
  667. true,
  668. ),
  669. mw.URLParam,
  670. mw.BodyParam,
  671. true,
  672. ),
  673. mw.URLParam,
  674. mw.WriteAccess,
  675. ),
  676. )
  677. r.Method(
  678. "GET",
  679. "/projects/{project_id}/registries",
  680. auth.DoesUserHaveProjectAccess(
  681. requestlog.NewHandler(a.HandleListProjectRegistries, l),
  682. mw.URLParam,
  683. mw.WriteAccess,
  684. ),
  685. )
  686. r.Method(
  687. "POST",
  688. "/projects/{project_id}/registries/{registry_id}",
  689. auth.DoesUserHaveProjectAccess(
  690. auth.DoesUserHaveRegistryAccess(
  691. requestlog.NewHandler(a.HandleUpdateProjectRegistry, l),
  692. mw.URLParam,
  693. mw.URLParam,
  694. ),
  695. mw.URLParam,
  696. mw.WriteAccess,
  697. ),
  698. )
  699. r.Method(
  700. "GET",
  701. "/projects/{project_id}/registries/ecr/{region}/token",
  702. auth.DoesUserHaveProjectAccess(
  703. requestlog.NewHandler(a.HandleGetProjectRegistryECRToken, l),
  704. mw.URLParam,
  705. mw.WriteAccess,
  706. ),
  707. )
  708. r.Method(
  709. "GET",
  710. "/projects/{project_id}/registries/gcr/token",
  711. auth.DoesUserHaveProjectAccess(
  712. requestlog.NewHandler(a.HandleGetProjectRegistryGCRToken, l),
  713. mw.URLParam,
  714. mw.WriteAccess,
  715. ),
  716. )
  717. r.Method(
  718. "GET",
  719. "/projects/{project_id}/registries/dockerhub/token",
  720. auth.DoesUserHaveProjectAccess(
  721. requestlog.NewHandler(a.HandleGetProjectRegistryDockerhubToken, l),
  722. mw.URLParam,
  723. mw.WriteAccess,
  724. ),
  725. )
  726. r.Method(
  727. "GET",
  728. "/projects/{project_id}/registries/docr/token",
  729. auth.DoesUserHaveProjectAccess(
  730. requestlog.NewHandler(a.HandleGetProjectRegistryDOCRToken, l),
  731. mw.URLParam,
  732. mw.WriteAccess,
  733. ),
  734. )
  735. r.Method(
  736. "DELETE",
  737. "/projects/{project_id}/registries/{registry_id}",
  738. auth.DoesUserHaveProjectAccess(
  739. auth.DoesUserHaveRegistryAccess(
  740. requestlog.NewHandler(a.HandleDeleteProjectRegistry, l),
  741. mw.URLParam,
  742. mw.URLParam,
  743. ),
  744. mw.URLParam,
  745. mw.WriteAccess,
  746. ),
  747. )
  748. // /api/projects/{project_id}/registries/{registry_id}/repositories routes
  749. r.Method(
  750. "GET",
  751. "/projects/{project_id}/registries/{registry_id}/repositories",
  752. auth.DoesUserHaveProjectAccess(
  753. auth.DoesUserHaveRegistryAccess(
  754. requestlog.NewHandler(a.HandleListRepositories, l),
  755. mw.URLParam,
  756. mw.URLParam,
  757. ),
  758. mw.URLParam,
  759. mw.WriteAccess,
  760. ),
  761. )
  762. r.Method(
  763. "GET",
  764. // * is the repo name, which can itself be nested
  765. // for example, for GCR this is project-id/repo
  766. // need to use wildcard, see https://github.com/go-chi/chi/issues/243
  767. "/projects/{project_id}/registries/{registry_id}/repositories/*",
  768. auth.DoesUserHaveProjectAccess(
  769. auth.DoesUserHaveRegistryAccess(
  770. requestlog.NewHandler(a.HandleListImages, l),
  771. mw.URLParam,
  772. mw.URLParam,
  773. ),
  774. mw.URLParam,
  775. mw.WriteAccess,
  776. ),
  777. )
  778. // /api/projects/{project_id}/releases routes
  779. r.Method(
  780. "GET",
  781. "/projects/{project_id}/releases",
  782. auth.DoesUserHaveProjectAccess(
  783. auth.DoesUserHaveClusterAccess(
  784. requestlog.NewHandler(a.HandleListReleases, l),
  785. mw.URLParam,
  786. mw.QueryParam,
  787. ),
  788. mw.URLParam,
  789. mw.ReadAccess,
  790. ),
  791. )
  792. r.Method(
  793. "GET",
  794. "/projects/{project_id}/releases/{name}/{revision}/components",
  795. auth.DoesUserHaveProjectAccess(
  796. auth.DoesUserHaveClusterAccess(
  797. requestlog.NewHandler(a.HandleGetReleaseComponents, l),
  798. mw.URLParam,
  799. mw.QueryParam,
  800. ),
  801. mw.URLParam,
  802. mw.ReadAccess,
  803. ),
  804. )
  805. r.Method(
  806. "GET",
  807. "/projects/{project_id}/releases/{name}/{revision}/controllers",
  808. auth.DoesUserHaveProjectAccess(
  809. auth.DoesUserHaveClusterAccess(
  810. requestlog.NewHandler(a.HandleGetReleaseControllers, l),
  811. mw.URLParam,
  812. mw.QueryParam,
  813. ),
  814. mw.URLParam,
  815. mw.ReadAccess,
  816. ),
  817. )
  818. r.Method(
  819. "GET",
  820. "/projects/{project_id}/releases/{name}/{revision}/pods/all",
  821. auth.DoesUserHaveProjectAccess(
  822. auth.DoesUserHaveClusterAccess(
  823. requestlog.NewHandler(a.HandleGetReleaseAllPods, l),
  824. mw.URLParam,
  825. mw.QueryParam,
  826. ),
  827. mw.URLParam,
  828. mw.ReadAccess,
  829. ),
  830. )
  831. r.Method(
  832. "GET",
  833. "/projects/{project_id}/releases/{name}/history",
  834. auth.DoesUserHaveProjectAccess(
  835. auth.DoesUserHaveClusterAccess(
  836. requestlog.NewHandler(a.HandleListReleaseHistory, l),
  837. mw.URLParam,
  838. mw.QueryParam,
  839. ),
  840. mw.URLParam,
  841. mw.ReadAccess,
  842. ),
  843. )
  844. r.Method(
  845. "GET",
  846. "/projects/{project_id}/releases/{name}/webhook_token",
  847. auth.DoesUserHaveProjectAccess(
  848. auth.DoesUserHaveClusterAccess(
  849. requestlog.NewHandler(a.HandleGetReleaseToken, l),
  850. mw.URLParam,
  851. mw.QueryParam,
  852. ),
  853. mw.URLParam,
  854. mw.ReadAccess,
  855. ),
  856. )
  857. r.Method(
  858. "POST",
  859. "/projects/{project_id}/releases/{name}/upgrade",
  860. auth.DoesUserHaveProjectAccess(
  861. auth.DoesUserHaveClusterAccess(
  862. requestlog.NewHandler(a.HandleUpgradeRelease, l),
  863. mw.URLParam,
  864. mw.QueryParam,
  865. ),
  866. mw.URLParam,
  867. mw.ReadAccess,
  868. ),
  869. )
  870. r.Method(
  871. "GET",
  872. "/projects/{project_id}/releases/{name}/{revision}",
  873. auth.DoesUserHaveProjectAccess(
  874. auth.DoesUserHaveClusterAccess(
  875. requestlog.NewHandler(a.HandleGetRelease, l),
  876. mw.URLParam,
  877. mw.QueryParam,
  878. ),
  879. mw.URLParam,
  880. mw.ReadAccess,
  881. ),
  882. )
  883. r.Method(
  884. "POST",
  885. "/projects/{project_id}/releases/{name}/rollback",
  886. auth.DoesUserHaveProjectAccess(
  887. auth.DoesUserHaveClusterAccess(
  888. requestlog.NewHandler(a.HandleRollbackRelease, l),
  889. mw.URLParam,
  890. mw.QueryParam,
  891. ),
  892. mw.URLParam,
  893. mw.ReadAccess,
  894. ),
  895. )
  896. r.Method(
  897. "POST",
  898. "/webhooks/deploy/{token}",
  899. requestlog.NewHandler(a.HandleReleaseDeployWebhook, l),
  900. )
  901. // /api/projects/{project_id}/gitrepos routes
  902. r.Method(
  903. "GET",
  904. "/projects/{project_id}/gitrepos",
  905. auth.DoesUserHaveProjectAccess(
  906. requestlog.NewHandler(a.HandleListProjectGitRepos, l),
  907. mw.URLParam,
  908. mw.ReadAccess,
  909. ),
  910. )
  911. r.Method(
  912. "DELETE",
  913. "/projects/{project_id}/gitrepos/{git_repo_id}",
  914. auth.DoesUserHaveProjectAccess(
  915. auth.DoesUserHaveGitRepoAccess(
  916. requestlog.NewHandler(a.HandleDeleteProjectGitRepo, l),
  917. mw.URLParam,
  918. mw.URLParam,
  919. ),
  920. mw.URLParam,
  921. mw.WriteAccess,
  922. ),
  923. )
  924. r.Method(
  925. "GET",
  926. "/projects/{project_id}/gitrepos/{git_repo_id}/repos",
  927. auth.DoesUserHaveProjectAccess(
  928. auth.DoesUserHaveGitRepoAccess(
  929. requestlog.NewHandler(a.HandleListRepos, l),
  930. mw.URLParam,
  931. mw.URLParam,
  932. ),
  933. mw.URLParam,
  934. mw.ReadAccess,
  935. ),
  936. )
  937. r.Method(
  938. "GET",
  939. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{owner}/{name}/branches",
  940. auth.DoesUserHaveProjectAccess(
  941. auth.DoesUserHaveGitRepoAccess(
  942. requestlog.NewHandler(a.HandleGetBranches, l),
  943. mw.URLParam,
  944. mw.URLParam,
  945. ),
  946. mw.URLParam,
  947. mw.ReadAccess,
  948. ),
  949. )
  950. r.Method(
  951. "GET",
  952. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{owner}/{name}/{branch}/contents",
  953. auth.DoesUserHaveProjectAccess(
  954. auth.DoesUserHaveGitRepoAccess(
  955. requestlog.NewHandler(a.HandleGetBranchContents, l),
  956. mw.URLParam,
  957. mw.URLParam,
  958. ),
  959. mw.URLParam,
  960. mw.ReadAccess,
  961. ),
  962. )
  963. r.Method(
  964. "GET",
  965. "/projects/{project_id}/gitrepos/{git_repo_id}/repos/{kind}/{owner}/{name}/{branch}/procfile",
  966. auth.DoesUserHaveProjectAccess(
  967. auth.DoesUserHaveGitRepoAccess(
  968. requestlog.NewHandler(a.HandleGetProcfileContents, l),
  969. mw.URLParam,
  970. mw.URLParam,
  971. ),
  972. mw.URLParam,
  973. mw.ReadAccess,
  974. ),
  975. )
  976. // /api/projects/{project_id}/deploy routes
  977. r.Method(
  978. "POST",
  979. "/projects/{project_id}/deploy/{name}/{version}",
  980. auth.DoesUserHaveProjectAccess(
  981. auth.DoesUserHaveClusterAccess(
  982. requestlog.NewHandler(a.HandleDeployTemplate, l),
  983. mw.URLParam,
  984. mw.QueryParam,
  985. ),
  986. mw.URLParam,
  987. mw.ReadAccess,
  988. ),
  989. )
  990. // /api/projects/{project_id}/deploy routes
  991. r.Method(
  992. "POST",
  993. "/projects/{project_id}/delete/{name}",
  994. auth.DoesUserHaveProjectAccess(
  995. auth.DoesUserHaveClusterAccess(
  996. requestlog.NewHandler(a.HandleUninstallTemplate, l),
  997. mw.URLParam,
  998. mw.QueryParam,
  999. ),
  1000. mw.URLParam,
  1001. mw.ReadAccess,
  1002. ),
  1003. )
  1004. // /api/projects/{project_id}/k8s routes
  1005. r.Method(
  1006. "GET",
  1007. "/projects/{project_id}/k8s/namespaces",
  1008. auth.DoesUserHaveProjectAccess(
  1009. auth.DoesUserHaveClusterAccess(
  1010. requestlog.NewHandler(a.HandleListNamespaces, l),
  1011. mw.URLParam,
  1012. mw.QueryParam,
  1013. ),
  1014. mw.URLParam,
  1015. mw.ReadAccess,
  1016. ),
  1017. )
  1018. r.Method(
  1019. "GET",
  1020. "/projects/{project_id}/k8s/kubeconfig",
  1021. auth.DoesUserHaveProjectAccess(
  1022. auth.DoesUserHaveClusterAccess(
  1023. requestlog.NewHandler(a.HandleGetTemporaryKubeconfig, l),
  1024. mw.URLParam,
  1025. mw.QueryParam,
  1026. ),
  1027. mw.URLParam,
  1028. mw.WriteAccess,
  1029. ),
  1030. )
  1031. r.Method(
  1032. "GET",
  1033. "/projects/{project_id}/k8s/prometheus/detect",
  1034. auth.DoesUserHaveProjectAccess(
  1035. auth.DoesUserHaveClusterAccess(
  1036. requestlog.NewHandler(a.HandleDetectPrometheusInstalled, l),
  1037. mw.URLParam,
  1038. mw.QueryParam,
  1039. ),
  1040. mw.URLParam,
  1041. mw.ReadAccess,
  1042. ),
  1043. )
  1044. r.Method(
  1045. "GET",
  1046. "/projects/{project_id}/k8s/prometheus/ingresses",
  1047. auth.DoesUserHaveProjectAccess(
  1048. auth.DoesUserHaveClusterAccess(
  1049. requestlog.NewHandler(a.HandleListNGINXIngresses, l),
  1050. mw.URLParam,
  1051. mw.QueryParam,
  1052. ),
  1053. mw.URLParam,
  1054. mw.ReadAccess,
  1055. ),
  1056. )
  1057. r.Method(
  1058. "GET",
  1059. "/projects/{project_id}/k8s/metrics",
  1060. auth.DoesUserHaveProjectAccess(
  1061. auth.DoesUserHaveClusterAccess(
  1062. requestlog.NewHandler(a.HandleGetPodMetrics, l),
  1063. mw.URLParam,
  1064. mw.QueryParam,
  1065. ),
  1066. mw.URLParam,
  1067. mw.ReadAccess,
  1068. ),
  1069. )
  1070. r.Method(
  1071. "GET",
  1072. "/projects/{project_id}/k8s/{namespace}/pod/{name}/logs",
  1073. auth.DoesUserHaveProjectAccess(
  1074. auth.DoesUserHaveClusterAccess(
  1075. requestlog.NewHandler(a.HandleGetPodLogs, l),
  1076. mw.URLParam,
  1077. mw.QueryParam,
  1078. ),
  1079. mw.URLParam,
  1080. mw.ReadAccess,
  1081. ),
  1082. )
  1083. r.Method(
  1084. "GET",
  1085. "/projects/{project_id}/k8s/{namespace}/{chart}/{release_name}/jobs",
  1086. auth.DoesUserHaveProjectAccess(
  1087. auth.DoesUserHaveClusterAccess(
  1088. requestlog.NewHandler(a.HandleListJobsByChart, l),
  1089. mw.URLParam,
  1090. mw.QueryParam,
  1091. ),
  1092. mw.URLParam,
  1093. mw.ReadAccess,
  1094. ),
  1095. )
  1096. r.Method(
  1097. "GET",
  1098. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/pods",
  1099. auth.DoesUserHaveProjectAccess(
  1100. auth.DoesUserHaveClusterAccess(
  1101. requestlog.NewHandler(a.HandleListJobPods, l),
  1102. mw.URLParam,
  1103. mw.QueryParam,
  1104. ),
  1105. mw.URLParam,
  1106. mw.ReadAccess,
  1107. ),
  1108. )
  1109. r.Method(
  1110. "GET",
  1111. "/projects/{project_id}/k8s/{namespace}/ingress/{name}",
  1112. auth.DoesUserHaveProjectAccess(
  1113. auth.DoesUserHaveClusterAccess(
  1114. requestlog.NewHandler(a.HandleGetIngress, l),
  1115. mw.URLParam,
  1116. mw.QueryParam,
  1117. ),
  1118. mw.URLParam,
  1119. mw.ReadAccess,
  1120. ),
  1121. )
  1122. r.Method(
  1123. "GET",
  1124. "/projects/{project_id}/k8s/{kind}/status",
  1125. auth.DoesUserHaveProjectAccess(
  1126. auth.DoesUserHaveClusterAccess(
  1127. requestlog.NewHandler(a.HandleStreamControllerStatus, l),
  1128. mw.URLParam,
  1129. mw.QueryParam,
  1130. ),
  1131. mw.URLParam,
  1132. mw.ReadAccess,
  1133. ),
  1134. )
  1135. r.Method(
  1136. "GET",
  1137. "/projects/{project_id}/k8s/pods",
  1138. auth.DoesUserHaveProjectAccess(
  1139. auth.DoesUserHaveClusterAccess(
  1140. requestlog.NewHandler(a.HandleListPods, l),
  1141. mw.URLParam,
  1142. mw.QueryParam,
  1143. ),
  1144. mw.URLParam,
  1145. mw.ReadAccess,
  1146. ),
  1147. )
  1148. r.Method(
  1149. "DELETE",
  1150. "/projects/{project_id}/k8s/pods/{namespace}/{name}",
  1151. auth.DoesUserHaveProjectAccess(
  1152. auth.DoesUserHaveClusterAccess(
  1153. requestlog.NewHandler(a.HandleDeletePod, l),
  1154. mw.URLParam,
  1155. mw.QueryParam,
  1156. ),
  1157. mw.URLParam,
  1158. mw.ReadAccess,
  1159. ),
  1160. )
  1161. r.Method(
  1162. "POST",
  1163. "/projects/{project_id}/k8s/configmap/create",
  1164. auth.DoesUserHaveProjectAccess(
  1165. auth.DoesUserHaveClusterAccess(
  1166. requestlog.NewHandler(a.HandleCreateConfigMap, l),
  1167. mw.URLParam,
  1168. mw.QueryParam,
  1169. ),
  1170. mw.URLParam,
  1171. mw.ReadAccess,
  1172. ),
  1173. )
  1174. r.Method(
  1175. "DELETE",
  1176. "/projects/{project_id}/k8s/configmap/delete",
  1177. auth.DoesUserHaveProjectAccess(
  1178. auth.DoesUserHaveClusterAccess(
  1179. requestlog.NewHandler(a.HandleDeleteConfigMap, l),
  1180. mw.URLParam,
  1181. mw.QueryParam,
  1182. ),
  1183. mw.URLParam,
  1184. mw.ReadAccess,
  1185. ),
  1186. )
  1187. r.Method(
  1188. "GET",
  1189. "/projects/{project_id}/k8s/configmap",
  1190. auth.DoesUserHaveProjectAccess(
  1191. auth.DoesUserHaveClusterAccess(
  1192. requestlog.NewHandler(a.HandleGetConfigMap, l),
  1193. mw.URLParam,
  1194. mw.QueryParam,
  1195. ),
  1196. mw.URLParam,
  1197. mw.ReadAccess,
  1198. ),
  1199. )
  1200. r.Method(
  1201. "GET",
  1202. "/projects/{project_id}/k8s/configmap/list",
  1203. auth.DoesUserHaveProjectAccess(
  1204. auth.DoesUserHaveClusterAccess(
  1205. requestlog.NewHandler(a.HandleListConfigMaps, l),
  1206. mw.URLParam,
  1207. mw.QueryParam,
  1208. ),
  1209. mw.URLParam,
  1210. mw.ReadAccess,
  1211. ),
  1212. )
  1213. r.Method(
  1214. "POST",
  1215. "/projects/{project_id}/k8s/configmap/update",
  1216. auth.DoesUserHaveProjectAccess(
  1217. auth.DoesUserHaveClusterAccess(
  1218. requestlog.NewHandler(a.HandleUpdateConfigMap, l),
  1219. mw.URLParam,
  1220. mw.QueryParam,
  1221. ),
  1222. mw.URLParam,
  1223. mw.ReadAccess,
  1224. ),
  1225. )
  1226. // /api/projects/{project_id}/subdomain routes
  1227. r.Method(
  1228. "POST",
  1229. "/projects/{project_id}/k8s/subdomain",
  1230. auth.DoesUserHaveProjectAccess(
  1231. auth.DoesUserHaveClusterAccess(
  1232. requestlog.NewHandler(a.HandleCreateDNSRecord, l),
  1233. mw.URLParam,
  1234. mw.QueryParam,
  1235. ),
  1236. mw.URLParam,
  1237. mw.ReadAccess,
  1238. ),
  1239. )
  1240. })
  1241. staticFilePath := a.ServerConf.StaticFilePath
  1242. fs := http.FileServer(http.Dir(staticFilePath))
  1243. r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
  1244. if _, err := os.Stat(staticFilePath + r.RequestURI); os.IsNotExist(err) {
  1245. w.Header().Set("Cache-Control", "no-cache")
  1246. http.StripPrefix(r.URL.Path, fs).ServeHTTP(w, r)
  1247. } else {
  1248. // Set static files involving html, js, or empty cache to "no-cache", which means they must be validated
  1249. // for changes before the browser uses the cache
  1250. if base := path.Base(r.URL.Path); strings.Contains(base, "html") || strings.Contains(base, "js") || base == "." || base == "/" {
  1251. w.Header().Set("Cache-Control", "no-cache")
  1252. }
  1253. fs.ServeHTTP(w, r)
  1254. }
  1255. })
  1256. return r
  1257. }