router.go 37 KB

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