router.go 37 KB

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