Skip to content

Commit e13c1b8

Browse files
Merge pull request #936 from kwienken/virtual-hvm
Add boot mode option to virtual guest creating
2 parents 23dab1e + 09c35a9 commit e13c1b8

File tree

4 files changed

+62
-11
lines changed

4 files changed

+62
-11
lines changed

SoftLayer/CLI/virt/create.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ def _parse_create_args(client, args):
8080
"disks": args['disk'],
8181
"cpus": args.get('cpu', None),
8282
"memory": args.get('memory', None),
83-
"flavor": args.get('flavor', None)
83+
"flavor": args.get('flavor', None),
84+
"boot_mode": args.get('boot_mode', None)
8485
}
8586

8687
# The primary disk is included in the flavor and the local_disk flag is not needed
@@ -175,6 +176,9 @@ def _parse_create_args(client, args):
175176
help="OS install code. Tip: you can specify <OS>_LATEST")
176177
@click.option('--image',
177178
help="Image ID. See: 'slcli image list' for reference")
179+
@click.option('--boot-mode',
180+
help="Specify the mode to boot the OS in. Supported modes are HVM and PV.",
181+
type=click.STRING)
178182
@click.option('--billing',
179183
type=click.Choice(['hourly', 'monthly']),
180184
default='hourly',

SoftLayer/managers/vs.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def _generate_create_dict(
307307
dedicated=False, public_vlan=None, private_vlan=None,
308308
userdata=None, nic_speed=None, disks=None, post_uri=None,
309309
private=False, ssh_keys=None, public_security_groups=None,
310-
private_security_groups=None, **kwargs):
310+
private_security_groups=None, boot_mode=None, **kwargs):
311311
"""Returns a dict appropriate to pass into Virtual_Guest::createObject
312312
313313
See :func:`create_instance` for a list of available options.
@@ -339,11 +339,14 @@ def _generate_create_dict(
339339
"hostname": hostname,
340340
"domain": domain,
341341
"localDiskFlag": local_disk,
342-
"hourlyBillingFlag": hourly
342+
"hourlyBillingFlag": hourly,
343+
"supplementalCreateObjectOptions": {
344+
"bootMode": boot_mode
345+
}
343346
}
344347

345348
if flavor:
346-
data["supplementalCreateObjectOptions"] = {"flavorKeyName": flavor}
349+
data["supplementalCreateObjectOptions"]["flavorKeyName"] = flavor
347350

348351
if dedicated and not host_id:
349352
data["dedicatedAccountHostOnlyFlag"] = dedicated

tests/CLI/modules/vs_tests.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ def test_create(self, confirm_mock):
161161
'hostname': 'host',
162162
'startCpus': 2,
163163
'operatingSystemReferenceCode': 'UBUNTU_LATEST',
164-
'networkComponents': [{'maxSpeed': '100'}]},)
164+
'networkComponents': [{'maxSpeed': '100'}],
165+
'supplementalCreateObjectOptions': {'bootMode': None}},)
165166
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObject',
166167
args=args)
167168

@@ -195,7 +196,8 @@ def test_create_with_integer_image_id(self, confirm_mock):
195196
'blockDeviceTemplateGroup': {
196197
'globalIdentifier': '0B5DEAF4-643D-46CA-A695-CECBE8832C9D',
197198
},
198-
'networkComponents': [{'maxSpeed': '100'}]
199+
'networkComponents': [{'maxSpeed': '100'}],
200+
'supplementalCreateObjectOptions': {'bootMode': None}
199201
},)
200202
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObject',
201203
args=args)
@@ -225,7 +227,9 @@ def test_create_with_flavor(self, confirm_mock):
225227
'startCpus': None,
226228
'maxMemory': None,
227229
'localDiskFlag': None,
228-
'supplementalCreateObjectOptions': {'flavorKeyName': 'B1_1X2X25'},
230+
'supplementalCreateObjectOptions': {
231+
'bootMode': None,
232+
'flavorKeyName': 'B1_1X2X25'},
229233
'operatingSystemReferenceCode': 'UBUNTU_LATEST',
230234
'networkComponents': [{'maxSpeed': '100'}]},)
231235
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObject',
@@ -261,7 +265,8 @@ def test_create_with_host_id(self, confirm_mock):
261265
'startCpus': 2,
262266
'operatingSystemReferenceCode': 'UBUNTU_LATEST',
263267
'networkComponents': [{'maxSpeed': '100'}],
264-
'dedicatedHost': {'id': 123}},)
268+
'dedicatedHost': {'id': 123},
269+
'supplementalCreateObjectOptions': {'bootMode': None}},)
265270
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObject',
266271
args=args)
267272

@@ -306,7 +311,8 @@ def test_create_like(self, confirm_mock):
306311
'maxMemory': 1024,
307312
'localDiskFlag': False,
308313
'operatingSystemReferenceCode': 'UBUNTU_LATEST',
309-
'networkComponents': [{'maxSpeed': 100}]},)
314+
'networkComponents': [{'maxSpeed': 100}],
315+
'supplementalCreateObjectOptions': {'bootMode': None}},)
310316
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObject',
311317
args=args)
312318

@@ -347,7 +353,9 @@ def test_create_like_flavor(self, confirm_mock):
347353
'startCpus': None,
348354
'maxMemory': None,
349355
'localDiskFlag': None,
350-
'supplementalCreateObjectOptions': {'flavorKeyName': 'B1_1X2X25'},
356+
'supplementalCreateObjectOptions': {
357+
'bootMode': None,
358+
'flavorKeyName': 'B1_1X2X25'},
351359
'operatingSystemReferenceCode': 'UBUNTU_LATEST',
352360
'networkComponents': [{'maxSpeed': 100}]},)
353361
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObject',

tests/managers/vs_tests.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ def test_create_instances(self):
192192
'localDiskFlag': True,
193193
'maxMemory': 1024,
194194
'hostname': 'server',
195-
'startCpus': 1}],)
195+
'startCpus': 1,
196+
'supplementalCreateObjectOptions': {'bootMode': None}}],)
196197
self.assert_called_with('SoftLayer_Virtual_Guest', 'createObjects',
197198
args=args)
198199
self.assert_called_with('SoftLayer_Virtual_Guest', 'setTags',
@@ -232,6 +233,7 @@ def test_generate_basic(self):
232233
'localDiskFlag': True,
233234
'operatingSystemReferenceCode': "STRING",
234235
'hourlyBillingFlag': True,
236+
'supplementalCreateObjectOptions': {'bootMode': None},
235237
}
236238

237239
self.assertEqual(data, assert_data)
@@ -254,6 +256,7 @@ def test_generate_monthly(self):
254256
'domain': 'example.com',
255257
'localDiskFlag': True,
256258
'operatingSystemReferenceCode': "STRING",
259+
'supplementalCreateObjectOptions': {'bootMode': None},
257260
}
258261

259262
self.assertEqual(data, assert_data)
@@ -275,6 +278,7 @@ def test_generate_image_id(self):
275278
'localDiskFlag': True,
276279
'blockDeviceTemplateGroup': {"globalIdentifier": "45"},
277280
'hourlyBillingFlag': True,
281+
'supplementalCreateObjectOptions': {'bootMode': None},
278282
}
279283

280284
self.assertEqual(data, assert_data)
@@ -298,6 +302,7 @@ def test_generate_dedicated(self):
298302
'operatingSystemReferenceCode': "STRING",
299303
'hourlyBillingFlag': True,
300304
'dedicatedAccountHostOnlyFlag': True,
305+
'supplementalCreateObjectOptions': {'bootMode': None},
301306
}
302307

303308
self.assertEqual(data, assert_data)
@@ -321,6 +326,7 @@ def test_generate_datacenter(self):
321326
'operatingSystemReferenceCode': "STRING",
322327
'hourlyBillingFlag': True,
323328
'datacenter': {"name": 'sng01'},
329+
'supplementalCreateObjectOptions': {'bootMode': None},
324330
}
325331

326332
self.assertEqual(data, assert_data)
@@ -344,6 +350,7 @@ def test_generate_public_vlan(self):
344350
'operatingSystemReferenceCode': "STRING",
345351
'hourlyBillingFlag': True,
346352
'primaryNetworkComponent': {"networkVlan": {"id": 1}},
353+
'supplementalCreateObjectOptions': {'bootMode': None},
347354
}
348355

349356
self.assertEqual(data, assert_data)
@@ -367,6 +374,7 @@ def test_generate_private_vlan(self):
367374
'operatingSystemReferenceCode': "STRING",
368375
'hourlyBillingFlag': True,
369376
'primaryBackendNetworkComponent': {"networkVlan": {"id": 1}},
377+
'supplementalCreateObjectOptions': {'bootMode': None},
370378
}
371379

372380
self.assertEqual(data, assert_data)
@@ -390,6 +398,7 @@ def test_generate_userdata(self):
390398
'operatingSystemReferenceCode': "STRING",
391399
'hourlyBillingFlag': True,
392400
'userData': [{'value': "ICANHAZVSI"}],
401+
'supplementalCreateObjectOptions': {'bootMode': None},
393402
}
394403

395404
self.assertEqual(data, assert_data)
@@ -413,6 +422,7 @@ def test_generate_network(self):
413422
'operatingSystemReferenceCode': "STRING",
414423
'hourlyBillingFlag': True,
415424
'networkComponents': [{'maxSpeed': 9001}],
425+
'supplementalCreateObjectOptions': {'bootMode': None},
416426
}
417427

418428
self.assertEqual(data, assert_data)
@@ -438,6 +448,7 @@ def test_generate_private_network_only(self):
438448
'privateNetworkOnlyFlag': True,
439449
'hourlyBillingFlag': True,
440450
'networkComponents': [{'maxSpeed': 9001}],
451+
'supplementalCreateObjectOptions': {'bootMode': None},
441452
}
442453

443454
self.assertEqual(data, assert_data)
@@ -461,6 +472,7 @@ def test_generate_post_uri(self):
461472
'operatingSystemReferenceCode': "STRING",
462473
'hourlyBillingFlag': True,
463474
'postInstallScriptUri': 'https://example.com/boostrap.sh',
475+
'supplementalCreateObjectOptions': {'bootMode': None},
464476
}
465477

466478
self.assertEqual(data, assert_data)
@@ -484,6 +496,7 @@ def test_generate_sshkey(self):
484496
'operatingSystemReferenceCode': "STRING",
485497
'hourlyBillingFlag': True,
486498
'sshKeys': [{'id': 543}],
499+
'supplementalCreateObjectOptions': {'bootMode': None},
487500
}
488501

489502
self.assertEqual(data, assert_data)
@@ -537,6 +550,29 @@ def test_generate_multi_disk(self):
537550
self.assertTrue(data.get('blockDevices'))
538551
self.assertEqual(data['blockDevices'], assert_data['blockDevices'])
539552

553+
def test_generate_boot_mode(self):
554+
data = self.vs._generate_create_dict(
555+
cpus=1,
556+
memory=1,
557+
hostname='test',
558+
domain='example.com',
559+
os_code="STRING",
560+
boot_mode="HVM"
561+
)
562+
563+
assert_data = {
564+
'startCpus': 1,
565+
'maxMemory': 1,
566+
'hostname': 'test',
567+
'domain': 'example.com',
568+
'localDiskFlag': True,
569+
'operatingSystemReferenceCode': "STRING",
570+
'hourlyBillingFlag': True,
571+
'supplementalCreateObjectOptions': {'bootMode': 'HVM'},
572+
}
573+
574+
self.assertEqual(data, assert_data)
575+
540576
def test_change_port_speed_public(self):
541577
result = self.vs.change_port_speed(1, True, 100)
542578

0 commit comments

Comments
 (0)