Skip to content

Commit f40dcd4

Browse files
authored
Support skaffold fix —version skaffold/v1 (#4016)
* Skaffold fix —version Fixes #3613 Signed-off-by: David Gageot <[email protected]> * Fix doc Signed-off-by: David Gageot <[email protected]> * feedback Signed-off-by: David Gageot <[email protected]>
1 parent 89d9933 commit f40dcd4

File tree

12 files changed

+88
-46
lines changed

12 files changed

+88
-46
lines changed

cmd/skaffold/app/cmd/find_configs.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func findConfigs(directory string) (map[string]string, error) {
8989
}
9090

9191
err := walk.From(directory).When(isYaml).Do(func(path string, _ walk.Dirent) error {
92-
if cfg, err := schema.ParseConfig(path, false); err == nil {
92+
if cfg, err := schema.ParseConfig(path); err == nil {
9393
pathToVersion[path] = cfg.GetVersion()
9494
}
9595
return nil

cmd/skaffold/app/cmd/fix.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,27 @@ import (
3232
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/validation"
3333
)
3434

35+
var toVersion string
36+
3537
func NewCmdFix() *cobra.Command {
3638
return NewCmd("fix").
37-
WithDescription("Update old configuration to newest schema version").
39+
WithDescription("Update old configuration to a newer schema version").
40+
WithExample("Update \"skaffold.yaml\" in the current folder to the latest version", "fix").
41+
WithExample("Update \"skaffold.yaml\" in the current folder to version \"skaffold/v1\"", "fix --version skaffold/v1").
3842
WithCommonFlags().
3943
WithFlags(func(f *pflag.FlagSet) {
4044
f.BoolVar(&overwrite, "overwrite", false, "Overwrite original config with fixed config")
45+
f.StringVar(&toVersion, "version", latest.Version, "Target schema version to upgrade to")
4146
}).
4247
NoArgs(doFix)
4348
}
4449

4550
func doFix(_ context.Context, out io.Writer) error {
46-
return fix(out, opts.ConfigurationFile, overwrite)
51+
return fix(out, opts.ConfigurationFile, toVersion, overwrite)
4752
}
4853

49-
func fix(out io.Writer, configFile string, overwrite bool) error {
50-
cfg, err := schema.ParseConfig(configFile, false)
54+
func fix(out io.Writer, configFile string, toVersion string, overwrite bool) error {
55+
cfg, err := schema.ParseConfig(configFile)
5156
if err != nil {
5257
return err
5358
}
@@ -57,7 +62,7 @@ func fix(out io.Writer, configFile string, overwrite bool) error {
5762
return nil
5863
}
5964

60-
cfg, err = schema.ParseConfig(configFile, true)
65+
cfg, err = schema.ParseConfigAndUpgrade(configFile, toVersion)
6166
if err != nil {
6267
return err
6368
}

cmd/skaffold/app/cmd/fix_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ kind: Config
113113
cfgFile := t.TempFile("config", []byte(test.inputYaml))
114114

115115
var b bytes.Buffer
116-
err := fix(&b, cfgFile, false)
116+
err := fix(&b, cfgFile, latest.Version, false)
117117

118118
t.CheckErrorAndDeepEqual(test.shouldErr, err, test.output, b.String())
119119
})
@@ -158,7 +158,7 @@ deploy:
158158
cfgFile := t.TempFile("config", []byte(inputYaml))
159159

160160
var b bytes.Buffer
161-
err := fix(&b, cfgFile, true)
161+
err := fix(&b, cfgFile, latest.Version, true)
162162

163163
output, _ := ioutil.ReadFile(cfgFile)
164164

cmd/skaffold/app/cmd/runner.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func withRunner(ctx context.Context, action func(runner.Runner, *latest.Skaffold
5151

5252
// createNewRunner creates a Runner and returns the SkaffoldConfig associated with it.
5353
func createNewRunner(opts config.SkaffoldOptions) (runner.Runner, *latest.SkaffoldConfig, error) {
54-
parsed, err := schema.ParseConfig(opts.ConfigurationFile, true)
54+
parsed, err := schema.ParseConfigAndUpgrade(opts.ConfigurationFile, latest.Version)
5555
if err != nil {
5656
if os.IsNotExist(errors.Unwrap(err)) {
5757
return nil, nil, fmt.Errorf("[%s] not found. You might need to run `skaffold init`", opts.ConfigurationFile)

docs/content/en/docs/references/cli/_index.md

+11-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Pipeline building blocks for CI/CD:
7979
8080
Getting started with a new project:
8181
init [alpha] Generate configuration for deploying an application
82-
fix Update old configuration to newest schema version
82+
fix Update old configuration to a newer schema version
8383
8484
Other Commands:
8585
completion Output shell completion for the given shell (bash or zsh)
@@ -584,14 +584,22 @@ Env vars:
584584

585585
### skaffold fix
586586

587-
Update old configuration to newest schema version
587+
Update old configuration to a newer schema version
588588

589589
```
590590
591591
592+
Examples:
593+
# Update "skaffold.yaml" in the current folder to the latest version
594+
skaffold fix
595+
596+
# Update "skaffold.yaml" in the current folder to version "skaffold/v1"
597+
skaffold fix --version skaffold/v1
598+
592599
Options:
593600
-f, --filename='skaffold.yaml': Path or URL to the Skaffold config file
594601
--overwrite=false: Overwrite original config with fixed config
602+
--version='skaffold/v2beta2': Target schema version to upgrade to
595603
596604
Usage:
597605
skaffold fix [options]
@@ -604,6 +612,7 @@ Env vars:
604612

605613
* `SKAFFOLD_FILENAME` (same as `--filename`)
606614
* `SKAFFOLD_OVERWRITE` (same as `--overwrite`)
615+
* `SKAFFOLD_VERSION` (same as `--version`)
607616

608617
### skaffold init
609618

pkg/skaffold/initializer/init_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,10 @@ func strip(s string) string {
227227
}
228228

229229
func checkGeneratedConfig(t *testutil.T, dir string) {
230-
expectedOutput, err := schema.ParseConfig(filepath.Join(dir, "skaffold.yaml"), false)
230+
expectedOutput, err := schema.ParseConfig(filepath.Join(dir, "skaffold.yaml"))
231231
t.CheckNoError(err)
232232

233-
output, err := schema.ParseConfig(filepath.Join(dir, "skaffold.yaml.out"), false)
233+
output, err := schema.ParseConfig(filepath.Join(dir, "skaffold.yaml.out"))
234234
t.CheckNoError(err)
235235
t.CheckDeepEqual(expectedOutput, output)
236236
}

pkg/skaffold/runner/generate_pipeline.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func setupConfigFiles(configPaths []string) ([]*pipeline.ConfigFile, error) {
7171
// Read all given config files to read contents into SkaffoldConfig
7272
var configFiles []*pipeline.ConfigFile
7373
for _, path := range configPaths {
74-
parsed, err := schema.ParseConfig(path, true)
74+
parsed, err := schema.ParseConfigAndUpgrade(path, latest.Version)
7575
if err != nil {
7676
return nil, fmt.Errorf("parsing config %q: %w", path, err)
7777
}

pkg/skaffold/schema/latest/upgrade.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ import (
2424

2525
// Upgrade upgrades a configuration to the next version.
2626
func (c *SkaffoldConfig) Upgrade() (util.VersionedConfig, error) {
27-
return nil, errors.New("not implemented yet")
27+
return nil, errors.New("there's no version to upgrade from \"latest\"")
2828
}

pkg/skaffold/schema/profiles_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ profiles:
6262
tmpDir := t.NewTempDir().
6363
Write("skaffold.yaml", addVersion(config))
6464

65-
parsed, err := ParseConfig(tmpDir.Path("skaffold.yaml"), false)
65+
parsed, err := ParseConfig(tmpDir.Path("skaffold.yaml"))
6666
t.CheckNoError(err)
6767

6868
skaffoldConfig := parsed.(*latest.SkaffoldConfig)
@@ -93,7 +93,7 @@ profiles:
9393
tmp := t.NewTempDir().
9494
Write("skaffold.yaml", addVersion(config))
9595

96-
parsed, err := ParseConfig(tmp.Path("skaffold.yaml"), false)
96+
parsed, err := ParseConfig(tmp.Path("skaffold.yaml"))
9797
t.CheckNoError(err)
9898

9999
skaffoldConfig := parsed.(*latest.SkaffoldConfig)
@@ -666,7 +666,7 @@ profiles:
666666
tmpDir := t.NewTempDir().
667667
Write("skaffold.yaml", addVersion(config))
668668

669-
parsed, err := ParseConfig(tmpDir.Path("skaffold.yaml"), false)
669+
parsed, err := ParseConfig(tmpDir.Path("skaffold.yaml"))
670670
t.RequireNoError(err)
671671

672672
skaffoldConfig := parsed.(*latest.SkaffoldConfig)

pkg/skaffold/schema/samples_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func TestParseSamples(t *testing.T) {
7575

7676
func checkSkaffoldConfig(t *testutil.T, yaml []byte) {
7777
configFile := t.TempFile("skaffold.yaml", yaml)
78-
cfg, err := ParseConfig(configFile, true)
78+
cfg, err := ParseConfigAndUpgrade(configFile, latest.Version)
7979
t.CheckNoError(err)
8080

8181
err = defaults.Set(cfg.(*latest.SkaffoldConfig))

pkg/skaffold/schema/versions.go

+29-25
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ func IsSkaffoldConfig(file string) bool {
120120
return false
121121
}
122122

123-
if config, err := ParseConfig(file, false); err == nil && config != nil {
123+
if config, err := ParseConfig(file); err == nil && config != nil {
124124
return true
125125
}
126126
return false
127127
}
128128

129129
// ParseConfig reads a configuration file.
130-
func ParseConfig(filename string, upgrade bool) (util.VersionedConfig, error) {
130+
func ParseConfig(filename string) (util.VersionedConfig, error) {
131131
buf, err := misc.ReadConfiguration(filename)
132132
if err != nil {
133133
return nil, fmt.Errorf("read skaffold config: %w", err)
@@ -146,7 +146,7 @@ func ParseConfig(filename string, upgrade bool) (util.VersionedConfig, error) {
146146

147147
factory, present := SchemaVersions.Find(apiVersion.Version)
148148
if !present {
149-
return nil, fmt.Errorf("unknown api version: '%s'", apiVersion.Version)
149+
return nil, fmt.Errorf("unknown api version: %q", apiVersion.Version)
150150
}
151151

152152
// Remove all top-level keys starting with `.` so they can be used as YAML anchors
@@ -169,42 +169,46 @@ func ParseConfig(filename string, upgrade bool) (util.VersionedConfig, error) {
169169
return nil, fmt.Errorf("unable to parse config: %w", err)
170170
}
171171

172-
if upgrade && cfg.GetVersion() != latest.Version {
173-
cfg, err = upgradeToLatest(cfg)
174-
if err != nil {
175-
return nil, err
176-
}
177-
}
178-
179172
return cfg, nil
180173
}
181174

182-
// upgradeToLatest upgrades a configuration to the latest version.
183-
func upgradeToLatest(vc util.VersionedConfig) (util.VersionedConfig, error) {
184-
var err error
175+
// ParseConfigAndUpgrade reads a configuration file and upgrades it to a given version.
176+
func ParseConfigAndUpgrade(filename, toVersion string) (util.VersionedConfig, error) {
177+
cfg, err := ParseConfig(filename)
178+
if err != nil {
179+
return nil, err
180+
}
181+
182+
// Check that the target version exists
183+
if _, present := SchemaVersions.Find(toVersion); !present {
184+
return nil, fmt.Errorf("unknown api version: %q", toVersion)
185+
}
185186

186-
// first, check to make sure config version isn't too new
187-
version, err := apiversion.Parse(vc.GetVersion())
187+
// Check that the config's version is not newer than the target version
188+
currentVersion, err := apiversion.Parse(cfg.GetVersion())
188189
if err != nil {
189-
return nil, fmt.Errorf("parsing api version: %w", err)
190+
return nil, err
191+
}
192+
targetVersion, err := apiversion.Parse(toVersion)
193+
if err != nil {
194+
return nil, err
190195
}
191196

192-
semver := apiversion.MustParse(latest.Version)
193-
if version.EQ(semver) {
194-
return vc, nil
197+
if currentVersion.EQ(targetVersion) {
198+
return cfg, nil
195199
}
196-
if version.GT(semver) {
197-
return nil, fmt.Errorf("config version %s is too new for this version: upgrade Skaffold", vc.GetVersion())
200+
if currentVersion.GT(targetVersion) {
201+
return nil, fmt.Errorf("config version %q is more recent than target version %q: upgrade Skaffold", cfg.GetVersion(), toVersion)
198202
}
199203

200-
logrus.Debugf("config version (%s) out of date: upgrading to latest (%s)", vc.GetVersion(), latest.Version)
204+
logrus.Debugf("config version %q out of date: upgrading to latest %q", cfg.GetVersion(), toVersion)
201205

202-
for vc.GetVersion() != latest.Version {
203-
vc, err = vc.Upgrade()
206+
for cfg.GetVersion() != toVersion {
207+
cfg, err = cfg.Upgrade()
204208
if err != nil {
205209
return nil, fmt.Errorf("transforming skaffold config: %w", err)
206210
}
207211
}
208212

209-
return vc, nil
213+
return cfg, nil
210214
}

pkg/skaffold/schema/versions_test.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ deploy:
149149
}
150150
}
151151

152-
func TestParseConfig(t *testing.T) {
152+
func TestParseConfigAndUpgrade(t *testing.T) {
153153
tests := []struct {
154154
apiVersion string
155155
description string
@@ -273,7 +273,7 @@ func TestParseConfig(t *testing.T) {
273273
tmpDir := t.NewTempDir().
274274
Write("skaffold.yaml", fmt.Sprintf("apiVersion: %s\nkind: Config\n%s", test.apiVersion, test.config))
275275

276-
cfg, err := ParseConfig(tmpDir.Path("skaffold.yaml"), true)
276+
cfg, err := ParseConfigAndUpgrade(tmpDir.Path("skaffold.yaml"), latest.Version)
277277
if cfg != nil {
278278
config := cfg.(*latest.SkaffoldConfig)
279279
err := defaults.Set(config)
@@ -472,3 +472,27 @@ func TestCantUpgradeFromLatestVersion(t *testing.T) {
472472
_, err := factory().Upgrade()
473473
testutil.CheckError(t, true, err)
474474
}
475+
476+
func TestParseConfigAndUpgradeToUnknownVersion(t *testing.T) {
477+
testutil.Run(t, "", func(t *testutil.T) {
478+
t.NewTempDir().
479+
Write("skaffold.yaml", fmt.Sprintf("apiVersion: %s\nkind: Config\n%s", latest.Version, minimalConfig)).
480+
Chdir()
481+
482+
_, err := ParseConfigAndUpgrade("skaffold.yaml", "unknown")
483+
484+
t.CheckErrorContains(`unknown api version: "unknown"`, err)
485+
})
486+
}
487+
488+
func TestParseConfigAndUpgradeToOlderVersion(t *testing.T) {
489+
testutil.Run(t, "", func(t *testutil.T) {
490+
t.NewTempDir().
491+
Write("skaffold.yaml", fmt.Sprintf("apiVersion: %s\nkind: Config\n%s", latest.Version, minimalConfig)).
492+
Chdir()
493+
494+
_, err := ParseConfigAndUpgrade("skaffold.yaml", "skaffold/v1alpha1")
495+
496+
t.CheckErrorContains(`is more recent than target version "skaffold/v1alpha1": upgrade Skaffold`, err)
497+
})
498+
}

0 commit comments

Comments
 (0)