-
Notifications
You must be signed in to change notification settings - Fork 787
/
kustomize_cli.go
84 lines (73 loc) · 2.35 KB
/
kustomize_cli.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package kustomize
import (
"os"
"path/filepath"
"regexp"
"strings"
"github.com/jenkins-x/jx-logging/pkg/log"
"github.com/jenkins-x/jx/v2/pkg/util"
"github.com/pkg/errors"
)
// KustomizeCLI implements common kustomize actions based on kustomize CLI
type KustomizeCLI struct {
Runner util.Commander
}
// NewKustomizeCLI creates a new KustomizeCLI instance configured to use the provided kustomize CLI in
// the given current working directory
func NewKustomizeCLI() *KustomizeCLI {
runner := &util.Command{
Name: "kustomize",
}
cli := &KustomizeCLI{
Runner: runner,
}
return cli
}
// Version executes the Kustomize version command and returns its output
func (k *KustomizeCLI) Version(extraArgs ...string) (string, error) {
args := []string{"version", "--short"}
args = append(args, extraArgs...)
version, err := k.runKustomizeWithOutput(args...)
if err != nil {
return "", err
}
return extractSemanticVersion(version)
}
func (k *KustomizeCLI) runKustomizeWithOutput(args ...string) (string, error) {
k.Runner.SetArgs(args)
return k.Runner.RunWithoutRetry()
}
// extractSemanticVersion return the semantic version string out of given version cli output.
// currently tested on {Version:3.5.4 GitCommit ....} and {Version:kustomize/v3.5.4 GitCommit: ...}
func extractSemanticVersion(version string) (string, error) {
regex, err := regexp.Compile(`[0-9]+\.[0-9]+\.[0-9]+`)
if err != nil {
return "", errors.Wrapf(err, "not able to extract a semantic version of kustomize version output")
}
return regex.FindString(version), nil
}
// ContainsKustomizeConfig finds out if there is any kustomize resource in the cwd or subdirectories
func (k *KustomizeCLI) ContainsKustomizeConfig(dir string) bool {
if len(k.FindKustomizationYamlPaths(dir)) != 0 {
return true
}
return false
}
// FindKustomizationYamlPaths looks for the kustomization.yaml i.e. kustomize resources in present and sub-directories
func (k *KustomizeCLI) FindKustomizationYamlPaths(dir string) []string {
fp, err := filepath.Abs(dir)
var resources []string
err = filepath.Walk(fp, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if strings.Contains(path, "kustomization.yaml") {
resources = append(resources, path)
}
return nil
})
if err != nil {
log.Logger().Errorf("problem finding kustomize resources %s ", err)
}
return resources
}