Skip to content

Commit 5b77f27

Browse files
authored
Merge pull request #55 from syntasso/ab/54/update-dependencies
Bug: handle single file dependencies with the --image flag
2 parents e4b467b + f3edd1d commit 5b77f27

7 files changed

+130
-47
lines changed

cmd/init_operator_promise.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func InitPromiseFromOperator(cmd *cobra.Command, args []string) error {
104104
fmt.Println("Promise generated successfully.")
105105
fmt.Println("The Operator documents were added as inline dependencies in the Promise Spec.")
106106
fmt.Println("You can move them to a workflow by running:")
107-
fmt.Printf("\tkratix update dependencies --image yourorg/your-image:tag\n")
107+
fmt.Printf("\tkratix update dependencies %s --image yourorg/your-image:tag\n", operatorManifestsDir)
108108
return nil
109109
}
110110

cmd/init_promise.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ func InitPromise(cmd *cobra.Command, args []string) error {
5656
templateValues := generateTemplateValues(promiseName, "promise", "", "")
5757

5858
templates := map[string]string{
59-
resourceFileName: "templates/promise/example-resource.yaml.tpl",
59+
resourceFileName: fmt.Sprintf("templates/promise/%s.tpl", resourceFileName),
6060
"README.md": "templates/promise/README.md.tpl",
6161
}
6262

6363
if split {
64-
templates[apiFileName] = "templates/promise/api.yaml.tpl"
65-
templates[dependenciesFileName] = "templates/promise/dependencies.yaml"
64+
templates[apiFileName] = fmt.Sprintf("templates/promise/%s.tpl", apiFileName)
65+
templates[dependenciesFileName] = fmt.Sprintf("templates/promise/%s", dependenciesFileName)
6666
} else {
67-
templates[promiseFileName] = "templates/promise/promise.yaml.tpl"
67+
templates[promiseFileName] = fmt.Sprintf("templates/promise/%s.tpl", promiseFileName)
6868
}
6969

7070
if err := templateFiles(promiseTemplates, outputDir, templates, templateValues); err != nil {

cmd/update_dependencies.go

+57-35
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"errors"
45
"fmt"
56
"io"
67
"os"
@@ -14,19 +15,22 @@ import (
1415
)
1516

1617
var updateDependenciesCmd = &cobra.Command{
17-
Use: "dependencies",
18+
Use: "dependencies PATH",
1819
Short: "Commands to update promise dependencies",
19-
Long: "Commands to update promise dependencies",
20-
Example: ` # update promise dependencies with files in 'local-dir'
21-
Kratix update dependencies local-dir/ `,
20+
Long: "Commands to update promise dependencies, by default dependencies are stored in the Promise spec.dependencies field",
21+
Example: `# update promise dependencies with all files in 'local-dir'
22+
kratix update dependencies path/to/dir/
23+
24+
# update promise dependencies with single file
25+
kratix update dependencies path/to/file.yaml`,
2226
Args: cobra.ExactArgs(1),
2327
RunE: updateDependencies,
2428
}
2529

2630
func init() {
2731
updateCmd.AddCommand(updateDependenciesCmd)
2832
updateDependenciesCmd.Flags().StringVarP(&dir, "dir", "d", ".", "Directory to read Promise from")
29-
updateDependenciesCmd.Flags().StringVarP(&image, "image", "i", "", "Name of the image in which to provide the dependencies within Promise Configure workflow.")
33+
updateDependenciesCmd.Flags().StringVarP(&image, "image", "i", "", "Store dependencies to a Promise Configure workflow image with this image/tag")
3034
}
3135

3236
func updateDependencies(cmd *cobra.Command, args []string) error {
@@ -36,7 +40,7 @@ func updateDependencies(cmd *cobra.Command, args []string) error {
3640
}
3741

3842
var depBytes []byte
39-
file := dependencyFile()
43+
mode, fileToUpdate := promiseFileMode()
4044
dependencies, err := buildDependencies(dependenciesDir)
4145
if err != nil {
4246
return err
@@ -46,26 +50,26 @@ func updateDependencies(cmd *cobra.Command, args []string) error {
4650
return err
4751
}
4852

49-
switch file {
50-
case dependenciesFileName:
53+
switch mode {
54+
case "split":
5155
err = os.WriteFile(filepath.Join(dir, dependenciesFileName), depBytes, filePerm)
52-
case promiseFileName:
56+
case "flat":
5357
err = updatePromiseDependencies(dependencies)
5458
}
5559

5660
if err != nil {
5761
return err
5862
}
59-
fmt.Printf("Updated %s\n", file)
63+
fmt.Printf("Updated %s\n", fileToUpdate)
6064
return nil
6165
}
6266

63-
func dependencyFile() string {
64-
_, err := os.Stat(filepath.Join(dir, dependenciesFileName))
65-
if _, promiseErr := os.Stat(filepath.Join(dir, promiseFileName)); os.IsNotExist(err) && promiseErr == nil {
66-
return promiseFileName
67+
func promiseFileMode() (mode string, fileToUpdate string) {
68+
_, dependencyFileErr := os.Stat(filepath.Join(dir, dependenciesFileName))
69+
if _, promiseErr := os.Stat(filepath.Join(dir, promiseFileName)); os.IsNotExist(dependencyFileErr) && promiseErr == nil {
70+
return "flat", promiseFileName
6771
}
68-
return dependenciesFileName
72+
return "split", dependenciesFileName
6973
}
7074

7175
func buildDependencies(dependenciesDir string) ([]v1alpha1.Dependency, error) {
@@ -202,11 +206,11 @@ func addDepsAsWorkflow(dependenciesDir string) error {
202206
return err
203207
}
204208

205-
file := dependencyFile()
206-
switch file {
207-
case dependenciesFileName:
209+
mode, _ := promiseFileMode()
210+
switch mode {
211+
case "split":
208212
err = os.Remove(filepath.Join(dir, dependenciesFileName))
209-
case promiseFileName:
213+
case "flat":
210214
err = updatePromiseDependencies([]v1alpha1.Dependency{})
211215
}
212216
if err != nil {
@@ -221,31 +225,49 @@ func addDepsAsWorkflow(dependenciesDir string) error {
221225
}
222226

223227
func copyFiles(src, dest string) error {
224-
files, err := os.ReadDir(src)
228+
srcInfo, err := os.Stat(src)
225229
if err != nil {
226230
return err
227231
}
228232

229-
for _, f := range files {
230-
if f.IsDir() {
231-
if err := os.Mkdir(filepath.Join(dest, f.Name()), 0755); err != nil {
232-
return err
233-
}
234-
if err := copyFiles(filepath.Join(src, f.Name()), filepath.Join(dest, f.Name())); err != nil {
235-
return err
236-
}
237-
238-
continue
239-
}
240-
241-
fileContents, err := os.ReadFile(filepath.Join(src, f.Name()))
233+
if srcInfo.Mode().IsDir() {
234+
files, err := os.ReadDir(src)
242235
if err != nil {
243236
return err
244237
}
245-
if err := os.WriteFile(filepath.Join(dest, f.Name()), fileContents, 0644); err != nil {
246-
return err
238+
239+
for _, f := range files {
240+
if f.IsDir() {
241+
if err := os.Mkdir(filepath.Join(dest, f.Name()), 0755); err != nil {
242+
return err
243+
}
244+
if err := copyFiles(filepath.Join(src, f.Name()), filepath.Join(dest, f.Name())); err != nil {
245+
return err
246+
}
247+
248+
continue
249+
}
250+
251+
return writeToFile(filepath.Join(src, f.Name()), dest, f.Name())
247252
}
248253
}
254+
255+
if srcInfo.Mode().IsRegular() {
256+
fileName := filepath.Base(src)
257+
return writeToFile(src, dest, fileName)
258+
}
259+
260+
return errors.New("unsupported type for dependencies: must be file or directory")
261+
}
262+
263+
func writeToFile(src string, dest string, fileName string) error {
264+
fileContents, err := os.ReadFile(src)
265+
if err != nil {
266+
return err
267+
}
268+
if err := os.WriteFile(filepath.Join(dest, fileName), fileContents, 0644); err != nil {
269+
return err
270+
}
249271
return nil
250272
}
251273

test/build_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ var _ = Describe("build", func() {
3131

3232
depDir, err = os.MkdirTemp("", "dep")
3333
Expect(err).NotTo(HaveOccurred())
34+
35+
r = &runner{}
3436
})
3537

3638
AfterEach(func() {
@@ -40,7 +42,6 @@ var _ = Describe("build", func() {
4042

4143
Describe("build --help", func() {
4244
It("includes the available build subcommands", func() {
43-
r = &runner{}
4445
sess := r.run("build", "--help")
4546
output := string(sess.Out.Contents())
4647
Expect(output).To(SatisfyAll(
@@ -52,7 +53,6 @@ var _ = Describe("build", func() {
5253

5354
Context("after init promise", func() {
5455
BeforeEach(func() {
55-
r = &runner{exitCode: 0}
5656
r.run("init", "promise", "postgresql", "--group", "syntasso.io", "--kind", "Database", "--split", "--dir", promiseDir)
5757

5858
Expect(os.WriteFile(filepath.Join(depDir, "deps.yaml"), slices.Concat(
@@ -218,7 +218,6 @@ var _ = Describe("build", func() {
218218

219219
Context("after init operator promise with split", func() {
220220
BeforeEach(func() {
221-
r = &runner{exitCode: 0}
222221
r.run("init", "operator-promise", "postgresql", "--group", "syntasso.io", "--kind", "Database", "--split", "--dir", promiseDir, "--operator-manifests", "assets/operator", "--api-schema-from", "postgresqls.acid.zalan.do")
223222
})
224223

@@ -244,7 +243,6 @@ var _ = Describe("build", func() {
244243

245244
Context("after init helm promise with split", func() {
246245
BeforeEach(func() {
247-
r = &runner{exitCode: 0}
248246
session := r.run("init", "helm-promise", "postgresql", "--chart-url", "https://helm.github.io/examples", "--dir", promiseDir, "--chart-name", "hello-world", "--group", "syntasso.io", "--kind", "Database", "--split")
249247
Expect(session.Out).To(gbytes.Say("postgresql promise bootstrapped in %s", promiseDir))
250248
})

test/init_operator_promise_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ var _ = Describe("InitOperatorPromise", func() {
212212
It("outputs a message", func() {
213213
Expect(session.Out).To(SatisfyAll(
214214
gbytes.Say(`Promise generated successfully.`),
215-
gbytes.Say(`kratix update dependencies --image yourorg/your-image:tag`),
215+
gbytes.Say(`kratix update dependencies assets/operator --image yourorg/your-image:tag`),
216216
))
217217
})
218218
})
@@ -251,7 +251,7 @@ var _ = Describe("InitOperatorPromise", func() {
251251
It("outputs a message", func() {
252252
Expect(session.Out).To(SatisfyAll(
253253
gbytes.Say(`Promise generated successfully.`),
254-
gbytes.Say(`kratix update dependencies --image yourorg/your-image:tag`),
254+
gbytes.Say(`kratix update dependencies assets/e2e-cnpg/manifests --image yourorg/your-image:tag`),
255255
))
256256
})
257257
})

test/suite_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (r *runner) run(args ...string) *gexec.Session {
6363

6464
session, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter)
6565
ExpectWithOffset(1, err).NotTo(HaveOccurred())
66-
t := 1 * time.Second
66+
t := 2 * time.Second
6767
if r.timeout > 0 {
6868
t = r.timeout
6969
}

test/update_test.go

+63
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,69 @@ var _ = Describe("update", func() {
380380
}))
381381
})
382382
})
383+
384+
It("can accept a single file for dependencies", func() {
385+
Expect(os.WriteFile(filepath.Join(depDir, "deps.yaml"), slices.Concat(
386+
namespaceBytes(ns1),
387+
namespaceBytes(ns2),
388+
deploymentBytes(deployment1)), 0644)).To(Succeed())
389+
files, _ := os.ReadDir(depDir)
390+
391+
for _, file := range files {
392+
fmt.Println("File in dir: ", file.Name(), file.IsDir())
393+
}
394+
depFilePath := filepath.Join(depDir, "deps.yaml")
395+
fmt.Println("depFilePath: ", depFilePath)
396+
397+
r.run("update", "dependencies", depFilePath)
398+
session := r.run("update", "dependencies", depFilePath, "--image", "registry/image-name:v1.0.0")
399+
Expect(session.Out).To(gbytes.Say("Dependencies added as a Promise workflow."))
400+
401+
By("generating a script that copies resources to output", func() {
402+
scriptFilepath := filepath.Join(workingDir, "workflows/promise/configure/dependencies/configure-deps/scripts/pipeline.sh")
403+
Expect(scriptFilepath).To(BeAnExistingFile())
404+
scriptContents, _ := os.ReadFile(scriptFilepath)
405+
Expect(string(scriptContents)).To(ContainSubstring("cp /resources/* /kratix/output"))
406+
})
407+
408+
By("copying the dependencies to the resources directory", func() {
409+
resourcesDir := filepath.Join(workingDir, "workflows/promise/configure/dependencies/configure-deps/resources")
410+
Expect(resourcesDir).To(BeADirectory())
411+
Expect(filepath.Join(resourcesDir, "deps.yaml")).To(BeAnExistingFile())
412+
depsContent, _ := os.ReadFile(filepath.Join(resourcesDir, "deps.yaml"))
413+
Expect(string(depsContent)).To(SatisfyAll(
414+
ContainSubstring(string(namespaceBytes(ns1))),
415+
ContainSubstring(string(namespaceBytes(ns2))),
416+
ContainSubstring(string(deploymentBytes(deployment1))),
417+
))
418+
})
419+
420+
By("generating a Dockerfile", func() {
421+
dockerfile := filepath.Join(workingDir, "workflows/promise/configure/dependencies/configure-deps/Dockerfile")
422+
Expect(dockerfile).To(BeAnExistingFile())
423+
depsContent, _ := os.ReadFile(dockerfile)
424+
Expect(string(depsContent)).To(SatisfyAll(
425+
ContainSubstring("ADD resources resources"),
426+
))
427+
})
428+
429+
By("removes the dependency.yaml file", func() {
430+
Expect(filepath.Join(depDir, "dependency.yaml")).NotTo(BeAnExistingFile())
431+
})
432+
433+
By("adding the promise workflow to the workflows.yaml", func() {
434+
Expect(filepath.Join(depDir, "workflows.yaml")).NotTo(BeAnExistingFile())
435+
pipelines := getWorkflows(workingDir)
436+
configurePromiseWorkflows := pipelines[v1alpha1.WorkflowTypePromise][v1alpha1.WorkflowActionConfigure]
437+
Expect(configurePromiseWorkflows).To(HaveLen(1))
438+
439+
Expect(configurePromiseWorkflows[0].Spec.Containers).To(HaveLen(1))
440+
Expect(configurePromiseWorkflows[0].Spec.Containers[0]).To(Equal(v1alpha1.Container{
441+
Name: "configure-deps",
442+
Image: "registry/image-name:v1.0.0",
443+
}))
444+
})
445+
})
383446
})
384447
})
385448
})

0 commit comments

Comments
 (0)