Skip to content
Snippets Groups Projects
Commit 90522cc1 authored by bryanl's avatar bryanl
Browse files

adding more behaviors to app interface


* UpdateTargets - allows targets for an env to be set
* Fs - the app can share its Fs
* Root - the app can share its root

Signed-off-by: default avatarbryanl <bryanliles@gmail.com>
parent f4c22151
No related branches found
No related tags found
No related merge requests found
......@@ -37,15 +37,38 @@ type App interface {
AddEnvironment(name, k8sSpecFlag string, spec *EnvironmentSpec) error
Environment(name string) (*EnvironmentSpec, error)
Environments() (EnvironmentSpecs, error)
Libraries() LibraryRefSpecs
LibPath(envName string) (string, error)
Fs() afero.Fs
Init() error
LibPath(envName string) (string, error)
Libraries() LibraryRefSpecs
Registries() RegistryRefSpecs
RenameEnvironment(from, to string) error
RemoveEnvironment(name string) error
RenameEnvironment(from, to string) error
Root() string
UpdateTargets(envName string, targets []string) error
Upgrade(dryRun bool) error
}
type baseApp struct {
root string
fs afero.Fs
}
func (ba *baseApp) Fs() afero.Fs {
return ba.fs
}
func (ba *baseApp) Root() string {
return ba.root
}
func newBaseApp(fs afero.Fs, root string) *baseApp {
return &baseApp{
fs: fs,
root: root,
}
}
// Load loads the application configuration.
func Load(fs afero.Fs, appRoot string) (App, error) {
spec, err := Read(fs, appRoot)
......
......@@ -8,7 +8,6 @@ import (
"path/filepath"
"strings"
"github.com/ksonnet/ksonnet/metadata/lib"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/spf13/afero"
......@@ -22,9 +21,8 @@ const (
// App001 is a ksonnet 0.0.1 application.
type App001 struct {
spec *Spec
root string
fs afero.Fs
out io.Writer
*baseApp
}
var _ App = (*App001)(nil)
......@@ -36,23 +34,15 @@ func NewApp001(fs afero.Fs, root string) (*App001, error) {
return nil, err
}
ba := newBaseApp(fs, root)
return &App001{
spec: spec,
fs: fs,
root: root,
out: os.Stdout,
spec: spec,
out: os.Stdout,
baseApp: ba,
}, nil
}
// Init initializes the App.
func (a *App001) Init() error {
msg := "Your application's apiVersion is below 0.1.0. In order to use all ks features, you " +
"can upgrade your application using `ks upgrade`."
log.Warn(msg)
return nil
}
// AddEnvironment adds an environment spec to the app spec. If the spec already exists,
// it is overwritten.
func (a *App001) AddEnvironment(name, k8sSpecFlag string, spec *EnvironmentSpec) error {
......@@ -76,21 +66,6 @@ func (a *App001) AddEnvironment(name, k8sSpecFlag string, spec *EnvironmentSpec)
return err
}
// RenameEnvironment renames environments.
func (a *App001) RenameEnvironment(from, to string) error {
return moveEnvironment(a.fs, a.root, from, to)
}
// Registries returns application registries.
func (a *App001) Registries() RegistryRefSpecs {
return a.spec.Registries
}
// Libraries returns application libraries.
func (a *App001) Libraries() LibraryRefSpecs {
return a.spec.Libraries
}
// Environment returns the spec for an environment. In 0.1.0, the file lives in
// /environments/name/spec.json.
func (a *App001) Environment(name string) (*EnvironmentSpec, error) {
......@@ -130,58 +105,47 @@ func (a *App001) Environments() (EnvironmentSpecs, error) {
return specs, nil
}
type k8sSchema struct {
Info struct {
Version string `json:"version,omitempty"`
} `json:"info,omitempty"`
}
func read001EnvSpec(fs afero.Fs, name, path string) (*EnvironmentSpec, error) {
b, err := afero.ReadFile(fs, path)
if err != nil {
return nil, err
}
var s EnvironmentDestinationSpec
if err = json.Unmarshal(b, &s); err != nil {
return nil, err
}
if s.Namespace == "" {
s.Namespace = "default"
}
envPath := filepath.Dir(path)
swaggerPath := filepath.Join(envPath, ".metadata", "swagger.json")
b, err = afero.ReadFile(fs, swaggerPath)
if err != nil {
return nil, err
}
// Init initializes the App.
func (a *App001) Init() error {
msg := "Your application's apiVersion is below 0.1.0. In order to use all ks features, you " +
"can upgrade your application using `ks upgrade`."
log.Warn(msg)
var ks k8sSchema
if err = json.Unmarshal(b, &ks); err != nil {
return nil, err
}
return nil
}
if ks.Info.Version == "" {
return nil, errors.New("unable to determine environment Kubernetes version")
}
// LibPath returns the lib path for an env environment.
func (a *App001) LibPath(envName string) (string, error) {
return filepath.Join(a.envDir(envName), ".metadata"), nil
}
spec := EnvironmentSpec{
Path: name,
Destination: &s,
KubernetesVersion: ks.Info.Version,
}
// Libraries returns application libraries.
func (a *App001) Libraries() LibraryRefSpecs {
return a.spec.Libraries
}
return &spec, nil
// Registries returns application registries.
func (a *App001) Registries() RegistryRefSpecs {
return a.spec.Registries
}
// RemoveEnvironment removes an environment.
func (a *App001) RemoveEnvironment(envName string) error {
a.Fs().RemoveAll(a.envDir(envName))
return nil
}
// RenameEnvironment renames environments.
func (a *App001) RenameEnvironment(from, to string) error {
return moveEnvironment(a.fs, a.root, from, to)
}
// UpdateTargets returns an error since 0.0.1 based applications don't have support
// for targets.
func (a *App001) UpdateTargets(envName string, targets []string) error {
return errors.New("ks apps with version 0.0.1 do not have support for targets")
}
// Upgrade upgrades the app to the latest apiVersion.
func (a *App001) Upgrade(dryRun bool) error {
if err := a.load(); err != nil {
......@@ -220,6 +184,53 @@ func (a *App001) Upgrade(dryRun bool) error {
return a.save()
}
type k8sSchema struct {
Info struct {
Version string `json:"version,omitempty"`
} `json:"info,omitempty"`
}
func read001EnvSpec(fs afero.Fs, name, path string) (*EnvironmentSpec, error) {
b, err := afero.ReadFile(fs, path)
if err != nil {
return nil, err
}
var s EnvironmentDestinationSpec
if err = json.Unmarshal(b, &s); err != nil {
return nil, err
}
if s.Namespace == "" {
s.Namespace = "default"
}
envPath := filepath.Dir(path)
swaggerPath := filepath.Join(envPath, ".metadata", "swagger.json")
b, err = afero.ReadFile(fs, swaggerPath)
if err != nil {
return nil, err
}
var ks k8sSchema
if err = json.Unmarshal(b, &ks); err != nil {
return nil, err
}
if ks.Info.Version == "" {
return nil, errors.New("unable to determine environment Kubernetes version")
}
spec := EnvironmentSpec{
Path: name,
Destination: &s,
KubernetesVersion: ks.Info.Version,
}
return &spec, nil
}
func (a *App001) convertEnvironment(envName string, dryRun bool) error {
path := filepath.Join(a.root, EnvironmentDirName, envName, "spec.json")
env, err := read001EnvSpec(a.fs, envName, path)
......@@ -262,18 +273,8 @@ func (a *App001) load() error {
return nil
}
// LibPath returns the lib path for an env environment.
func (a *App001) LibPath(envName string) (string, error) {
env, err := a.Environment(envName)
if err != nil {
return "", err
}
ver := fmt.Sprintf("version:%s", env.KubernetesVersion)
lm, err := lib.NewManager(ver, a.fs, a.appLibPath(envName))
if err != nil {
return "", err
}
return lm.GetLibPath(false)
func (a *App001) envDir(envName string) string {
envParts := strings.Split(envName, "/")
envRoot := filepath.Join(a.Root(), EnvironmentDirName)
return filepath.Join(append([]string{envRoot}, envParts...)...)
}
package app
import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
......@@ -47,20 +46,17 @@ func TestApp001_RenameEnvironment(t *testing.T) {
}
for _, tc := range cases {
withApp001Fs(t, "app001_app.yaml", func(fs afero.Fs) {
t.Run(tc.name, func(t *testing.T) {
app, err := NewApp001(fs, "/")
require.NoError(t, err)
err = app.RenameEnvironment(tc.from, tc.to)
t.Run(tc.name, func(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
err := app.RenameEnvironment(tc.from, tc.to)
require.NoError(t, err)
for _, p := range tc.shouldExist {
checkExist(t, fs, p)
checkExist(t, app.Fs(), p)
}
for _, p := range tc.shouldNotExist {
checkNotExist(t, fs, p)
checkNotExist(t, app.Fs(), p)
}
app.load()
......@@ -77,10 +73,7 @@ func TestApp001_RenameEnvironment(t *testing.T) {
}
func TestApp001_Environments(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(fs afero.Fs) {
app, err := NewApp001(fs, "/")
require.NoError(t, err)
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
expected := EnvironmentSpecs{
"default": &EnvironmentSpec{
Destination: &EnvironmentDestinationSpec{
......@@ -141,10 +134,7 @@ func TestApp001_Environment(t *testing.T) {
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(fs afero.Fs) {
app, err := NewApp001(fs, "/")
require.NoError(t, err)
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
spec, err := app.Environment(tc.envName)
if tc.isErr {
require.Error(t, err)
......@@ -158,10 +148,7 @@ func TestApp001_Environment(t *testing.T) {
}
func TestApp001_AddEnvironment(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(fs afero.Fs) {
app, err := NewApp001(fs, "/")
require.NoError(t, err)
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
newEnv := &EnvironmentSpec{
Destination: &EnvironmentDestinationSpec{
Namespace: "some-namespace",
......@@ -171,7 +158,7 @@ func TestApp001_AddEnvironment(t *testing.T) {
}
k8sSpecFlag := "version:v1.8.7"
err = app.AddEnvironment("us-west/qa", k8sSpecFlag, newEnv)
err := app.AddEnvironment("us-west/qa", k8sSpecFlag, newEnv)
require.NoError(t, err)
_, err = app.Environment("us-west/qa")
......@@ -180,32 +167,24 @@ func TestApp001_AddEnvironment(t *testing.T) {
}
func TestApp001_Upgrade_dryrun(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(fs afero.Fs) {
app, err := NewApp001(fs, "/")
require.NoError(t, err)
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
app.out = ioutil.Discard
var buf bytes.Buffer
app.out = &buf
err = app.Upgrade(true)
err := app.Upgrade(true)
require.NoError(t, err)
})
}
func TestApp001_Upgrade(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(fs afero.Fs) {
app, err := NewApp001(fs, "/")
require.NoError(t, err)
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
app.out = ioutil.Discard
var buf bytes.Buffer
app.out = &buf
err = app.Upgrade(false)
err := app.Upgrade(false)
require.NoError(t, err)
root := filepath.Join(app.root, EnvironmentDirName)
root := filepath.Join(app.Root(), EnvironmentDirName)
var foundSpec bool
err = afero.Walk(fs, root, func(path string, fi os.FileInfo, err error) error {
err = afero.Walk(app.Fs(), root, func(path string, fi os.FileInfo, err error) error {
if err != nil {
return err
}
......@@ -225,7 +204,39 @@ func TestApp001_Upgrade(t *testing.T) {
})
}
func withApp001Fs(t *testing.T, appName string, fn func(fs afero.Fs)) {
func TestApp001_LibPath(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
path, err := app.LibPath("default")
require.NoError(t, err)
expected := filepath.Join("/", "environments", "default", ".metadata")
require.Equal(t, expected, path)
})
}
func TestApp001_RemoveEnvironment(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
err := app.RemoveEnvironment("default")
require.NoError(t, err)
checkNotExist(t, app.Fs(), "/environments/default")
})
}
func TestApp001_Init(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
err := app.Init()
require.NoError(t, err)
})
}
func TestApp001_UpdateTargets(t *testing.T) {
withApp001Fs(t, "app001_app.yaml", func(app *App001) {
err := app.UpdateTargets("", nil)
require.Error(t, err)
})
}
func withApp001Fs(t *testing.T, appName string, fn func(app *App001)) {
ogLibUpdater := LibUpdater
LibUpdater = func(fs afero.Fs, k8sSpecFlag string, libPath string, useVersionPath bool) (string, error) {
path := filepath.Join(libPath, "swagger.json")
......@@ -253,7 +264,7 @@ func withApp001Fs(t *testing.T, appName string, fn func(fs afero.Fs)) {
for _, dir := range envDirs {
path := filepath.Join("/environments", dir)
err := fs.MkdirAll(path, DefaultFolderPermissions)
err = fs.MkdirAll(path, DefaultFolderPermissions)
require.NoError(t, err)
specPath := filepath.Join(path, "spec.json")
......@@ -265,5 +276,7 @@ func withApp001Fs(t *testing.T, appName string, fn func(fs afero.Fs)) {
stageFile(t, fs, appName, "/app.yaml")
fn(fs)
app, err := NewApp001(fs, "/")
require.NoError(t, err)
fn(app)
}
......@@ -15,17 +15,17 @@ import (
// App010 is a ksonnet 0.1.0 application.
type App010 struct {
spec *Spec
root string
fs afero.Fs
*baseApp
}
var _ App = (*App010)(nil)
// NewApp010 creates an App010 instance.
func NewApp010(fs afero.Fs, root string) (*App010, error) {
ba := newBaseApp(fs, root)
a := &App010{
fs: fs,
root: root,
baseApp: ba,
}
if err := a.load(); err != nil {
......@@ -35,6 +35,42 @@ func NewApp010(fs afero.Fs, root string) (*App010, error) {
return a, nil
}
// AddEnvironment adds an environment spec to the app spec. If the spec already exists,
// it is overwritten.
func (a *App010) AddEnvironment(name, k8sSpecFlag string, spec *EnvironmentSpec) error {
if err := a.load(); err != nil {
return err
}
a.spec.Environments[name] = spec
if k8sSpecFlag != "" {
ver, err := LibUpdater(a.fs, k8sSpecFlag, app010LibPath(a.root), true)
if err != nil {
return err
}
a.spec.Environments[name].KubernetesVersion = ver
}
return a.save()
}
// Environment returns the spec for an environment.
func (a *App010) Environment(name string) (*EnvironmentSpec, error) {
s, ok := a.spec.Environments[name]
if !ok {
return nil, errors.Errorf("environment %q was not found", name)
}
return s, nil
}
// Environments returns all environment specs.
func (a *App010) Environments() (EnvironmentSpecs, error) {
return a.spec.Environments, nil
}
// Init initializes the App.
func (a *App010) Init() error {
// check to see if there are spec.json files.
......@@ -55,52 +91,38 @@ func (a *App010) Init() error {
return errors.Errorf(msg, strings.Join(legacyEnvs, ", "))
}
func (a *App010) findLegacySpec() ([]string, error) {
var found []string
envPath := filepath.Join(a.root, EnvironmentDirName)
err := afero.Walk(a.fs, envPath, func(path string, fi os.FileInfo, err error) error {
if err != nil {
return err
}
if fi.IsDir() {
return nil
}
if fi.Name() == app001specJSON {
envName := strings.TrimPrefix(path, envPath+"/")
envName = strings.TrimSuffix(envName, "/"+app001specJSON)
found = append(found, envName)
}
return nil
})
// LibPath returns the lib path for an env environment.
func (a *App010) LibPath(envName string) (string, error) {
env, err := a.Environment(envName)
if err != nil {
return "", err
}
ver := fmt.Sprintf("version:%s", env.KubernetesVersion)
lm, err := lib.NewManager(ver, a.fs, app010LibPath(a.root))
if err != nil {
return nil, err
return "", err
}
return found, nil
return lm.GetLibPath(true)
}
// AddEnvironment adds an environment spec to the app spec. If the spec already exists,
// it is overwritten.
func (a *App010) AddEnvironment(name, k8sSpecFlag string, spec *EnvironmentSpec) error {
if err := a.load(); err != nil {
return err
}
a.spec.Environments[name] = spec
// Libraries returns application libraries.
func (a *App010) Libraries() LibraryRefSpecs {
return a.spec.Libraries
}
if k8sSpecFlag != "" {
ver, err := LibUpdater(a.fs, k8sSpecFlag, app010LibPath(a.root), true)
if err != nil {
return err
}
// Registries returns application registries.
func (a *App010) Registries() RegistryRefSpecs {
return a.spec.Registries
}
a.spec.Environments[name].KubernetesVersion = ver
// RemoveEnvironment removes an environment.
func (a *App010) RemoveEnvironment(envName string) error {
if err := a.load(); err != nil {
return err
}
delete(a.spec.Environments, envName)
return a.save()
}
......@@ -122,38 +144,49 @@ func (a *App010) RenameEnvironment(from, to string) error {
return a.save()
}
// Registries returns application registries.
func (a *App010) Registries() RegistryRefSpecs {
return a.spec.Registries
// UpdateTargets updates the list of targets for a 0.1.0 application.
func (a *App010) UpdateTargets(envName string, targets []string) error {
spec, err := a.Environment(envName)
if err != nil {
return err
}
spec.Targets = targets
return errors.Wrap(a.AddEnvironment(envName, "", spec), "update targets")
}
// Libraries returns application libraries.
func (a *App010) Libraries() LibraryRefSpecs {
return a.spec.Libraries
// Upgrade upgrades the app to the latest apiVersion.
func (a *App010) Upgrade(dryRun bool) error {
return nil
}
// Environment returns the spec for an environment.
func (a *App010) Environment(name string) (*EnvironmentSpec, error) {
s, ok := a.spec.Environments[name]
if !ok {
return nil, errors.Errorf("environment %q was not found", name)
}
func (a *App010) findLegacySpec() ([]string, error) {
var found []string
return s, nil
}
envPath := filepath.Join(a.root, EnvironmentDirName)
err := afero.Walk(a.fs, envPath, func(path string, fi os.FileInfo, err error) error {
if err != nil {
return err
}
if fi.IsDir() {
return nil
}
// Environments returns all environment specs.
func (a *App010) Environments() (EnvironmentSpecs, error) {
return a.spec.Environments, nil
}
if fi.Name() == app001specJSON {
envName := strings.TrimPrefix(path, envPath+"/")
envName = strings.TrimSuffix(envName, "/"+app001specJSON)
found = append(found, envName)
}
// RemoveEnvironment removes an environment.
func (a *App010) RemoveEnvironment(envName string) error {
if err := a.load(); err != nil {
return err
return nil
})
if err != nil {
return nil, err
}
delete(a.spec.Environments, envName)
return a.save()
return found, nil
}
func (a *App010) save() error {
......@@ -169,24 +202,3 @@ func (a *App010) load() error {
a.spec = spec
return nil
}
// Upgrade upgrades the app to the latest apiVersion.
func (a *App010) Upgrade(dryRun bool) error {
return nil
}
// LibPath returns the lib path for an env environment.
func (a *App010) LibPath(envName string) (string, error) {
env, err := a.Environment(envName)
if err != nil {
return "", err
}
ver := fmt.Sprintf("version:%s", env.KubernetesVersion)
lm, err := lib.NewManager(ver, a.fs, app010LibPath(a.root))
if err != nil {
return "", err
}
return lm.GetLibPath(true)
}
......@@ -11,81 +11,63 @@ import (
"github.com/stretchr/testify/require"
)
func TestApp010_RenameEnvironment(t *testing.T) {
cases := []struct {
name string
from string
to string
shouldExist []string
shouldNotExist []string
}{
{
name: "rename",
from: "default",
to: "renamed",
shouldExist: []string{
"/environments/renamed/main.jsonnet",
},
shouldNotExist: []string{
"/environments/default",
},
},
{
name: "rename to nested",
from: "default",
to: "default/nested",
shouldExist: []string{
"/environments/default/nested/main.jsonnet",
},
shouldNotExist: []string{
"/environments/default/main.jsonnet",
},
},
{
name: "un-nest",
from: "us-east/test",
to: "us-east",
shouldExist: []string{
"/environments/us-east/main.jsonnet",
},
shouldNotExist: []string{
"/environments/us-east/test",
func TestApp010_AddEnvironment(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
envs, err := app.Environments()
require.NoError(t, err)
envLen := len(envs)
newEnv := &EnvironmentSpec{
Destination: &EnvironmentDestinationSpec{
Namespace: "some-namespace",
Server: "http://example.com",
},
},
}
Path: "us-west/qa",
}
for _, tc := range cases {
withApp010Fs(t, "app010_app.yaml", func(fs afero.Fs) {
t.Run(tc.name, func(t *testing.T) {
app, err := NewApp010(fs, "/")
require.NoError(t, err)
k8sSpecFlag := "version:v1.8.7"
err = app.AddEnvironment("us-west/qa", k8sSpecFlag, newEnv)
require.NoError(t, err)
err = app.RenameEnvironment(tc.from, tc.to)
require.NoError(t, err)
envs, err = app.Environments()
require.NoError(t, err)
require.Len(t, envs, envLen+1)
for _, p := range tc.shouldExist {
checkExist(t, fs, p)
}
env, err := app.Environment("us-west/qa")
require.NoError(t, err)
require.Equal(t, "v1.8.7", env.KubernetesVersion)
})
}
for _, p := range tc.shouldNotExist {
checkNotExist(t, fs, p)
}
func TestApp010_AddEnvironment_empty_spec_flag(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
envs, err := app.Environments()
require.NoError(t, err)
_, err = app.Environment(tc.from)
assert.Error(t, err)
envLen := len(envs)
_, err = app.Environment(tc.to)
assert.NoError(t, err)
})
})
}
}
env, err := app.Environment("default")
require.NoError(t, err)
func TestApp0101_Environments(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(fs afero.Fs) {
app, err := NewApp010(fs, "/")
env.Destination.Namespace = "updated"
err = app.AddEnvironment("default", "", env)
require.NoError(t, err)
envs, err = app.Environments()
require.NoError(t, err)
require.Len(t, envs, envLen)
env, err = app.Environment("default")
require.NoError(t, err)
require.Equal(t, "v1.7.0", env.KubernetesVersion)
require.Equal(t, "updated", env.Destination.Namespace)
})
}
func TestApp0101_Environments(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
expected := EnvironmentSpecs{
"default": &EnvironmentSpec{
Destination: &EnvironmentDestinationSpec{
......@@ -146,10 +128,7 @@ func TestApp010_Environment(t *testing.T) {
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(fs afero.Fs) {
app, err := NewApp010(fs, "/")
require.NoError(t, err)
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
spec, err := app.Environment(tc.envName)
if tc.isErr {
require.Error(t, err)
......@@ -162,87 +141,133 @@ func TestApp010_Environment(t *testing.T) {
}
}
func TestApp010_AddEnvironment(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(fs afero.Fs) {
app, err := NewApp010(fs, "/")
func TestApp010_Init_no_legacy_environments(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
err := app.Init()
require.NoError(t, err)
})
}
envs, err := app.Environments()
require.NoError(t, err)
envLen := len(envs)
newEnv := &EnvironmentSpec{
Destination: &EnvironmentDestinationSpec{
Namespace: "some-namespace",
Server: "http://example.com",
},
Path: "us-west/qa",
}
func TestApp010_Init_legacy_environments(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
stageFile(t, app.Fs(), "spec.json", "/environments/default/spec.json")
k8sSpecFlag := "version:v1.8.7"
err = app.AddEnvironment("us-west/qa", k8sSpecFlag, newEnv)
require.NoError(t, err)
err := app.Init()
require.Error(t, err)
})
}
envs, err = app.Environments()
func TestApp0101_LibPath(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
path, err := app.LibPath("default")
require.NoError(t, err)
require.Len(t, envs, envLen+1)
env, err := app.Environment("us-west/qa")
require.NoError(t, err)
require.Equal(t, "v1.8.7", env.KubernetesVersion)
expected := filepath.Join("/", "lib", "v1.7.0")
require.Equal(t, expected, path)
})
}
func TestApp010_AddEnvironment_empty_spec_flag(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(fs afero.Fs) {
app, err := NewApp010(fs, "/")
func TestApp010_RemoveEnvironment(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
_, err := app.Environment("default")
require.NoError(t, err)
envs, err := app.Environments()
err = app.RemoveEnvironment("default")
require.NoError(t, err)
envLen := len(envs)
_, err = app.Environment("default")
require.Error(t, err)
})
}
env, err := app.Environment("default")
require.NoError(t, err)
func TestApp010_RenameEnvironment(t *testing.T) {
cases := []struct {
name string
from string
to string
shouldExist []string
shouldNotExist []string
}{
{
name: "rename",
from: "default",
to: "renamed",
shouldExist: []string{
"/environments/renamed/main.jsonnet",
},
shouldNotExist: []string{
"/environments/default",
},
},
{
name: "rename to nested",
from: "default",
to: "default/nested",
shouldExist: []string{
"/environments/default/nested/main.jsonnet",
},
shouldNotExist: []string{
"/environments/default/main.jsonnet",
},
},
{
name: "un-nest",
from: "us-east/test",
to: "us-east",
shouldExist: []string{
"/environments/us-east/main.jsonnet",
},
shouldNotExist: []string{
"/environments/us-east/test",
},
},
}
env.Destination.Namespace = "updated"
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
err := app.RenameEnvironment(tc.from, tc.to)
require.NoError(t, err)
err = app.AddEnvironment("default", "", env)
require.NoError(t, err)
for _, p := range tc.shouldExist {
checkExist(t, app.Fs(), p)
}
envs, err = app.Environments()
require.NoError(t, err)
require.Len(t, envs, envLen)
for _, p := range tc.shouldNotExist {
checkNotExist(t, app.Fs(), p)
}
env, err = app.Environment("default")
require.NoError(t, err)
require.Equal(t, "v1.7.0", env.KubernetesVersion)
require.Equal(t, "updated", env.Destination.Namespace)
})
}
_, err = app.Environment(tc.from)
assert.Error(t, err)
func TestApp010_RemoveEnvironment(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(fs afero.Fs) {
app, err := NewApp010(fs, "/")
require.NoError(t, err)
_, err = app.Environment(tc.to)
assert.NoError(t, err)
})
})
}
}
_, err = app.Environment("default")
func TestApp010_Upgrade(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
err := app.Upgrade(false)
require.NoError(t, err)
})
}
err = app.RemoveEnvironment("default")
func TestApp0101_UpdateTargets(t *testing.T) {
withApp010Fs(t, "app010_app.yaml", func(app *App010) {
err := app.UpdateTargets("default", []string{"foo"})
require.NoError(t, err)
app, err = NewApp010(fs, "/")
e, err := app.Environment("default")
require.NoError(t, err)
_, err = app.Environment("default")
require.Error(t, err)
expected := []string{"foo"}
require.Equal(t, expected, e.Targets)
})
}
func withApp010Fs(t *testing.T, appName string, fn func(fs afero.Fs)) {
func withApp010Fs(t *testing.T, appName string, fn func(app *App010)) {
ogLibUpdater := LibUpdater
LibUpdater = func(fs afero.Fs, k8sSpecFlag string, libPath string, useVersionPath bool) (string, error) {
return "v1.8.7", nil
......@@ -268,7 +293,7 @@ func withApp010Fs(t *testing.T, appName string, fn func(fs afero.Fs)) {
for _, dir := range envDirs {
path := filepath.Join("/environments", dir)
err := fs.MkdirAll(path, DefaultFolderPermissions)
err = fs.MkdirAll(path, DefaultFolderPermissions)
require.NoError(t, err)
swaggerPath := filepath.Join(path, "main.jsonnet")
......@@ -277,5 +302,8 @@ func withApp010Fs(t *testing.T, appName string, fn func(fs afero.Fs)) {
stageFile(t, fs, appName, "/app.yaml")
fn(fs)
app, err := NewApp010(fs, "/")
require.NoError(t, err)
fn(app)
}
// Code generated by mockery v1.0.0
package mocks
import afero "github.com/spf13/afero"
import app "github.com/ksonnet/ksonnet/metadata/app"
import mock "github.com/stretchr/testify/mock"
......@@ -69,6 +70,22 @@ func (_m *App) Environments() (app.EnvironmentSpecs, error) {
return r0, r1
}
// Fs provides a mock function with given fields:
func (_m *App) Fs() afero.Fs {
ret := _m.Called()
var r0 afero.Fs
if rf, ok := ret.Get(0).(func() afero.Fs); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(afero.Fs)
}
}
return r0
}
// Init provides a mock function with given fields:
func (_m *App) Init() error {
ret := _m.Called()
......@@ -164,6 +181,34 @@ func (_m *App) RenameEnvironment(from string, to string) error {
return r0
}
// Root provides a mock function with given fields:
func (_m *App) Root() string {
ret := _m.Called()
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// UpdateTargets provides a mock function with given fields: envName, targets
func (_m *App) UpdateTargets(envName string, targets []string) error {
ret := _m.Called(envName, targets)
var r0 error
if rf, ok := ret.Get(0).(func(string, []string) error); ok {
r0 = rf(envName, targets)
} else {
r0 = ret.Error(0)
}
return r0
}
// Upgrade provides a mock function with given fields: dryRun
func (_m *App) Upgrade(dryRun bool) error {
ret := _m.Called(dryRun)
......
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