router.go 41 KB

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