...

Source file src/edge-infra.dev/pkg/edge/api/graph/mapper/mapper_vm_test.go

Documentation: edge-infra.dev/pkg/edge/api/graph/mapper

     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)} /* #nosec G115 */
    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), /* #nosec G115 */
    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