Skip to content

Commit 6bc9b1f

Browse files
change venona's image name on upgrade (#168)
* change venona's image name on upgrade * support upgrade and migration of env vars * add quote
1 parent dd99286 commit 6bc9b1f

File tree

10 files changed

+139
-26
lines changed

10 files changed

+139
-26
lines changed

venona/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.4.10
1+
1.4.11

venonactl/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.4.10
1+
1.4.11

venonactl/cmd/install-agent.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ limitations under the License.
1818

1919
import (
2020
"fmt"
21+
"strings"
2122

2223
"github.com/codefresh-io/venona/venonactl/pkg/logger"
2324
"github.com/codefresh-io/venona/venonactl/pkg/plugins"
@@ -41,6 +42,7 @@ var installAgentCmdOptions struct {
4142
agentID string
4243
kubernetesRunnerType bool
4344
tolerations string
45+
envVars string
4446
}
4547

4648
var installAgentCmd = &cobra.Command{
@@ -94,6 +96,14 @@ var installAgentCmd = &cobra.Command{
9496
s.Image.Tag = version
9597
s.Version.Current.Version = version
9698
}
99+
if installAgentCmdOptions.envVars != "" {
100+
s.AdditionalEnvVars = make(map[string]string)
101+
parts := strings.Split(installAgentCmdOptions.envVars, ",")
102+
for _, part := range parts {
103+
splited := strings.Split(part, "=")
104+
s.AdditionalEnvVars[splited[0]] = splited[1]
105+
}
106+
}
97107

98108
s.KubernetesAPI.NodeSelector = installAgentCmdOptions.kube.nodeSelector
99109

@@ -127,6 +137,7 @@ func init() {
127137
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.kube.context, "kube-context-name", viper.GetString("kube-context"), "Name of the kubernetes context on which venona should be installed (default is current-context) [$KUBE_CONTEXT]")
128138
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.kube.nodeSelector, "kube-node-selector", "", "The kubernetes node selector \"key=value\" to be used by venona resources (default is no node selector)")
129139
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.tolerations, "tolerations", "", "The kubernetes tolerations as JSON string to be used by venona resources (default is no tolerations)")
140+
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.envVars, "envVars", "", "More env vars to be declared \"key=value\"")
130141

131142
installAgentCmd.Flags().BoolVar(&installAgentCmdOptions.kube.inCluster, "in-cluster", false, "Set flag if venona is been installed from inside a cluster")
132143
installAgentCmd.Flags().BoolVar(&installAgentCmdOptions.dryRun, "dry-run", false, "Set to true to simulate installation")

venonactl/cmd/upgrade.go

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,55 @@ limitations under the License.
1717
*/
1818

1919
import (
20-
"os"
21-
20+
"github.com/codefresh-io/venona/venonactl/pkg/plugins"
21+
"github.com/codefresh-io/venona/venonactl/pkg/store"
2222
"github.com/spf13/cobra"
23+
"github.com/spf13/viper"
2324
)
2425

2526
var upgradeCmdOpt struct {
2627
kube struct {
27-
context string
28+
context string
29+
namespace string
2830
}
29-
dryRun bool
3031
}
3132

3233
// upgradeCmd represents the upgrade command
3334
var upgradeCmd = &cobra.Command{
34-
Use: "upgrade [name]",
35-
Short: "Upgrade existing runtime-environment",
35+
Use: "upgrade",
36+
Short: "Upgrade existing 1.X runner",
3637
Run: func(cmd *cobra.Command, args []string) {
3738
lgr := createLogger("Upgrade", true, logFormatter)
38-
lgr.Warn("Upgrade is not supported from version < 1.0.0 to version >= 1.x.x, please run the migration script: https://github.com/codefresh-io/venona/blob/master/scripts/migration.sh to upgrade to the latest version")
39-
os.Exit(0)
39+
builder := plugins.NewBuilder(lgr)
40+
builder.Add(plugins.VenonaPluginType)
41+
42+
s := store.GetStore()
43+
buildBasicStore(lgr)
44+
extendStoreWithKubeClient(lgr)
45+
extendStoreWithCodefershClient(lgr)
46+
extendStoreWithAgentAPI(lgr, "", "")
47+
fillKubernetesAPI(lgr, upgradeCmdOpt.kube.context, upgradeCmdOpt.kube.namespace, false)
48+
values := s.BuildValues()
49+
spn := createSpinner("Upgarding runtime (might take a few seconds)", "")
50+
spn.Start()
51+
defer spn.Stop()
52+
var err error
53+
for _, p := range builder.Get() {
54+
values, err = p.Upgrade(&plugins.UpgradeOptions{
55+
Name: s.AppName,
56+
ClusterNamespace: upgradeCmdOpt.kube.namespace,
57+
ClusterName: upgradeCmdOpt.kube.namespace,
58+
KubeBuilder: getKubeClientBuilder(upgradeCmdOpt.kube.context, upgradeCmdOpt.kube.namespace, s.KubernetesAPI.ConfigPath, s.KubernetesAPI.InCluster),
59+
}, values)
60+
if err != nil {
61+
dieOnError(err)
62+
}
63+
}
4064
},
4165
}
4266

4367
func init() {
4468
rootCmd.AddCommand(upgradeCmd)
4569
upgradeCmd.Flags().StringVar(&upgradeCmdOpt.kube.context, "kube-context-name", "", "Set name to overwrite the context name saved in Codefresh")
46-
upgradeCmd.Flags().BoolVar(&upgradeCmdOpt.dryRun, "dry-run", false, "Set to to actually upgrade the kubernetes components")
70+
upgradeCmd.Flags().StringVar(&upgradeCmdOpt.kube.namespace, "kube-namespace", viper.GetString("kube-namespace"), "Name of the namespace on which venona is installed [$KUBE_NAMESPACE]")
4771
}

venonactl/pkg/plugins/helper.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"strings"
2626

2727
// import all cloud providers auth clients
28+
"gopkg.in/yaml.v2"
2829
authv1 "k8s.io/api/authorization/v1"
2930
v1 "k8s.io/api/core/v1"
3031
"k8s.io/client-go/kubernetes"
@@ -87,6 +88,26 @@ func nodeSelectorParamToYaml(ns string) string {
8788
return nodeSelectorYaml
8889
}
8990

91+
func nodeSelectorToString(nodeSelectors map[string]string) string {
92+
str := ""
93+
for key, value := range nodeSelectors {
94+
95+
//str = strings.Join([]string {str, fmt.Sprintf("%s=%s", key, value)} , ",")
96+
str = fmt.Sprintf("%s,%s=%s", str, key, value)
97+
98+
}
99+
return strings.TrimPrefix(str, ",")
100+
}
101+
func tolerationsToSring(tolerations []v1.Toleration) string {
102+
// [{\"effect\":\"NoSchedule\",\"key\":\"dedicated\",\"value\":\"codefresh\"},{\"effect\":\"NoSchedule\",\"key\":\"dedicated\",\"value\":\"codefresh\"}]
103+
y, err := yaml.Marshal(&tolerations)
104+
if err != nil {
105+
return ""
106+
}
107+
return fmt.Sprintf("\n%s", string(y))
108+
109+
}
110+
90111
// ExecuteTemplate - executes templates in tpl str with config as values
91112
func ExecuteTemplate(tplStr string, data interface{}) (string, error) {
92113
funcMap := template.FuncMap{

venonactl/pkg/plugins/plugin.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,12 @@ type (
9090
}
9191

9292
UpgradeOptions struct {
93-
CodefreshHost string
94-
CodefreshToken string
9593
ClusterName string
9694
ClusterNamespace string
9795
Name string
9896
KubeBuilder interface {
9997
BuildClient() (*kubernetes.Clientset, error)
10098
}
101-
DryRun bool
10299
}
103100

104101
MigrateOptions struct {

venonactl/pkg/plugins/venona.go

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
v1 "k8s.io/api/core/v1"
3131
kerrors "k8s.io/apimachinery/pkg/api/errors"
3232
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
33+
"k8s.io/client-go/kubernetes"
3334
)
3435

3536
// venonaPlugin installs assets on Kubernetes Dind runtimectl Env
@@ -40,7 +41,7 @@ type venonaPlugin struct {
4041
type migrationData struct {
4142
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
4243
Tolerations []v1.Toleration `json:"tolerations,omitempty"`
43-
Env []v1.EnvVar
44+
Env map[string]string `json:"env,omitempty"`
4445
}
4546

4647
const (
@@ -168,6 +169,7 @@ func (u *venonaPlugin) Upgrade(opt *UpgradeOptions, v Values) (Values, error) {
168169
if err != nil {
169170
return nil, err
170171
}
172+
v, err = updateValuesBasedOnPreviousDeployment(opt.ClusterNamespace, kubeClientset, v)
171173

172174
for fileName, local := range kubeObjects {
173175
if _, ok := deletePriorUpgrade[fileName]; ok {
@@ -192,7 +194,6 @@ func (u *venonaPlugin) Upgrade(opt *UpgradeOptions, v Values) (Values, error) {
192194
kubeClientSet: kubeClientset,
193195
namespace: opt.ClusterNamespace,
194196
matchPattern: fileName,
195-
dryRun: opt.DryRun,
196197
operatorType: VenonaPluginType,
197198
}
198199
err = install(installOpt)
@@ -215,6 +216,50 @@ func (u *venonaPlugin) Upgrade(opt *UpgradeOptions, v Values) (Values, error) {
215216
return v, nil
216217
}
217218

219+
func updateValuesBasedOnPreviousDeployment(ns string, kubeClientset *kubernetes.Clientset, v Values) (Values, error) {
220+
221+
runnerDeployment, err := kubeClientset.AppsV1().Deployments(ns).Get(AppName, metav1.GetOptions{})
222+
if err != nil {
223+
return nil, err
224+
}
225+
// Update the values with existing deployment values
226+
if runnerDeployment.Spec.Template.Spec.NodeSelector != nil {
227+
228+
}
229+
if runnerDeployment.Spec.Template.Spec.NodeSelector != nil {
230+
v["NodeSelector"] = nodeSelectorToString(runnerDeployment.Spec.Template.Spec.NodeSelector)
231+
}
232+
if runnerDeployment.Spec.Template.Spec.Tolerations != nil {
233+
v["Tolerations"] = tolerationsToSring(runnerDeployment.Spec.Template.Spec.Tolerations)
234+
}
235+
236+
v["AdditionalEnvVars"] = getEnvVarsFromDeployment(runnerDeployment.Spec.Template.Spec.Containers)
237+
return v, nil
238+
239+
}
240+
241+
func getEnvVarsFromDeployment(containers []v1.Container) map[string]string {
242+
// Get env for containers
243+
preDefinedEnvVars := map[string]interface{}{}
244+
newEnvVars := map[string]string{}
245+
preDefinedEnvVars["SELF_DEPLOYMENT_NAME"] = "SELF_DEPLOYMENT_NAME"
246+
preDefinedEnvVars["CODEFRESH_TOKEN"] = "CODEFRESH_TOKEN"
247+
preDefinedEnvVars["CODEFRESH_HOST"] = "CODEFRESH_HOST"
248+
preDefinedEnvVars["AGENT_MODE"] = "AGENT_MODE"
249+
preDefinedEnvVars["AGENT_NAME"] = "AGENT_NAME"
250+
preDefinedEnvVars["AGENT_ID"] = "AGENT_ID"
251+
preDefinedEnvVars["VENONA_CONFIG_DIR"] = "VENONA_CONFIG_DIR"
252+
253+
for _, container := range containers {
254+
for _, envVar := range container.Env {
255+
if preDefinedEnvVars[envVar.Name] == nil {
256+
newEnvVars[envVar.Name] = envVar.Value
257+
}
258+
}
259+
}
260+
return newEnvVars
261+
}
262+
218263
func (u *venonaPlugin) Migrate(opt *MigrateOptions, v Values) error {
219264
var deletePriorUpgrade = map[string]interface{}{
220265
"deployment.venona.yaml": nil,
@@ -242,7 +287,7 @@ func (u *venonaPlugin) Migrate(opt *MigrateOptions, v Values) error {
242287
migrationData := migrationData{
243288
Tolerations: list.Items[0].Spec.Tolerations,
244289
NodeSelector: list.Items[0].Spec.NodeSelector,
245-
Env: list.Items[0].Spec.Containers[0].Env,
290+
Env: getEnvVarsFromDeployment(list.Items[0].Spec.Containers),
246291
}
247292
var jsonData []byte
248293
jsonData, err = json.Marshal(migrationData)

venonactl/pkg/store/store.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ type (
4747

4848
// need for define if monitor use cluster role or just role
4949
UseNamespaceWithRole bool
50+
51+
AdditionalEnvVars map[string]string
5052
}
5153

5254
KubernetesAPI struct {
@@ -106,13 +108,14 @@ func (s *Values) BuildValues() map[string]interface{} {
106108
"Name": "codefresh/venona",
107109
"Tag": s.Version.Current.Version,
108110
},
109-
"Namespace": s.KubernetesAPI.Namespace,
110-
"ConfigPath": s.KubernetesAPI.ConfigPath,
111-
"Context": s.KubernetesAPI.ContextName,
112-
"NodeSelector": s.KubernetesAPI.NodeSelector,
113-
"Tolerations": s.KubernetesAPI.Tolerations,
114-
"AgentToken": s.AgentAPI.Token,
115-
"AgentId": s.AgentAPI.Id,
111+
"AdditionalEnvVars": s.AdditionalEnvVars,
112+
"Namespace": s.KubernetesAPI.Namespace,
113+
"ConfigPath": s.KubernetesAPI.ConfigPath,
114+
"Context": s.KubernetesAPI.ContextName,
115+
"NodeSelector": s.KubernetesAPI.NodeSelector,
116+
"Tolerations": s.KubernetesAPI.Tolerations,
117+
"AgentToken": s.AgentAPI.Token,
118+
"AgentId": s.AgentAPI.Id,
116119
"ServerCert": map[string]string{
117120
"Cert": "",
118121
"Key": "",

venonactl/pkg/templates/kubernetes/deployment.venona.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ spec:
3838
{{ end }}
3939
containers:
4040
- env:
41+
{{- if $.AdditionalEnvVars }}
42+
{{- range $key, $value := $.AdditionalEnvVars }}
43+
- name: {{ $key }}
44+
value: "{{ $value}}"
45+
{{- end}}
46+
{{- end}}
4147
- name: SELF_DEPLOYMENT_NAME
4248
valueFrom:
4349
fieldRef:
@@ -53,7 +59,7 @@ spec:
5359
value: {{ .Mode }}
5460
- name: AGENT_NAME
5561
value: {{ .AppName }}
56-
- name: AGENT_ID
62+
- name: "AGENT_ID"
5763
value: {{ .AgentId }}
5864
- name: VENONA_CONFIG_DIR
5965
value: "/etc/secrets"

venonactl/pkg/templates/kubernetes/templates.go

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)