@@ -19,6 +19,7 @@ import (
19
19
"context"
20
20
"fmt"
21
21
"io"
22
+ "io/ioutil"
22
23
"os"
23
24
"os/exec"
24
25
"path/filepath"
@@ -30,6 +31,7 @@ import (
30
31
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/manifest"
31
32
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/render/generate"
32
33
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/render/kptfile"
34
+ "github.com/GoogleContainerTools/skaffold/pkg/skaffold/render/validate"
33
35
latestV2 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest/v2"
34
36
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/util"
35
37
)
@@ -44,17 +46,37 @@ type Renderer interface {
44
46
}
45
47
46
48
// NewSkaffoldRenderer creates a new Renderer object from the latestV2 API schema.
47
- func NewSkaffoldRenderer (config * latestV2.RenderConfig , workingDir string ) Renderer {
49
+ func NewSkaffoldRenderer (config * latestV2.RenderConfig , workingDir string ) ( Renderer , error ) {
48
50
// TODO(yuwenma): return instance of kpt-managed mode or skaffold-managed mode defer to the config.Path fields.
49
51
// The alpha implementation only has skaffold-managed mode.
50
52
// TODO(yuwenma): The current work directory may not be accurate if users use --filepath flag.
51
53
hydrationDir := filepath .Join (workingDir , DefaultHydrationDir )
52
- generator := generate .NewGenerator (workingDir , * config .Generate )
53
- return & SkaffoldRenderer {Generator : * generator , workingDir : workingDir , hydrationDir : hydrationDir }
54
+
55
+ var generator * generate.Generator
56
+ if config .Generate == nil {
57
+ // If render.generate is not given, default to current working directory.
58
+ defaultManifests := filepath .Join (workingDir , "*.yaml" )
59
+ generator = generate .NewGenerator (workingDir , latestV2.Generate {Manifests : []string {defaultManifests }})
60
+ } else {
61
+ generator = generate .NewGenerator (workingDir , * config .Generate )
62
+ }
63
+
64
+ var validator * validate.Validator
65
+ if config .Validate != nil {
66
+ var err error
67
+ validator , err = validate .NewValidator (* config .Validate )
68
+ if err != nil {
69
+ return nil , err
70
+ }
71
+ } else {
72
+ validator , _ = validate .NewValidator ([]latestV2.Validator {})
73
+ }
74
+ return & SkaffoldRenderer {Generator : * generator , Validator : * validator , workingDir : workingDir , hydrationDir : hydrationDir }, nil
54
75
}
55
76
56
77
type SkaffoldRenderer struct {
57
78
generate.Generator
79
+ validate.Validator
58
80
workingDir string
59
81
hydrationDir string
60
82
labels map [string ]string
@@ -68,14 +90,16 @@ func (r *SkaffoldRenderer) prepareHydrationDir(ctx context.Context) error {
68
90
if _ , err := os .Stat (r .hydrationDir ); os .IsNotExist (err ) {
69
91
logrus .Debugf ("creating render directory: %v" , r .hydrationDir )
70
92
if err := os .MkdirAll (r .hydrationDir , os .ModePerm ); err != nil {
71
- return fmt .Errorf ("creating cache directory for hydration: %w" , err )
93
+ return fmt .Errorf ("creating render directory for hydration: %w" , err )
72
94
}
73
95
}
74
96
kptFilePath := filepath .Join (r .hydrationDir , kptfile .KptFileName )
75
97
if _ , err := os .Stat (kptFilePath ); os .IsNotExist (err ) {
76
98
cmd := exec .CommandContext (ctx , "kpt" , "pkg" , "init" , r .hydrationDir )
77
99
if _ , err := util .RunCmdOut (cmd ); err != nil {
78
- return err
100
+ // TODO: user error. need manual init
101
+ return fmt .Errorf ("unable to initialize kpt directory in %v, please manually run `kpt pkg init %v`" ,
102
+ kptFilePath , kptFilePath )
79
103
}
80
104
}
81
105
return nil
@@ -111,10 +135,23 @@ func (r *SkaffoldRenderer) Render(ctx context.Context, out io.Writer, builds []g
111
135
defer file .Close ()
112
136
kfConfig := & kptfile.KptFile {}
113
137
if err := yaml .NewDecoder (file ).Decode (& kfConfig ); err != nil {
114
- return err
138
+ // TODO: user error.
139
+ return fmt .Errorf ("unable to parse %v: %w, please check if the kptfile is updated to new apiVersion > v1alpha2" ,
140
+ kptFilePath , err )
141
+ }
142
+ if kfConfig .Pipeline == nil {
143
+ kfConfig .Pipeline = & kptfile.Pipeline {}
115
144
}
116
145
117
- // TODO: Update the Kptfile with the new validators.
146
+ kfConfig . Pipeline . Validators = r . GetDeclarativeValidators ()
118
147
// TODO: Update the Kptfile with the new mutators.
148
+
149
+ configByte , err := yaml .Marshal (kfConfig )
150
+ if err != nil {
151
+ return fmt .Errorf ("unable to marshal Kptfile config %v" , kfConfig )
152
+ }
153
+ if err = ioutil .WriteFile (kptFilePath , configByte , 0644 ); err != nil {
154
+ return fmt .Errorf ("unable to update %v" , kptFilePath )
155
+ }
119
156
return nil
120
157
}
0 commit comments