public boolean satisfies(NodeResources other) {
        ensureSpecified();
        other.ensureSpecified();
        if (this.vcpu < other.vcpu) return false;
        if (this.memoryGiB < other.memoryGiB) return false;
        if (this.diskGb < other.diskGb) return false;
        if (this.bandwidthGbps < other.bandwidthGbps) return false;
        if (this.gpuResources.lessThan(other.gpuResources)) return false;

        // Why doesn't a fast disk satisfy a slow disk? Because if slow disk is explicitly specified
        // (i.e not "any"), you should not randomly, sometimes get a faster disk as that means you may
        // draw conclusions about performance on the basis of better resources than you think you have
        if (other.diskSpeed != DiskSpeed.any && other.diskSpeed != this.diskSpeed) return false;

        // Same reasoning as the above
        if (other.storageType != StorageType.any && other.storageType != this.storageType) return false;

        // Same reasoning as the above
        if (other.architecture != Architecture.any && other.architecture != this.architecture) return false;

        return true;
    }
@Test
    void testSatisfies() {
        var hostResources = new NodeResources(1, 2, 3, 1);
        assertTrue(hostResources.satisfies(new NodeResources(1, 2, 3, 1)));
        assertTrue(hostResources.satisfies(new NodeResources(1, 1, 1, 1)));
        assertFalse(hostResources.satisfies(new NodeResources(2, 2, 3, 1)));
        assertFalse(hostResources.satisfies(new NodeResources(1, 3, 3, 1)));
        assertFalse(hostResources.satisfies(new NodeResources(1, 2, 4, 1)));

        var gpuHostResources = new NodeResources(1, 2, 3, 1,
                                                 NodeResources.DiskSpeed.fast,
                                                 NodeResources.StorageType.local,
                                                 NodeResources.Architecture.x86_64,
                                                 new NodeResources.GpuResources(1, 16));
        assertTrue(gpuHostResources.satisfies(new NodeResources(1, 2, 3, 1,
                                                                NodeResources.DiskSpeed.fast,
                                                                NodeResources.StorageType.local,
                                                                NodeResources.Architecture.x86_64,
                                                                new NodeResources.GpuResources(1, 16))));
        assertFalse(gpuHostResources.satisfies(new NodeResources(1, 2, 3, 1,
                                                                 NodeResources.DiskSpeed.fast,
                                                                 NodeResources.StorageType.local,
                                                                 NodeResources.Architecture.x86_64,
                                                                 new NodeResources.GpuResources(1, 32))));
        assertFalse(hostResources.satisfies(gpuHostResources));
    }