-
-
Notifications
You must be signed in to change notification settings - Fork 61
/
list_networks.rb
122 lines (108 loc) · 4.16 KB
/
list_networks.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
module Fog
module Vsphere
class Compute
class Real
def list_networks(filters = {})
datacenter_name = filters[:datacenter]
cluster_name = filters.fetch(:cluster, nil)
# default to show all networks
only_active = filters[:accessible] || false
dc = find_raw_datacenter(datacenter_name)
results = property_collector_results(network_filter_spec(dc))
dvswitches = results.select { |result| result.obj.is_a?(RbVmomi::VIM::DistributedVirtualSwitch) }.each_with_object({}) do |dvswitch, obj|
obj[dvswitch.obj._ref] = dvswitch['summary.name']
end
if cluster_name
cluster = get_raw_cluster(cluster_name, datacenter_name)
cluster_networks = cluster.network.map(&:_ref)
end
results.select { |result| result.obj.is_a?(RbVmomi::VIM::DistributedVirtualPortgroup) || result.obj.is_a?(RbVmomi::VIM::Network) }.map do |network|
next if cluster_name && !cluster_networks.include?(network.obj._ref)
next if only_active && !network['summary.accessible']
if network.obj.is_a?(RbVmomi::VIM::DistributedVirtualPortgroup)
map_attrs_to_hash(network, network_dvportgroup_attribute_mapping).merge(
vlanid: raw_network_vlan(network['config.defaultPortConfig']),
virtualswitch: dvswitches[network['config.distributedVirtualSwitch']._ref]
)
elsif network.obj.is_a?(RbVmomi::VIM::OpaqueNetwork)
map_attrs_to_hash(network, network_attribute_mapping).merge(
opaqueNetworkId: network.obj.summary.opaqueNetworkId
)
else
map_attrs_to_hash(network, network_attribute_mapping)
end.merge(
_ref: network.obj._ref,
id: managed_obj_id(network.obj),
datacenter: datacenter_name
)
end.compact
end
protected
def network_attribute_mapping
{
name: 'name',
accessible: 'summary.accessible'
}
end
def network_dvportgroup_attribute_mapping
network_attribute_mapping.merge(
dvp_uuid: 'config.key'
)
end
def folder_traversal_spec
RbVmomi::VIM.TraversalSpec(
name: 'FolderTraversalSpec',
type: 'Folder',
path: 'childEntity',
skip: false,
selectSet: [
RbVmomi::VIM.SelectionSpec(name: 'FolderTraversalSpec')
]
)
end
def network_filter_spec(obj)
RbVmomi::VIM.PropertyFilterSpec(
objectSet: [
obj: obj.networkFolder,
skip: true,
selectSet: [
folder_traversal_spec
]
],
propSet: [
{ type: 'DistributedVirtualSwitch', pathSet: ['summary.name'] },
{ type: 'Network', pathSet: network_attribute_mapping.values },
{ type: 'DistributedVirtualPortgroup', pathSet: network_dvportgroup_attribute_mapping.values + ['config.defaultPortConfig', 'config.distributedVirtualSwitch'] }
]
)
end
private
def raw_network_vlan(network)
case network
when RbVmomi::VIM::VMwareDVSPortSetting
raw_network_vlan_id(network.vlan)
end
end
def raw_network_vlan_id(vlan)
case vlan
when RbVmomi::VIM::VmwareDistributedVirtualSwitchVlanIdSpec
vlan.vlanId
end
end
end
class Mock
def list_networks(filters)
datacenter_name = filters[:datacenter]
cluster_name = filters.fetch(:cluster, nil)
if cluster_name.nil?
data[:networks].values.select { |d| d['datacenter'] == datacenter_name } ||
raise(Fog::Vsphere::Compute::NotFound)
else
data[:networks].values.select { |d| d['datacenter'] == datacenter_name && d['cluster'].include?(cluster_name) } ||
raise(Fog::Vsphere::Compute::NotFound)
end
end
end
end
end
end