-
Notifications
You must be signed in to change notification settings - Fork 30
/
execution.go
100 lines (92 loc) · 3.11 KB
/
execution.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package extensions
import (
"bytes"
"fmt"
"strings"
jenkinsv1client "github.com/jenkins-x/jx-api/pkg/client/clientset/versioned/typed/jenkins.io/v1"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/ghodss/yaml"
jenkinsv1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1"
"github.com/stoewer/go-strcase"
)
// TODO remove the env vars formatting stuff from here and make it a function on ExtensionSpec
func ToExecutable(e *jenkinsv1.ExtensionSpec, paramValues []jenkinsv1.ExtensionParameterValue, teamNamespace string, exts jenkinsv1client.ExtensionInterface) (ext jenkinsv1.ExtensionExecution, envVarsStr string, err error) {
envVars := make([]jenkinsv1.EnvironmentVariable, 0)
paramValueLookup := make(map[string]string, 0)
for _, v := range paramValues {
paramValueLookup[v.Name] = v.Value
}
for _, p := range e.Parameters {
value := p.DefaultValue
if v, ok := paramValueLookup[p.Name]; ok {
value = v
}
// TODO Log any parameters from RepoExetensions NOT used
if value != "" {
envVarName := p.EnvironmentVariableName
if envVarName == "" {
envVarName = namespaceName(e.Namespace, e.Name, p.Name)
}
envVars = append(envVars, jenkinsv1.EnvironmentVariable{
Name: envVarName,
Value: value,
})
}
}
extension, err := exts.Get(e.FullyQualifiedKebabName(), metav1.GetOptions{})
if err != nil {
return jenkinsv1.ExtensionExecution{}, "", errors.Wrapf(err, "unable to find extension definition %s", e.FullyQualifiedKebabName())
}
// Create an owner ref yaml snippet for this extension
ownerRef, err := yaml.Marshal(ExtensionOwnerRef(extension))
if err != nil {
return jenkinsv1.ExtensionExecution{}, "", err
}
// Add Global vars
envVars = append(envVars,
jenkinsv1.EnvironmentVariable{
Name: namespaceName(jenkinsv1.VersionGlobalParameterName),
Value: e.Version,
}, jenkinsv1.EnvironmentVariable{
Name: namespaceName(jenkinsv1.TeamNamespaceGlobalParameterName),
Value: teamNamespace,
},
jenkinsv1.EnvironmentVariable{
Name: namespaceName(jenkinsv1.OwnerReferenceGlobalParameterName),
Value: string(ownerRef),
},
)
res := jenkinsv1.ExtensionExecution{
Name: e.Name,
Namespace: e.Namespace,
UUID: e.UUID,
Description: e.Description,
Script: e.Script,
Given: e.Given,
EnvironmentVariables: envVars,
}
envVarsFormatted := new(bytes.Buffer)
for _, envVar := range envVars {
fmt.Fprintf(envVarsFormatted, "%s=%s, ", envVar.Name, envVar.Value)
}
return res, strings.TrimSuffix(envVarsFormatted.String(), ", "), err
}
func ExtensionOwnerRef(ext *jenkinsv1.Extension) metav1.OwnerReference {
controller := true
return metav1.OwnerReference{
APIVersion: "v1",
Kind: "Extension",
Name: ext.Name,
UID: ext.UID,
Controller: &controller,
}
}
func namespaceName(names ...string) string {
format := strings.TrimPrefix(strings.Repeat("_%s", len(names)), "_")
vars := make([]interface{}, 0)
for _, a := range names {
vars = append(vars, strings.ToUpper(strcase.SnakeCase(a)))
}
return fmt.Sprintf(format, vars...)
}