Skip to content

Commit 318151a

Browse files
Merge pull request #1306 from FernandoOjeda/fo_hardware_guests
List hardware vs associated.
2 parents 9129708 + d1c59f9 commit 318151a

File tree

13 files changed

+265
-16
lines changed

13 files changed

+265
-16
lines changed

SoftLayer/CLI/hardware/guests.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""Lists the Virtual Guests running on this server."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
import SoftLayer
7+
from SoftLayer.CLI import environment
8+
from SoftLayer.CLI import exceptions
9+
from SoftLayer.CLI import formatting
10+
from SoftLayer.CLI import helpers
11+
from SoftLayer import utils
12+
13+
14+
@click.command()
15+
@click.argument('identifier')
16+
@environment.pass_env
17+
def cli(env, identifier):
18+
"""Lists the Virtual Guests running on this server."""
19+
20+
mgr = SoftLayer.HardwareManager(env.client)
21+
hw_id = helpers.resolve_id(mgr.resolve_ids, identifier, 'hardware')
22+
hw_guests = mgr.get_hardware_guests(hw_id)
23+
24+
if not hw_guests:
25+
raise exceptions.CLIAbort("No Virtual Guests found.")
26+
27+
table = formatting.Table(['id', 'hostname', 'CPU', 'Memory', 'Start Date', 'Status', 'powerState'])
28+
table.sortby = 'hostname'
29+
for guest in hw_guests:
30+
table.add_row([
31+
guest['id'],
32+
guest['hostname'],
33+
'%i %s' % (guest['maxCpu'], guest['maxCpuUnits']),
34+
guest['maxMemory'],
35+
utils.clean_time(guest['createDate']),
36+
guest['status']['keyName'],
37+
guest['powerState']['keyName']
38+
])
39+
40+
env.fout(table)

SoftLayer/CLI/routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
('hardware:detail', 'SoftLayer.CLI.hardware.detail:cli'),
237237
('hardware:billing', 'SoftLayer.CLI.hardware.billing:cli'),
238238
('hardware:edit', 'SoftLayer.CLI.hardware.edit:cli'),
239+
('hardware:guests', 'SoftLayer.CLI.hardware.guests:cli'),
239240
('hardware:list', 'SoftLayer.CLI.hardware.list:cli'),
240241
('hardware:power-cycle', 'SoftLayer.CLI.hardware.power:power_cycle'),
241242
('hardware:power-off', 'SoftLayer.CLI.hardware.power:power_off'),

SoftLayer/CLI/virt/list.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from SoftLayer.CLI import environment
99
from SoftLayer.CLI import formatting
1010
from SoftLayer.CLI import helpers
11-
11+
from SoftLayer import utils
1212

1313
# pylint: disable=unnecessary-lambda
1414

@@ -93,3 +93,22 @@ def cli(env, sortby, cpu, domain, datacenter, hostname, memory, network,
9393
for value in columns.row(guest)])
9494

9595
env.fout(table)
96+
97+
hardware_guests = vsi.get_hardware_guests()
98+
for hardware in hardware_guests:
99+
if hardware['virtualHost']['guests']:
100+
title = "Hardware(id = {hardwareId}) guests associated".format(hardwareId=hardware['id'])
101+
table_hardware_guest = formatting.Table(['id', 'hostname', 'CPU', 'Memory', 'Start Date', 'Status',
102+
'powerState'], title=title)
103+
table_hardware_guest.sortby = 'hostname'
104+
for guest in hardware['virtualHost']['guests']:
105+
table_hardware_guest.add_row([
106+
guest['id'],
107+
guest['hostname'],
108+
'%i %s' % (guest['maxCpu'], guest['maxCpuUnits']),
109+
guest['maxMemory'],
110+
utils.clean_time(guest['createDate']),
111+
guest['status']['keyName'],
112+
guest['powerState']['keyName']
113+
])
114+
env.fout(table_hardware_guest)

SoftLayer/fixtures/SoftLayer_Account.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,28 @@
146146
'id': 6660
147147
}
148148
},
149+
"virtualHost": {
150+
"accountId": 11111,
151+
"id": 22222,
152+
"name": "vmware.chechu.com",
153+
"guests": [
154+
{
155+
"accountId": 11111,
156+
"createDate": "2019-09-05T17:03:42-06:00",
157+
"hostname": "NSX-T Manager",
158+
"id": 33333,
159+
"maxCpu": 16,
160+
"maxCpuUnits": "CORE",
161+
"maxMemory": 49152,
162+
"powerState": {
163+
"keyName": "RUNNING",
164+
"name": "Running"
165+
},
166+
"status": {
167+
"keyName": "ACTIVE",
168+
"name": "Active"
169+
}
170+
}]}
149171
}, {
150172
'id': 1001,
151173
'metricTrackingObject': {'id': 4},
@@ -190,7 +212,13 @@
190212
'vlanNumber': 3672,
191213
'id': 19082
192214
},
193-
]
215+
],
216+
"virtualHost": {
217+
"accountId": 11111,
218+
"id": 22222,
219+
"name": "host14.vmware.chechu.com",
220+
"guests": []
221+
}
194222
}, {
195223
'id': 1002,
196224
'metricTrackingObject': {'id': 5},
@@ -234,9 +262,21 @@
234262
'vlanNumber': 3672,
235263
'id': 19082
236264
},
237-
]
265+
],
266+
"virtualHost": {
267+
"accountId": 11111,
268+
"id": 22222,
269+
"name": "host14.vmware.chechu.com",
270+
"guests": []
271+
}
238272
}, {
239273
'id': 1003,
274+
"virtualHost": {
275+
"accountId": 11111,
276+
"id": 22222,
277+
"name": "host14.vmware.chechu.com",
278+
"guests": []
279+
}
240280
}]
241281
getDomains = [{'name': 'example.com',
242282
'id': 12345,

SoftLayer/fixtures/SoftLayer_Hardware_Server.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,23 @@
242242
}
243243
}
244244
]
245+
246+
getVirtualHost = {
247+
"accountId": 11111,
248+
"createDate": "2018-10-08T10:54:48-06:00",
249+
"description": "host16.vmware.chechu.com",
250+
"hardwareId": 22222,
251+
"id": 33333,
252+
"name": "host16.vmware.chechu.com",
253+
"uuid": "00000000-0000-0000-0000-0cc11111",
254+
"hardware": {
255+
"accountId": 11111,
256+
"domain": "chechu.com",
257+
"hostname": "host16.vmware",
258+
"id": 22222,
259+
"hardwareStatus": {
260+
"id": 5,
261+
"status": "ACTIVE"
262+
}
263+
}
264+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
getGuests = [
2+
{
3+
"accountId": 11111,
4+
"createDate": "2019-09-05T17:03:42-06:00",
5+
"fullyQualifiedDomainName": "NSX-T Manager",
6+
"hostname": "NSX-T Manager",
7+
"id": 22222,
8+
"maxCpu": 16,
9+
"maxCpuUnits": "CORE",
10+
"maxMemory": 49152,
11+
"startCpus": 16,
12+
"powerState": {
13+
"keyName": "RUNNING",
14+
"name": "Running"
15+
},
16+
"status": {
17+
"keyName": "ACTIVE",
18+
"name": "Active"
19+
}
20+
},
21+
{
22+
"accountId": 11111,
23+
"createDate": "2019-09-23T06:00:53-06:00",
24+
"hostname": "NSX-T Manager2",
25+
"id": 33333,
26+
"maxCpu": 12,
27+
"maxCpuUnits": "CORE",
28+
"maxMemory": 49152,
29+
"startCpus": 12,
30+
"statusId": 1001,
31+
"powerState": {
32+
"keyName": "RUNNING",
33+
"name": "Running"
34+
},
35+
"status": {
36+
"keyName": "ACTIVE",
37+
"name": "Active"
38+
}
39+
}
40+
]

SoftLayer/managers/hardware.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,18 @@ def get_hard_drives(self, instance_id):
728728
"""
729729
return self.hardware.getHardDrives(id=instance_id)
730730

731+
def get_hardware_guests(self, instance_id):
732+
"""Returns the hardware server guests.
733+
734+
:param int instance_id: Id of the hardware server.
735+
"""
736+
mask = "mask[id]"
737+
virtual_host = self.hardware.getVirtualHost(mask=mask, id=instance_id)
738+
if virtual_host:
739+
return self.client.call('SoftLayer_Virtual_Host', 'getGuests', mask='mask[powerState]',
740+
id=virtual_host['id'])
741+
return virtual_host
742+
731743

732744
def _get_bandwidth_key(items, hourly=True, no_public=False, location=None):
733745
"""Picks a valid Bandwidth Item, returns the KeyName"""

SoftLayer/managers/vs.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,3 +1158,12 @@ def get_local_disks(self, instance_id):
11581158
"""
11591159
mask = 'mask[diskImage]'
11601160
return self.guest.getBlockDevices(mask=mask, id=instance_id)
1161+
1162+
def get_hardware_guests(self):
1163+
"""Returns all virtualHost capable hardware objects and their guests.
1164+
1165+
:return SoftLayer_Hardware[].
1166+
"""
1167+
object_filter = {"hardware": {"virtualHost": {"id": {"operation": "not null"}}}}
1168+
mask = "mask[virtualHost[guests[powerState]]]"
1169+
return self.client.call('SoftLayer_Account', 'getHardware', mask=mask, filter=object_filter)

docs/cli/hardware.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,7 @@ This function updates the firmware of a server. If already at the latest version
115115
.. click:: SoftLayer.CLI.hardware.storage:cli
116116
:prog: hardware storage
117117
:show-nested:
118+
119+
.. click:: SoftLayer.CLI.hardware.guests:cli
120+
:prog: hardware guests
121+
:show-nested:

tests/CLI/modules/server_tests.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,3 +852,15 @@ def test_create_hw_no_confirm(self, confirm_mock):
852852
'--network=TEST_NETWORK', '--os=UBUNTU_12_64'])
853853

854854
self.assertEqual(result.exit_code, 2)
855+
856+
def test_get_hardware_guests(self):
857+
result = self.run_command(['hw', 'guests', '123456'])
858+
self.assert_no_fail(result)
859+
860+
def test_hardware_guests_empty(self):
861+
mock = self.set_mock('SoftLayer_Virtual_Host', 'getGuests')
862+
mock.return_value = None
863+
864+
result = self.run_command(['hw', 'guests', '123456'])
865+
self.assertEqual(result.exit_code, 2)
866+
self.assertIsInstance(result.exception, exceptions.CLIAbort)

0 commit comments

Comments
 (0)