registry_handler.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "strconv"
  7. "github.com/porter-dev/porter/internal/registry"
  8. "github.com/go-chi/chi"
  9. "github.com/porter-dev/porter/internal/forms"
  10. "github.com/porter-dev/porter/internal/models"
  11. "github.com/google/go-containerregistry/pkg/authn"
  12. "github.com/google/go-containerregistry/pkg/name"
  13. "github.com/google/go-containerregistry/pkg/v1/remote"
  14. )
  15. // HandleCreateRegistry creates a new registry
  16. func (app *App) HandleCreateRegistry(w http.ResponseWriter, r *http.Request) {
  17. projID, err := strconv.ParseUint(chi.URLParam(r, "project_id"), 0, 64)
  18. if err != nil || projID == 0 {
  19. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  20. return
  21. }
  22. form := &forms.CreateRegistry{
  23. ProjectID: uint(projID),
  24. }
  25. // decode from JSON to form value
  26. if err := json.NewDecoder(r.Body).Decode(form); err != nil {
  27. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  28. return
  29. }
  30. // validate the form
  31. if err := app.validator.Struct(form); err != nil {
  32. app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
  33. return
  34. }
  35. // convert the form to a registry
  36. registry, err := form.ToRegistry()
  37. if err != nil {
  38. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  39. return
  40. }
  41. // handle write to the database
  42. registry, err = app.repo.Registry.CreateRegistry(registry)
  43. if err != nil {
  44. app.handleErrorDataWrite(err, w)
  45. return
  46. }
  47. app.logger.Info().Msgf("New registry created: %d", registry.ID)
  48. w.WriteHeader(http.StatusCreated)
  49. regExt := registry.Externalize()
  50. if err := json.NewEncoder(w).Encode(regExt); err != nil {
  51. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  52. return
  53. }
  54. }
  55. // HandleListProjectRegistries returns a list of registries for a project
  56. func (app *App) HandleListProjectRegistries(w http.ResponseWriter, r *http.Request) {
  57. projID, err := strconv.ParseUint(chi.URLParam(r, "project_id"), 0, 64)
  58. if err != nil || projID == 0 {
  59. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  60. return
  61. }
  62. regs, err := app.repo.Registry.ListRegistriesByProjectID(uint(projID))
  63. if err != nil {
  64. app.handleErrorRead(err, ErrProjectDataRead, w)
  65. return
  66. }
  67. extRegs := make([]*models.RegistryExternal, 0)
  68. for _, reg := range regs {
  69. extRegs = append(extRegs, reg.Externalize())
  70. }
  71. w.WriteHeader(http.StatusOK)
  72. if err := json.NewEncoder(w).Encode(extRegs); err != nil {
  73. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  74. return
  75. }
  76. }
  77. // HandleListRepositories returns a list of repositories for a given registry
  78. func (app *App) HandleListRepositories(w http.ResponseWriter, r *http.Request) {
  79. regID, err := strconv.ParseUint(chi.URLParam(r, "registry_id"), 0, 64)
  80. if err != nil || regID == 0 {
  81. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  82. return
  83. }
  84. reg, err := app.repo.Registry.ReadRegistry(uint(regID))
  85. if err != nil {
  86. app.handleErrorRead(err, ErrProjectDataRead, w)
  87. return
  88. }
  89. // cast to a registry from registry package
  90. _reg := registry.Registry(*reg)
  91. regAPI := &_reg
  92. repos, err := regAPI.ListRepositories(*app.repo)
  93. if err != nil {
  94. app.handleErrorRead(err, ErrProjectDataRead, w)
  95. return
  96. }
  97. w.WriteHeader(http.StatusOK)
  98. if err := json.NewEncoder(w).Encode(repos); err != nil {
  99. app.handleErrorFormDecoding(err, ErrProjectDecode, w)
  100. return
  101. }
  102. }
  103. // HandleListImages retrieves a list of repo names
  104. func (app *App) HandleListImages(w http.ResponseWriter, r *http.Request) {
  105. ref, err := name.ParseReference("gcr.io/google-containers/pause")
  106. if err != nil {
  107. fmt.Println(err)
  108. return
  109. }
  110. img, err := remote.Image(ref)
  111. if err != nil {
  112. fmt.Println(err)
  113. return
  114. }
  115. fmt.Println(img.Size())
  116. ctx := r.Context()
  117. reg, err := name.NewRegistry("index.docker.io")
  118. if err != nil {
  119. fmt.Println("fuk")
  120. fmt.Println(err)
  121. return
  122. }
  123. stuff, err := remote.Catalog(ctx, reg, remote.WithAuthFromKeychain(authn.DefaultKeychain))
  124. if err != nil {
  125. fmt.Println(err)
  126. return
  127. }
  128. fmt.Println(stuff[0])
  129. }