Skip to content

Commit 2322ab4

Browse files
authored
[release/v1.45] Refactor handling of kubeconfig for kubevirt (#1358)
* Refactor handling of kubeconfig for kubevirt Signed-off-by: Marcin Franczyk <[email protected]> * fix test KubeVirt MachineDeployment object change storage class to longhorn and remove hardcoded KubeVirt registry IP Signed-off-by: Marcin Franczyk <[email protected]>
1 parent b44997c commit 2322ab4

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

pkg/cloudprovider/provider/kubevirt/provider.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package kubevirt
1818

1919
import (
2020
"context"
21+
"encoding/base64"
2122
"errors"
2223
"fmt"
2324
"strconv"
@@ -135,9 +136,34 @@ func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *p
135136
}
136137

137138
config := Config{}
138-
config.Kubeconfig, err = p.configVarResolver.GetConfigVarStringValueOrEnv(rawConfig.Kubeconfig, "KUBEVIRT_KUBECONFIG")
139+
140+
// Kubeconfig was specified directly in the Machine/MachineDeployment CR. In this case we need to ensure that the value is base64 encoded.
141+
if rawConfig.Kubeconfig.Value != "" {
142+
val, err := base64.StdEncoding.DecodeString(rawConfig.Kubeconfig.Value)
143+
if err != nil {
144+
// An error here means that this is not a valid base64 string
145+
// We can be more explicit here with the error for visibility. Webhook will return this error if we hit this scenario.
146+
return nil, nil, fmt.Errorf("failed to decode base64 encoded kubeconfig. Expected value is a base64 encoded Kubeconfig in JSON or YAML format: %w", err)
147+
}
148+
config.Kubeconfig = string(val)
149+
} else {
150+
// Environment variable or secret reference was used for providing the value of kubeconfig
151+
// We have to be lenient in this case and allow unencoded values as well.
152+
config.Kubeconfig, err = p.configVarResolver.GetConfigVarStringValueOrEnv(rawConfig.Kubeconfig, "KUBEVIRT_KUBECONFIG")
153+
if err != nil {
154+
return nil, nil, fmt.Errorf(`failed to get value of "kubeconfig" field: %w`, err)
155+
}
156+
val, err := base64.StdEncoding.DecodeString(config.Kubeconfig)
157+
// We intentionally ignore errors here with an assumption that an unencoded YAML or JSON must have been passed on
158+
// in this case.
159+
if err == nil {
160+
config.Kubeconfig = string(val)
161+
}
162+
}
163+
164+
config.RestConfig, err = clientcmd.RESTConfigFromKubeConfig([]byte(config.Kubeconfig))
139165
if err != nil {
140-
return nil, nil, fmt.Errorf(`failed to get value of "kubeconfig" field: %v`, err)
166+
return nil, nil, fmt.Errorf("failed to decode kubeconfig: %w", err)
141167
}
142168
config.CPUs, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.CPUs)
143169
if err != nil {
@@ -166,10 +192,6 @@ func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *p
166192
if err != nil {
167193
return nil, nil, fmt.Errorf(`failed to get value of "storageClassName" field: %v`, err)
168194
}
169-
config.RestConfig, err = clientcmd.RESTConfigFromKubeConfig([]byte(config.Kubeconfig))
170-
if err != nil {
171-
return nil, nil, fmt.Errorf("failed to decode kubeconfig: %v", err)
172-
}
173195

174196
dnsPolicyString, err := p.configVarResolver.GetConfigVarStringValue(rawConfig.DNSPolicy)
175197
if err != nil {

test/e2e/provisioning/testdata/machinedeployment-kubevirt.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ spec:
2626
- "<< YOUR_PUBLIC_KEY >>"
2727
cloudProvider: "kubevirt"
2828
cloudProviderSpec:
29-
storageClassName: local-path
29+
storageClassName: longhorn
3030
pvcSize: "10Gi"
31-
sourceURL: http://10.107.208.71/<< OS_NAME >>.img
31+
sourceURL: http://image-repo.kube-system.svc.cluster.local/images/<< OS_NAME >>.img
3232
cpus: "1"
3333
memory: "4096M"
3434
dnsPolicy: "None"

0 commit comments

Comments
 (0)