1 package mapper
2
3 import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7 corev1 "k8s.io/api/core/v1"
8 kr "k8s.io/apimachinery/pkg/api/resource"
9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10 virtv1 "kubevirt.io/api/core/v1"
11 virtbeta "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1"
12
13 "edge-infra.dev/pkg/edge/api/graph/model"
14 )
15
16 var (
17 virtualMachineID = "fa9c24ac-f280-498b-bf98-a2af101fba23"
18 virtualMachineHostname = "ien-asdfghjkl"
19 )
20
21 func TestVirtualMachineToKubeVirtualMachine(t *testing.T) {
22 virtualMachine := createGenericVirtualMachine()
23 disks := virtualMachine.Disks
24 assert.NotNil(t, disks)
25 memoryQuantity, err := kr.ParseQuantity(virtualMachine.Memory)
26 assert.NoError(t, err)
27
28 sizeQuantity1, err := kr.ParseQuantity(disks[0].Size)
29 assert.NoError(t, err)
30 sizeQuantity2, err := kr.ParseQuantity(disks[1].Size)
31 assert.NoError(t, err)
32 bootOrders := []uint{uint(disks[0].BootOrder), uint(disks[1].BootOrder)}
33 volumeNames := []string{"ien-asdfghjkl-c65c92ef-6109-4814-a1e7-ddb8db64b7d9", "ien-asdfghjkl-e782f667-b50d-4044-9421-99b5c71c28ee"}
34 pullMethod := virtbeta.RegistryPullNode
35
36 expectedKubeVM := virtv1.VirtualMachine{
37 TypeMeta: metav1.TypeMeta{
38 Kind: "VirtualMachine",
39 APIVersion: "kubevirt.io/v1",
40 },
41 ObjectMeta: metav1.ObjectMeta{
42 Name: virtualMachine.Hostname,
43 Namespace: virtualMachine.Namespace,
44 Annotations: map[string]string{
45 "linkerd.io/inject": "disabled",
46 },
47 },
48 Spec: virtv1.VirtualMachineSpec{
49 Running: &virtualMachine.TargetPowerState,
50 Template: &virtv1.VirtualMachineInstanceTemplateSpec{
51 ObjectMeta: metav1.ObjectMeta{
52 Labels: map[string]string{
53 "kubevirt.io/domain": virtualMachine.Hostname,
54 },
55 Annotations: map[string]string{
56 "linkerd.io/inject": "disabled",
57 },
58 },
59 Spec: virtv1.VirtualMachineInstanceSpec{
60 Domain: virtv1.DomainSpec{
61 CPU: &virtv1.CPU{
62 Cores: uint32(virtualMachine.Cpus),
63 },
64 Memory: &virtv1.Memory{
65 Guest: &memoryQuantity,
66 },
67 Devices: virtv1.Devices{
68 ClientPassthrough: &virtv1.ClientPassthroughDevices{},
69 Disks: []virtv1.Disk{
70 {
71 Name: volumeNames[0],
72 DiskDevice: virtv1.DiskDevice{
73 CDRom: &virtv1.CDRomTarget{
74 Bus: virtv1.DiskBusSATA,
75 },
76 },
77 BootOrder: &bootOrders[0],
78 },
79 {
80 Name: volumeNames[1],
81 DiskDevice: virtv1.DiskDevice{
82 Disk: &virtv1.DiskTarget{
83 Bus: virtv1.DiskBusVirtio,
84 },
85 },
86 BootOrder: &bootOrders[1],
87 },
88 },
89 Interfaces: []virtv1.Interface{
90 {
91 Model: "e1000",
92 Name: "default",
93 InterfaceBindingMethod: virtv1.InterfaceBindingMethod{
94 Masquerade: &virtv1.InterfaceMasquerade{},
95 },
96 },
97 },
98 },
99 Machine: &virtv1.Machine{
100 Type: "i440fx",
101 },
102 },
103 Networks: []virtv1.Network{
104 {
105 Name: "default",
106 NetworkSource: virtv1.NetworkSource{
107 Pod: &virtv1.PodNetwork{},
108 },
109 },
110 },
111 Volumes: []virtv1.Volume{
112 {
113 Name: volumeNames[0],
114 VolumeSource: virtv1.VolumeSource{
115 DataVolume: &virtv1.DataVolumeSource{
116 Name: volumeNames[0],
117 },
118 },
119 },
120 {
121 Name: volumeNames[1],
122 VolumeSource: virtv1.VolumeSource{
123 DataVolume: &virtv1.DataVolumeSource{
124 Name: volumeNames[1],
125 },
126 },
127 },
128 },
129 Affinity: &corev1.Affinity{
130 NodeAffinity: &corev1.NodeAffinity{
131 RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
132 NodeSelectorTerms: []corev1.NodeSelectorTerm{
133 {
134 MatchExpressions: []corev1.NodeSelectorRequirement{
135 {
136 Key: "node.ncr.com/class",
137 Operator: corev1.NodeSelectorOpIn,
138 Values: []string{
139 "touchpoint",
140 },
141 },
142 },
143 },
144 },
145 },
146 },
147 },
148 },
149 },
150 DataVolumeTemplates: []virtv1.DataVolumeTemplateSpec{
151 {
152 ObjectMeta: metav1.ObjectMeta{
153 Name: volumeNames[0],
154 Annotations: map[string]string{
155 "linkerd.io/inject": "disabled",
156 },
157 },
158 Spec: virtbeta.DataVolumeSpec{
159 PVC: &corev1.PersistentVolumeClaimSpec{
160 AccessModes: []corev1.PersistentVolumeAccessMode{
161 corev1.ReadWriteOnce,
162 },
163 StorageClassName: &storageTypeVM,
164 Resources: corev1.VolumeResourceRequirements{
165 Requests: map[corev1.ResourceName]kr.Quantity{
166 corev1.ResourceStorage: sizeQuantity1,
167 },
168 },
169 },
170 Source: &virtbeta.DataVolumeSource{
171 Blank: &virtbeta.DataVolumeBlankImage{},
172 },
173 },
174 },
175 {
176 ObjectMeta: metav1.ObjectMeta{
177 Name: volumeNames[1],
178 Annotations: map[string]string{
179 "linkerd.io/inject": "disabled",
180 },
181 },
182 Spec: virtbeta.DataVolumeSpec{
183 PVC: &corev1.PersistentVolumeClaimSpec{
184 AccessModes: []corev1.PersistentVolumeAccessMode{
185 corev1.ReadWriteOnce,
186 },
187 StorageClassName: &storageTypeVM,
188 Resources: corev1.VolumeResourceRequirements{
189 Requests: map[corev1.ResourceName]kr.Quantity{
190 corev1.ResourceStorage: sizeQuantity2,
191 },
192 },
193 },
194 Source: &virtbeta.DataVolumeSource{
195 Registry: &virtbeta.DataVolumeSourceRegistry{
196 URL: &disks[1].ContainerImageURL,
197 PullMethod: &pullMethod,
198 },
199 },
200 },
201 },
202 },
203 },
204 Status: virtv1.VirtualMachineStatus{},
205 }
206
207 actualKubeVM, err := VirtualMachineToKubeVirtualMachine(virtualMachine)
208 assert.NoError(t, err)
209 assert.Equal(t, expectedKubeVM, actualKubeVM)
210 }
211
212 func createGenericVirtualMachine() *model.VirtualMachine {
213 return &model.VirtualMachine{
214 VirtualMachineID: virtualMachineID,
215 ClusterEdgeID: "1b79cb14-c00a-48a3-8e6c-9f741e7419e7",
216 ClusterName: "cluster-name",
217 Hostname: virtualMachineHostname,
218 TargetPowerState: true,
219 Cpus: 2,
220 Memory: "8Gi",
221 MachineType: model.MachineTypeI440fx,
222 Disks: createGenericVirtualMachineDisks(),
223 }
224 }
225
226 func createGenericVirtualMachineDisks() []*model.VirtualMachineDisk {
227 return []*model.VirtualMachineDisk{
228 {
229 DiskID: "c65c92ef-6109-4814-a1e7-ddb8db64b7d9",
230 VirtualMachineID: virtualMachineID,
231 Type: model.DiskTypeCdrom,
232 Bus: model.BusTypeSata,
233 BootOrder: 0,
234 Size: "128Gi",
235 ContainerImageURL: "",
236 },
237 {
238 DiskID: "e782f667-b50d-4044-9421-99b5c71c28ee",
239 VirtualMachineID: virtualMachineID,
240 Type: model.DiskTypeDisk,
241 Bus: model.BusTypeVirtio,
242 BootOrder: 1,
243 Size: "256Gi",
244 ContainerImageURL: "docker://us-east1-docker.pkg.dev/ret-edge-pltf-infra/workloads/ien-image:v1.7.1",
245 },
246 }
247 }
248
View as plain text