router.go 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774
  1. package router
  2. import (
  3. "net/http"
  4. "os"
  5. "path"
  6. "strings"
  7. "time"
  8. "github.com/go-chi/chi"
  9. "github.com/go-chi/chi/middleware"
  10. "github.com/porter-dev/porter/internal/auth/token"
  11. "github.com/porter-dev/porter/server/api"
  12. mw "github.com/porter-dev/porter/server/middleware"
  13. "github.com/porter-dev/porter/server/middleware/requestlog"
  14. "golang.org/x/oauth2"
  15. )
  16. // New creates a new Chi router instance and registers all routes supported by the
  17. // API
  18. func New(a *api.App) *chi.Mux {
  19. l := a.Logger
  20. r := chi.NewRouter()
  21. var ghAppConf *oauth2.Config
  22. if a.GithubAppConf != nil {
  23. ghAppConf = &a.GithubAppConf.Config
  24. }
  25. auth := mw.NewAuth(a.Store, a.ServerConf.CookieName, &token.TokenGeneratorConf{
  26. TokenSecret: a.ServerConf.TokenGeneratorSecret,
  27. }, a.Repo, ghAppConf)
  28. r.Route("/api", func(r chi.Router) {
  29. r.Use(mw.ContentTypeJSON)
  30. // Group for default operations with 10s timeout
  31. r.Group(func(r chi.Router) {
  32. r.Use(middleware.Timeout(10 * time.Second))
  33. // health checks
  34. r.Method("GET", "/livez", http.HandlerFunc(a.HandleLive))
  35. r.Method("GET", "/readyz", http.HandlerFunc(a.HandleReady))
  36. // /api/users routes
  37. r.Method(
  38. "GET",
  39. "/users/{user_id}",
  40. auth.DoesUserIDMatch(
  41. requestlog.NewHandler(a.HandleReadUser, l),
  42. mw.URLParam,
  43. ),
  44. )
  45. r.Method(
  46. "GET",
  47. "/users/{user_id}/projects",
  48. auth.DoesUserIDMatch(
  49. requestlog.NewHandler(a.HandleListUserProjects, l),
  50. mw.URLParam,
  51. ),
  52. )
  53. // only allow basic create user or basic login if BasicLogin feature is set
  54. if a.Capabilities.BasicLogin {
  55. r.Method(
  56. "POST",
  57. "/users",
  58. requestlog.NewHandler(a.HandleCreateUser, l),
  59. )
  60. r.Method(
  61. "POST",
  62. "/login",
  63. requestlog.NewHandler(a.HandleLoginUser, l),
  64. )
  65. }
  66. r.Method(
  67. "DELETE",
  68. "/users/{user_id}",
  69. auth.DoesUserIDMatch(
  70. requestlog.NewHandler(a.HandleDeleteUser, l),
  71. mw.URLParam,
  72. ),
  73. )
  74. r.Method(
  75. "GET",
  76. "/cli/login",
  77. auth.BasicAuthenticateWithRedirect(
  78. requestlog.NewHandler(a.HandleCLILoginUser, l),
  79. ),
  80. )
  81. r.Method(
  82. "GET",
  83. "/cli/login/exchange",
  84. requestlog.NewHandler(a.HandleCLILoginExchangeToken, l),
  85. )
  86. r.Method(
  87. "GET",
  88. "/auth/check",
  89. auth.BasicAuthenticate(
  90. requestlog.NewHandler(a.HandleAuthCheck, l),
  91. ),
  92. )
  93. r.Method(
  94. "POST",
  95. "/logout",
  96. auth.BasicAuthenticate(
  97. requestlog.NewHandler(a.HandleLogoutUser, l),
  98. ),
  99. )
  100. r.Method(
  101. "POST",
  102. "/email/verify/initiate",
  103. auth.BasicAuthenticate(
  104. requestlog.NewHandler(a.InitiateEmailVerifyUser, l),
  105. ),
  106. )
  107. r.Method(
  108. "GET",
  109. "/email/verify/finalize",
  110. auth.BasicAuthenticateWithRedirect(
  111. requestlog.NewHandler(a.FinalizEmailVerifyUser, l),
  112. ),
  113. )
  114. r.Method(
  115. "POST",
  116. "/password/reset/initiate",
  117. requestlog.NewHandler(a.InitiatePWResetUser, l),
  118. )
  119. r.Method(
  120. "POST",
  121. "/password/reset/verify",
  122. requestlog.NewHandler(a.VerifyPWResetUser, l),
  123. )
  124. r.Method(
  125. "POST",
  126. "/password/reset/finalize",
  127. requestlog.NewHandler(a.FinalizPWResetUser, l),
  128. )
  129. // /api/integrations routes
  130. r.Method(
  131. "GET",
  132. "/integrations/cluster",
  133. auth.BasicAuthenticate(
  134. requestlog.NewHandler(a.HandleListClusterIntegrations, l),
  135. ),
  136. )
  137. r.Method(
  138. "GET",
  139. "/integrations/registry",
  140. auth.BasicAuthenticate(
  141. requestlog.NewHandler(a.HandleListRegistryIntegrations, l),
  142. ),
  143. )
  144. r.Method(
  145. "GET",
  146. "/integrations/helm",
  147. auth.BasicAuthenticate(
  148. requestlog.NewHandler(a.HandleListHelmRepoIntegrations, l),
  149. ),
  150. )
  151. r.Method(
  152. "GET",
  153. "/integrations/repo",
  154. auth.BasicAuthenticate(
  155. requestlog.NewHandler(a.HandleListRepoIntegrations, l),
  156. ),
  157. )
  158. r.Method(
  159. "POST",
  160. "/integrations/github-app/webhook",
  161. requestlog.NewHandler(a.HandleGithubAppEvent, l),
  162. )
  163. r.Method(
  164. "GET",
  165. "/integrations/github-app/authorize",
  166. requestlog.NewHandler(a.HandleGithubAppAuthorize, l),
  167. )
  168. r.Method(
  169. "GET",
  170. "/integrations/github-app/oauth",
  171. requestlog.NewHandler(a.HandleGithubAppOauthInit, l),
  172. )
  173. r.Method(
  174. "GET",
  175. "/integrations/github-app/install",
  176. requestlog.NewHandler(a.HandleGithubAppInstall, l),
  177. )
  178. r.Method(
  179. "GET",
  180. "/integrations/github-app/access",
  181. auth.BasicAuthenticate(
  182. requestlog.NewHandler(a.HandleListGithubAppAccess, l),
  183. ),
  184. )
  185. // /api/templates routes
  186. r.Method(
  187. "GET",
  188. "/templates",
  189. auth.BasicAuthenticate(
  190. requestlog.NewHandler(a.HandleListTemplates, l),
  191. ),
  192. )
  193. r.Method(
  194. "GET",
  195. "/templates/{name}/{version}",
  196. auth.BasicAuthenticate(
  197. requestlog.NewHandler(a.HandleReadTemplate, l),
  198. ),
  199. )
  200. r.Method(
  201. "GET",
  202. "/templates/upgrade_notes/{name}/{version}",
  203. auth.BasicAuthenticate(
  204. requestlog.NewHandler(a.HandleGetTemplateUpgradeNotes, l),
  205. ),
  206. )
  207. // /api/oauth routes
  208. r.Method(
  209. "GET",
  210. "/oauth/projects/{project_id}/github",
  211. auth.DoesUserHaveProjectAccess(
  212. requestlog.NewHandler(a.HandleGithubOAuthStartProject, l),
  213. mw.URLParam,
  214. mw.WriteAccess,
  215. ),
  216. )
  217. r.Method(
  218. "GET",
  219. "/oauth/login/github",
  220. requestlog.NewHandler(a.HandleGithubOAuthStartUser, l),
  221. )
  222. r.Method(
  223. "GET",
  224. "/oauth/github/callback",
  225. requestlog.NewHandler(a.HandleGithubOAuthCallback, l),
  226. )
  227. r.Method(
  228. "GET",
  229. "/oauth/github-app/callback",
  230. requestlog.NewHandler(a.HandleGithubAppOAuthCallback, l),
  231. )
  232. r.Method(
  233. "GET",
  234. "/oauth/login/google",
  235. requestlog.NewHandler(a.HandleGoogleStartUser, l),
  236. )
  237. r.Method(
  238. "GET",
  239. "/oauth/google/callback",
  240. requestlog.NewHandler(a.HandleGoogleOAuthCallback, l),
  241. )
  242. r.Method(
  243. "GET",
  244. "/oauth/projects/{project_id}/digitalocean",
  245. auth.DoesUserHaveProjectAccess(
  246. requestlog.NewHandler(a.HandleDOOAuthStartProject, l),
  247. mw.URLParam,
  248. mw.WriteAccess,
  249. ),
  250. )
  251. r.Method(
  252. "GET",
  253. "/oauth/digitalocean/callback",
  254. requestlog.NewHandler(a.HandleDOOAuthCallback, l),
  255. )
  256. r.Method(
  257. "GET",
  258. "/oauth/projects/{project_id}/slack",
  259. auth.DoesUserHaveProjectAccess(
  260. requestlog.NewHandler(a.HandleSlackOAuthStartProject, l),
  261. mw.URLParam,
  262. mw.WriteAccess,
  263. ),
  264. )
  265. r.Method(
  266. "GET",
  267. "/oauth/slack/callback",
  268. requestlog.NewHandler(a.HandleSlackOAuthCallback, l),
  269. )
  270. // /api/projects routes
  271. r.Method(
  272. "GET",
  273. "/projects/{project_id}",
  274. auth.DoesUserHaveProjectAccess(
  275. requestlog.NewHandler(a.HandleReadProject, l),
  276. mw.URLParam,
  277. mw.ReadAccess,
  278. ),
  279. )
  280. r.Method(
  281. "GET",
  282. "/projects/{project_id}/policy",
  283. auth.DoesUserHaveProjectAccess(
  284. requestlog.NewHandler(a.HandleReadProjectPolicy, l),
  285. mw.URLParam,
  286. mw.ReadAccess,
  287. ),
  288. )
  289. r.Method(
  290. "GET",
  291. "/projects/{project_id}/roles",
  292. auth.DoesUserHaveProjectAccess(
  293. requestlog.NewHandler(a.HandleGetProjectRoles, l),
  294. mw.URLParam,
  295. mw.AdminAccess,
  296. ),
  297. )
  298. r.Method(
  299. "GET",
  300. "/projects/{project_id}/collaborators",
  301. auth.DoesUserHaveProjectAccess(
  302. requestlog.NewHandler(a.HandleListProjectCollaborators, l),
  303. mw.URLParam,
  304. mw.AdminAccess,
  305. ),
  306. )
  307. r.Method(
  308. "POST",
  309. "/projects/{project_id}/roles/{user_id}",
  310. auth.DoesUserHaveProjectAccess(
  311. requestlog.NewHandler(a.HandleUpdateProjectRole, l),
  312. mw.URLParam,
  313. mw.AdminAccess,
  314. ),
  315. )
  316. r.Method(
  317. "POST",
  318. "/projects",
  319. auth.BasicAuthenticate(
  320. requestlog.NewHandler(a.HandleCreateProject, l),
  321. ),
  322. )
  323. r.Method(
  324. "DELETE",
  325. "/projects/{project_id}",
  326. auth.DoesUserHaveProjectAccess(
  327. requestlog.NewHandler(a.HandleDeleteProject, l),
  328. mw.URLParam,
  329. mw.AdminAccess,
  330. ),
  331. )
  332. r.Method(
  333. "DELETE",
  334. "/projects/{project_id}/roles/{user_id}",
  335. auth.DoesUserHaveProjectAccess(
  336. requestlog.NewHandler(a.HandleDeleteProjectRole, l),
  337. mw.URLParam,
  338. mw.AdminAccess,
  339. ),
  340. )
  341. // /api/projects/{project_id}/ci routes
  342. r.Method(
  343. "POST",
  344. "/projects/{project_id}/ci/actions",
  345. auth.DoesUserHaveProjectAccess(
  346. auth.DoesUserHaveClusterAccess(
  347. requestlog.NewHandler(a.HandleCreateGitAction, l),
  348. mw.URLParam,
  349. mw.QueryParam,
  350. ),
  351. mw.URLParam,
  352. mw.WriteAccess,
  353. ),
  354. )
  355. // /api/projects/{project_id}/invites routes
  356. r.Method(
  357. "POST",
  358. "/projects/{project_id}/invites",
  359. auth.DoesUserHaveProjectAccess(
  360. requestlog.NewHandler(a.HandleCreateInvite, l),
  361. mw.URLParam,
  362. mw.AdminAccess,
  363. ),
  364. )
  365. r.Method(
  366. "GET",
  367. "/projects/{project_id}/invites",
  368. auth.DoesUserHaveProjectAccess(
  369. requestlog.NewHandler(a.HandleListProjectInvites, l),
  370. mw.URLParam,
  371. mw.AdminAccess,
  372. ),
  373. )
  374. r.Method(
  375. "GET",
  376. "/projects/{project_id}/invites/{token}",
  377. auth.BasicAuthenticateWithRedirect(
  378. requestlog.NewHandler(a.HandleAcceptInvite, l),
  379. ),
  380. )
  381. r.Method(
  382. "POST",
  383. "/projects/{project_id}/invites/{invite_id}",
  384. auth.DoesUserHaveProjectAccess(
  385. auth.DoesUserHaveInviteAccess(
  386. requestlog.NewHandler(a.HandleUpdateInviteRole, l),
  387. mw.URLParam,
  388. mw.URLParam,
  389. ),
  390. mw.URLParam,
  391. mw.AdminAccess,
  392. ),
  393. )
  394. r.Method(
  395. "DELETE",
  396. "/projects/{project_id}/invites/{invite_id}",
  397. auth.DoesUserHaveProjectAccess(
  398. auth.DoesUserHaveInviteAccess(
  399. requestlog.NewHandler(a.HandleDeleteProjectInvite, l),
  400. mw.URLParam,
  401. mw.URLParam,
  402. ),
  403. mw.URLParam,
  404. mw.AdminAccess,
  405. ),
  406. )
  407. // /api/projects/{project_id}/infra routes
  408. r.Method(
  409. "GET",
  410. "/projects/{project_id}/infra",
  411. auth.DoesUserHaveProjectAccess(
  412. requestlog.NewHandler(a.HandleListProjectInfra, l),
  413. mw.URLParam,
  414. mw.ReadAccess,
  415. ),
  416. )
  417. // /api/projects/{project_id}/provision routes
  418. r.Method(
  419. "POST",
  420. "/projects/{project_id}/provision/test",
  421. auth.DoesUserHaveProjectAccess(
  422. requestlog.NewHandler(a.HandleProvisionTestInfra, l),
  423. mw.URLParam,
  424. mw.WriteAccess,
  425. ),
  426. )
  427. r.Method(
  428. "POST",
  429. "/projects/{project_id}/provision/ecr",
  430. auth.DoesUserHaveProjectAccess(
  431. auth.DoesUserHaveAWSIntegrationAccess(
  432. requestlog.NewHandler(a.HandleProvisionAWSECRInfra, l),
  433. mw.URLParam,
  434. mw.BodyParam,
  435. false,
  436. ),
  437. mw.URLParam,
  438. mw.WriteAccess,
  439. ),
  440. )
  441. r.Method(
  442. "POST",
  443. "/projects/{project_id}/provision/eks",
  444. auth.DoesUserHaveProjectAccess(
  445. auth.DoesUserHaveAWSIntegrationAccess(
  446. requestlog.NewHandler(a.HandleProvisionAWSEKSInfra, l),
  447. mw.URLParam,
  448. mw.BodyParam,
  449. false,
  450. ),
  451. mw.URLParam,
  452. mw.WriteAccess,
  453. ),
  454. )
  455. r.Method(
  456. "POST",
  457. "/projects/{project_id}/provision/gcr",
  458. auth.DoesUserHaveProjectAccess(
  459. auth.DoesUserHaveGCPIntegrationAccess(
  460. requestlog.NewHandler(a.HandleProvisionGCPGCRInfra, l),
  461. mw.URLParam,
  462. mw.BodyParam,
  463. false,
  464. ),
  465. mw.URLParam,
  466. mw.WriteAccess,
  467. ),
  468. )
  469. r.Method(
  470. "POST",
  471. "/projects/{project_id}/provision/gke",
  472. auth.DoesUserHaveProjectAccess(
  473. auth.DoesUserHaveGCPIntegrationAccess(
  474. requestlog.NewHandler(a.HandleProvisionGCPGKEInfra, l),
  475. mw.URLParam,
  476. mw.BodyParam,
  477. false,
  478. ),
  479. mw.URLParam,
  480. mw.WriteAccess,
  481. ),
  482. )
  483. r.Method(
  484. "POST",
  485. "/projects/{project_id}/provision/docr",
  486. auth.DoesUserHaveProjectAccess(
  487. auth.DoesUserHaveDOIntegrationAccess(
  488. requestlog.NewHandler(a.HandleProvisionDODOCRInfra, l),
  489. mw.URLParam,
  490. mw.BodyParam,
  491. false,
  492. ),
  493. mw.URLParam,
  494. mw.WriteAccess,
  495. ),
  496. )
  497. r.Method(
  498. "POST",
  499. "/projects/{project_id}/provision/doks",
  500. auth.DoesUserHaveProjectAccess(
  501. auth.DoesUserHaveDOIntegrationAccess(
  502. requestlog.NewHandler(a.HandleProvisionDODOKSInfra, l),
  503. mw.URLParam,
  504. mw.BodyParam,
  505. false,
  506. ),
  507. mw.URLParam,
  508. mw.WriteAccess,
  509. ),
  510. )
  511. r.Method(
  512. "GET",
  513. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  514. auth.DoesUserHaveProjectAccess(
  515. auth.DoesUserHaveInfraAccess(
  516. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  517. mw.URLParam,
  518. mw.URLParam,
  519. ),
  520. mw.URLParam,
  521. mw.ReadAccess,
  522. ),
  523. )
  524. r.Method(
  525. "POST",
  526. "/projects/{project_id}/infra/{infra_id}/ecr/destroy",
  527. auth.DoesUserHaveProjectAccess(
  528. auth.DoesUserHaveInfraAccess(
  529. requestlog.NewHandler(a.HandleDestroyAWSECRInfra, l),
  530. mw.URLParam,
  531. mw.URLParam,
  532. ),
  533. mw.URLParam,
  534. mw.WriteAccess,
  535. ),
  536. )
  537. r.Method(
  538. "POST",
  539. "/projects/{project_id}/infra/{infra_id}/test/destroy",
  540. auth.DoesUserHaveProjectAccess(
  541. auth.DoesUserHaveInfraAccess(
  542. requestlog.NewHandler(a.HandleDestroyTestInfra, l),
  543. mw.URLParam,
  544. mw.URLParam,
  545. ),
  546. mw.URLParam,
  547. mw.WriteAccess,
  548. ),
  549. )
  550. r.Method(
  551. "POST",
  552. "/projects/{project_id}/infra/{infra_id}/eks/destroy",
  553. auth.DoesUserHaveProjectAccess(
  554. auth.DoesUserHaveInfraAccess(
  555. requestlog.NewHandler(a.HandleDestroyAWSEKSInfra, l),
  556. mw.URLParam,
  557. mw.URLParam,
  558. ),
  559. mw.URLParam,
  560. mw.WriteAccess,
  561. ),
  562. )
  563. r.Method(
  564. "POST",
  565. "/projects/{project_id}/infra/{infra_id}/gke/destroy",
  566. auth.DoesUserHaveProjectAccess(
  567. auth.DoesUserHaveInfraAccess(
  568. requestlog.NewHandler(a.HandleDestroyGCPGKEInfra, l),
  569. mw.URLParam,
  570. mw.URLParam,
  571. ),
  572. mw.URLParam,
  573. mw.WriteAccess,
  574. ),
  575. )
  576. r.Method(
  577. "POST",
  578. "/projects/{project_id}/infra/{infra_id}/docr/destroy",
  579. auth.DoesUserHaveProjectAccess(
  580. auth.DoesUserHaveInfraAccess(
  581. requestlog.NewHandler(a.HandleDestroyDODOCRInfra, l),
  582. mw.URLParam,
  583. mw.URLParam,
  584. ),
  585. mw.URLParam,
  586. mw.WriteAccess,
  587. ),
  588. )
  589. r.Method(
  590. "POST",
  591. "/projects/{project_id}/infra/{infra_id}/doks/destroy",
  592. auth.DoesUserHaveProjectAccess(
  593. auth.DoesUserHaveInfraAccess(
  594. requestlog.NewHandler(a.HandleDestroyDODOKSInfra, l),
  595. mw.URLParam,
  596. mw.URLParam,
  597. ),
  598. mw.URLParam,
  599. mw.WriteAccess,
  600. ),
  601. )
  602. // /api/projects/{project_id}/clusters routes
  603. r.Method(
  604. "GET",
  605. "/projects/{project_id}/clusters",
  606. auth.DoesUserHaveProjectAccess(
  607. requestlog.NewHandler(a.HandleListProjectClusters, l),
  608. mw.URLParam,
  609. mw.ReadAccess,
  610. ),
  611. )
  612. r.Method(
  613. "POST",
  614. "/projects/{project_id}/clusters",
  615. auth.DoesUserHaveProjectAccess(
  616. auth.DoesUserHaveAWSIntegrationAccess(
  617. auth.DoesUserHaveGCPIntegrationAccess(
  618. requestlog.NewHandler(a.HandleCreateProjectCluster, l),
  619. mw.URLParam,
  620. mw.BodyParam,
  621. true,
  622. ),
  623. mw.URLParam,
  624. mw.BodyParam,
  625. true,
  626. ),
  627. mw.URLParam,
  628. mw.WriteAccess,
  629. ),
  630. )
  631. r.Method(
  632. "GET",
  633. "/projects/{project_id}/clusters/{cluster_id}",
  634. auth.DoesUserHaveProjectAccess(
  635. auth.DoesUserHaveClusterAccess(
  636. requestlog.NewHandler(a.HandleReadProjectCluster, l),
  637. mw.URLParam,
  638. mw.URLParam,
  639. ),
  640. mw.URLParam,
  641. mw.ReadAccess,
  642. ),
  643. )
  644. r.Method(
  645. "GET",
  646. "/projects/{project_id}/clusters/{cluster_id}/nodes",
  647. auth.DoesUserHaveProjectAccess(
  648. auth.DoesUserHaveClusterAccess(
  649. requestlog.NewHandler(a.HandleListNodes, l),
  650. mw.URLParam,
  651. mw.URLParam,
  652. ),
  653. mw.URLParam,
  654. mw.ReadAccess,
  655. ),
  656. )
  657. r.Method(
  658. "GET",
  659. "/projects/{project_id}/clusters/{cluster_id}/node/{node_name}",
  660. auth.DoesUserHaveProjectAccess(
  661. auth.DoesUserHaveClusterAccess(
  662. requestlog.NewHandler(a.HandleGetNode, l),
  663. mw.URLParam,
  664. mw.URLParam,
  665. ),
  666. mw.URLParam,
  667. mw.ReadAccess,
  668. ),
  669. )
  670. r.Method(
  671. "POST",
  672. "/projects/{project_id}/clusters/{cluster_id}",
  673. auth.DoesUserHaveProjectAccess(
  674. auth.DoesUserHaveClusterAccess(
  675. requestlog.NewHandler(a.HandleUpdateProjectCluster, l),
  676. mw.URLParam,
  677. mw.URLParam,
  678. ),
  679. mw.URLParam,
  680. mw.WriteAccess,
  681. ),
  682. )
  683. r.Method(
  684. "DELETE",
  685. "/projects/{project_id}/clusters/{cluster_id}",
  686. auth.DoesUserHaveProjectAccess(
  687. auth.DoesUserHaveClusterAccess(
  688. requestlog.NewHandler(a.HandleDeleteProjectCluster, l),
  689. mw.URLParam,
  690. mw.URLParam,
  691. ),
  692. mw.URLParam,
  693. mw.WriteAccess,
  694. ),
  695. )
  696. // /api/projects/{project_id}/clusters/candidates routes
  697. r.Method(
  698. "POST",
  699. "/projects/{project_id}/clusters/candidates",
  700. auth.DoesUserHaveProjectAccess(
  701. requestlog.NewHandler(a.HandleCreateProjectClusterCandidates, l),
  702. mw.URLParam,
  703. mw.WriteAccess,
  704. ),
  705. )
  706. r.Method(
  707. "GET",
  708. "/projects/{project_id}/clusters/candidates",
  709. auth.DoesUserHaveProjectAccess(
  710. requestlog.NewHandler(a.HandleListProjectClusterCandidates, l),
  711. mw.URLParam,
  712. mw.WriteAccess,
  713. ),
  714. )
  715. r.Method(
  716. "POST",
  717. "/projects/{project_id}/clusters/candidates/{candidate_id}/resolve",
  718. auth.DoesUserHaveProjectAccess(
  719. requestlog.NewHandler(a.HandleResolveClusterCandidate, l),
  720. mw.URLParam,
  721. mw.WriteAccess,
  722. ),
  723. )
  724. // /api/projects/{project_id}/integrations routes
  725. r.Method(
  726. "POST",
  727. "/projects/{project_id}/integrations/gcp",
  728. auth.DoesUserHaveProjectAccess(
  729. requestlog.NewHandler(a.HandleCreateGCPIntegration, l),
  730. mw.URLParam,
  731. mw.WriteAccess,
  732. ),
  733. )
  734. r.Method(
  735. "POST",
  736. "/projects/{project_id}/integrations/aws",
  737. auth.DoesUserHaveProjectAccess(
  738. requestlog.NewHandler(a.HandleCreateAWSIntegration, l),
  739. mw.URLParam,
  740. mw.WriteAccess,
  741. ),
  742. )
  743. r.Method(
  744. "POST",
  745. "/projects/{project_id}/integrations/aws/{aws_integration_id}/overwrite",
  746. auth.DoesUserHaveProjectAccess(
  747. auth.DoesUserHaveClusterAccess(
  748. auth.DoesUserHaveAWSIntegrationAccess(
  749. requestlog.NewHandler(a.HandleOverwriteAWSIntegration, l),
  750. mw.URLParam,
  751. mw.URLParam,
  752. false,
  753. ),
  754. mw.URLParam,
  755. mw.QueryParam,
  756. ),
  757. mw.URLParam,
  758. mw.WriteAccess,
  759. ),
  760. )
  761. r.Method(
  762. "POST",
  763. "/projects/{project_id}/integrations/basic",
  764. auth.DoesUserHaveProjectAccess(
  765. requestlog.NewHandler(a.HandleCreateBasicAuthIntegration, l),
  766. mw.URLParam,
  767. mw.WriteAccess,
  768. ),
  769. )
  770. r.Method(
  771. "GET",
  772. "/projects/{project_id}/integrations/oauth",
  773. auth.DoesUserHaveProjectAccess(
  774. requestlog.NewHandler(a.HandleListProjectOAuthIntegrations, l),
  775. mw.URLParam,
  776. mw.WriteAccess,
  777. ),
  778. )
  779. // /api/projects/{project_id}/slack_integrations routes
  780. r.Method(
  781. "GET",
  782. "/projects/{project_id}/slack_integrations",
  783. auth.DoesUserHaveProjectAccess(
  784. requestlog.NewHandler(a.HandleListSlackIntegrations, l),
  785. mw.URLParam,
  786. mw.WriteAccess,
  787. ),
  788. )
  789. r.Method(
  790. "DELETE",
  791. "/projects/{project_id}/slack_integrations/{slack_integration_id}",
  792. auth.DoesUserHaveProjectAccess(
  793. requestlog.NewHandler(a.HandleDeleteSlackIntegration, l),
  794. mw.URLParam,
  795. mw.WriteAccess,
  796. ),
  797. )
  798. // /api/projects/{project_id}/helmrepos routes
  799. r.Method(
  800. "POST",
  801. "/projects/{project_id}/helmrepos",
  802. auth.DoesUserHaveProjectAccess(
  803. auth.DoesUserHaveAWSIntegrationAccess(
  804. auth.DoesUserHaveGCPIntegrationAccess(
  805. requestlog.NewHandler(a.HandleCreateHelmRepo, l),
  806. mw.URLParam,
  807. mw.BodyParam,
  808. true,
  809. ),
  810. mw.URLParam,
  811. mw.BodyParam,
  812. true,
  813. ),
  814. mw.URLParam,
  815. mw.WriteAccess,
  816. ),
  817. )
  818. r.Method(
  819. "GET",
  820. "/projects/{project_id}/helmrepos",
  821. auth.DoesUserHaveProjectAccess(
  822. requestlog.NewHandler(a.HandleListProjectHelmRepos, l),
  823. mw.URLParam,
  824. mw.ReadAccess,
  825. ),
  826. )
  827. r.Method(
  828. "GET",
  829. "/projects/{project_id}/helmrepos/{helm_id}/charts",
  830. auth.DoesUserHaveProjectAccess(
  831. requestlog.NewHandler(a.HandleListHelmRepoCharts, l),
  832. mw.URLParam,
  833. mw.ReadAccess,
  834. ),
  835. )
  836. // /api/projects/{project_id}/registries routes
  837. r.Method(
  838. "POST",
  839. "/projects/{project_id}/registries",
  840. auth.DoesUserHaveProjectAccess(
  841. auth.DoesUserHaveAWSIntegrationAccess(
  842. auth.DoesUserHaveGCPIntegrationAccess(
  843. auth.DoesUserHaveDOIntegrationAccess(
  844. requestlog.NewHandler(a.HandleCreateRegistry, l),
  845. mw.URLParam,
  846. mw.BodyParam,
  847. true,
  848. ),
  849. mw.URLParam,
  850. mw.BodyParam,
  851. true,
  852. ),
  853. mw.URLParam,
  854. mw.BodyParam,
  855. true,
  856. ),
  857. mw.URLParam,
  858. mw.WriteAccess,
  859. ),
  860. )
  861. r.Method(
  862. "GET",
  863. "/projects/{project_id}/registries",
  864. auth.DoesUserHaveProjectAccess(
  865. requestlog.NewHandler(a.HandleListProjectRegistries, l),
  866. mw.URLParam,
  867. mw.ReadAccess,
  868. ),
  869. )
  870. r.Method(
  871. "POST",
  872. "/projects/{project_id}/registries/{registry_id}",
  873. auth.DoesUserHaveProjectAccess(
  874. auth.DoesUserHaveRegistryAccess(
  875. requestlog.NewHandler(a.HandleUpdateProjectRegistry, l),
  876. mw.URLParam,
  877. mw.URLParam,
  878. ),
  879. mw.URLParam,
  880. mw.ReadAccess,
  881. ),
  882. )
  883. r.Method(
  884. "POST",
  885. "/projects/{project_id}/registries/{registry_id}/repository",
  886. auth.DoesUserHaveProjectAccess(
  887. auth.DoesUserHaveRegistryAccess(
  888. requestlog.NewHandler(a.HandleCreateRepository, l),
  889. mw.URLParam,
  890. mw.URLParam,
  891. ),
  892. mw.URLParam,
  893. mw.WriteAccess,
  894. ),
  895. )
  896. r.Method(
  897. "GET",
  898. "/projects/{project_id}/registries/ecr/{region}/token",
  899. auth.DoesUserHaveProjectAccess(
  900. requestlog.NewHandler(a.HandleGetProjectRegistryECRToken, l),
  901. mw.URLParam,
  902. mw.WriteAccess,
  903. ),
  904. )
  905. r.Method(
  906. "GET",
  907. "/projects/{project_id}/registries/gcr/token",
  908. auth.DoesUserHaveProjectAccess(
  909. requestlog.NewHandler(a.HandleGetProjectRegistryGCRToken, l),
  910. mw.URLParam,
  911. mw.WriteAccess,
  912. ),
  913. )
  914. r.Method(
  915. "GET",
  916. "/projects/{project_id}/registries/dockerhub/token",
  917. auth.DoesUserHaveProjectAccess(
  918. requestlog.NewHandler(a.HandleGetProjectRegistryDockerhubToken, l),
  919. mw.URLParam,
  920. mw.WriteAccess,
  921. ),
  922. )
  923. r.Method(
  924. "GET",
  925. "/projects/{project_id}/registries/docr/token",
  926. auth.DoesUserHaveProjectAccess(
  927. requestlog.NewHandler(a.HandleGetProjectRegistryDOCRToken, l),
  928. mw.URLParam,
  929. mw.WriteAccess,
  930. ),
  931. )
  932. r.Method(
  933. "DELETE",
  934. "/projects/{project_id}/registries/{registry_id}",
  935. auth.DoesUserHaveProjectAccess(
  936. auth.DoesUserHaveRegistryAccess(
  937. requestlog.NewHandler(a.HandleDeleteProjectRegistry, l),
  938. mw.URLParam,
  939. mw.URLParam,
  940. ),
  941. mw.URLParam,
  942. mw.WriteAccess,
  943. ),
  944. )
  945. // /api/projects/{project_id}/registries/{registry_id}/repositories routes
  946. r.Method(
  947. "GET",
  948. "/projects/{project_id}/registries/{registry_id}/repositories",
  949. auth.DoesUserHaveProjectAccess(
  950. auth.DoesUserHaveRegistryAccess(
  951. requestlog.NewHandler(a.HandleListRepositories, l),
  952. mw.URLParam,
  953. mw.URLParam,
  954. ),
  955. mw.URLParam,
  956. mw.WriteAccess,
  957. ),
  958. )
  959. r.Method(
  960. "GET",
  961. // * is the repo name, which can itself be nested
  962. // for example, for GCR this is project-id/repo
  963. // need to use wildcard, see https://github.com/go-chi/chi/issues/243
  964. "/projects/{project_id}/registries/{registry_id}/repositories/*",
  965. auth.DoesUserHaveProjectAccess(
  966. auth.DoesUserHaveRegistryAccess(
  967. requestlog.NewHandler(a.HandleListImages, l),
  968. mw.URLParam,
  969. mw.URLParam,
  970. ),
  971. mw.URLParam,
  972. mw.ReadAccess,
  973. ),
  974. )
  975. // /api/projects/{project_id}/releases routes
  976. r.Method(
  977. "GET",
  978. "/projects/{project_id}/releases",
  979. auth.DoesUserHaveProjectAccess(
  980. auth.DoesUserHaveClusterAccess(
  981. requestlog.NewHandler(a.HandleListReleases, l),
  982. mw.URLParam,
  983. mw.QueryParam,
  984. ),
  985. mw.URLParam,
  986. mw.ReadAccess,
  987. ),
  988. )
  989. r.Method(
  990. "GET",
  991. "/projects/{project_id}/releases/{name}/{revision}/components",
  992. auth.DoesUserHaveProjectAccess(
  993. auth.DoesUserHaveClusterAccess(
  994. requestlog.NewHandler(a.HandleGetReleaseComponents, l),
  995. mw.URLParam,
  996. mw.QueryParam,
  997. ),
  998. mw.URLParam,
  999. mw.ReadAccess,
  1000. ),
  1001. )
  1002. r.Method(
  1003. "GET",
  1004. "/projects/{project_id}/releases/{name}/{revision}/controllers",
  1005. auth.DoesUserHaveProjectAccess(
  1006. auth.DoesUserHaveClusterAccess(
  1007. requestlog.NewHandler(a.HandleGetReleaseControllers, l),
  1008. mw.URLParam,
  1009. mw.QueryParam,
  1010. ),
  1011. mw.URLParam,
  1012. mw.ReadAccess,
  1013. ),
  1014. )
  1015. r.Method(
  1016. "GET",
  1017. "/projects/{project_id}/releases/{name}/{revision}/pods/all",
  1018. auth.DoesUserHaveProjectAccess(
  1019. auth.DoesUserHaveClusterAccess(
  1020. requestlog.NewHandler(a.HandleGetReleaseAllPods, l),
  1021. mw.URLParam,
  1022. mw.QueryParam,
  1023. ),
  1024. mw.URLParam,
  1025. mw.ReadAccess,
  1026. ),
  1027. )
  1028. r.Method(
  1029. "GET",
  1030. "/projects/{project_id}/releases/{name}/history",
  1031. auth.DoesUserHaveProjectAccess(
  1032. auth.DoesUserHaveClusterAccess(
  1033. requestlog.NewHandler(a.HandleListReleaseHistory, l),
  1034. mw.URLParam,
  1035. mw.QueryParam,
  1036. ),
  1037. mw.URLParam,
  1038. mw.ReadAccess,
  1039. ),
  1040. )
  1041. r.Method(
  1042. "GET",
  1043. "/projects/{project_id}/releases/{name}/webhook_token",
  1044. auth.DoesUserHaveProjectAccess(
  1045. auth.DoesUserHaveClusterAccess(
  1046. requestlog.NewHandler(a.HandleGetReleaseToken, l),
  1047. mw.URLParam,
  1048. mw.QueryParam,
  1049. ),
  1050. mw.URLParam,
  1051. mw.ReadAccess,
  1052. ),
  1053. )
  1054. r.Method(
  1055. "POST",
  1056. "/projects/{project_id}/releases/{name}/webhook_token",
  1057. auth.DoesUserHaveProjectAccess(
  1058. auth.DoesUserHaveClusterAccess(
  1059. requestlog.NewHandler(a.HandleCreateWebhookToken, l),
  1060. mw.URLParam,
  1061. mw.QueryParam,
  1062. ),
  1063. mw.URLParam,
  1064. mw.WriteAccess,
  1065. ),
  1066. )
  1067. r.Method(
  1068. "GET",
  1069. "/projects/{project_id}/releases/{name}/{revision}",
  1070. auth.DoesUserHaveProjectAccess(
  1071. auth.DoesUserHaveClusterAccess(
  1072. requestlog.NewHandler(a.HandleGetRelease, l),
  1073. mw.URLParam,
  1074. mw.QueryParam,
  1075. ),
  1076. mw.URLParam,
  1077. mw.ReadAccess,
  1078. ),
  1079. )
  1080. // /api/projects/{project_id}/gitrepos routes
  1081. r.Method(
  1082. "GET",
  1083. "/projects/{project_id}/gitrepos",
  1084. auth.DoesUserHaveProjectAccess(
  1085. requestlog.NewHandler(a.HandleListProjectGitRepos, l),
  1086. mw.URLParam,
  1087. mw.ReadAccess,
  1088. ),
  1089. )
  1090. r.Method(
  1091. "GET",
  1092. "/projects/{project_id}/gitrepos/{installation_id}/repos",
  1093. auth.DoesUserHaveProjectAccess(
  1094. auth.DoesUserHaveGitInstallationAccess(
  1095. requestlog.NewHandler(a.HandleListRepos, l),
  1096. mw.URLParam,
  1097. ),
  1098. mw.URLParam,
  1099. mw.ReadAccess,
  1100. ),
  1101. )
  1102. r.Method(
  1103. "GET",
  1104. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/branches",
  1105. auth.DoesUserHaveProjectAccess(
  1106. auth.DoesUserHaveGitInstallationAccess(
  1107. requestlog.NewHandler(a.HandleGetBranches, l),
  1108. mw.URLParam,
  1109. ),
  1110. mw.URLParam,
  1111. mw.ReadAccess,
  1112. ),
  1113. )
  1114. r.Method(
  1115. "GET",
  1116. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/buildpack/detect",
  1117. auth.DoesUserHaveProjectAccess(
  1118. auth.DoesUserHaveGitInstallationAccess(
  1119. requestlog.NewHandler(a.HandleDetectBuildpack, l),
  1120. mw.URLParam,
  1121. ),
  1122. mw.URLParam,
  1123. mw.ReadAccess,
  1124. ),
  1125. )
  1126. r.Method(
  1127. "GET",
  1128. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/contents",
  1129. auth.DoesUserHaveProjectAccess(
  1130. auth.DoesUserHaveGitInstallationAccess(
  1131. requestlog.NewHandler(a.HandleGetBranchContents, l),
  1132. mw.URLParam,
  1133. ),
  1134. mw.URLParam,
  1135. mw.ReadAccess,
  1136. ),
  1137. )
  1138. r.Method(
  1139. "GET",
  1140. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/procfile",
  1141. auth.DoesUserHaveProjectAccess(
  1142. auth.DoesUserHaveGitInstallationAccess(
  1143. requestlog.NewHandler(a.HandleGetProcfileContents, l),
  1144. mw.URLParam,
  1145. ),
  1146. mw.URLParam,
  1147. mw.ReadAccess,
  1148. ),
  1149. )
  1150. r.Method(
  1151. "GET",
  1152. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/tarball_url",
  1153. auth.DoesUserHaveProjectAccess(
  1154. auth.DoesUserHaveGitInstallationAccess(
  1155. requestlog.NewHandler(a.HandleGetRepoZIPDownloadURL, l),
  1156. mw.URLParam,
  1157. ),
  1158. mw.URLParam,
  1159. mw.ReadAccess,
  1160. ),
  1161. )
  1162. // /api/projects/{project_id}/k8s routes
  1163. r.Method(
  1164. "GET",
  1165. "/projects/{project_id}/k8s/namespaces",
  1166. auth.DoesUserHaveProjectAccess(
  1167. auth.DoesUserHaveClusterAccess(
  1168. requestlog.NewHandler(a.HandleListNamespaces, l),
  1169. mw.URLParam,
  1170. mw.QueryParam,
  1171. ),
  1172. mw.URLParam,
  1173. mw.ReadAccess,
  1174. ),
  1175. )
  1176. r.Method(
  1177. "POST",
  1178. "/projects/{project_id}/k8s/namespaces/create",
  1179. auth.DoesUserHaveProjectAccess(
  1180. auth.DoesUserHaveClusterAccess(
  1181. requestlog.NewHandler(a.HandleCreateNamespace, l),
  1182. mw.URLParam,
  1183. mw.QueryParam,
  1184. ),
  1185. mw.URLParam,
  1186. mw.ReadAccess,
  1187. ),
  1188. )
  1189. r.Method(
  1190. "DELETE",
  1191. "/projects/{project_id}/k8s/namespaces/delete",
  1192. auth.DoesUserHaveProjectAccess(
  1193. auth.DoesUserHaveClusterAccess(
  1194. requestlog.NewHandler(a.HandleDeleteNamespace, l),
  1195. mw.URLParam,
  1196. mw.QueryParam,
  1197. ),
  1198. mw.URLParam,
  1199. mw.ReadAccess,
  1200. ),
  1201. )
  1202. r.Method(
  1203. "GET",
  1204. "/projects/{project_id}/k8s/kubeconfig",
  1205. auth.DoesUserHaveProjectAccess(
  1206. auth.DoesUserHaveClusterAccess(
  1207. requestlog.NewHandler(a.HandleGetTemporaryKubeconfig, l),
  1208. mw.URLParam,
  1209. mw.QueryParam,
  1210. ),
  1211. mw.URLParam,
  1212. mw.WriteAccess,
  1213. ),
  1214. )
  1215. r.Method(
  1216. "GET",
  1217. "/projects/{project_id}/k8s/prometheus/detect",
  1218. auth.DoesUserHaveProjectAccess(
  1219. auth.DoesUserHaveClusterAccess(
  1220. requestlog.NewHandler(a.HandleDetectPrometheusInstalled, l),
  1221. mw.URLParam,
  1222. mw.QueryParam,
  1223. ),
  1224. mw.URLParam,
  1225. mw.ReadAccess,
  1226. ),
  1227. )
  1228. r.Method(
  1229. "GET",
  1230. "/projects/{project_id}/k8s/prometheus/ingresses",
  1231. auth.DoesUserHaveProjectAccess(
  1232. auth.DoesUserHaveClusterAccess(
  1233. requestlog.NewHandler(a.HandleListNGINXIngresses, l),
  1234. mw.URLParam,
  1235. mw.QueryParam,
  1236. ),
  1237. mw.URLParam,
  1238. mw.ReadAccess,
  1239. ),
  1240. )
  1241. r.Method(
  1242. "GET",
  1243. "/projects/{project_id}/k8s/metrics",
  1244. auth.DoesUserHaveProjectAccess(
  1245. auth.DoesUserHaveClusterAccess(
  1246. requestlog.NewHandler(a.HandleGetPodMetrics, l),
  1247. mw.URLParam,
  1248. mw.QueryParam,
  1249. ),
  1250. mw.URLParam,
  1251. mw.ReadAccess,
  1252. ),
  1253. )
  1254. r.Method(
  1255. "GET",
  1256. "/projects/{project_id}/k8s/{namespace}/pod/{name}/logs",
  1257. auth.DoesUserHaveProjectAccess(
  1258. auth.DoesUserHaveClusterAccess(
  1259. requestlog.NewHandler(a.HandleGetPodLogs, l),
  1260. mw.URLParam,
  1261. mw.QueryParam,
  1262. ),
  1263. mw.URLParam,
  1264. mw.ReadAccess,
  1265. ),
  1266. )
  1267. r.Method(
  1268. "GET",
  1269. "/projects/{project_id}/k8s/{namespace}/{chart}/{release_name}/jobs",
  1270. auth.DoesUserHaveProjectAccess(
  1271. auth.DoesUserHaveClusterAccess(
  1272. requestlog.NewHandler(a.HandleListJobsByChart, l),
  1273. mw.URLParam,
  1274. mw.QueryParam,
  1275. ),
  1276. mw.URLParam,
  1277. mw.ReadAccess,
  1278. ),
  1279. )
  1280. r.Method(
  1281. "GET",
  1282. "/projects/{project_id}/k8s/{namespace}/{name}/jobs/status",
  1283. auth.DoesUserHaveProjectAccess(
  1284. auth.DoesUserHaveClusterAccess(
  1285. requestlog.NewHandler(a.HandleGetJobStatus, l),
  1286. mw.URLParam,
  1287. mw.QueryParam,
  1288. ),
  1289. mw.URLParam,
  1290. mw.ReadAccess,
  1291. ),
  1292. )
  1293. r.Method(
  1294. "GET",
  1295. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/pods",
  1296. auth.DoesUserHaveProjectAccess(
  1297. auth.DoesUserHaveClusterAccess(
  1298. requestlog.NewHandler(a.HandleListJobPods, l),
  1299. mw.URLParam,
  1300. mw.QueryParam,
  1301. ),
  1302. mw.URLParam,
  1303. mw.ReadAccess,
  1304. ),
  1305. )
  1306. r.Method(
  1307. "GET",
  1308. "/projects/{project_id}/k8s/{namespace}/ingress/{name}",
  1309. auth.DoesUserHaveProjectAccess(
  1310. auth.DoesUserHaveClusterAccess(
  1311. requestlog.NewHandler(a.HandleGetIngress, l),
  1312. mw.URLParam,
  1313. mw.QueryParam,
  1314. ),
  1315. mw.URLParam,
  1316. mw.ReadAccess,
  1317. ),
  1318. )
  1319. r.Method(
  1320. "GET",
  1321. "/projects/{project_id}/k8s/{kind}/status",
  1322. auth.DoesUserHaveProjectAccess(
  1323. auth.DoesUserHaveClusterAccess(
  1324. requestlog.NewHandler(a.HandleStreamControllerStatus, l),
  1325. mw.URLParam,
  1326. mw.QueryParam,
  1327. ),
  1328. mw.URLParam,
  1329. mw.ReadAccess,
  1330. ),
  1331. )
  1332. r.Method(
  1333. "GET",
  1334. "/projects/{project_id}/k8s/helm_releases",
  1335. auth.DoesUserHaveProjectAccess(
  1336. auth.DoesUserHaveClusterAccess(
  1337. requestlog.NewHandler(a.HandleStreamHelmReleases, l),
  1338. mw.URLParam,
  1339. mw.QueryParam,
  1340. ),
  1341. mw.URLParam,
  1342. mw.ReadAccess,
  1343. ),
  1344. )
  1345. r.Method(
  1346. "GET",
  1347. "/projects/{project_id}/k8s/pods",
  1348. auth.DoesUserHaveProjectAccess(
  1349. auth.DoesUserHaveClusterAccess(
  1350. requestlog.NewHandler(a.HandleListPods, l),
  1351. mw.URLParam,
  1352. mw.QueryParam,
  1353. ),
  1354. mw.URLParam,
  1355. mw.ReadAccess,
  1356. ),
  1357. )
  1358. r.Method(
  1359. "DELETE",
  1360. "/projects/{project_id}/k8s/pods/{namespace}/{name}",
  1361. auth.DoesUserHaveProjectAccess(
  1362. auth.DoesUserHaveClusterAccess(
  1363. requestlog.NewHandler(a.HandleDeletePod, l),
  1364. mw.URLParam,
  1365. mw.QueryParam,
  1366. ),
  1367. mw.URLParam,
  1368. mw.WriteAccess,
  1369. ),
  1370. )
  1371. r.Method(
  1372. "GET",
  1373. "/projects/{project_id}/k8s/pods/{namespace}/{name}/events/list",
  1374. auth.DoesUserHaveProjectAccess(
  1375. auth.DoesUserHaveClusterAccess(
  1376. requestlog.NewHandler(a.HandleListPodEvents, l),
  1377. mw.URLParam,
  1378. mw.QueryParam,
  1379. ),
  1380. mw.URLParam,
  1381. mw.ReadAccess,
  1382. ),
  1383. )
  1384. r.Method(
  1385. "POST",
  1386. "/projects/{project_id}/k8s/configmap/create",
  1387. auth.DoesUserHaveProjectAccess(
  1388. auth.DoesUserHaveClusterAccess(
  1389. requestlog.NewHandler(a.HandleCreateConfigMap, l),
  1390. mw.URLParam,
  1391. mw.QueryParam,
  1392. ),
  1393. mw.URLParam,
  1394. mw.WriteAccess,
  1395. ),
  1396. )
  1397. r.Method(
  1398. "DELETE",
  1399. "/projects/{project_id}/k8s/configmap/delete",
  1400. auth.DoesUserHaveProjectAccess(
  1401. auth.DoesUserHaveClusterAccess(
  1402. requestlog.NewHandler(a.HandleDeleteConfigMap, l),
  1403. mw.URLParam,
  1404. mw.QueryParam,
  1405. ),
  1406. mw.URLParam,
  1407. mw.WriteAccess,
  1408. ),
  1409. )
  1410. r.Method(
  1411. "GET",
  1412. "/projects/{project_id}/k8s/configmap",
  1413. auth.DoesUserHaveProjectAccess(
  1414. auth.DoesUserHaveClusterAccess(
  1415. requestlog.NewHandler(a.HandleGetConfigMap, l),
  1416. mw.URLParam,
  1417. mw.QueryParam,
  1418. ),
  1419. mw.URLParam,
  1420. mw.ReadAccess,
  1421. ),
  1422. )
  1423. r.Method(
  1424. "GET",
  1425. "/projects/{project_id}/k8s/configmap/list",
  1426. auth.DoesUserHaveProjectAccess(
  1427. auth.DoesUserHaveClusterAccess(
  1428. requestlog.NewHandler(a.HandleListConfigMaps, l),
  1429. mw.URLParam,
  1430. mw.QueryParam,
  1431. ),
  1432. mw.URLParam,
  1433. mw.ReadAccess,
  1434. ),
  1435. )
  1436. r.Method(
  1437. "POST",
  1438. "/projects/{project_id}/k8s/configmap/update",
  1439. auth.DoesUserHaveProjectAccess(
  1440. auth.DoesUserHaveClusterAccess(
  1441. requestlog.NewHandler(a.HandleUpdateConfigMap, l),
  1442. mw.URLParam,
  1443. mw.QueryParam,
  1444. ),
  1445. mw.URLParam,
  1446. mw.WriteAccess,
  1447. ),
  1448. )
  1449. r.Method(
  1450. "POST",
  1451. "/projects/{project_id}/k8s/configmap/rename",
  1452. auth.DoesUserHaveProjectAccess(
  1453. auth.DoesUserHaveClusterAccess(
  1454. requestlog.NewHandler(a.HandleRenameConfigMap, l),
  1455. mw.URLParam,
  1456. mw.QueryParam,
  1457. ),
  1458. mw.URLParam,
  1459. mw.WriteAccess,
  1460. ),
  1461. )
  1462. r.Method(
  1463. "DELETE",
  1464. "/projects/{project_id}/k8s/jobs/{namespace}/{name}",
  1465. auth.DoesUserHaveProjectAccess(
  1466. auth.DoesUserHaveClusterAccess(
  1467. requestlog.NewHandler(a.HandleDeleteJob, l),
  1468. mw.URLParam,
  1469. mw.QueryParam,
  1470. ),
  1471. mw.URLParam,
  1472. mw.WriteAccess,
  1473. ),
  1474. )
  1475. r.Method(
  1476. "POST",
  1477. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/stop",
  1478. auth.DoesUserHaveProjectAccess(
  1479. auth.DoesUserHaveClusterAccess(
  1480. requestlog.NewHandler(a.HandleStopJob, l),
  1481. mw.URLParam,
  1482. mw.QueryParam,
  1483. ),
  1484. mw.URLParam,
  1485. mw.WriteAccess,
  1486. ),
  1487. )
  1488. // /api/projects/{project_id}/subdomain routes
  1489. r.Method(
  1490. "POST",
  1491. "/projects/{project_id}/k8s/subdomain",
  1492. auth.DoesUserHaveProjectAccess(
  1493. auth.DoesUserHaveClusterAccess(
  1494. requestlog.NewHandler(a.HandleCreateDNSRecord, l),
  1495. mw.URLParam,
  1496. mw.QueryParam,
  1497. ),
  1498. mw.URLParam,
  1499. mw.WriteAccess,
  1500. ),
  1501. )
  1502. // capabilities
  1503. r.Method(
  1504. "GET",
  1505. "/capabilities",
  1506. http.HandlerFunc(a.HandleGetCapabilities),
  1507. )
  1508. // /api/projects/{project_id}/deploy routes
  1509. r.Method(
  1510. "POST",
  1511. "/projects/{project_id}/deploy/{name}/{version}",
  1512. auth.DoesUserHaveProjectAccess(
  1513. auth.DoesUserHaveClusterAccess(
  1514. requestlog.NewHandler(a.HandleDeployTemplate, l),
  1515. mw.URLParam,
  1516. mw.QueryParam,
  1517. ),
  1518. mw.URLParam,
  1519. mw.WriteAccess,
  1520. ),
  1521. )
  1522. r.Method(
  1523. "POST",
  1524. "/projects/{project_id}/deploy/addon/{name}/{version}",
  1525. auth.DoesUserHaveProjectAccess(
  1526. auth.DoesUserHaveClusterAccess(
  1527. requestlog.NewHandler(a.HandleDeployAddon, l),
  1528. mw.URLParam,
  1529. mw.QueryParam,
  1530. ),
  1531. mw.URLParam,
  1532. mw.WriteAccess,
  1533. ),
  1534. )
  1535. })
  1536. // Create group for long-running Helm operations
  1537. r.Group(func(r chi.Router) {
  1538. r.Use(middleware.Timeout(300 * time.Second))
  1539. r.Method(
  1540. "POST",
  1541. "/projects/{project_id}/releases/{name}/rollback",
  1542. auth.DoesUserHaveProjectAccess(
  1543. auth.DoesUserHaveClusterAccess(
  1544. requestlog.NewHandler(a.HandleRollbackRelease, l),
  1545. mw.URLParam,
  1546. mw.QueryParam,
  1547. ),
  1548. mw.URLParam,
  1549. mw.WriteAccess,
  1550. ),
  1551. )
  1552. r.Method(
  1553. "POST",
  1554. "/webhooks/deploy/{token}",
  1555. requestlog.NewHandler(a.HandleReleaseDeployWebhook, l),
  1556. )
  1557. r.Method(
  1558. "POST",
  1559. "/projects/{project_id}/delete/{name}",
  1560. auth.DoesUserHaveProjectAccess(
  1561. auth.DoesUserHaveClusterAccess(
  1562. requestlog.NewHandler(a.HandleUninstallTemplate, l),
  1563. mw.URLParam,
  1564. mw.QueryParam,
  1565. ),
  1566. mw.URLParam,
  1567. mw.WriteAccess,
  1568. ),
  1569. )
  1570. r.Method(
  1571. "POST",
  1572. "/projects/{project_id}/releases/{name}/upgrade",
  1573. auth.DoesUserHaveProjectAccess(
  1574. auth.DoesUserHaveClusterAccess(
  1575. requestlog.NewHandler(a.HandleUpgradeRelease, l),
  1576. mw.URLParam,
  1577. mw.QueryParam,
  1578. ),
  1579. mw.URLParam,
  1580. mw.WriteAccess,
  1581. ),
  1582. )
  1583. r.Method(
  1584. "POST",
  1585. "/projects/{project_id}/releases/image/update/batch",
  1586. auth.DoesUserHaveProjectAccess(
  1587. auth.DoesUserHaveClusterAccess(
  1588. requestlog.NewHandler(a.HandleReleaseUpdateJobImages, l),
  1589. mw.URLParam,
  1590. mw.QueryParam,
  1591. ),
  1592. mw.URLParam,
  1593. mw.WriteAccess,
  1594. ),
  1595. )
  1596. })
  1597. })
  1598. staticFilePath := a.ServerConf.StaticFilePath
  1599. fs := http.FileServer(http.Dir(staticFilePath))
  1600. r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
  1601. if _, err := os.Stat(staticFilePath + r.RequestURI); os.IsNotExist(err) {
  1602. w.Header().Set("Cache-Control", "no-cache")
  1603. http.StripPrefix(r.URL.Path, fs).ServeHTTP(w, r)
  1604. } else {
  1605. // Set static files involving html, js, or empty cache to "no-cache", which means they must be validated
  1606. // for changes before the browser uses the cache
  1607. if base := path.Base(r.URL.Path); strings.Contains(base, "html") || strings.Contains(base, "js") || base == "." || base == "/" {
  1608. w.Header().Set("Cache-Control", "no-cache")
  1609. }
  1610. fs.ServeHTTP(w, r)
  1611. }
  1612. })
  1613. return r
  1614. }