router.go 36 KB

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