Skip to content

Commit 8bc1a9c

Browse files
Updated vlan masks to fix id/number fields not being retrieved properly. Fixed #2204
1 parent 69ba21b commit 8bc1a9c

File tree

3 files changed

+64
-51
lines changed

3 files changed

+64
-51
lines changed

SoftLayer/CLI/vlan/detail.py

+35-21
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,11 @@
1212

1313
@click.command(cls=SoftLayer.CLI.command.SLCommand, )
1414
@click.argument('identifier')
15-
@click.option('--no-vs',
16-
is_flag=True,
15+
@click.option('--no-vs', is_flag=True,
1716
help="Hide virtual server listing")
18-
@click.option('--no-hardware',
19-
is_flag=True,
17+
@click.option('--no-hardware', is_flag=True,
2018
help="Hide hardware listing")
21-
@click.option('--no-trunks',
22-
is_flag=True,
19+
@click.option('--no-trunks', is_flag=True,
2320
help="Hide devices with trunks")
2421
@environment.pass_env
2522
def cli(env, identifier, no_vs, no_hardware, no_trunks):
@@ -28,11 +25,24 @@ def cli(env, identifier, no_vs, no_hardware, no_trunks):
2825

2926
vlan_id = helpers.resolve_id(mgr.resolve_vlan_ids, identifier, 'VLAN')
3027

31-
mask = """mask[firewallInterfaces,primaryRouter[id, fullyQualifiedDomainName, datacenter],
32-
totalPrimaryIpAddressCount,networkSpace,billingItem,hardware,subnets,virtualGuests,
33-
networkVlanFirewall[id,fullyQualifiedDomainName,primaryIpAddress],attachedNetworkGateway[id,name,networkFirewall],
34-
networkComponentTrunks[networkComponent[downlinkComponent[networkComponentGroup[membersDescription],
35-
hardware[tagReferences]]]]]"""
28+
mask = """mask[
29+
firewallInterfaces, primaryRouter[id, fullyQualifiedDomainName, datacenter[longName]],
30+
totalPrimaryIpAddressCount,
31+
networkSpace, id, vlanNumber, fullyQualifiedName, name,
32+
hardware[id, hostname, domain, primaryIpAddress, primaryBackendIpAddress, tagReferences],
33+
subnets[id, networkIdentifier, netmask, gateway, subnetType, usableIpAddressCount],
34+
virtualGuests[id, hostname, domain, primaryIpAddress, primaryBackendIpAddress],
35+
networkVlanFirewall[id,fullyQualifiedDomainName,primaryIpAddress],
36+
attachedNetworkGateway[id,name,networkFirewall],
37+
networkComponentTrunks[
38+
networkComponent[
39+
downlinkComponent[
40+
networkComponentGroup[membersDescription],
41+
hardware[tagReferences]
42+
]
43+
]
44+
]
45+
]"""
3646

3747
vlan = mgr.get_vlan(vlan_id, mask=mask)
3848

@@ -42,10 +52,8 @@ def cli(env, identifier, no_vs, no_hardware, no_trunks):
4252

4353
table.add_row(['id', vlan.get('id')])
4454
table.add_row(['number', vlan.get('vlanNumber')])
45-
table.add_row(['datacenter',
46-
utils.lookup(vlan, 'primaryRouter', 'datacenter', 'longName')])
47-
table.add_row(['primary_router',
48-
utils.lookup(vlan, 'primaryRouter', 'fullyQualifiedDomainName')])
55+
table.add_row(['datacenter', utils.lookup(vlan, 'primaryRouter', 'datacenter', 'longName')])
56+
table.add_row(['primary_router', utils.lookup(vlan, 'primaryRouter', 'fullyQualifiedDomainName')])
4957
table.add_row(['Gateway/Firewall', get_gateway_firewall(vlan)])
5058

5159
if vlan.get('subnets'):
@@ -93,19 +101,25 @@ def cli(env, identifier, no_vs, no_hardware, no_trunks):
93101
trunks = filter_trunks(vlan.get('networkComponentTrunks'))
94102
trunks_table = formatting.Table(['device', 'port', 'tags'])
95103
for trunk in trunks:
96-
trunks_table.add_row([utils.lookup(trunk, 'networkComponent', 'downlinkComponent',
97-
'hardware', 'fullyQualifiedDomainName'),
98-
utils.lookup(trunk, 'networkComponent', 'downlinkComponent',
99-
'networkComponentGroup', 'membersDescription'),
100-
formatting.tags(utils.lookup(trunk, 'networkComponent', 'downlinkComponent',
101-
'hardware', 'tagReferences'))])
104+
trunks_table.add_row(get_trunk_row(trunk))
102105
table.add_row(['trunks', trunks_table])
103106
else:
104107
table.add_row(['trunks', '-'])
105108

106109
env.fout(table)
107110

108111

112+
def get_trunk_row(trunk: dict) -> list:
113+
"""Parses a vlan trunk and returns a table row for it"""
114+
dl_component = utils.lookup(trunk, 'networkComponent', 'downlinkComponent')
115+
row = [
116+
utils.lookup(dl_component, 'hardware', 'fullyQualifiedDomainName'),
117+
utils.lookup(dl_component, 'networkComponentGroup', 'membersDescription'),
118+
formatting.tags(utils.lookup(dl_component, 'hardware', 'tagReferences'))
119+
]
120+
return row
121+
122+
109123
def get_gateway_firewall(vlan):
110124
"""Gets the name of a gateway/firewall from a VLAN. """
111125

SoftLayer/CLI/vlan/list.py

+20-16
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,21 @@
99
from SoftLayer.CLI.vlan.detail import get_gateway_firewall
1010
from SoftLayer import utils
1111

12-
COLUMNS = ['Id',
13-
'Number',
14-
'Fully qualified name',
15-
'Name',
16-
'Network',
17-
'Data center',
18-
'Pod',
19-
'Gateway/Firewall',
20-
'Hardware',
21-
'Virtual servers',
22-
'Public ips',
23-
'Premium',
24-
'Tags']
12+
COLUMNS = [
13+
'Id',
14+
'Number',
15+
'Fully qualified name',
16+
'Name',
17+
'Network',
18+
'Data center',
19+
'Pod',
20+
'Gateway/Firewall',
21+
'Hardware',
22+
'Virtual servers',
23+
'Public ips',
24+
'Premium',
25+
'Tags'
26+
]
2527

2628

2729
@click.command(cls=SoftLayer.CLI.command.SLCommand, )
@@ -49,9 +51,11 @@ def cli(env, sortby, datacenter, number, name, limit):
4951
name=name,
5052
limit=limit)
5153

52-
mask = """mask[name, datacenterLongName, frontendRouterId, capabilities, datacenterId, backendRouterId,
53-
backendRouterName, frontendRouterName]"""
54-
pods = mgr.get_pods(mask=mask)
54+
pod_mask = """mask[
55+
name, datacenterLongName, capabilities, datacenterId,
56+
backendRouterId, backendRouterName, frontendRouterName, frontendRouterId
57+
]"""
58+
pods = mgr.get_pods(mask=pod_mask)
5559

5660
for vlan in vlans:
5761
billing = 'Yes' if vlan.get('billingItem') else 'No'

SoftLayer/managers/network.py

+9-14
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,7 @@
3838
'addressSpace',
3939
'endPointIpAddress'
4040
])
41-
DEFAULT_VLAN_MASK = ','.join([
42-
'firewallInterfaces',
43-
'hardwareCount',
44-
'primaryRouter[id, fullyQualifiedDomainName, datacenter]',
45-
'subnetCount',
46-
'billingItem',
47-
'totalPrimaryIpAddressCount',
48-
'virtualGuestCount',
49-
'networkSpace',
50-
'networkVlanFirewall[id,fullyQualifiedDomainName,primaryIpAddress]',
51-
'attachedNetworkGateway[id,name,networkFirewall]',
52-
'tagReferences[tag[name]]',
53-
])
41+
5442
DEFAULT_GET_VLAN_MASK = ','.join([
5543
'firewallInterfaces',
5644
'primaryRouter[id, fullyQualifiedDomainName, datacenter]',
@@ -528,6 +516,13 @@ def list_vlans(self, datacenter=None, vlan_number=None, name=None, limit=100, ma
528516
:param dict \\*\\*kwargs: response-level options (mask, limit, etc.)
529517

530518
"""
519+
vlan_mask = """mask[
520+
networkSpace, id, vlanNumber, fullyQualifiedName, name,
521+
networkVlanFirewall[id,fullyQualifiedDomainName], attachedNetworkGateway[id,name],
522+
firewallInterfaces, primaryRouter[id, fullyQualifiedDomainName, datacenter[name]],
523+
hardwareCount, subnetCount, totalPrimaryIpAddressCount, virtualGuestCount,
524+
billingItem[id], tagReferences[tag[name]]
525+
]"""
531526
_filter = utils.NestedDict(_filter or {})
532527

533528
_filter['networkVlans']['id'] = utils.query_filter_orderby()
@@ -542,7 +537,7 @@ def list_vlans(self, datacenter=None, vlan_number=None, name=None, limit=100, ma
542537
_filter['networkVlans']['primaryRouter']['datacenter']['name'] = utils.query_filter(datacenter)
543538

544539
if mask is None:
545-
mask = DEFAULT_VLAN_MASK
540+
mask = vlan_mask
546541

547542
# cf_call uses threads to get all results.
548543
return self.client.cf_call('SoftLayer_Account', 'getNetworkVlans',

0 commit comments

Comments
 (0)