Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement nxos_ssh get_environment #973

Merged
merged 8 commits into from Apr 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
73 changes: 73 additions & 0 deletions napalm/nxos_ssh/nxos_ssh.py
Expand Up @@ -763,6 +763,79 @@ def cli(self, commands):
cli_output[py23_compat.text_type(command)] = output
return cli_output

def get_environment(self):
"""
Get environment facts.

power and fan are currently not implemented
cpu is using 1-minute average
"""

environment = {}
# sys_resources contains cpu and mem output
sys_resources = self._send_command("show system resources")
temp_cmd = "show environment temperature"

# cpu
environment.setdefault("cpu", {})
environment["cpu"]["0"] = {}
environment["cpu"]["0"]["%usage"] = -1.0
system_resources_cpu = helpers.textfsm_extractor(
self, "system_resources", sys_resources
)
for cpu in system_resources_cpu:
cpu_dict = {
cpu.get("cpu_id"): {
"%usage": round(100 - float(cpu.get("cpu_idle")), 2)
}
}
environment["cpu"].update(cpu_dict)

# memory
environment.setdefault("memory", {})
for line in sys_resources.splitlines():
# Memory usage: 16401224K total, 4798280K used, 11602944K free
if "Memory usage:" in line:
proc_total_mem, proc_used_mem, _ = line.split(",")
proc_used_mem = re.search(r"\d+", proc_used_mem).group(0)
proc_total_mem = re.search(r"\d+", proc_total_mem).group(0)
break
else:
raise ValueError("Unexpected output from: {}".format(line))
environment["memory"]["used_ram"] = int(proc_used_mem)
environment["memory"]["available_ram"] = int(proc_total_mem)

# temperature
output = self._send_command(temp_cmd)
environment.setdefault("temperature", {})
for line in output.splitlines():
# Module Sensor MajorThresh MinorThres CurTemp Status
# 1 Intake 70 42 28 Ok
if re.match(r"^[0-9]", line):
module, sensor, is_critical, is_alert, temp, _ = line.split()
is_critical = float(is_critical)
is_alert = float(is_alert)
temp = float(temp)
env_value = {
"is_alert": temp >= is_alert,
"is_critical": temp >= is_critical,
"temperature": temp,
}
location = "{0}-{1}".format(sensor, module)
environment["temperature"][location] = env_value

# Initialize 'power' and 'fan' to default values (not implemented)
environment.setdefault("power", {})
environment["power"]["invalid"] = {
"status": True,
"output": -1.0,
"capacity": -1.0,
}
environment.setdefault("fans", {})
environment["fans"]["invalid"] = {"status": True}

return environment

def get_arp_table(self, vrf=""):
"""
Get arp table information.
Expand Down
5 changes: 5 additions & 0 deletions napalm/nxos_ssh/utils/textfsm_templates/system_resources.tpl
@@ -0,0 +1,5 @@
Value CPU_ID (\d+)
Value CPU_IDLE ([0-9]+\.[0-9]+)

Start
^\s+CPU${CPU_ID} states :.*kernel,\s+${CPU_IDLE}% idle -> Record
@@ -0,0 +1,54 @@
{
"power": {
"invalid": {
"status": true,
"output": -1.0,
"capacity": -1.0
}
},
"fans": {
"invalid": {
"status": true
}
},
"cpu": {
"0": {
"%usage": 1.04
},
"1": {
"%usage": 8.43
},
"2": {
"%usage": 1.05
},
"3": {
"%usage": 1.04
}
},
"temperature": {
"Exhaust-1": {
"is_alert": false,
"temperature": 33.0,
"is_critical": false
},
"Intake-1": {
"is_alert": false,
"temperature": 28.0,
"is_critical": false
},
"Davos-1": {
"is_alert": false,
"temperature": 49.0,
"is_critical": false
},
"CPU-1": {
"is_alert": false,
"temperature": 44.0,
"is_critical": false
}
},
"memory": {
"available_ram": 16401224,
"used_ram": 4798280
}
}
@@ -0,0 +1,9 @@
Temperature:
--------------------------------------------------------------------
Module Sensor MajorThresh MinorThres CurTemp Status
(Celsius) (Celsius) (Celsius)
--------------------------------------------------------------------
1 Intake 70 42 28 Ok
1 Exhaust 90 80 33 Ok
1 CPU 100 90 44 Ok
1 Davos 110 90 49 Ok
@@ -0,0 +1,9 @@
Load average: 1 minute: 0.05 5 minutes: 0.07 15 minutes: 0.14
Processes : 627 total, 1 running
CPU states : 2.31% user, 1.28% kernel, 96.39% idle
CPU0 states : 0.00% user, 1.03% kernel, 98.96% idle
CPU1 states : 6.31% user, 2.10% kernel, 91.57% idle
CPU2 states : 1.04% user, 0.00% kernel, 98.95% idle
CPU3 states : 0.00% user, 1.03% kernel, 98.96% idle
Memory usage: 16401224K total, 4798280K used, 11602944K free
Current memory status: OK
@@ -0,0 +1,27 @@
{
"cpu": {
"0": {
"%usage": 15.91
},
"1": {
"%usage": 4.31
}
},
"memory": {
"used_ram": 4176656,
"available_ram": 6096260
},
"temperature": {},
"power": {
"invalid": {
"status": true,
"output": -1.0,
"capacity": -1.0
}
},
"fans": {
"invalid": {
"status": true
}
}
}
@@ -0,0 +1,5 @@
Temperature:
--------------------------------------------------------------------
Module Sensor MajorThresh MinorThres CurTemp Status
(Celsius) (Celsius) (Celsius)
--------------------------------------------------------------------
@@ -0,0 +1,7 @@
Load average: 1 minute: 1.13 5 minutes: 1.22 15 minutes: 1.34
Processes : 635 total, 1 running
CPU states : 1.65% user, 7.73% kernel, 90.60% idle
CPU0 states : 2.27% user, 13.63% kernel, 84.09% idle
CPU1 states : 2.15% user, 2.15% kernel, 95.69% idle
Memory usage: 6096260K total, 4176656K used, 1919604K free
Current memory status: OK