diff --git a/src/runtime/pkg/oci/utils.go b/src/runtime/pkg/oci/utils.go index b07951fdfe..696cd59fb1 100644 --- a/src/runtime/pkg/oci/utils.go +++ b/src/runtime/pkg/oci/utils.go @@ -608,7 +608,7 @@ func addHypervisorHotColdPlugVfioOverrides(ocispec specs.Spec, sbConfig *vc.Sand func addHypervisorMemoryOverrides(ocispec specs.Spec, sbConfig *vc.SandboxConfig, runtime RuntimeConfig) error { if err := newAnnotationConfiguration(ocispec, vcAnnotations.DefaultMemory).setUintWithCheck(func(memorySz uint64) error { - if memorySz < vc.MinHypervisorMemory { + if memorySz < vc.MinHypervisorMemory && sbConfig.HypervisorType != vc.RemoteHypervisor { return fmt.Errorf("Memory specified in annotation %s is less than minimum required %d, please specify a larger value", vcAnnotations.DefaultMemory, vc.MinHypervisorMemory) } sbConfig.HypervisorConfig.MemorySize = uint32(memorySz) @@ -689,7 +689,7 @@ func addHypervisorCPUOverrides(ocispec specs.Spec, sbConfig *vc.SandboxConfig) e numCPUs := goruntime.NumCPU() if err := newAnnotationConfiguration(ocispec, vcAnnotations.DefaultVCPUs).setFloat32WithCheck(func(vcpus float32) error { - if vcpus > float32(numCPUs) { + if vcpus > float32(numCPUs) && sbConfig.HypervisorType != vc.RemoteHypervisor { return fmt.Errorf("Number of cpus %f specified in annotation default_vcpus is greater than the number of CPUs %d on the system", vcpus, numCPUs) } sbConfig.HypervisorConfig.NumVCPUsF = float32(vcpus) @@ -701,11 +701,11 @@ func addHypervisorCPUOverrides(ocispec specs.Spec, sbConfig *vc.SandboxConfig) e return newAnnotationConfiguration(ocispec, vcAnnotations.DefaultMaxVCPUs).setUintWithCheck(func(maxVCPUs uint64) error { max := uint32(maxVCPUs) - if max > uint32(numCPUs) { + if max > uint32(numCPUs) && sbConfig.HypervisorType != vc.RemoteHypervisor { return fmt.Errorf("Number of cpus %d in annotation default_maxvcpus is greater than the number of CPUs %d on the system", max, numCPUs) } - if sbConfig.HypervisorType == vc.QemuHypervisor && max > govmm.MaxVCPUs() { + if sbConfig.HypervisorType == vc.QemuHypervisor && max > govmm.MaxVCPUs() && sbConfig.HypervisorType != vc.RemoteHypervisor { return fmt.Errorf("Number of cpus %d in annotation default_maxvcpus is greater than max no of CPUs %d supported for qemu", max, govmm.MaxVCPUs()) } sbConfig.HypervisorConfig.DefaultMaxVCPUs = max diff --git a/src/runtime/pkg/oci/utils_test.go b/src/runtime/pkg/oci/utils_test.go index 1f53b831ad..e769e0cb96 100644 --- a/src/runtime/pkg/oci/utils_test.go +++ b/src/runtime/pkg/oci/utils_test.go @@ -726,6 +726,51 @@ func TestAddHypervisorAnnotations(t *testing.T) { assert.Error(err) } +func TestAddRemoteHypervisorAnnotations(t *testing.T) { + // Remote hypervisor uses DefaultVCPUs, DefaultMemory etc as annotations to pick the size of the separate VM to create, + // so doesn't need to be bound by the host's capacity limits. + assert := assert.New(t) + + config := vc.SandboxConfig{ + Annotations: make(map[string]string), + } + + sbConfig := vc.SandboxConfig{ + Annotations: make(map[string]string), + HypervisorType: vc.RemoteHypervisor, + } + + ocispec := specs.Spec{ + Annotations: make(map[string]string), + } + + runtimeConfig := RuntimeConfig{ + HypervisorType: vc.RemoteHypervisor, + } + + err := addAnnotations(ocispec, &config, runtimeConfig) + assert.NoError(err) + assert.Exactly(vc.HypervisorConfig{}, config.HypervisorConfig) + + // Enable annotations + runtimeConfig.HypervisorConfig.EnableAnnotations = []string{".*"} + + // When DefaultVCPUs is more than the number of cpus on the host, remote hypervisor annotations don't throw an error + ocispec.Annotations[vcAnnotations.DefaultVCPUs] = "2000" + err = addAnnotations(ocispec, &sbConfig, runtimeConfig) + assert.NoError(err) + + // When DefaultMaxVCPUs is more than the number of cpus on the host, remote hypervisor annotations don't throw an error + ocispec.Annotations[vcAnnotations.DefaultMaxVCPUs] = "2000" + err = addAnnotations(ocispec, &sbConfig, runtimeConfig) + assert.NoError(err) + + // When memory is smaller than the minimum Hypervisor memory, remote hypervisor annotations don't throw an error + ocispec.Annotations[vcAnnotations.DefaultMemory] = "1" + err = addAnnotations(ocispec, &sbConfig, runtimeConfig) + assert.NoError(err) +} + func TestAddProtectedHypervisorAnnotations(t *testing.T) { assert := assert.New(t)