Skip to content

Commit 1b6d1ac

Browse files
committed
vmware: Encrypt vmotion if flavor requires it, or don't
Vmotions should be encrypted, but not for really large RAM sizes because encryption impacts vmotion performance too much. So let the flavor define one of "required", "disabled" or "opportunistic". If not set, null/None defaults to "opportunistic". Change-Id: Iba0fd2f2edc8fae210f6c4bab0218703e87ecfbc
1 parent fd10af1 commit 1b6d1ac

File tree

4 files changed

+39
-1
lines changed

4 files changed

+39
-1
lines changed

nova/tests/unit/virt/vmwareapi/test_vm_util.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ def test_get_resize_spec(self):
426426
expected.memoryAllocation = memoryAllocation
427427
expected.extraConfig = []
428428
expected.memoryReservationLockedToMax = False
429+
expected.migrateEncryption = None
429430

430431
self.assertEqual(expected, result)
431432

@@ -459,6 +460,7 @@ def test_get_resize_spec_with_limits(self):
459460
expected.memoryAllocation = memoryAllocation
460461
expected.extraConfig = []
461462
expected.memoryReservationLockedToMax = False
463+
expected.migrateEncryption = None
462464

463465
self.assertEqual(expected, result)
464466

@@ -883,6 +885,7 @@ def _create_vm_config_spec(self):
883885
spec.name = self._instance.uuid
884886
spec.instanceUuid = self._instance.uuid
885887
spec.deviceChange = []
888+
spec.migrateEncryption = None
886889
spec.numCPUs = 2
887890

888891
spec.version = None
@@ -963,6 +966,7 @@ def test_get_vm_create_spec_with_allocations(self):
963966
extra_specs)
964967
expected = fake_factory.create('ns0:VirtualMachineConfigSpec')
965968
expected.deviceChange = []
969+
expected.migrateEncryption = None
966970
expected.guestId = constants.DEFAULT_OS_TYPE
967971
expected.instanceUuid = self._instance.uuid
968972
expected.memoryMB = self._instance.memory_mb
@@ -1018,6 +1022,7 @@ def test_get_vm_create_spec_with_limit(self):
10181022
expected.instanceUuid = self._instance.uuid
10191023
expected.name = self._instance.uuid
10201024
expected.deviceChange = []
1025+
expected.migrateEncryption = None
10211026
expected.extraConfig = []
10221027

10231028
extra_config = fake_factory.create("ns0:OptionValue")
@@ -1072,6 +1077,7 @@ def test_get_vm_create_spec_with_share(self):
10721077
expected.instanceUuid = self._instance.uuid
10731078
expected.name = self._instance.uuid
10741079
expected.deviceChange = []
1080+
expected.migrateEncryption = None
10751081

10761082
expected.extraConfig = []
10771083
extra_config = fake_factory.create('ns0:OptionValue')
@@ -1125,6 +1131,7 @@ def test_get_vm_create_spec_with_share_custom(self):
11251131
expected.instanceUuid = self._instance.uuid
11261132
expected.name = self._instance.uuid
11271133
expected.deviceChange = []
1134+
expected.migrateEncryption = None
11281135

11291136
expected.extraConfig = []
11301137
extra_config = fake_factory.create('ns0:OptionValue')
@@ -1173,6 +1180,7 @@ def test_get_vm_create_spec_with_metadata(self):
11731180
expected.name = self._instance.uuid
11741181
expected.instanceUuid = self._instance.uuid
11751182
expected.deviceChange = []
1183+
expected.migrateEncryption = None
11761184
expected.numCPUs = 2
11771185

11781186
expected.version = None
@@ -1216,6 +1224,7 @@ def test_get_vm_create_spec_with_firmware(self):
12161224
expected.name = self._instance.uuid
12171225
expected.instanceUuid = self._instance.uuid
12181226
expected.deviceChange = []
1227+
expected.migrateEncryption = None
12191228
expected.numCPUs = 2
12201229

12211230
expected.version = None
@@ -2058,6 +2067,7 @@ def test_get_vm_create_spec_with_console_delay(self):
20582067
expected.name = self._instance.uuid
20592068
expected.instanceUuid = self._instance.uuid
20602069
expected.deviceChange = []
2070+
expected.migrateEncryption = None
20612071
expected.numCPUs = 2
20622072

20632073
expected.version = None
@@ -2102,6 +2112,7 @@ def test_get_vm_create_spec_with_cores_per_socket(self):
21022112
extra_specs)
21032113
expected = fake_factory.create('ns0:VirtualMachineConfigSpec')
21042114
expected.deviceChange = []
2115+
expected.migrateEncryption = None
21052116
expected.guestId = 'otherGuest'
21062117
expected.instanceUuid = self._instance.uuid
21072118
expected.memoryMB = self._instance.memory_mb
@@ -2147,6 +2158,7 @@ def test_get_vm_create_spec_with_memory_allocations(self):
21472158
extra_specs)
21482159
expected = fake_factory.create('ns0:VirtualMachineConfigSpec')
21492160
expected.deviceChange = []
2161+
expected.migrateEncryption = None
21502162
expected.guestId = 'otherGuest'
21512163
expected.instanceUuid = self._instance.uuid
21522164
expected.memoryMB = self._instance.memory_mb

nova/tests/unit/virt/vmwareapi/test_vmops.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,21 @@ def test_reserve_max_flavor_memory_for_memory_reserved_flavor(self):
13991399
self.assertEqual(specs.memory_limits.reservation,
14001400
self._instance.flavor.memory_mb)
14011401

1402+
def _test_vmotion_encryption(self, encryption, expected=None):
1403+
if encryption is not None:
1404+
self._instance.flavor.extra_specs.update({
1405+
"vmware:vmotion_encryption": encryption})
1406+
specs = self._vmops._get_extra_specs(self._instance.flavor,
1407+
self._image_meta)
1408+
self.assertEqual(specs.vmotion_encryption, expected)
1409+
1410+
def test_vmotion_encryption_values(self):
1411+
self._test_vmotion_encryption("required", "required")
1412+
self._test_vmotion_encryption("opportunistic", "opportunistic")
1413+
self._test_vmotion_encryption("disabled", "disabled")
1414+
self._test_vmotion_encryption("INVALID", None)
1415+
self._test_vmotion_encryption(None) # no extra_specs entry at all
1416+
14021417
@mock.patch.object(vmops.VMwareVMOps, '_extend_virtual_disk')
14031418
@mock.patch.object(vmops.VMwareVMOps, '_get_extra_specs')
14041419
@mock.patch.object(ds_util, 'disk_move')

nova/virt/vmwareapi/vm_util.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def __init__(self, cpu_limits=None, hw_version=None,
114114
vif_limits=None, hv_enabled=None, firmware=None,
115115
hw_video_ram=None, numa_prefer_ht=None,
116116
numa_vcpu_max_per_virtual_node=None,
117-
migration_data_timeout=None):
117+
migration_data_timeout=None, vmotion_encryption=None):
118118
"""ExtraSpecs object holds extra_specs for the instance."""
119119
self.cpu_limits = cpu_limits or Limits()
120120
self.memory_limits = memory_limits or Limits()
@@ -129,6 +129,7 @@ def __init__(self, cpu_limits=None, hw_version=None,
129129
self.numa_prefer_ht = numa_prefer_ht
130130
self.numa_vcpu_max_per_virtual_node = numa_vcpu_max_per_virtual_node
131131
self.migration_data_timeout = migration_data_timeout
132+
self.vmotion_encryption = vmotion_encryption
132133

133134

134135
class HistoryCollectorItems(six.Iterator):
@@ -419,6 +420,8 @@ def get_vm_create_spec(client_factory, instance, data_store_name,
419420

420421
config_spec.deviceChange = devices
421422

423+
config_spec.migrateEncryption = extra_specs.vmotion_encryption
424+
422425
# add vm-uuid and iface-id.x values for Neutron
423426
extra_config = []
424427
opt = client_factory.create('ns0:OptionValue')
@@ -612,6 +615,8 @@ def get_vm_resize_spec(client_factory, vcpus, memory_mb, extra_specs,
612615

613616
resize_spec.extraConfig = extra_config
614617

618+
resize_spec.migrateEncryption = extra_specs.vmotion_encryption
619+
615620
if metadata:
616621
resize_spec.annotation = metadata
617622
return resize_spec

nova/virt/vmwareapi/vmops.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,12 @@ def _get_extra_specs(self, flavor, image_meta=None):
476476
str(extra_specs.cores_per_socket)
477477
if utils.is_numa_aligned_flavor(flavor)
478478
else '')
479+
480+
vmotion_encryption = flavor.extra_specs.get(
481+
"vmware:vmotion_encryption", "opportunistic")
482+
if vmotion_encryption in ["disabled", "opportunistic", "required"]:
483+
extra_specs.vmotion_encryption = vmotion_encryption
484+
479485
return extra_specs
480486

481487
def _get_storage_policy(self, flavor):

0 commit comments

Comments
 (0)