Skip to content

Commit e0c29cd

Browse files
authored
Support kubevirt evection strategy in kv provider (#1897)
* support evictStrategy in VMs Signed-off-by: moadqassem <[email protected]> Signed-off-by: moadqassem <[email protected]> * add tests Signed-off-by: moadqassem <[email protected]> Signed-off-by: moadqassem <[email protected]> --------- Signed-off-by: moadqassem <[email protected]>
1 parent cb06308 commit e0c29cd

File tree

4 files changed

+104
-0
lines changed

4 files changed

+104
-0
lines changed

pkg/cloudprovider/provider/kubevirt/provider.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ type Config struct {
117117
ExtraHeaders []string
118118
ExtraHeadersSecretRef string
119119
DataVolumeSecretRef string
120+
EvictionStrategy kubevirtv1.EvictionStrategy
120121

121122
ProviderNetworkName string
122123
SubnetName string
@@ -366,6 +367,10 @@ func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *p
366367
}
367368
}
368369

370+
if rawConfig.VirtualMachine.EvictionStrategy != "" {
371+
config.EvictionStrategy = kubevirtv1.EvictionStrategy(rawConfig.VirtualMachine.EvictionStrategy)
372+
}
373+
369374
return &config, pconfig, nil
370375
}
371376

@@ -635,6 +640,13 @@ func (p *provider) Validate(ctx context.Context, _ *zap.SugaredLogger, spec clus
635640
return fmt.Errorf("failed to request VirtualMachineInstances: %w", err)
636641
}
637642

643+
if c.EvictionStrategy != "" {
644+
if c.EvictionStrategy != kubevirtv1.EvictionStrategyExternal &&
645+
c.EvictionStrategy != kubevirtv1.EvictionStrategyLiveMigrate {
646+
return fmt.Errorf("unsupported vm eviction strategy: %s", c.EvictionStrategy)
647+
}
648+
}
649+
638650
return nil
639651
}
640652

@@ -729,6 +741,9 @@ func (p *provider) newVirtualMachine(c *Config, pc *providerconfigtypes.Config,
729741
terminationGracePeriodSeconds := int64(30)
730742

731743
evictionStrategy := kubevirtv1.EvictionStrategyExternal
744+
if c.EvictionStrategy != "" {
745+
evictionStrategy = c.EvictionStrategy
746+
}
732747

733748
resourceRequirements := kubevirtv1.ResourceRequirements{}
734749
labels["kubevirt.io/vm"] = machine.Name

pkg/cloudprovider/provider/kubevirt/provider_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ type kubevirtProviderSpecConf struct {
7171
PullMethod cdiv1beta1.RegistryPullMethod
7272
ProviderNetwork *types.ProviderNetwork
7373
ExtraHeadersSet bool
74+
EvictStrategy string
7475
}
7576

7677
func (k kubevirtProviderSpecConf) rawProviderSpec(t *testing.T) []byte {
@@ -104,6 +105,9 @@ func (k kubevirtProviderSpecConf) rawProviderSpec(t *testing.T) []byte {
104105
},
105106
{{- end }}
106107
"virtualMachine": {
108+
{{- if .EvictStrategy }}
109+
"evictionStrategy": "LiveMigrate",
110+
{{- end }}
107111
{{- if .ProviderNetwork }}
108112
"providerNetwork": {
109113
"name": "kubeovn",
@@ -275,6 +279,10 @@ func TestNewVirtualMachine(t *testing.T) {
275279
name: "pvc-image-source",
276280
specConf: kubevirtProviderSpecConf{OsImageSource: pvcSource, OsImageDV: "ns/dvname"},
277281
},
282+
{
283+
name: "eviction-strategy-live-migrate",
284+
specConf: kubevirtProviderSpecConf{EvictStrategy: "LiveMigrate"},
285+
},
278286
}
279287
for _, tt := range tests {
280288
t.Run(tt.name, func(t *testing.T) {
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
apiVersion: kubevirt.io/v1
2+
kind: VirtualMachine
3+
metadata:
4+
annotations:
5+
labels:
6+
cluster.x-k8s.io/cluster-name: cluster-name
7+
cluster.x-k8s.io/role: worker
8+
kubevirt.io/vm: eviction-strategy-live-migrate
9+
md: md-name
10+
name: eviction-strategy-live-migrate
11+
namespace: test-namespace
12+
spec:
13+
dataVolumeTemplates:
14+
- metadata:
15+
name: eviction-strategy-live-migrate
16+
spec:
17+
storage:
18+
accessModes:
19+
- ReadWriteMany
20+
resources:
21+
requests:
22+
storage: 10Gi
23+
storageClassName: longhorn
24+
source:
25+
http:
26+
url: http://x.y.z.t/ubuntu.img
27+
runStrategy: Once
28+
template:
29+
metadata:
30+
creationTimestamp: null
31+
annotations:
32+
"kubevirt.io/allow-pod-bridge-network-live-migration": "true"
33+
"ovn.kubernetes.io/allow_live_migration": "true"
34+
labels:
35+
cluster.x-k8s.io/cluster-name: cluster-name
36+
cluster.x-k8s.io/role: worker
37+
kubevirt.io/vm: eviction-strategy-live-migrate
38+
md: md-name
39+
spec:
40+
affinity: {}
41+
domain:
42+
devices:
43+
disks:
44+
- disk:
45+
bus: virtio
46+
name: datavolumedisk
47+
- disk:
48+
bus: virtio
49+
name: cloudinitdisk
50+
interfaces:
51+
- name: default
52+
bridge: {}
53+
networkInterfaceMultiqueue: true
54+
resources:
55+
limits:
56+
cpu: "2"
57+
memory: 2Gi
58+
requests:
59+
cpu: "2"
60+
memory: 2Gi
61+
networks:
62+
- name: default
63+
pod: {}
64+
terminationGracePeriodSeconds: 30
65+
topologyspreadconstraints:
66+
- maxskew: 1
67+
topologykey: kubernetes.io/hostname
68+
whenunsatisfiable: ScheduleAnyway
69+
labelselector:
70+
matchlabels:
71+
md: md-name
72+
volumes:
73+
- dataVolume:
74+
name: eviction-strategy-live-migrate
75+
name: datavolumedisk
76+
- cloudInitNoCloud:
77+
secretRef:
78+
name: udsn
79+
name: cloudinitdisk
80+
evictionStrategy: LiveMigrate

pkg/cloudprovider/provider/kubevirt/types/types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ type VirtualMachine struct {
5959
Location *Location `json:"location,omitempty"`
6060
ProviderNetwork *ProviderNetwork `json:"providerNetwork,omitempty"`
6161
EnableNetworkMultiQueue providerconfigtypes.ConfigVarBool `json:"enableNetworkMultiQueue,omitempty"`
62+
EvictionStrategy string `json:"evictionStrategy,omitempty"`
6263
}
6364

6465
// Flavor.

0 commit comments

Comments
 (0)