Skip to content

Commit

Permalink
Merge 3044152 into a0f90f2
Browse files Browse the repository at this point in the history
  • Loading branch information
richardtief committed Jun 29, 2021
2 parents a0f90f2 + 3044152 commit 5dcd0ba
Show file tree
Hide file tree
Showing 12 changed files with 192 additions and 55 deletions.
13 changes: 13 additions & 0 deletions BaseCollector.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ def get_nsxt_mgmt_cluster(self, target):
self.nsxt_mgmt_cluster = request.json() if request else {}
return self.nsxt_mgmt_cluster

def get_nsxt_mgmt_nodes(self, target):
self.wait_for_inventory_data()
current_iteration = self.get_iteration()
url = "http://" + os.environ['INVENTORY'] + "/" + target + "/nsxt_mgmt_nodes/{}".format(current_iteration)
request = requests.get(url)
self.nsxt_mgmt_nodes = request.json() if request else {}
return self.nsxt_mgmt_nodes

def get_iteration(self):
request = requests.get(url="http://" + os.environ['INVENTORY'] + "/iteration")
self.iteration = request.json() if request else {}
Expand Down Expand Up @@ -147,6 +155,11 @@ def get_nsxt_mgmt_cluster_by_target(self):
self.target_nsxt_mgmt_cluster = [nsxt_resources_dict[uuid]['uuid'] for uuid in nsxt_resources_dict]
return self.target_nsxt_mgmt_cluster

def get_nsxt_mgmt_nodes_by_target(self):
nsxt_resources_dict = self.get_nsxt_mgmt_nodes(self.target)
self.target_nsxt_mgmt_nodes = [nsxt_resources_dict[uuid]['uuid'] for uuid in nsxt_resources_dict]
return self.target_nsxt_mgmt_nodes

def get_project_ids_by_target(self):
try:
token = self.get_target_tokens()
Expand Down
72 changes: 53 additions & 19 deletions InventoryBuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,11 @@ def vms(target, iteration):

@app.route('/<target>/nsxt_mgmt_cluster/<int:iteration>', methods=['GET'])
def nsxt_mgmt_cluster(target, iteration):
return self.iterated_inventory[str(iteration)]['nsxt_resources'].get(target, {})
return self.iterated_inventory[str(iteration)]['nsxt_mgmt_cluster'].get(target, {})

@app.route('/<target>/nsxt_mgmt_nodes/<int:iteration>', methods=['GET'])
def nsxt_mgmt_nodes(target, iteration):
return self.iterated_inventory[str(iteration)]['nsxt_mgmt_nodes'].get(target, {})

@app.route('/iteration', methods=['GET'])
def iteration():
Expand Down Expand Up @@ -168,13 +172,14 @@ def query_inventory_permanent(self):
self.vrops_collection_times[vrops] = joined_threads[vrops]
logger.info(f"Fetched {vrops} in {joined_threads[vrops]}s")

self.get_vcenters()
self.get_datacenters()
self.get_clusters()
self.get_hosts()
self.get_datastores()
self.get_vms()
self.get_nsxt_mgmt_cluster()
self.expose_vcenters()
self.expose_datacenters()
self.expose_clusters()
self.expose_hosts()
self.expose_datastores()
self.expose_vms()
self.expose_nsxt_mgmt_cluster()
self.expose_nsxt_mgmt_nodes()
if len(self.iterated_inventory[str(self.iteration)]['vcenters']) > 0:
self.successful_iteration_list.append(self.iteration)
else:
Expand Down Expand Up @@ -253,15 +258,21 @@ def create_nsxt_objects(self, target: str, token: str):
nsxt_mgmt_plane.add_adapter(adapter)

nsxt_mgmt_cluster = Vrops.get_nsxt_mgmt_cluster(vrops, target, token, [a.uuid for a in nsxt_adapter])
nsxt_mgmt_nodes = Vrops.get_nsxt_mgmt_nodes(vrops, target, token, [c.uuid for c in nsxt_mgmt_cluster])

for adapter_object in nsxt_mgmt_plane.adapter:
for nsxt_adapter_object in nsxt_mgmt_plane.adapter:
for mgmt_cluster in nsxt_mgmt_cluster:
if mgmt_cluster.parent == adapter_object.uuid:
adapter_object.add_mgmt_cluster(mgmt_cluster)
if mgmt_cluster.parent == nsxt_adapter_object.uuid:
nsxt_adapter_object.add_mgmt_cluster(mgmt_cluster)
logger.debug(f'Collecting NSX-T management cluster: {mgmt_cluster.name}')
for mgmt_cluster_object in nsxt_adapter_object.management_cluster:
for mgmt_node in nsxt_mgmt_nodes:
mgmt_cluster_object.add_mgmt_node(mgmt_node)
logger.debug(f'Collecting NSX-T management node: {mgmt_node.name}')

return nsxt_mgmt_plane

def get_vcenters(self) -> dict:
def expose_vcenters(self) -> dict:
tree = dict()
for vcenter_entry in self.vcenter_dict:
vcenter = self.vcenter_dict[vcenter_entry]
Expand All @@ -281,7 +292,7 @@ def get_vcenters(self) -> dict:
self.iterated_inventory[str(self.iteration)]['vcenters'] = tree
return tree

def get_datacenters(self) -> dict:
def expose_datacenters(self) -> dict:
tree = dict()
for vcenter_entry in self.vcenter_dict:
vcenter = self.vcenter_dict[vcenter_entry]
Expand All @@ -301,7 +312,7 @@ def get_datacenters(self) -> dict:
self.iterated_inventory[str(self.iteration)]['datacenters'] = tree
return tree

def get_datastores(self) -> dict:
def expose_datastores(self) -> dict:
tree = dict()
for vcenter_entry in self.vcenter_dict:
vcenter = self.vcenter_dict[vcenter_entry]
Expand All @@ -323,7 +334,7 @@ def get_datastores(self) -> dict:
self.iterated_inventory[str(self.iteration)]['datastores'] = tree
return tree

def get_clusters(self) -> dict:
def expose_clusters(self) -> dict:
tree = dict()
for vcenter_entry in self.vcenter_dict:
vcenter = self.vcenter_dict[vcenter_entry]
Expand All @@ -344,7 +355,7 @@ def get_clusters(self) -> dict:
self.iterated_inventory[str(self.iteration)]['clusters'] = tree
return tree

def get_hosts(self) -> dict:
def expose_hosts(self) -> dict:
tree = dict()
for vcenter_entry in self.vcenter_dict:
vcenter = self.vcenter_dict[vcenter_entry]
Expand All @@ -367,7 +378,7 @@ def get_hosts(self) -> dict:
self.iterated_inventory[str(self.iteration)]['hosts'] = tree
return tree

def get_vms(self) -> dict:
def expose_vms(self) -> dict:
tree = dict()
for vcenter_entry in self.vcenter_dict:
vcenter = self.vcenter_dict[vcenter_entry]
Expand All @@ -392,7 +403,7 @@ def get_vms(self) -> dict:
self.iterated_inventory[str(self.iteration)]['vms'] = tree
return tree

def get_nsxt_mgmt_cluster(self) -> dict:
def expose_nsxt_mgmt_cluster(self) -> dict:
tree = dict()
for nsxt_entry in self.nsxt_dict:
nsxt_mgmt_plane = self.nsxt_dict[nsxt_entry]
Expand All @@ -409,5 +420,28 @@ def get_nsxt_mgmt_cluster(self) -> dict:
'target': nsxt_mgmt_plane.target,
'token': nsxt_mgmt_plane.token,
}
self.iterated_inventory[str(self.iteration)]['nsxt_resources'] = tree
self.iterated_inventory[str(self.iteration)]['nsxt_mgmt_cluster'] = tree
return tree

def expose_nsxt_mgmt_nodes(self) -> dict:
tree = dict()
for nsxt_entry in self.nsxt_dict:
nsxt_mgmt_plane = self.nsxt_dict[nsxt_entry]
if not nsxt_mgmt_plane:
continue
tree[nsxt_mgmt_plane.target] = dict()
for nsxt_adapter in nsxt_mgmt_plane.adapter:
for mgmt_cluster in nsxt_adapter.management_cluster:
for mgmt_node in mgmt_cluster.management_nodes:
tree[nsxt_mgmt_plane.target][mgmt_node.uuid] = {
'uuid': mgmt_node.uuid,
'name': mgmt_node.name,
'mgmt_cluster_name': mgmt_cluster.name,
'mgmt_cluster_uuid': mgmt_cluster.uuid,
'nsxt_adapter_name': nsxt_adapter.name,
'nsxt_adapter_uuid': nsxt_adapter.uuid,
'target': nsxt_mgmt_plane.target,
'token': nsxt_mgmt_plane.token,
}
self.iterated_inventory[str(self.iteration)]['nsxt_mgmt_nodes'] = tree
return tree
2 changes: 1 addition & 1 deletion collectors/NSXTMmgtClusterPropertiesCollector.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class NSXTMmgtClusterPropertiesCollector(PropertiesCollector):

def __init__(self):
super().__init__()
self.vrops_entity_name = 'nsxt'
self.vrops_entity_name = 'nsxt_mgmt_cluster'
self.label_names = ['nsxt_mgmt_cluster', 'nsxt_adapter']

def get_resource_uuids(self):
Expand Down
2 changes: 1 addition & 1 deletion collectors/NSXTMmgtClusterStatsCollector.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class NSXTMmgtClusterStatsCollector(StatsCollector):

def __init__(self):
super().__init__()
self.vrops_entity_name = 'nsxt'
self.vrops_entity_name = 'nsxt_mgmt_cluster'
self.label_names = ['nsxt_mgmt_cluster', 'nsxt_adapter']

def get_resource_uuids(self):
Expand Down
17 changes: 17 additions & 0 deletions collectors/NSXTMmgtNodePropertiesCollector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from collectors.PropertiesCollector import PropertiesCollector


class NSXTMmgtNodePropertiesCollector(PropertiesCollector):

def __init__(self):
super().__init__()
self.vrops_entity_name = 'nsxt_mgmt_node'
self.label_names = ['nsxt_mgmt_cluster', 'nsxt_adapter', 'nsxt_mgmt_node']

def get_resource_uuids(self):
return self.get_nsxt_mgmt_nodes_by_target()

def set_labels(self, resource_id, project_ids):
return [self.nsxt_mgmt_nodes[resource_id]['mgmt_cluster_name'],
self.nsxt_mgmt_nodes[resource_id]['nsxt_adapter_name'],
self.nsxt_mgmt_nodes[resource_id]['name']] if resource_id else []
17 changes: 17 additions & 0 deletions collectors/NSXTMmgtNodeStatsCollector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from collectors.StatsCollector import StatsCollector


class NSXTMmgtNodeStatsCollector(StatsCollector):

def __init__(self):
super().__init__()
self.vrops_entity_name = 'nsxt_mgmt_node'
self.label_names = ['nsxt_mgmt_cluster', 'nsxt_adapter', 'nsxt_mgmt_node']

def get_resource_uuids(self):
return self.get_nsxt_mgmt_nodes_by_target()

def set_labels(self, resource_id, project_ids):
return [self.nsxt_mgmt_nodes[resource_id]['mgmt_cluster_name'],
self.nsxt_mgmt_nodes[resource_id]['nsxt_adapter_name'],
self.nsxt_mgmt_nodes[resource_id]['name']] if resource_id else []
2 changes: 1 addition & 1 deletion collectors/StatsCollector.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def collect(self):
for value_entry in resource.get('stat-list', {}).get('stat', []):
statkey = value_entry.get('statKey', {}).get('key')
# Normalisation of keys retrieved from API (e.g. cpu:102|usage_average -> cpu|usage_average)
norm_statkey = re.sub("[^a-zA-Z|_ ]+", "", statkey)
norm_statkey = re.sub("[^a-zA-Z|_ -]+", "", statkey)
values_received.add(norm_statkey)

metric_data = value_entry.get('data', [0])[0]
Expand Down
9 changes: 9 additions & 0 deletions resources/Resourceskinds.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,13 @@ def add_mgmt_cluster(self, mgmt_cluster):


class NSXTManagementCluster:

def __init__(self):
self.management_nodes = list()

def add_mgmt_node(self, mgmt_node):
self.management_nodes.append(mgmt_node)


class NSXTManagementNode:
pass
39 changes: 27 additions & 12 deletions tests/TestCollectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,30 @@ def test_collector_metrics(self):
Vrops.get_nsxt_adapter = MagicMock(return_value=([nsxt_adapter1, nsxt_adapter2]))

# test tool get_resources to create resource objects
nsxt1 = NSXTManagementCluster()
nsxt2 = NSXTManagementCluster()
nsxt3 = NSXTManagementCluster()
nsxt1.name = "nsxt_mgmt_cluster1"
nsxt2.name = "nsxt_mgmt_cluster2"
nsxt3.name = "nsxt_mgmt_cluster3"
nsxt1.uuid = "5628-9ba1-55e847050815"
nsxt2.uuid = "3628-93a1-56e84634050814"
nsxt3.uuid = "7422-91h7-52s842060815"
nsxt1.resourcekind = nsxt2.resourcekind = nsxt3.resourcekind = "ManagementCluster"
nsxt1.parent = nsxt2.parent = nsxt3.parent = "3628-93a1-56e84634050814"
nsxt_mgmt_cluster1 = NSXTManagementCluster()
nsxt_mgmt_cluster2 = NSXTManagementCluster()
nsxt_mgmt_cluster3 = NSXTManagementCluster()
nsxt_mgmt_cluster1.name = "nsxt_mgmt_cluster1"
nsxt_mgmt_cluster2.name = "nsxt_mgmt_cluster2"
nsxt_mgmt_cluster3.name = "nsxt_mgmt_cluster3"
nsxt_mgmt_cluster1.uuid = "5628-9ba1-55e847050815"
nsxt_mgmt_cluster2.uuid = "3628-93a1-56e84634050814"
nsxt_mgmt_cluster3.uuid = "7422-91h7-52s842060815"
nsxt_mgmt_cluster1.resourcekind = nsxt_mgmt_cluster2.resourcekind = \
nsxt_mgmt_cluster3.resourcekind = "ManagementCluster"
nsxt_mgmt_cluster1.parent = nsxt_mgmt_cluster2.parent = nsxt_mgmt_cluster3.parent = "3628-93a1-56e84634050814"

nsxt_mgmt_node1 = NSXTManagementNode()
nsxt_mgmt_node2 = NSXTManagementNode()
nsxt_mgmt_node3 = NSXTManagementNode()
nsxt_mgmt_node1.name = "nsxt_mgmt_node1"
nsxt_mgmt_node2.name = "nsxt_mgmt_node2"
nsxt_mgmt_node3.name = "nsxt_mgmt_node3"
nsxt_mgmt_node1.uuid = "5628-9ba1-55e847050815"
nsxt_mgmt_node2.uuid = "3628-93a1-56e84634050814"
nsxt_mgmt_node3.uuid = "7422-91h7-52s842060815"
nsxt_mgmt_node1.resourcekind = nsxt_mgmt_node2.resourcekind = nsxt_mgmt_node3.resourcekind = "ManagementNode"
nsxt_mgmt_node1.parent = nsxt_mgmt_node2.parent = nsxt_mgmt_node3.parent = "3628-93a1-56e84634050814"

dc1 = Datacenter()
dc2 = Datacenter()
Expand Down Expand Up @@ -131,7 +144,9 @@ def test_collector_metrics(self):
vm1.parent = vm2.parent = vm3.parent = "7422-91h7-52s842060815"

Vrops.get_nsxt_mgmt_cluster = MagicMock(
return_value=[nsxt1, nsxt2, nsxt3])
return_value=[nsxt_mgmt_cluster1, nsxt_mgmt_cluster2, nsxt_mgmt_cluster3])
Vrops.get_nsxt_mgmt_nodes = MagicMock(
return_value=[nsxt_mgmt_node1, nsxt_mgmt_node2, nsxt_mgmt_node3])
Vrops.get_datacenter = MagicMock(
return_value=[dc1, dc2, dc3])
Vrops.get_cluster = MagicMock(
Expand Down
14 changes: 14 additions & 0 deletions tests/collector_config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
default_collectors:
- 'NSXTMmgtClusterStatsCollector'
- 'NSXTMmgtClusterPropertiesCollector'
- 'NSXTMmgtNodeStatsCollector'
- 'NSXTMmgtNodePropertiesCollector'
- 'ClusterStatsCollector'
- 'ClusterPropertiesCollector'
- 'DatastoreStatsCollector'
Expand Down Expand Up @@ -378,3 +380,15 @@ NSXTMmgtClusterPropertiesCollector:
- metric_suffix: "controller_cluster_connectivity_status"
expected: "STABLE"
key: "ConnectivityStatus|ClusterStatus|ControllerClusterStatusProperty"

NSXTMmgtNodeStatsCollector:
- metric_suffix: "memory_used"
key: "Memory|Used"
- metric_suffix: "memory_total"
key: "Memory|Total"

NSXTMmgtNodePropertiesCollector:
- metric_suffix: "version"
key: "NSXTManagerNodeVersion"
- metric_suffix: "connectivity_status"
key: "ConnectivityStatus|ManagerConnectivityProperty"
Loading

0 comments on commit 5dcd0ba

Please sign in to comment.