Skip to content

Commit aeaaec7

Browse files
fixing runtime attach to support kubernetes 1.24 (#315)
* fixing runtime attach to support kubernetes 1.24 * updating chart
1 parent 7dae4cf commit aeaaec7

File tree

9 files changed

+86
-30
lines changed

9 files changed

+86
-30
lines changed

.deploy/cf-runtime/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ apiVersion: v2
22
name: cf-runtime
33
description: A Helm chart for Codefresh Runner
44
type: application
5-
version: 1.7.9
6-
appVersion: "1.7.9"
5+
version: 1.8.0
6+
appVersion: "1.8.0"

.deploy/cf-runtime/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dockerRegistry: "quay.io" # Registry prefix for the runtime images (default quay
2424
newRelicLicense: "" # NEWRELIC_LICENSE_KEY (for app-proxy and runner deployments)
2525

2626
runner: # Runner Deployment
27-
image: "codefresh/venona:1.7.8"
27+
image: "codefresh/venona:1.8.0"
2828
env: {}
2929
## e.g:
3030
# env:

venona/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.7.9
1+
1.8.0

venonactl/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.7.9
1+
1.8.0

venonactl/cmd/attach.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ var attachRuntimeCmd = &cobra.Command{
105105
ClusterNamespace: attachRuntimeCmdOptions.kubeVenona.namespace,
106106
ClusterHost: attachRuntimeCmdOptions.kube.host,
107107
RuntimeEnvironment: attachRuntimeCmdOptions.runtimeEnvironmentName,
108-
RuntimeClusterName: attachRuntimeCmdOptions.kube.namespace,
108+
RuntimeNamespace: attachRuntimeCmdOptions.kube.namespace,
109109
RuntimeServiceAccount: attachRuntimeCmdOptions.kube.serviceAccount,
110110
RestartAgent: attachRuntimeCmdOptions.restartAgent,
111111
DryRun: attachRuntimeCmdOptions.dryRun,
@@ -146,6 +146,8 @@ func init() {
146146
viper.BindEnv("kube-namespace", "KUBE_NAMESPACE")
147147
viper.BindEnv("kube-context", "KUBE_CONTEXT")
148148

149+
viper.SetDefault("kube-namespace", "default")
150+
149151
attachRuntimeCmd.Flags().StringVar(&attachRuntimeCmdOptions.kube.host, "kube-host", viper.GetString("kube-host"), "overrides the address of the api-server the runner will use")
150152
attachRuntimeCmd.Flags().StringVar(&attachRuntimeCmdOptions.kube.namespace, "kube-namespace", viper.GetString("kube-namespace"), "Name of the namespace on which venona should be installed [$KUBE_NAMESPACE]")
151153
attachRuntimeCmd.Flags().StringVar(&attachRuntimeCmdOptions.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]")

venonactl/cmd/install-agent.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ func init() {
184184

185185
viper.BindEnv("kube-namespace", "KUBE_NAMESPACE")
186186
viper.BindEnv("kube-context", "KUBE_CONTEXT")
187+
188+
viper.SetDefault("kube-namespace", "default")
189+
187190
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.agentToken, "agentToken", "", "Agent token created by codefresh")
188191
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.agentID, "agentId", "", "Agent id created by codefresh")
189192
installAgentCmd.Flags().StringVar(&installAgentCmdOptions.venona.version, "venona-version", "", "Version of venona to install (default is the latest)")

venonactl/cmd/install-runtime.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ func init() {
176176
viper.BindEnv("kube-namespace", "KUBE_NAMESPACE")
177177
viper.BindEnv("kube-context", "KUBE_CONTEXT")
178178

179+
viper.SetDefault("kube-namespace", "default")
180+
179181
installRuntimeCmd.Flags().StringVar(&installRuntimeCmdOptions.codefreshToken, "codefreshToken", "", "Codefresh token")
180182
installRuntimeCmd.Flags().StringVar(&installRuntimeCmdOptions.runtimeEnvironmentName, "runtimeName", viper.GetString("runtimeName"), "Name of the runtime as in codefresh")
181183
installRuntimeCmd.Flags().StringVar(&installRuntimeCmdOptions.kube.namespace, "kube-namespace", viper.GetString("kube-namespace"), "Name of the namespace on which venona should be installed [$KUBE_NAMESPACE]")

venonactl/pkg/plugins/plugin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ type (
7777
BuildNodeSelector map[string]string
7878
Annotations map[string]string
7979
RuntimeEnvironment string
80-
RuntimeClusterName string
80+
RuntimeNamespace string
8181
RuntimeServiceAccount string
8282
RestartAgent bool
8383
Insecure bool

venonactl/pkg/plugins/runtime-attach.go

Lines changed: 72 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ import (
1010
"github.com/codefresh-io/venona/venonactl/pkg/logger"
1111
templates "github.com/codefresh-io/venona/venonactl/pkg/templates/kubernetes"
1212
"gopkg.in/yaml.v2"
13+
v1 "k8s.io/api/core/v1"
1314
kerrors "k8s.io/apimachinery/pkg/api/errors"
1415
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
"k8s.io/apimachinery/pkg/types"
17+
"k8s.io/client-go/kubernetes"
1518
)
1619

1720
type runtimeAttachPlugin struct {
@@ -35,8 +38,7 @@ const (
3538
runtimeSecretName = "runnerconf"
3639
)
3740

38-
func buildRuntimeConfig(ctx context.Context, opt *InstallOptions, v Values) (RuntimeConfiguration, error) {
39-
41+
func (u *runtimeAttachPlugin) buildRuntimeConfig(ctx context.Context, opt *InstallOptions, v Values) (RuntimeConfiguration, error) {
4042
config, err := opt.KubeBuilder.BuildConfig()
4143
if err != nil {
4244
return RuntimeConfiguration{}, fmt.Errorf("Failed to get client config on runtime cluster: %v", err)
@@ -51,27 +53,10 @@ func buildRuntimeConfig(ctx context.Context, opt *InstallOptions, v Values) (Run
5153
return RuntimeConfiguration{}, fmt.Errorf("Failed to ensure namespace on runtime cluster: %v", err)
5254
}
5355

54-
// get default service account for the namespace
55-
var getOpt metav1.GetOptions
56-
sa, err := cs.CoreV1().ServiceAccounts(opt.RuntimeClusterName).Get(ctx, opt.RuntimeServiceAccount, getOpt)
56+
secret, err := u.generateServiceAccountSecret(ctx, cs, opt.RuntimeNamespace, opt.RuntimeServiceAccount)
5757
if err != nil {
58-
return RuntimeConfiguration{}, fmt.Errorf("Failed to read service account runtime cluster: %v", err)
59-
}
60-
61-
var saSecretName string
62-
saSecretPattern := fmt.Sprintf("%s-token-", opt.RuntimeServiceAccount)
63-
for _, secretRef := range sa.Secrets {
64-
if strings.Contains(secretRef.Name, saSecretPattern) {
65-
saSecretName = secretRef.Name
66-
break
67-
}
68-
}
69-
if saSecretName == "" {
70-
return RuntimeConfiguration{}, fmt.Errorf("Failed to get secret %s from service account %s", saSecretPattern, opt.RuntimeServiceAccount)
71-
}
72-
secret, err := cs.CoreV1().Secrets(opt.RuntimeClusterName).Get(ctx, saSecretName, getOpt)
73-
if err != nil {
74-
return RuntimeConfiguration{}, fmt.Errorf("Failed to get secret from service account on runtime cluster: %v", err)
58+
return RuntimeConfiguration{}, fmt.Errorf("Failed to get secret from service account %s on runtime cluster: %v",
59+
opt.RuntimeServiceAccount, err)
7560
}
7661

7762
crt := secret.Data["ca.crt"]
@@ -93,13 +78,77 @@ func buildRuntimeConfig(ctx context.Context, opt *InstallOptions, v Values) (Run
9378
return rc, nil
9479
}
9580

81+
func (u *runtimeAttachPlugin) generateServiceAccountSecret(ctx context.Context, client kubernetes.Interface, namespace, saName string) (*v1.Secret, error) {
82+
secret := &v1.Secret{
83+
ObjectMeta: metav1.ObjectMeta{
84+
GenerateName: fmt.Sprintf("%s-token-", saName),
85+
Annotations: map[string]string{
86+
"kubernetes.io/service-account.name": saName,
87+
},
88+
},
89+
Type: v1.SecretTypeServiceAccountToken,
90+
}
91+
92+
u.logger.Debug("Creating secret for service-account token", "service-account", saName)
93+
94+
secret, err := client.CoreV1().Secrets(namespace).Create(ctx, secret, metav1.CreateOptions{})
95+
if err != nil {
96+
return nil, fmt.Errorf("failed to create service-account token secret: %w", err)
97+
}
98+
secretName := secret.Name
99+
100+
u.logger.Debug("Created secret for service-account token", "service-account", saName, "secret", secret.Name)
101+
102+
patch := []byte(fmt.Sprintf("{\"secrets\": [{\"name\": \"%s\"}]}", secretName))
103+
_, err = client.CoreV1().ServiceAccounts(namespace).Patch(ctx, saName, types.StrategicMergePatchType, patch, metav1.PatchOptions{})
104+
if err != nil {
105+
return nil, fmt.Errorf("failed to patch service-account with new secret: %w", err)
106+
}
107+
108+
u.logger.Debug("Added secret to service-account secrets", "service-account", saName, "secret", secret.Name)
109+
110+
// try to read the token from the secret
111+
ticker := time.NewTicker(time.Second)
112+
retries := 15
113+
defer ticker.Stop()
114+
115+
for try := 0; try < retries; try++ {
116+
select {
117+
case <-ticker.C:
118+
secret, err = client.CoreV1().Secrets(namespace).Get(ctx, secretName, metav1.GetOptions{})
119+
case <-ctx.Done():
120+
return nil, ctx.Err()
121+
}
122+
123+
u.logger.Debug("Checking secret for service-account token", "service-account", saName, "secret", secret.Name)
124+
125+
if err != nil {
126+
return nil, fmt.Errorf("failed to get service-account secret: %w", err)
127+
}
128+
129+
if secret.Data == nil || len(secret.Data["token"]) == 0 {
130+
u.logger.Debug("Secret is missing service-account token", "service-account", saName, "secret", secret.Name)
131+
continue
132+
}
133+
134+
u.logger.Debug("Got service-account token from secret", "service-account", saName, "secret", secret.Name)
135+
136+
return secret, nil
137+
}
138+
139+
return nil, fmt.Errorf("timed out waiting for secret to contain token")
140+
}
141+
96142
func readCurrentVenonaConf(ctx context.Context, agentKubeBuilder KubeClientBuilder, clusterNamespace string) (venonaConf, error) {
97143

98144
cs, err := agentKubeBuilder.BuildClient()
99145
if err != nil {
100146
return venonaConf{}, fmt.Errorf("Failed to create client on venona cluster: %v", err)
101147
}
102148
secret, err := cs.CoreV1().Secrets(clusterNamespace).Get(ctx, runtimeSecretName, metav1.GetOptions{})
149+
if err != nil {
150+
return venonaConf{}, fmt.Errorf("Failed to get %s secret: %v", runtimeSecretName, err)
151+
}
103152

104153
conf := &venonaConf{
105154
Runtimes: make(map[string]RuntimeConfiguration),
@@ -138,7 +187,7 @@ func (u *runtimeAttachPlugin) Install(ctx context.Context, opt *InstallOptions,
138187
}
139188

140189
// new runtime configuration
141-
rc, err := buildRuntimeConfig(ctx, opt, v)
190+
rc, err := u.buildRuntimeConfig(ctx, opt, v)
142191
if err != nil {
143192
return nil, err
144193
}

0 commit comments

Comments
 (0)