Commit abe8e31d authored by Oren Shomron's avatar Oren Shomron
Browse files

Validate environment prior to fetching in pkg install



Closes #702
Signed-off-by: default avatarOren Shomron <shomron@gmail.com>
parent 70935911
......@@ -19,12 +19,15 @@ import (
"github.com/ksonnet/ksonnet/pkg/app"
"github.com/ksonnet/ksonnet/pkg/pkg"
"github.com/ksonnet/ksonnet/pkg/registry"
"github.com/pkg/errors"
)
type libCacher func(app.App, registry.InstalledChecker, pkg.Descriptor, string, bool) (*app.LibraryConfig, error)
type libUpdater func(name string, env string, spec *app.LibraryConfig) (*app.LibraryConfig, error)
type envChecker func(name string) (bool, error)
// RunPkgInstall runs `pkg install`
func RunPkgInstall(m map[string]interface{}) error {
pi, err := NewPkgInstall(m)
......@@ -37,14 +40,15 @@ func RunPkgInstall(m map[string]interface{}) error {
// PkgInstall installs packages.
type PkgInstall struct {
app app.App
libName string
customName string
envName string
force bool
checker registry.InstalledChecker
libCacherFn libCacher
libUpdateFn libUpdater
app app.App
libName string
customName string
envName string
force bool
checker registry.InstalledChecker
libCacherFn libCacher
libUpdateFn libUpdater
envCheckerFn envChecker
}
// NewPkgInstall creates an instance of PkgInstall.
......@@ -70,6 +74,14 @@ func NewPkgInstall(m map[string]interface{}) (*PkgInstall, error) {
return registry.CacheDependency(a, checker, d, customName, force, httpClient)
},
libUpdateFn: a.UpdateLib,
envCheckerFn: func(name string) (bool, error) {
env, err := a.Environment(name)
if err != nil {
return false, err
}
exists := (env != nil)
return exists, nil
},
}
if ol.err != nil {
......@@ -86,6 +98,17 @@ func (pi *PkgInstall) Run() error {
return err
}
// Environment validation
if pi.envName != "" {
ok, err := pi.envCheckerFn(pi.envName)
if err != nil {
return errors.Wrap(err, "checking environment")
}
if !ok {
return errors.Errorf("invalid environment: %s", pi.envName)
}
}
libCfg, err := pi.libCacherFn(pi.app, pi.checker, d, customName, pi.force)
if err != nil {
return err
......
......@@ -22,6 +22,7 @@ import (
amocks "github.com/ksonnet/ksonnet/pkg/app/mocks"
"github.com/ksonnet/ksonnet/pkg/pkg"
"github.com/ksonnet/ksonnet/pkg/registry"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
......@@ -97,3 +98,45 @@ func TestPkgInstall_requires_app(t *testing.T) {
_, err := NewPkgInstall(in)
require.Error(t, err)
}
func TestPkgInstall_invalid_env(t *testing.T) {
withApp(t, func(appMock *amocks.App) {
libName := "incubator/apache"
customName := "customName"
in := map[string]interface{}{
OptionApp: appMock,
OptionPkgName: libName,
OptionName: customName,
OptionEnvName: "invalid-env",
OptionForce: false,
OptionTLSSkipVerify: false,
}
a, err := NewPkgInstall(in)
require.NoError(t, err)
var cacherCalled bool
fakeCacher := func(a app.App, checker registry.InstalledChecker, d pkg.Descriptor, cn string, force bool) (*app.LibraryConfig, error) {
cacherCalled = true
return nil, errors.New("not implemented")
}
var updaterCalled bool
fakeUpdater := func(name string, env string, spec *app.LibraryConfig) (*app.LibraryConfig, error) {
updaterCalled = true
return nil, errors.New("not implemented")
}
a.libCacherFn = fakeCacher
a.libUpdateFn = fakeUpdater
a.envCheckerFn = func(string) (bool, error) {
return false, nil
}
err = a.Run()
require.Error(t, err)
assert.False(t, cacherCalled, "dependency cacher called unexpectedly")
assert.False(t, updaterCalled, "library reference updater called unexpectedly")
})
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment