Skip to content

Commit

Permalink
Implement nxos_ssh get_environment (napalm-automation#973)
Browse files Browse the repository at this point in the history
  • Loading branch information
ktbyers authored and bharath-ravindranath committed Jul 1, 2019
1 parent c9fb54d commit 90fffc2
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 0 deletions.
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

0 comments on commit 90fffc2

Please sign in to comment.