Skip to content

Commit

Permalink
feat: add buildpack registry configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
elbandito committed Sep 23, 2020
1 parent 87c62e6 commit d291ae1
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 0 deletions.
1 change: 1 addition & 0 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ func NewPackCommand(logger ConfigurableLogger) (*cobra.Command, error) {
rootCmd.AddCommand(commands.Report(logger, pack.Version))

if cfg.Experimental {
rootCmd.AddCommand(commands.AddBuildpackRegistry(logger, cfg))
rootCmd.AddCommand(commands.RegisterBuildpack(logger, cfg, &packClient))
rootCmd.AddCommand(commands.YankBuildpack(logger, cfg, &packClient))
}
Expand Down
65 changes: 65 additions & 0 deletions internal/commands/add_buildpack_registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package commands

import (
"fmt"

"github.com/pkg/errors"
"github.com/spf13/cobra"

"github.com/buildpacks/pack/internal/style"

"github.com/buildpacks/pack/internal/config"
"github.com/buildpacks/pack/logging"
)

func AddBuildpackRegistry(logger logging.Logger, cfg config.Config) *cobra.Command {
var setDefault bool

cmd := &cobra.Command{
Use: "add-buildpack-registry <name> <type> <url>",
Args: cobra.ExactArgs(3),
Short: "Adds a new buildpack registry to your pack config file",
RunE: logError(logger, func(cmd *cobra.Command, args []string) error {
newRegistry := config.Registry{
Name: args[0],
Type: args[1],
URL: args[2],
}

err := addRegistry(newRegistry, cfg, setDefault)
if err != nil {
return errors.Wrapf(err, "add buildpack registry")
}
logger.Infof("Successfully added %s to buildpack registries", style.Symbol(newRegistry.Name))

return nil
}),
}
cmd.Example = "pack add-buildpack-registry myregistry github https://github.com/buildpacks/mybuildpack"
cmd.Flags().BoolVar(&setDefault, "default", false, "Set this buildpack registry as the default")
AddHelpFlag(cmd, "add-registry")

return cmd
}

func addRegistry(registry config.Registry, cfg config.Config, setDefault bool) error {
for _, r := range cfg.Registries {
if r.Name == registry.Name {
return errors.Errorf(
"Buildpack registry %s already exists. First run %s and try again.",
style.Symbol(registry.Name),
style.Symbol(fmt.Sprintf("remove-buildpack-registry %s", registry.Name)))
}
}

if setDefault {
cfg.DefaultRegistryName = registry.Name
}
cfg.Registries = append(cfg.Registries, registry)
configPath, err := config.DefaultConfigPath()
if err != nil {
return err
}

return config.Write(cfg, configPath)
}
73 changes: 73 additions & 0 deletions internal/commands/add_buildpack_registry_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package commands_test

import (
"bytes"
"testing"

"github.com/heroku/color"
"github.com/sclevine/spec"
"github.com/sclevine/spec/report"
"github.com/spf13/cobra"

"github.com/buildpacks/pack/internal/commands"
"github.com/buildpacks/pack/internal/config"
ilogging "github.com/buildpacks/pack/internal/logging"
"github.com/buildpacks/pack/logging"
h "github.com/buildpacks/pack/testhelpers"
)

func TestAddBuildpackRegistry(t *testing.T) {
color.Disable(true)
defer color.Disable(false)

spec.Run(t, "Commands", testAddBuildpackRegistryCommand, spec.Parallel(), spec.Report(report.Terminal{}))
}

func testAddBuildpackRegistryCommand(t *testing.T, when spec.G, it spec.S) {
var (
command *cobra.Command
logger logging.Logger
outBuf bytes.Buffer
cfg config.Config
)

when("AddBuildpackRegistry", func() {
it.Before(func() {
logger = ilogging.NewLogWithWriters(&outBuf, &outBuf)
cfg = config.Config{}

command = commands.AddBuildpackRegistry(logger, cfg)
})

it("fails with missing args", func() {
err := command.Execute()
h.AssertError(t, err, "accepts 3 arg")
})

it("should successfully add a new registry", func() {
command.SetArgs([]string{"bp", "https://github.com/buildpacks/registry-index/", "github"})
command.Execute()

output := outBuf.String()
h.AssertContains(t, output, "Successfully added 'bp' to buildpack registries")
})

it("should throw error when registry already exists", func() {
cfg = config.Config{
Registries: []config.Registry{
{
Name: "bp",
Type: "github",
URL: "https://github.com/buildpacks/registry-index/",
},
},
}
command = commands.AddBuildpackRegistry(logger, cfg)
command.SetArgs([]string{"bp", "https://github.com/buildpacks/registry-index/", "github"})
command.Execute()

output := outBuf.String()
h.AssertContains(t, output, "Buildpack registry 'bp' already exists. First run 'remove-buildpack-registry bp' and try again.")
})
})
}

0 comments on commit d291ae1

Please sign in to comment.