router.go 39 KB

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