router.go 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819
  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/generate",
  345. auth.DoesUserHaveProjectAccess(
  346. auth.DoesUserHaveClusterAccess(
  347. requestlog.NewHandler(a.HandleGenerateGitAction, l),
  348. mw.URLParam,
  349. mw.QueryParam,
  350. ),
  351. mw.URLParam,
  352. mw.WriteAccess,
  353. ),
  354. )
  355. r.Method(
  356. "POST",
  357. "/projects/{project_id}/ci/actions/create",
  358. auth.DoesUserHaveProjectAccess(
  359. auth.DoesUserHaveClusterAccess(
  360. requestlog.NewHandler(a.HandleCreateGitAction, l),
  361. mw.URLParam,
  362. mw.QueryParam,
  363. ),
  364. mw.URLParam,
  365. mw.WriteAccess,
  366. ),
  367. )
  368. // /api/projects/{project_id}/invites routes
  369. r.Method(
  370. "POST",
  371. "/projects/{project_id}/invites",
  372. auth.DoesUserHaveProjectAccess(
  373. requestlog.NewHandler(a.HandleCreateInvite, l),
  374. mw.URLParam,
  375. mw.AdminAccess,
  376. ),
  377. )
  378. r.Method(
  379. "GET",
  380. "/projects/{project_id}/invites",
  381. auth.DoesUserHaveProjectAccess(
  382. requestlog.NewHandler(a.HandleListProjectInvites, l),
  383. mw.URLParam,
  384. mw.AdminAccess,
  385. ),
  386. )
  387. r.Method(
  388. "GET",
  389. "/projects/{project_id}/invites/{token}",
  390. auth.BasicAuthenticateWithRedirect(
  391. requestlog.NewHandler(a.HandleAcceptInvite, l),
  392. ),
  393. )
  394. r.Method(
  395. "POST",
  396. "/projects/{project_id}/invites/{invite_id}",
  397. auth.DoesUserHaveProjectAccess(
  398. auth.DoesUserHaveInviteAccess(
  399. requestlog.NewHandler(a.HandleUpdateInviteRole, l),
  400. mw.URLParam,
  401. mw.URLParam,
  402. ),
  403. mw.URLParam,
  404. mw.AdminAccess,
  405. ),
  406. )
  407. r.Method(
  408. "DELETE",
  409. "/projects/{project_id}/invites/{invite_id}",
  410. auth.DoesUserHaveProjectAccess(
  411. auth.DoesUserHaveInviteAccess(
  412. requestlog.NewHandler(a.HandleDeleteProjectInvite, l),
  413. mw.URLParam,
  414. mw.URLParam,
  415. ),
  416. mw.URLParam,
  417. mw.AdminAccess,
  418. ),
  419. )
  420. // /api/projects/{project_id}/infra routes
  421. r.Method(
  422. "GET",
  423. "/projects/{project_id}/infra",
  424. auth.DoesUserHaveProjectAccess(
  425. requestlog.NewHandler(a.HandleListProjectInfra, l),
  426. mw.URLParam,
  427. mw.ReadAccess,
  428. ),
  429. )
  430. // /api/projects/{project_id}/provision routes
  431. r.Method(
  432. "POST",
  433. "/projects/{project_id}/provision/test",
  434. auth.DoesUserHaveProjectAccess(
  435. requestlog.NewHandler(a.HandleProvisionTestInfra, l),
  436. mw.URLParam,
  437. mw.WriteAccess,
  438. ),
  439. )
  440. r.Method(
  441. "POST",
  442. "/projects/{project_id}/provision/ecr",
  443. auth.DoesUserHaveProjectAccess(
  444. auth.DoesUserHaveAWSIntegrationAccess(
  445. requestlog.NewHandler(a.HandleProvisionAWSECRInfra, l),
  446. mw.URLParam,
  447. mw.BodyParam,
  448. false,
  449. ),
  450. mw.URLParam,
  451. mw.WriteAccess,
  452. ),
  453. )
  454. r.Method(
  455. "POST",
  456. "/projects/{project_id}/provision/eks",
  457. auth.DoesUserHaveProjectAccess(
  458. auth.DoesUserHaveAWSIntegrationAccess(
  459. requestlog.NewHandler(a.HandleProvisionAWSEKSInfra, l),
  460. mw.URLParam,
  461. mw.BodyParam,
  462. false,
  463. ),
  464. mw.URLParam,
  465. mw.WriteAccess,
  466. ),
  467. )
  468. r.Method(
  469. "POST",
  470. "/projects/{project_id}/provision/gcr",
  471. auth.DoesUserHaveProjectAccess(
  472. auth.DoesUserHaveGCPIntegrationAccess(
  473. requestlog.NewHandler(a.HandleProvisionGCPGCRInfra, l),
  474. mw.URLParam,
  475. mw.BodyParam,
  476. false,
  477. ),
  478. mw.URLParam,
  479. mw.WriteAccess,
  480. ),
  481. )
  482. r.Method(
  483. "POST",
  484. "/projects/{project_id}/provision/gke",
  485. auth.DoesUserHaveProjectAccess(
  486. auth.DoesUserHaveGCPIntegrationAccess(
  487. requestlog.NewHandler(a.HandleProvisionGCPGKEInfra, l),
  488. mw.URLParam,
  489. mw.BodyParam,
  490. false,
  491. ),
  492. mw.URLParam,
  493. mw.WriteAccess,
  494. ),
  495. )
  496. r.Method(
  497. "POST",
  498. "/projects/{project_id}/provision/docr",
  499. auth.DoesUserHaveProjectAccess(
  500. auth.DoesUserHaveDOIntegrationAccess(
  501. requestlog.NewHandler(a.HandleProvisionDODOCRInfra, l),
  502. mw.URLParam,
  503. mw.BodyParam,
  504. false,
  505. ),
  506. mw.URLParam,
  507. mw.WriteAccess,
  508. ),
  509. )
  510. r.Method(
  511. "POST",
  512. "/projects/{project_id}/provision/doks",
  513. auth.DoesUserHaveProjectAccess(
  514. auth.DoesUserHaveDOIntegrationAccess(
  515. requestlog.NewHandler(a.HandleProvisionDODOKSInfra, l),
  516. mw.URLParam,
  517. mw.BodyParam,
  518. false,
  519. ),
  520. mw.URLParam,
  521. mw.WriteAccess,
  522. ),
  523. )
  524. r.Method(
  525. "GET",
  526. "/projects/{project_id}/provision/{kind}/{infra_id}/logs",
  527. auth.DoesUserHaveProjectAccess(
  528. auth.DoesUserHaveInfraAccess(
  529. requestlog.NewHandler(a.HandleGetProvisioningLogs, l),
  530. mw.URLParam,
  531. mw.URLParam,
  532. ),
  533. mw.URLParam,
  534. mw.ReadAccess,
  535. ),
  536. )
  537. r.Method(
  538. "POST",
  539. "/projects/{project_id}/infra/{infra_id}/ecr/destroy",
  540. auth.DoesUserHaveProjectAccess(
  541. auth.DoesUserHaveInfraAccess(
  542. requestlog.NewHandler(a.HandleDestroyAWSECRInfra, 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}/test/destroy",
  553. auth.DoesUserHaveProjectAccess(
  554. auth.DoesUserHaveInfraAccess(
  555. requestlog.NewHandler(a.HandleDestroyTestInfra, 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}/eks/destroy",
  566. auth.DoesUserHaveProjectAccess(
  567. auth.DoesUserHaveInfraAccess(
  568. requestlog.NewHandler(a.HandleDestroyAWSEKSInfra, 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}/gke/destroy",
  579. auth.DoesUserHaveProjectAccess(
  580. auth.DoesUserHaveInfraAccess(
  581. requestlog.NewHandler(a.HandleDestroyGCPGKEInfra, 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}/docr/destroy",
  592. auth.DoesUserHaveProjectAccess(
  593. auth.DoesUserHaveInfraAccess(
  594. requestlog.NewHandler(a.HandleDestroyDODOCRInfra, l),
  595. mw.URLParam,
  596. mw.URLParam,
  597. ),
  598. mw.URLParam,
  599. mw.WriteAccess,
  600. ),
  601. )
  602. r.Method(
  603. "POST",
  604. "/projects/{project_id}/infra/{infra_id}/doks/destroy",
  605. auth.DoesUserHaveProjectAccess(
  606. auth.DoesUserHaveInfraAccess(
  607. requestlog.NewHandler(a.HandleDestroyDODOKSInfra, l),
  608. mw.URLParam,
  609. mw.URLParam,
  610. ),
  611. mw.URLParam,
  612. mw.WriteAccess,
  613. ),
  614. )
  615. // /api/projects/{project_id}/clusters routes
  616. r.Method(
  617. "GET",
  618. "/projects/{project_id}/clusters",
  619. auth.DoesUserHaveProjectAccess(
  620. requestlog.NewHandler(a.HandleListProjectClusters, l),
  621. mw.URLParam,
  622. mw.ReadAccess,
  623. ),
  624. )
  625. r.Method(
  626. "POST",
  627. "/projects/{project_id}/clusters",
  628. auth.DoesUserHaveProjectAccess(
  629. auth.DoesUserHaveAWSIntegrationAccess(
  630. auth.DoesUserHaveGCPIntegrationAccess(
  631. requestlog.NewHandler(a.HandleCreateProjectCluster, l),
  632. mw.URLParam,
  633. mw.BodyParam,
  634. true,
  635. ),
  636. mw.URLParam,
  637. mw.BodyParam,
  638. true,
  639. ),
  640. mw.URLParam,
  641. mw.WriteAccess,
  642. ),
  643. )
  644. r.Method(
  645. "GET",
  646. "/projects/{project_id}/clusters/{cluster_id}",
  647. auth.DoesUserHaveProjectAccess(
  648. auth.DoesUserHaveClusterAccess(
  649. requestlog.NewHandler(a.HandleReadProjectCluster, 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}/nodes",
  660. auth.DoesUserHaveProjectAccess(
  661. auth.DoesUserHaveClusterAccess(
  662. requestlog.NewHandler(a.HandleListNodes, l),
  663. mw.URLParam,
  664. mw.URLParam,
  665. ),
  666. mw.URLParam,
  667. mw.ReadAccess,
  668. ),
  669. )
  670. r.Method(
  671. "GET",
  672. "/projects/{project_id}/clusters/{cluster_id}/node/{node_name}",
  673. auth.DoesUserHaveProjectAccess(
  674. auth.DoesUserHaveClusterAccess(
  675. requestlog.NewHandler(a.HandleGetNode, l),
  676. mw.URLParam,
  677. mw.URLParam,
  678. ),
  679. mw.URLParam,
  680. mw.ReadAccess,
  681. ),
  682. )
  683. r.Method(
  684. "POST",
  685. "/projects/{project_id}/clusters/{cluster_id}",
  686. auth.DoesUserHaveProjectAccess(
  687. auth.DoesUserHaveClusterAccess(
  688. requestlog.NewHandler(a.HandleUpdateProjectCluster, l),
  689. mw.URLParam,
  690. mw.URLParam,
  691. ),
  692. mw.URLParam,
  693. mw.WriteAccess,
  694. ),
  695. )
  696. r.Method(
  697. "DELETE",
  698. "/projects/{project_id}/clusters/{cluster_id}",
  699. auth.DoesUserHaveProjectAccess(
  700. auth.DoesUserHaveClusterAccess(
  701. requestlog.NewHandler(a.HandleDeleteProjectCluster, l),
  702. mw.URLParam,
  703. mw.URLParam,
  704. ),
  705. mw.URLParam,
  706. mw.WriteAccess,
  707. ),
  708. )
  709. // /api/projects/{project_id}/clusters/candidates routes
  710. r.Method(
  711. "POST",
  712. "/projects/{project_id}/clusters/candidates",
  713. auth.DoesUserHaveProjectAccess(
  714. requestlog.NewHandler(a.HandleCreateProjectClusterCandidates, l),
  715. mw.URLParam,
  716. mw.WriteAccess,
  717. ),
  718. )
  719. r.Method(
  720. "GET",
  721. "/projects/{project_id}/clusters/candidates",
  722. auth.DoesUserHaveProjectAccess(
  723. requestlog.NewHandler(a.HandleListProjectClusterCandidates, l),
  724. mw.URLParam,
  725. mw.WriteAccess,
  726. ),
  727. )
  728. r.Method(
  729. "POST",
  730. "/projects/{project_id}/clusters/candidates/{candidate_id}/resolve",
  731. auth.DoesUserHaveProjectAccess(
  732. requestlog.NewHandler(a.HandleResolveClusterCandidate, l),
  733. mw.URLParam,
  734. mw.WriteAccess,
  735. ),
  736. )
  737. // /api/projects/{project_id}/integrations routes
  738. r.Method(
  739. "POST",
  740. "/projects/{project_id}/integrations/gcp",
  741. auth.DoesUserHaveProjectAccess(
  742. requestlog.NewHandler(a.HandleCreateGCPIntegration, l),
  743. mw.URLParam,
  744. mw.WriteAccess,
  745. ),
  746. )
  747. r.Method(
  748. "POST",
  749. "/projects/{project_id}/integrations/aws",
  750. auth.DoesUserHaveProjectAccess(
  751. requestlog.NewHandler(a.HandleCreateAWSIntegration, l),
  752. mw.URLParam,
  753. mw.WriteAccess,
  754. ),
  755. )
  756. r.Method(
  757. "POST",
  758. "/projects/{project_id}/integrations/aws/{aws_integration_id}/overwrite",
  759. auth.DoesUserHaveProjectAccess(
  760. auth.DoesUserHaveClusterAccess(
  761. auth.DoesUserHaveAWSIntegrationAccess(
  762. requestlog.NewHandler(a.HandleOverwriteAWSIntegration, l),
  763. mw.URLParam,
  764. mw.URLParam,
  765. false,
  766. ),
  767. mw.URLParam,
  768. mw.QueryParam,
  769. ),
  770. mw.URLParam,
  771. mw.WriteAccess,
  772. ),
  773. )
  774. r.Method(
  775. "POST",
  776. "/projects/{project_id}/integrations/basic",
  777. auth.DoesUserHaveProjectAccess(
  778. requestlog.NewHandler(a.HandleCreateBasicAuthIntegration, l),
  779. mw.URLParam,
  780. mw.WriteAccess,
  781. ),
  782. )
  783. r.Method(
  784. "GET",
  785. "/projects/{project_id}/integrations/oauth",
  786. auth.DoesUserHaveProjectAccess(
  787. requestlog.NewHandler(a.HandleListProjectOAuthIntegrations, l),
  788. mw.URLParam,
  789. mw.WriteAccess,
  790. ),
  791. )
  792. // /api/projects/{project_id}/slack_integrations routes
  793. r.Method(
  794. "GET",
  795. "/projects/{project_id}/slack_integrations",
  796. auth.DoesUserHaveProjectAccess(
  797. requestlog.NewHandler(a.HandleListSlackIntegrations, l),
  798. mw.URLParam,
  799. mw.WriteAccess,
  800. ),
  801. )
  802. r.Method(
  803. "DELETE",
  804. "/projects/{project_id}/slack_integrations/{slack_integration_id}",
  805. auth.DoesUserHaveProjectAccess(
  806. requestlog.NewHandler(a.HandleDeleteSlackIntegration, l),
  807. mw.URLParam,
  808. mw.WriteAccess,
  809. ),
  810. )
  811. r.Method(
  812. "GET",
  813. "/projects/{project_id}/slack_integrations/exists",
  814. auth.DoesUserHaveProjectAccess(
  815. requestlog.NewHandler(a.HandleSlackIntegrationExists, l),
  816. mw.URLParam,
  817. mw.WriteAccess,
  818. ),
  819. )
  820. // /projects/{project_id}/releases/{name}/notifications routes
  821. r.Method(
  822. "POST",
  823. "/projects/{project_id}/releases/{name}/notifications",
  824. auth.DoesUserHaveProjectAccess(
  825. requestlog.NewHandler(a.HandleUpdateNotificationConfig, l),
  826. mw.URLParam,
  827. mw.WriteAccess,
  828. ),
  829. )
  830. r.Method(
  831. "GET",
  832. "/projects/{project_id}/releases/{name}/notifications",
  833. auth.DoesUserHaveProjectAccess(
  834. requestlog.NewHandler(a.HandleGetNotificationConfig, l),
  835. mw.URLParam,
  836. mw.WriteAccess,
  837. ),
  838. )
  839. // /api/projects/{project_id}/helmrepos routes
  840. r.Method(
  841. "POST",
  842. "/projects/{project_id}/helmrepos",
  843. auth.DoesUserHaveProjectAccess(
  844. auth.DoesUserHaveAWSIntegrationAccess(
  845. auth.DoesUserHaveGCPIntegrationAccess(
  846. requestlog.NewHandler(a.HandleCreateHelmRepo, l),
  847. mw.URLParam,
  848. mw.BodyParam,
  849. true,
  850. ),
  851. mw.URLParam,
  852. mw.BodyParam,
  853. true,
  854. ),
  855. mw.URLParam,
  856. mw.WriteAccess,
  857. ),
  858. )
  859. r.Method(
  860. "GET",
  861. "/projects/{project_id}/helmrepos",
  862. auth.DoesUserHaveProjectAccess(
  863. requestlog.NewHandler(a.HandleListProjectHelmRepos, l),
  864. mw.URLParam,
  865. mw.ReadAccess,
  866. ),
  867. )
  868. r.Method(
  869. "GET",
  870. "/projects/{project_id}/helmrepos/{helm_id}/charts",
  871. auth.DoesUserHaveProjectAccess(
  872. requestlog.NewHandler(a.HandleListHelmRepoCharts, l),
  873. mw.URLParam,
  874. mw.ReadAccess,
  875. ),
  876. )
  877. // /api/projects/{project_id}/registries routes
  878. r.Method(
  879. "POST",
  880. "/projects/{project_id}/registries",
  881. auth.DoesUserHaveProjectAccess(
  882. auth.DoesUserHaveAWSIntegrationAccess(
  883. auth.DoesUserHaveGCPIntegrationAccess(
  884. auth.DoesUserHaveDOIntegrationAccess(
  885. requestlog.NewHandler(a.HandleCreateRegistry, l),
  886. mw.URLParam,
  887. mw.BodyParam,
  888. true,
  889. ),
  890. mw.URLParam,
  891. mw.BodyParam,
  892. true,
  893. ),
  894. mw.URLParam,
  895. mw.BodyParam,
  896. true,
  897. ),
  898. mw.URLParam,
  899. mw.WriteAccess,
  900. ),
  901. )
  902. r.Method(
  903. "GET",
  904. "/projects/{project_id}/registries",
  905. auth.DoesUserHaveProjectAccess(
  906. requestlog.NewHandler(a.HandleListProjectRegistries, l),
  907. mw.URLParam,
  908. mw.ReadAccess,
  909. ),
  910. )
  911. r.Method(
  912. "POST",
  913. "/projects/{project_id}/registries/{registry_id}",
  914. auth.DoesUserHaveProjectAccess(
  915. auth.DoesUserHaveRegistryAccess(
  916. requestlog.NewHandler(a.HandleUpdateProjectRegistry, l),
  917. mw.URLParam,
  918. mw.URLParam,
  919. ),
  920. mw.URLParam,
  921. mw.ReadAccess,
  922. ),
  923. )
  924. r.Method(
  925. "POST",
  926. "/projects/{project_id}/registries/{registry_id}/repository",
  927. auth.DoesUserHaveProjectAccess(
  928. auth.DoesUserHaveRegistryAccess(
  929. requestlog.NewHandler(a.HandleCreateRepository, l),
  930. mw.URLParam,
  931. mw.URLParam,
  932. ),
  933. mw.URLParam,
  934. mw.WriteAccess,
  935. ),
  936. )
  937. r.Method(
  938. "GET",
  939. "/projects/{project_id}/registries/ecr/{region}/token",
  940. auth.DoesUserHaveProjectAccess(
  941. requestlog.NewHandler(a.HandleGetProjectRegistryECRToken, l),
  942. mw.URLParam,
  943. mw.WriteAccess,
  944. ),
  945. )
  946. r.Method(
  947. "GET",
  948. "/projects/{project_id}/registries/gcr/token",
  949. auth.DoesUserHaveProjectAccess(
  950. requestlog.NewHandler(a.HandleGetProjectRegistryGCRToken, l),
  951. mw.URLParam,
  952. mw.WriteAccess,
  953. ),
  954. )
  955. r.Method(
  956. "GET",
  957. "/projects/{project_id}/registries/dockerhub/token",
  958. auth.DoesUserHaveProjectAccess(
  959. requestlog.NewHandler(a.HandleGetProjectRegistryDockerhubToken, l),
  960. mw.URLParam,
  961. mw.WriteAccess,
  962. ),
  963. )
  964. r.Method(
  965. "GET",
  966. "/projects/{project_id}/registries/docr/token",
  967. auth.DoesUserHaveProjectAccess(
  968. requestlog.NewHandler(a.HandleGetProjectRegistryDOCRToken, l),
  969. mw.URLParam,
  970. mw.WriteAccess,
  971. ),
  972. )
  973. r.Method(
  974. "DELETE",
  975. "/projects/{project_id}/registries/{registry_id}",
  976. auth.DoesUserHaveProjectAccess(
  977. auth.DoesUserHaveRegistryAccess(
  978. requestlog.NewHandler(a.HandleDeleteProjectRegistry, l),
  979. mw.URLParam,
  980. mw.URLParam,
  981. ),
  982. mw.URLParam,
  983. mw.WriteAccess,
  984. ),
  985. )
  986. // /api/projects/{project_id}/registries/{registry_id}/repositories routes
  987. r.Method(
  988. "GET",
  989. "/projects/{project_id}/registries/{registry_id}/repositories",
  990. auth.DoesUserHaveProjectAccess(
  991. auth.DoesUserHaveRegistryAccess(
  992. requestlog.NewHandler(a.HandleListRepositories, l),
  993. mw.URLParam,
  994. mw.URLParam,
  995. ),
  996. mw.URLParam,
  997. mw.WriteAccess,
  998. ),
  999. )
  1000. r.Method(
  1001. "GET",
  1002. // * is the repo name, which can itself be nested
  1003. // for example, for GCR this is project-id/repo
  1004. // need to use wildcard, see https://github.com/go-chi/chi/issues/243
  1005. "/projects/{project_id}/registries/{registry_id}/repositories/*",
  1006. auth.DoesUserHaveProjectAccess(
  1007. auth.DoesUserHaveRegistryAccess(
  1008. requestlog.NewHandler(a.HandleListImages, l),
  1009. mw.URLParam,
  1010. mw.URLParam,
  1011. ),
  1012. mw.URLParam,
  1013. mw.ReadAccess,
  1014. ),
  1015. )
  1016. // /api/projects/{project_id}/releases routes
  1017. r.Method(
  1018. "GET",
  1019. "/projects/{project_id}/releases",
  1020. auth.DoesUserHaveProjectAccess(
  1021. auth.DoesUserHaveClusterAccess(
  1022. requestlog.NewHandler(a.HandleListReleases, l),
  1023. mw.URLParam,
  1024. mw.QueryParam,
  1025. ),
  1026. mw.URLParam,
  1027. mw.ReadAccess,
  1028. ),
  1029. )
  1030. r.Method(
  1031. "GET",
  1032. "/projects/{project_id}/releases/{name}/{revision}/components",
  1033. auth.DoesUserHaveProjectAccess(
  1034. auth.DoesUserHaveClusterAccess(
  1035. requestlog.NewHandler(a.HandleGetReleaseComponents, l),
  1036. mw.URLParam,
  1037. mw.QueryParam,
  1038. ),
  1039. mw.URLParam,
  1040. mw.ReadAccess,
  1041. ),
  1042. )
  1043. r.Method(
  1044. "GET",
  1045. "/projects/{project_id}/releases/{name}/{revision}/controllers",
  1046. auth.DoesUserHaveProjectAccess(
  1047. auth.DoesUserHaveClusterAccess(
  1048. requestlog.NewHandler(a.HandleGetReleaseControllers, l),
  1049. mw.URLParam,
  1050. mw.QueryParam,
  1051. ),
  1052. mw.URLParam,
  1053. mw.ReadAccess,
  1054. ),
  1055. )
  1056. r.Method(
  1057. "GET",
  1058. "/projects/{project_id}/releases/{name}/{revision}/pods/all",
  1059. auth.DoesUserHaveProjectAccess(
  1060. auth.DoesUserHaveClusterAccess(
  1061. requestlog.NewHandler(a.HandleGetReleaseAllPods, l),
  1062. mw.URLParam,
  1063. mw.QueryParam,
  1064. ),
  1065. mw.URLParam,
  1066. mw.ReadAccess,
  1067. ),
  1068. )
  1069. r.Method(
  1070. "GET",
  1071. "/projects/{project_id}/releases/{name}/history",
  1072. auth.DoesUserHaveProjectAccess(
  1073. auth.DoesUserHaveClusterAccess(
  1074. requestlog.NewHandler(a.HandleListReleaseHistory, l),
  1075. mw.URLParam,
  1076. mw.QueryParam,
  1077. ),
  1078. mw.URLParam,
  1079. mw.ReadAccess,
  1080. ),
  1081. )
  1082. r.Method(
  1083. "GET",
  1084. "/projects/{project_id}/releases/{name}/webhook_token",
  1085. auth.DoesUserHaveProjectAccess(
  1086. auth.DoesUserHaveClusterAccess(
  1087. requestlog.NewHandler(a.HandleGetReleaseToken, l),
  1088. mw.URLParam,
  1089. mw.QueryParam,
  1090. ),
  1091. mw.URLParam,
  1092. mw.ReadAccess,
  1093. ),
  1094. )
  1095. r.Method(
  1096. "POST",
  1097. "/projects/{project_id}/releases/{name}/webhook_token",
  1098. auth.DoesUserHaveProjectAccess(
  1099. auth.DoesUserHaveClusterAccess(
  1100. requestlog.NewHandler(a.HandleCreateWebhookToken, l),
  1101. mw.URLParam,
  1102. mw.QueryParam,
  1103. ),
  1104. mw.URLParam,
  1105. mw.WriteAccess,
  1106. ),
  1107. )
  1108. r.Method(
  1109. "GET",
  1110. "/projects/{project_id}/releases/{name}/{revision}",
  1111. auth.DoesUserHaveProjectAccess(
  1112. auth.DoesUserHaveClusterAccess(
  1113. requestlog.NewHandler(a.HandleGetRelease, l),
  1114. mw.URLParam,
  1115. mw.QueryParam,
  1116. ),
  1117. mw.URLParam,
  1118. mw.ReadAccess,
  1119. ),
  1120. )
  1121. // /api/projects/{project_id}/gitrepos routes
  1122. r.Method(
  1123. "GET",
  1124. "/projects/{project_id}/gitrepos",
  1125. auth.DoesUserHaveProjectAccess(
  1126. requestlog.NewHandler(a.HandleListProjectGitRepos, l),
  1127. mw.URLParam,
  1128. mw.ReadAccess,
  1129. ),
  1130. )
  1131. r.Method(
  1132. "GET",
  1133. "/projects/{project_id}/gitrepos/{installation_id}/repos",
  1134. auth.DoesUserHaveProjectAccess(
  1135. auth.DoesUserHaveGitInstallationAccess(
  1136. requestlog.NewHandler(a.HandleListRepos, l),
  1137. mw.URLParam,
  1138. ),
  1139. mw.URLParam,
  1140. mw.ReadAccess,
  1141. ),
  1142. )
  1143. r.Method(
  1144. "GET",
  1145. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/branches",
  1146. auth.DoesUserHaveProjectAccess(
  1147. auth.DoesUserHaveGitInstallationAccess(
  1148. requestlog.NewHandler(a.HandleGetBranches, l),
  1149. mw.URLParam,
  1150. ),
  1151. mw.URLParam,
  1152. mw.ReadAccess,
  1153. ),
  1154. )
  1155. r.Method(
  1156. "GET",
  1157. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/buildpack/detect",
  1158. auth.DoesUserHaveProjectAccess(
  1159. auth.DoesUserHaveGitInstallationAccess(
  1160. requestlog.NewHandler(a.HandleDetectBuildpack, l),
  1161. mw.URLParam,
  1162. ),
  1163. mw.URLParam,
  1164. mw.ReadAccess,
  1165. ),
  1166. )
  1167. r.Method(
  1168. "GET",
  1169. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/contents",
  1170. auth.DoesUserHaveProjectAccess(
  1171. auth.DoesUserHaveGitInstallationAccess(
  1172. requestlog.NewHandler(a.HandleGetBranchContents, l),
  1173. mw.URLParam,
  1174. ),
  1175. mw.URLParam,
  1176. mw.ReadAccess,
  1177. ),
  1178. )
  1179. r.Method(
  1180. "GET",
  1181. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/procfile",
  1182. auth.DoesUserHaveProjectAccess(
  1183. auth.DoesUserHaveGitInstallationAccess(
  1184. requestlog.NewHandler(a.HandleGetProcfileContents, l),
  1185. mw.URLParam,
  1186. ),
  1187. mw.URLParam,
  1188. mw.ReadAccess,
  1189. ),
  1190. )
  1191. r.Method(
  1192. "GET",
  1193. "/projects/{project_id}/gitrepos/{installation_id}/repos/{kind}/{owner}/{name}/{branch}/tarball_url",
  1194. auth.DoesUserHaveProjectAccess(
  1195. auth.DoesUserHaveGitInstallationAccess(
  1196. requestlog.NewHandler(a.HandleGetRepoZIPDownloadURL, l),
  1197. mw.URLParam,
  1198. ),
  1199. mw.URLParam,
  1200. mw.ReadAccess,
  1201. ),
  1202. )
  1203. // /api/projects/{project_id}/k8s routes
  1204. r.Method(
  1205. "GET",
  1206. "/projects/{project_id}/k8s/namespaces",
  1207. auth.DoesUserHaveProjectAccess(
  1208. auth.DoesUserHaveClusterAccess(
  1209. requestlog.NewHandler(a.HandleListNamespaces, l),
  1210. mw.URLParam,
  1211. mw.QueryParam,
  1212. ),
  1213. mw.URLParam,
  1214. mw.ReadAccess,
  1215. ),
  1216. )
  1217. r.Method(
  1218. "POST",
  1219. "/projects/{project_id}/k8s/namespaces/create",
  1220. auth.DoesUserHaveProjectAccess(
  1221. auth.DoesUserHaveClusterAccess(
  1222. requestlog.NewHandler(a.HandleCreateNamespace, l),
  1223. mw.URLParam,
  1224. mw.QueryParam,
  1225. ),
  1226. mw.URLParam,
  1227. mw.ReadAccess,
  1228. ),
  1229. )
  1230. r.Method(
  1231. "DELETE",
  1232. "/projects/{project_id}/k8s/namespaces/delete",
  1233. auth.DoesUserHaveProjectAccess(
  1234. auth.DoesUserHaveClusterAccess(
  1235. requestlog.NewHandler(a.HandleDeleteNamespace, l),
  1236. mw.URLParam,
  1237. mw.QueryParam,
  1238. ),
  1239. mw.URLParam,
  1240. mw.ReadAccess,
  1241. ),
  1242. )
  1243. r.Method(
  1244. "GET",
  1245. "/projects/{project_id}/k8s/kubeconfig",
  1246. auth.DoesUserHaveProjectAccess(
  1247. auth.DoesUserHaveClusterAccess(
  1248. requestlog.NewHandler(a.HandleGetTemporaryKubeconfig, l),
  1249. mw.URLParam,
  1250. mw.QueryParam,
  1251. ),
  1252. mw.URLParam,
  1253. mw.WriteAccess,
  1254. ),
  1255. )
  1256. r.Method(
  1257. "GET",
  1258. "/projects/{project_id}/k8s/prometheus/detect",
  1259. auth.DoesUserHaveProjectAccess(
  1260. auth.DoesUserHaveClusterAccess(
  1261. requestlog.NewHandler(a.HandleDetectPrometheusInstalled, l),
  1262. mw.URLParam,
  1263. mw.QueryParam,
  1264. ),
  1265. mw.URLParam,
  1266. mw.ReadAccess,
  1267. ),
  1268. )
  1269. r.Method(
  1270. "GET",
  1271. "/projects/{project_id}/k8s/prometheus/ingresses",
  1272. auth.DoesUserHaveProjectAccess(
  1273. auth.DoesUserHaveClusterAccess(
  1274. requestlog.NewHandler(a.HandleListNGINXIngresses, l),
  1275. mw.URLParam,
  1276. mw.QueryParam,
  1277. ),
  1278. mw.URLParam,
  1279. mw.ReadAccess,
  1280. ),
  1281. )
  1282. r.Method(
  1283. "GET",
  1284. "/projects/{project_id}/k8s/metrics",
  1285. auth.DoesUserHaveProjectAccess(
  1286. auth.DoesUserHaveClusterAccess(
  1287. requestlog.NewHandler(a.HandleGetPodMetrics, l),
  1288. mw.URLParam,
  1289. mw.QueryParam,
  1290. ),
  1291. mw.URLParam,
  1292. mw.ReadAccess,
  1293. ),
  1294. )
  1295. r.Method(
  1296. "GET",
  1297. "/projects/{project_id}/k8s/{namespace}/pod/{name}/logs",
  1298. auth.DoesUserHaveProjectAccess(
  1299. auth.DoesUserHaveClusterAccess(
  1300. requestlog.NewHandler(a.HandleGetPodLogs, l),
  1301. mw.URLParam,
  1302. mw.QueryParam,
  1303. ),
  1304. mw.URLParam,
  1305. mw.ReadAccess,
  1306. ),
  1307. )
  1308. r.Method(
  1309. "GET",
  1310. "/projects/{project_id}/k8s/{namespace}/{chart}/{release_name}/jobs",
  1311. auth.DoesUserHaveProjectAccess(
  1312. auth.DoesUserHaveClusterAccess(
  1313. requestlog.NewHandler(a.HandleListJobsByChart, l),
  1314. mw.URLParam,
  1315. mw.QueryParam,
  1316. ),
  1317. mw.URLParam,
  1318. mw.ReadAccess,
  1319. ),
  1320. )
  1321. r.Method(
  1322. "GET",
  1323. "/projects/{project_id}/k8s/{namespace}/{name}/jobs/status",
  1324. auth.DoesUserHaveProjectAccess(
  1325. auth.DoesUserHaveClusterAccess(
  1326. requestlog.NewHandler(a.HandleGetJobStatus, l),
  1327. mw.URLParam,
  1328. mw.QueryParam,
  1329. ),
  1330. mw.URLParam,
  1331. mw.ReadAccess,
  1332. ),
  1333. )
  1334. r.Method(
  1335. "GET",
  1336. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/pods",
  1337. auth.DoesUserHaveProjectAccess(
  1338. auth.DoesUserHaveClusterAccess(
  1339. requestlog.NewHandler(a.HandleListJobPods, l),
  1340. mw.URLParam,
  1341. mw.QueryParam,
  1342. ),
  1343. mw.URLParam,
  1344. mw.ReadAccess,
  1345. ),
  1346. )
  1347. r.Method(
  1348. "GET",
  1349. "/projects/{project_id}/k8s/{namespace}/ingress/{name}",
  1350. auth.DoesUserHaveProjectAccess(
  1351. auth.DoesUserHaveClusterAccess(
  1352. requestlog.NewHandler(a.HandleGetIngress, l),
  1353. mw.URLParam,
  1354. mw.QueryParam,
  1355. ),
  1356. mw.URLParam,
  1357. mw.ReadAccess,
  1358. ),
  1359. )
  1360. r.Method(
  1361. "GET",
  1362. "/projects/{project_id}/k8s/{kind}/status",
  1363. auth.DoesUserHaveProjectAccess(
  1364. auth.DoesUserHaveClusterAccess(
  1365. requestlog.NewHandler(a.HandleStreamControllerStatus, l),
  1366. mw.URLParam,
  1367. mw.QueryParam,
  1368. ),
  1369. mw.URLParam,
  1370. mw.ReadAccess,
  1371. ),
  1372. )
  1373. r.Method(
  1374. "GET",
  1375. "/projects/{project_id}/k8s/helm_releases",
  1376. auth.DoesUserHaveProjectAccess(
  1377. auth.DoesUserHaveClusterAccess(
  1378. requestlog.NewHandler(a.HandleStreamHelmReleases, l),
  1379. mw.URLParam,
  1380. mw.QueryParam,
  1381. ),
  1382. mw.URLParam,
  1383. mw.ReadAccess,
  1384. ),
  1385. )
  1386. r.Method(
  1387. "GET",
  1388. "/projects/{project_id}/k8s/pods",
  1389. auth.DoesUserHaveProjectAccess(
  1390. auth.DoesUserHaveClusterAccess(
  1391. requestlog.NewHandler(a.HandleListPods, l),
  1392. mw.URLParam,
  1393. mw.QueryParam,
  1394. ),
  1395. mw.URLParam,
  1396. mw.ReadAccess,
  1397. ),
  1398. )
  1399. r.Method(
  1400. "DELETE",
  1401. "/projects/{project_id}/k8s/pods/{namespace}/{name}",
  1402. auth.DoesUserHaveProjectAccess(
  1403. auth.DoesUserHaveClusterAccess(
  1404. requestlog.NewHandler(a.HandleDeletePod, l),
  1405. mw.URLParam,
  1406. mw.QueryParam,
  1407. ),
  1408. mw.URLParam,
  1409. mw.WriteAccess,
  1410. ),
  1411. )
  1412. r.Method(
  1413. "GET",
  1414. "/projects/{project_id}/k8s/pods/{namespace}/{name}/events/list",
  1415. auth.DoesUserHaveProjectAccess(
  1416. auth.DoesUserHaveClusterAccess(
  1417. requestlog.NewHandler(a.HandleListPodEvents, l),
  1418. mw.URLParam,
  1419. mw.QueryParam,
  1420. ),
  1421. mw.URLParam,
  1422. mw.ReadAccess,
  1423. ),
  1424. )
  1425. r.Method(
  1426. "POST",
  1427. "/projects/{project_id}/k8s/configmap/create",
  1428. auth.DoesUserHaveProjectAccess(
  1429. auth.DoesUserHaveClusterAccess(
  1430. requestlog.NewHandler(a.HandleCreateConfigMap, l),
  1431. mw.URLParam,
  1432. mw.QueryParam,
  1433. ),
  1434. mw.URLParam,
  1435. mw.WriteAccess,
  1436. ),
  1437. )
  1438. r.Method(
  1439. "DELETE",
  1440. "/projects/{project_id}/k8s/configmap/delete",
  1441. auth.DoesUserHaveProjectAccess(
  1442. auth.DoesUserHaveClusterAccess(
  1443. requestlog.NewHandler(a.HandleDeleteConfigMap, l),
  1444. mw.URLParam,
  1445. mw.QueryParam,
  1446. ),
  1447. mw.URLParam,
  1448. mw.WriteAccess,
  1449. ),
  1450. )
  1451. r.Method(
  1452. "GET",
  1453. "/projects/{project_id}/k8s/configmap",
  1454. auth.DoesUserHaveProjectAccess(
  1455. auth.DoesUserHaveClusterAccess(
  1456. requestlog.NewHandler(a.HandleGetConfigMap, l),
  1457. mw.URLParam,
  1458. mw.QueryParam,
  1459. ),
  1460. mw.URLParam,
  1461. mw.ReadAccess,
  1462. ),
  1463. )
  1464. r.Method(
  1465. "GET",
  1466. "/projects/{project_id}/k8s/configmap/list",
  1467. auth.DoesUserHaveProjectAccess(
  1468. auth.DoesUserHaveClusterAccess(
  1469. requestlog.NewHandler(a.HandleListConfigMaps, l),
  1470. mw.URLParam,
  1471. mw.QueryParam,
  1472. ),
  1473. mw.URLParam,
  1474. mw.ReadAccess,
  1475. ),
  1476. )
  1477. r.Method(
  1478. "POST",
  1479. "/projects/{project_id}/k8s/configmap/update",
  1480. auth.DoesUserHaveProjectAccess(
  1481. auth.DoesUserHaveClusterAccess(
  1482. requestlog.NewHandler(a.HandleUpdateConfigMap, l),
  1483. mw.URLParam,
  1484. mw.QueryParam,
  1485. ),
  1486. mw.URLParam,
  1487. mw.WriteAccess,
  1488. ),
  1489. )
  1490. r.Method(
  1491. "POST",
  1492. "/projects/{project_id}/k8s/configmap/rename",
  1493. auth.DoesUserHaveProjectAccess(
  1494. auth.DoesUserHaveClusterAccess(
  1495. requestlog.NewHandler(a.HandleRenameConfigMap, l),
  1496. mw.URLParam,
  1497. mw.QueryParam,
  1498. ),
  1499. mw.URLParam,
  1500. mw.WriteAccess,
  1501. ),
  1502. )
  1503. r.Method(
  1504. "DELETE",
  1505. "/projects/{project_id}/k8s/jobs/{namespace}/{name}",
  1506. auth.DoesUserHaveProjectAccess(
  1507. auth.DoesUserHaveClusterAccess(
  1508. requestlog.NewHandler(a.HandleDeleteJob, l),
  1509. mw.URLParam,
  1510. mw.QueryParam,
  1511. ),
  1512. mw.URLParam,
  1513. mw.WriteAccess,
  1514. ),
  1515. )
  1516. r.Method(
  1517. "POST",
  1518. "/projects/{project_id}/k8s/jobs/{namespace}/{name}/stop",
  1519. auth.DoesUserHaveProjectAccess(
  1520. auth.DoesUserHaveClusterAccess(
  1521. requestlog.NewHandler(a.HandleStopJob, l),
  1522. mw.URLParam,
  1523. mw.QueryParam,
  1524. ),
  1525. mw.URLParam,
  1526. mw.WriteAccess,
  1527. ),
  1528. )
  1529. // /api/projects/{project_id}/subdomain routes
  1530. r.Method(
  1531. "POST",
  1532. "/projects/{project_id}/k8s/subdomain",
  1533. auth.DoesUserHaveProjectAccess(
  1534. auth.DoesUserHaveClusterAccess(
  1535. requestlog.NewHandler(a.HandleCreateDNSRecord, l),
  1536. mw.URLParam,
  1537. mw.QueryParam,
  1538. ),
  1539. mw.URLParam,
  1540. mw.WriteAccess,
  1541. ),
  1542. )
  1543. // capabilities
  1544. r.Method(
  1545. "GET",
  1546. "/capabilities",
  1547. http.HandlerFunc(a.HandleGetCapabilities),
  1548. )
  1549. // /api/projects/{project_id}/deploy routes
  1550. r.Method(
  1551. "POST",
  1552. "/projects/{project_id}/deploy/{name}/{version}",
  1553. auth.DoesUserHaveProjectAccess(
  1554. auth.DoesUserHaveClusterAccess(
  1555. requestlog.NewHandler(a.HandleDeployTemplate, l),
  1556. mw.URLParam,
  1557. mw.QueryParam,
  1558. ),
  1559. mw.URLParam,
  1560. mw.WriteAccess,
  1561. ),
  1562. )
  1563. r.Method(
  1564. "POST",
  1565. "/projects/{project_id}/deploy/addon/{name}/{version}",
  1566. auth.DoesUserHaveProjectAccess(
  1567. auth.DoesUserHaveClusterAccess(
  1568. requestlog.NewHandler(a.HandleDeployAddon, l),
  1569. mw.URLParam,
  1570. mw.QueryParam,
  1571. ),
  1572. mw.URLParam,
  1573. mw.WriteAccess,
  1574. ),
  1575. )
  1576. })
  1577. // Create group for long-running Helm operations
  1578. r.Group(func(r chi.Router) {
  1579. r.Use(middleware.Timeout(300 * time.Second))
  1580. r.Method(
  1581. "POST",
  1582. "/projects/{project_id}/releases/{name}/rollback",
  1583. auth.DoesUserHaveProjectAccess(
  1584. auth.DoesUserHaveClusterAccess(
  1585. requestlog.NewHandler(a.HandleRollbackRelease, l),
  1586. mw.URLParam,
  1587. mw.QueryParam,
  1588. ),
  1589. mw.URLParam,
  1590. mw.WriteAccess,
  1591. ),
  1592. )
  1593. r.Method(
  1594. "POST",
  1595. "/webhooks/deploy/{token}",
  1596. requestlog.NewHandler(a.HandleReleaseDeployWebhook, l),
  1597. )
  1598. r.Method(
  1599. "POST",
  1600. "/projects/{project_id}/delete/{name}",
  1601. auth.DoesUserHaveProjectAccess(
  1602. auth.DoesUserHaveClusterAccess(
  1603. requestlog.NewHandler(a.HandleUninstallTemplate, l),
  1604. mw.URLParam,
  1605. mw.QueryParam,
  1606. ),
  1607. mw.URLParam,
  1608. mw.WriteAccess,
  1609. ),
  1610. )
  1611. r.Method(
  1612. "POST",
  1613. "/projects/{project_id}/releases/{name}/upgrade",
  1614. auth.DoesUserHaveProjectAccess(
  1615. auth.DoesUserHaveClusterAccess(
  1616. requestlog.NewHandler(a.HandleUpgradeRelease, l),
  1617. mw.URLParam,
  1618. mw.QueryParam,
  1619. ),
  1620. mw.URLParam,
  1621. mw.WriteAccess,
  1622. ),
  1623. )
  1624. r.Method(
  1625. "POST",
  1626. "/projects/{project_id}/releases/image/update/batch",
  1627. auth.DoesUserHaveProjectAccess(
  1628. auth.DoesUserHaveClusterAccess(
  1629. requestlog.NewHandler(a.HandleReleaseUpdateJobImages, l),
  1630. mw.URLParam,
  1631. mw.QueryParam,
  1632. ),
  1633. mw.URLParam,
  1634. mw.WriteAccess,
  1635. ),
  1636. )
  1637. })
  1638. })
  1639. staticFilePath := a.ServerConf.StaticFilePath
  1640. fs := http.FileServer(http.Dir(staticFilePath))
  1641. r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
  1642. if _, err := os.Stat(staticFilePath + r.RequestURI); os.IsNotExist(err) {
  1643. w.Header().Set("Cache-Control", "no-cache")
  1644. http.StripPrefix(r.URL.Path, fs).ServeHTTP(w, r)
  1645. } else {
  1646. // Set static files involving html, js, or empty cache to "no-cache", which means they must be validated
  1647. // for changes before the browser uses the cache
  1648. if base := path.Base(r.URL.Path); strings.Contains(base, "html") || strings.Contains(base, "js") || base == "." || base == "/" {
  1649. w.Header().Set("Cache-Control", "no-cache")
  1650. }
  1651. fs.ServeHTTP(w, r)
  1652. }
  1653. })
  1654. return r
  1655. }