Skip to main content

Healthbot Python Client

Project description

Documentation Status UnitTest Status

HealthBot Python Client

This repo contains a Python package to control HealthBot

The purpose of this package is to provide a Python library that automates the provisioning of the HealthBot server.

Examples

Import HbEZ library

from jnpr.healthbot import HealthBotClient
from pprint import pprint

Opening connection

hb = HealthBotClient('xx.xx.xx.xxx', 'xxxxx', 'xxxxx', port=nnnn)
hb.open()

using Python withcontext manager

  • Takes care of login and logout with access tokens
with HealthBotClient('xx.xx.xx.xxx', 'xxxxx', 'xxxxx', port=nnnn) as hb:
    pprint(hb.device.get_ids())

Use Case: Device

pprint(hb.device.get_ids())
['edge', 'srx', 'qfx', 'mx-edge', 'core', 'node', 'demo']

Getting help for any given function

help(hb.device.get_ids)
Help on method get_ids in module jnpr.healthbot.modules.devices:

get_ids() method of jnpr.healthbot.modules.devices.Device instance
    Return Device IDs for all the devices in HealthBot system

    :return: list of device IDs

    Example:
    ::

        from jnpr.healthbot import HealthBotClient
        hb = HealthBotClient('xx.xxx.x.xx', 'xxxx', 'xxxx', port=nnnn)
        print(hb.device.get_ids())

Get config related to given device-id

# Get config related to given device-id
obj = hb.device.get('demo')
obj.host
'xx.xxx.x.xx'
pprint(obj)
{'authentication': {'password': {'password': 'xxx',
                                 'username': 'xxxx'}},
 'description': None,
 'device_id': 'demo',
 'host': 'xx.xxx.x.xx',
 'i_agent': None,
 'open_config': None,
 'snmp': None,
 'system_id': 'test:HbEZ',
 'variable': None,
 'vendor': None}

get facts for the given device id

# Get device facts of a given device id
pprint(hb.device.get_facts('demo'))
{'device-id': 'demo',
 'facts': {'fpc': [],
           'hostname': 'R1_re0',
           'junos-info': [{'last-reboot-reason': 'Router rebooted after a '
                                                 'normal shutdown.',
                           'mastership-state': 'master',
                           'model': 'RE-VMX',
                           'name': 're0',
                           'status': 'OK',
                           'up-time': '98 days, 3 minutes, 49 seconds',
                           'version-info': {'build': '0',
                                            'major': [19, 3],
                                            'minor': ['20190421_dev_common'],
                                            'type': 'I'}}],
           'platform': 'MX960',
           'platform-info': [{'name': 're0', 'platform': 'MX960'}],
           'product': 'MX',
           'release': '19.3-20190421_dev_common.0.84473',
           'serial-number': 'xxxx'}}

Add a new device

from jnpr.healthbot import DeviceSchema

ds = DeviceSchema(device_id='demo', host='xx.xxx.x.xx',
                  authentication={"password": {"password": "xxxx", "username": "xxxx"}})
print(hb.device.add(schema=ds))
True
help(DeviceSchema)
Help on class DeviceSchema in module jnpr.healthbot.swagger.models.device_schema:

class DeviceSchema(builtins.object)
 |  NOTE: This class is auto generated by the swagger code generator program.
 |  
 |  Do not edit the class manually.
 |  
 |  Methods defined here:
 |  
 |  __eq__(self, other)
 |      Returns true if both objects are equal
 |  
 |  __init__(self, authentication=None, description=None, device_id=None, host=None, i_agent=None, open_config=None, snmp=None, system_id=None, variable=None, vendor=None)
 |      DeviceSchema - a model defined in Swagger
 |  
 |  __ne__(self, other)
 |      Returns true if both objects are not equal
 |  
 |  __repr__(self)
 |      For `print` and `pprint`
 |  
 |  to_dict(self)
 |      Returns the model properties as a dict
 |  
 |  to_str(self)
 |      Returns the string representation of the model
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
 |  
 |  authentication
 |      Gets the authentication of this DeviceSchema.  # noqa: E501
 |      
 |      
 |      :return: The authentication of this DeviceSchema.  # noqa: E501
 |      :rtype: DeviceSchemaAuthentication
 |  
 |  description
 |      Gets the description of this DeviceSchema.  # noqa: E501
 |      
 |      Description about the device  # noqa: E501
 |      
 |      :return: The description of this DeviceSchema.  # noqa: E501
 |      :rtype: str
 |  
 |  device_id
 |      Gets the device_id of this DeviceSchema.  # noqa: E501
 |      
 |      Identifier for the device. Should be of pattern [a-zA-Z][a-zA-Z0-9_-]*  # noqa: E501
 |      
 |      :return: The device_id of this DeviceSchema.  # noqa: E501
 |      :rtype: str
 |  
 |  host
 |      Gets the host of this DeviceSchema.  # noqa: E501
 |      
 |      Name or IP the device  # noqa: E501
 |      
 |      :return: The host of this DeviceSchema.  # noqa: E501
 |      :rtype: str
 |  
 |  i_agent
 |      Gets the i_agent of this DeviceSchema.  # noqa: E501
 |      
 |      
 |      :return: The i_agent of this DeviceSchema.  # noqa: E501
 |      :rtype: DeviceSchemaIAgent
 |  
 |  open_config
 |      Gets the open_config of this DeviceSchema.  # noqa: E501
 |      
 |      
 |      :return: The open_config of this DeviceSchema.  # noqa: E501
 |      :rtype: DeviceSchemaOpenconfig
 |  
 |  snmp
 |      Gets the snmp of this DeviceSchema.  # noqa: E501
 |      
 |      
 |      :return: The snmp of this DeviceSchema.  # noqa: E501
 |      :rtype: DeviceSchemaSnmp
 |  
 |  system_id
 |      Gets the system_id of this DeviceSchema.  # noqa: E501
 |      
 |      ID which is sent in the JTI UDP messages  # noqa: E501
 |      
 |      :return: The system_id of this DeviceSchema.  # noqa: E501
 |      :rtype: str
 |  
 |  variable
 |      Gets the variable of this DeviceSchema.  # noqa: E501
 |      
 |      Playbook variable configuration  # noqa: E501
 |      
 |      :return: The variable of this DeviceSchema.  # noqa: E501
 |      :rtype: list[DeviceSchemaVariable]
 |  
 |  vendor
 |      Gets the vendor of this DeviceSchema.  # noqa: E501
 |      
 |      
 |      :return: The vendor of this DeviceSchema.  # noqa: E501
 |      :rtype: DeviceSchemaVendor
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __hash__ = None
 |  
 |  attribute_map = {'authentication': 'authentication', 'description': 'd...
 |  
 |  swagger_types = {'authentication': 'DeviceSchemaAuthentication', 'desc...
dev = hb.device.get('demo')
pprint(dev)
{'authentication': {'password': {'password': 'xxxx',
                                 'username': 'xxxx'}},
 'description': None,
 'device_id': 'demo',
 'host': 'xx.xxx.x.xx',
 'i_agent': None,
 'open_config': None,
 'snmp': None,
 'system_id': None,
 'variable': None,
 'vendor': None}

By default, get() returns uncommited data (from candidate DB)

pprint(hb.device.get('demo', uncommitted=False))
{
  "detail": "Device id demo not found",
  "status": 404
}




---------------------------------------------------------------------------

HTTPError                                 Traceback (most recent call last)

<ipython-input-25-13c8b67cdb5c> in <module>
----> 1 pprint(hb.device.get('demo', uncommitted=False))


~/Coding/git.juniper.net.iceberg/healthbot-py-client/lib/jnpr/healthbot/modules/devices.py in get(self, device_id, uncommitted)
    217             if response.status_code != 200:
    218                 logger.error(response.text)
--> 219             response.raise_for_status()
    220             return self.hbot._create_schema(response, DeviceSchema)
    221         else:


/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/models.py in raise_for_status(self)
    933 
    934         if http_error_msg:
--> 935             raise HTTPError(http_error_msg, response=self)
    936 
    937     def close(self):


HTTPError: 404 Client Error: NOT FOUND for url: https://10.209.7.33:8080/api/v1/device/demo

Why we choose to go with Schema. We can easily access and edit any attribute.

# Existing system_id
print (dev.system_id)
None
# Editing system_id
dev.system_id = "Demo:HbEZ"
print(hb.device.update(dev))
True

HealthBot API provide commit and rollback config

hb.commit()
True
dev = hb.device.get('demo')
pprint(dev)
{'authentication': {'password': {'password': 'xxxx',
                                 'username': 'xxxx'}},
 'description': None,
 'device_id': 'demo',
 'host': 'xx.xxx.x.xx',
 'i_agent': None,
 'open_config': None,
 'snmp': None,
 'system_id': 'Demo:HbEZ',
 'variable': None,
 'vendor': None}
print(dev.system_id)
Demo:HbEZ
# To delete a device
hb.device.delete('demo')

# if a device is part of device group, to make sure we delete it first from device group
hb.device.delete('demo', force=True)

Use Case: Devices

Get details of all devices in System

# Get config details of all the device
obj = hb.device.get()
obj
[{'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'xxxx',
  'host': 'xx.xxx.x.xx',
  'i_agent': None,
  'open_config': {'port': 32767},
  'snmp': None,
  'system_id': None,
  'variable': [],
  'vendor': {'juniper': {'operating-system': 'junos'}}},
 {'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'xxx',
  'host': 'xx.xxx.x.xx9',
  'i_agent': {'port': 830},
  'open_config': {'port': 32767},
  'snmp': None,
  'system_id': None,
  'variable': [],
  'vendor': {'juniper': {'operating-system': 'junos'}}},
 {'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'xxx',
  'host': 'xx.xxx.x.xx',
  'i_agent': {'port': 830},
  'open_config': {'port': 32767},
  'snmp': None,
  'system_id': 'changed description',
  'variable': [],
  'vendor': {'juniper': {'operating-system': 'junos'}}},
 {'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'demo',
  'host': 'xx.xxx.x.xx',
  'i_agent': None,
  'open_config': None,
  'snmp': None,
  'system_id': 'Demo:HbEZ',
  'variable': None,
  'vendor': None},
 {'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'vmx_db',
  'host': 'xx.xxx.x.xx',
  'i_agent': {'port': 830},
  'open_config': {'port': 32767},
  'snmp': None,
  'system_id': None,
  'variable': [],
  'vendor': {'juniper': {'operating-system': 'junos'}}},
 {'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'core_db',
  'host': 'xx.xxx.x.xx',
  'i_agent': {'port': 830},
  'open_config': {'port': 32767},
  'snmp': None,
  'system_id': None,
  'variable': [],
  'vendor': {'juniper': {'operating-system': 'junos'}}},
 {'authentication': {'password': {'password': 'xxxx',
                                  'username': 'xxxx'}},
  'description': None,
  'device_id': 'node1',
  'host': 'node1',
  'i_agent': None,
  'open_config': {'port': 32767},
  'snmp': None,
  'system_id': None,
  'variable': None,
  'vendor': {'juniper': {'operating-system': 'junos'}}}]

Get device facts for all the devices in HB

pprint(hb.device.get_facts())
[{'device-id': 'edge', 'facts': {}},
 {'device-id': 'EVO',
  'facts': {'fpc': [{'description': 'FPC-JNP10003-LOGICAL',
                     'model-number': None,
                     'name': 'FPC 1',
                     'part-number': 'BUILTIN',
                     'serial-number': 'BUILTIN',
                     'version': None}],
            'hostname': None,
            'junos-info': [{'last-reboot-reason': 'Unknown',
                            'mastership-state': 'Master',
                            'model': 'Control Board',
                            'name': 're0',
                            'status': 'OK',
                            'up-time': '0 second',
                            'version-info': {'build': None,
                                             'major': [19, 4],
                                             'minor': ['20190731122440-EVO_soumikd'],
                                             'type': 'I'}}],
            'platform': 'PTX10003-160C',
            'platform-info': [{'name': 're0', 'platform': 'PTX10003-160C'}],
            'product': 'PTX',
            'release': '19.4I20190731122440-EVO_soumikd',
            'serial-number': 'xxxx'}},
 {'device-id': 'vmx',
  'facts': {'fpc': [],
            'hostname': 'R1_re0',
            'junos-info': [{'last-reboot-reason': 'Router rebooted after a '
                                                  'normal shutdown.',
                            'mastership-state': 'master',
                            'model': 'RE-VMX',
                            'name': 're0',
                            'status': 'OK',
                            'up-time': '80 days, 1 hour, 20 minutes, 9 seconds',
                            'version-info': {'build': '0',
                                             'major': [19, 3],
                                             'minor': ['20190421_dev_common'],
                                             'type': 'I'}}],
            'platform': 'MX960',
            'platform-info': [{'name': 're0', 'platform': 'MX960'}],
            'product': 'MX',
            'release': '19.3-20190421_dev_common.0.84473',
            'serial-number': 'xxxx'}},
 {'device-id': 'demo',
  'facts': {'fpc': [],
            'hostname': 'R1_re0',
            'junos-info': [{'last-reboot-reason': 'Router rebooted after a '
                                                  'normal shutdown.',
                            'mastership-state': 'master',
                            'model': 'RE-VMX',
                            'name': 're0',
                            'status': 'OK',
                            'up-time': '98 days, 38 minutes, 25 seconds',
                            'version-info': {'build': '0',
                                             'major': [19, 3],
                                             'minor': ['20190421_dev_common'],
                                             'type': 'I'}}],
            'platform': 'MX960',
            'platform-info': [{'name': 're0', 'platform': 'MX960'}],
            'product': 'MX',
            'release': '19.3-20190421_dev_common.0.84473',
            'serial-number': 'xxxx'}},
 {'device-id': 'vmx_db',
  'facts': {'hostname': 'riad001-g',
            'junos-info': [],
            'platform': 'MX480',
            'platform-info': [{'name': 're0', 'platform': 'MX480'}],
            'product': None,
            'release': '19.4I20190809_0730_madhus',
            'serial-number': None}},
 {'device-id': 'core_db',
  'facts': {'fpc': [{'description': 'MPC Type 2 3D',
                     'model-number': 'MX-MPC2-3D',
                     'name': 'FPC 1',
                     'part-number': '750-031089',
                     'serial-number': 'xxxx',
                     'version': 'REV 31'}],
            'hostname': 'choc-mx480-b',
            'junos-info': [{'last-reboot-reason': 'Router rebooted after a '
                                                  'normal shutdown.',
                            'mastership-state': 'master',
                            'model': 'RE-S-2000',
                            'name': 're0',
                            'status': 'OK',
                            'up-time': '5 hours, 27 minutes, 15 seconds',
                            'version-info': {'build': None,
                                             'major': [19, 4],
                                             'minor': ['20190809_0730_madhus'],
                                             'type': 'I'}},
                           {'last-reboot-reason': '0x1:power cycle/failure',
                            'mastership-state': 'backup',
                            'model': 'RE-S-2000',
                            'name': 're1',
                            'status': 'OK',
                            'up-time': '14 days, 22 hours, 34 minutes, 13 '
                                       'seconds',
                            'version-info': {'build': 7,
                                             'major': [15, 1],
                                             'minor': ['6'],
                                             'type': 'R'}}],
            'platform': 'MX480',
            'platform-info': [{'name': 're0', 'platform': 'MX480'},
                              {'name': 're1', 'platform': 'MX480'}],
            'product': 'MX',
            'release': '19.4I20190809_0730_madhus',
            'serial-number': 'xxxx'}},
 {'device-id': 'node1', 'facts': {}}]

Add device group using DevicegroupSchema and APIs provided

from jnpr.healthbot import DeviceGroupSchema
dgs = DeviceGroupSchema(device_group_name="edge", devices=['demo'])

We can also set any param/attribute after creating schema object

dgs.description="All devices on the edge"

Now add device group using provided API

print(hb.device_group.add(dgs))
True

Let see whats the plus point of using Schema

 1> Helps with any missing paramters
 2> Checks for any rule associated with given params
# Error for missing mandatory parameters

dgs = DeviceGroupSchema()
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-39-4d61d231fd38> in <module>
      1 # Error for missing mandatory parameters
      2 
----> 3 dgs = DeviceGroupSchema()


~/Coding/git.juniper.net.iceberg/healthbot-py-client/lib/jnpr/healthbot/swagger/models/device_group_schema.py in __init__(self, authentication, description, device_group_name, devices, logging, native_gpb, notification, playbooks, reports, retention_policy, variable)
     85         if description is not None:
     86             self.description = description
---> 87         self.device_group_name = device_group_name
     88         if devices is not None:
     89             self.devices = devices


~/Coding/git.juniper.net.iceberg/healthbot-py-client/lib/jnpr/healthbot/swagger/models/device_group_schema.py in device_group_name(self, device_group_name)
    168         """
    169         if device_group_name is None:
--> 170             raise ValueError("Invalid value for `device_group_name`, must not be `None`")  # noqa: E501
    171         if device_group_name is not None and len(device_group_name) > 64:
    172             raise ValueError("Invalid value for `device_group_name`, length must be less than or equal to `64`")  # noqa: E501


ValueError: Invalid value for `device_group_name`, must not be `None`
# Error for not following rule for give parameter

dgs = DeviceGroupSchema(device_group_name="edge group")
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-40-8617b5d8e365> in <module>
      1 # Error for not following rule for give parameter
      2 
----> 3 dgs = DeviceGroupSchema(device_group_name="edge group")


~/Coding/git.juniper.net.iceberg/healthbot-py-client/lib/jnpr/healthbot/swagger/models/device_group_schema.py in __init__(self, authentication, description, device_group_name, devices, logging, native_gpb, notification, playbooks, reports, retention_policy, variable)
     85         if description is not None:
     86             self.description = description
---> 87         self.device_group_name = device_group_name
     88         if devices is not None:
     89             self.devices = devices


~/Coding/git.juniper.net.iceberg/healthbot-py-client/lib/jnpr/healthbot/swagger/models/device_group_schema.py in device_group_name(self, device_group_name)
    172             raise ValueError("Invalid value for `device_group_name`, length must be less than or equal to `64`")  # noqa: E501
    173         if device_group_name is not None and not re.search('^[a-zA-Z][a-zA-Z0-9_-]*$', device_group_name):  # noqa: E501
--> 174             raise ValueError("Invalid value for `device_group_name`, must be a follow pattern or equal to `/^[a-zA-Z][a-zA-Z0-9_-]*$/`")  # noqa: E501
    175 
    176         self._device_group_name = device_group_name


ValueError: Invalid value for `device_group_name`, must be a follow pattern or equal to `/^[a-zA-Z][a-zA-Z0-9_-]*$/`
# Now we are in compliance with rules

dgs = DeviceGroupSchema(device_group_name="edge")
dgs.devices = ['demo']

We can also pass all Schema params to add_ APIs, internally it will use these params to create Schema

print(hb.device_group.add(device_group_name="edge", description="All devices on the edge", devices=['demo']))
hb.commit()
True





True
# Get details for a given device group
hb.device_group.get('real')
{'authentication': None,
 'description': None,
 'device_group_name': 'real',
 'devices': ['edge'],
 'logging': None,
 'native_gpb': None,
 'notification': {},
 'playbooks': ['phyport'],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1563348601},
               'instance-id': 'ge-1-0-0',
               'playbook': 'phyport',
               'rule': 'external/interface-info',
               'variable-value': [{'name': 'interface_name',
                                   'value': 'ge-1/0/0'}]},
              {'@': {'changed-seconds': 1563348601},
               'instance-id': 'ge-1-0-1',
               'playbook': 'phyport',
               'rule': 'external/interface-info',
               'variable-value': [{'name': 'interface_name',
                                   'value': 'ge-1/0/1'}]}]}
hb.device_group.delete('edge', force=True)
True

Add an existing device to existing group

hb.device_group.add_device_in_group('vmx', 'edge')
True
obj = hb.device_group.get('edge')
print (obj)
{'authentication': None,
 'description': 'All devices on the edge',
 'device_group_name': 'edge',
 'devices': ['vmx', 'demo'],
 'logging': {'log-level': 'warn'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1565668543},
               'instance-id': 'HbEZ-instance',
               'playbook': 'forwarding-table-summary',
               'rule': 'protocol.routesummary/check-fib-summary'},
              {'@': {'changed-seconds': 1565669467},
               'instance-id': 'HbEZ-instance',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics'}]}
obj.devices
['vmx', 'demo']

Get details of all the device groups

print(hb.device_group.get())
[{'authentication': None,
 'description': None,
 'device_group_name': 'real',
 'devices': ['edge'],
 'logging': None,
 'native_gpb': None,
 'notification': {},
 'playbooks': ['phyport'],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1563348601},
               'instance-id': 'ge-1-0-0',
               'playbook': 'phyport',
               'rule': 'external/interface-info',
               'variable-value': [{'name': 'interface_name',
                                   'value': 'ge-1/0/0'}]},
              {'@': {'changed-seconds': 1563348601},
               'instance-id': 'ge-1-0-1',
               'playbook': 'phyport',
               'rule': 'external/interface-info',
               'variable-value': [{'name': 'interface_name',
                                   'value': 'ge-1/0/1'}]}]}, {'authentication': None,
 'description': 'UBS Demo',
 'device_group_name': 'QFabric',
 'devices': ['node1'],
 'logging': None,
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': []}, {'authentication': {'password': {'password': 'xxxx',
                                 'username': 'xxxx'}},
 'description': None,
 'device_group_name': 'EVO_CORE',
 'devices': ['EVO'],
 'logging': None,
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': []}, {'authentication': {'password': {'password': 'xxxx',
                                 'username': 'xxxx'}},
 'description': None,
 'device_group_name': 'vmx_db',
 'devices': ['core_db'],
 'logging': {'log-level': 'critical'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': []}, {'authentication': None,
 'description': 'All devices on the edge',
 'device_group_name': 'edge',
 'devices': ['vmx', 'demo'],
 'logging': {'log-level': 'warn'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1565668543},
               'instance-id': 'HbEZ-instance',
               'playbook': 'forwarding-table-summary',
               'rule': 'protocol.routesummary/check-fib-summary'},
              {'@': {'changed-seconds': 1565669467},
               'instance-id': 'HbEZ-instance',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics'}]}, {'authentication': None,
 'description': 'learning',
 'device_group_name': 'Core',
 'devices': ['vmx'],
 'logging': None,
 'native_gpb': {'ports': [22000]},
 'notification': {},
 'playbooks': ['icmp-probe', 'rca-ospf-playbook'],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'interface.statistics/check-host-loopback-status',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.fpc/check-fpc-memory',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.ospf/check-ddos-statistics',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-center-chip-host-path',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-cm-error-table',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-fpc-cpu-scheduler-info',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-fpc-threads',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-fpc-utilization-information',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-ithrottle',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-ithrottle-statistics',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-jnh-exceptions',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-jnh-interface-statistics',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-linecard-ethernet-statistics',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-pci-error-counters',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-pfe-traffic-statistics',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-pre-classifier-dropped-packets',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'linecard.statistics/check-traffic-offload-engine-status',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.infra/check-task-io-drops',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.infra/check-task-memory-usage',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.ospf/check-ospf-forwarding-table',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.ospf/check-ospf-io-statistics-information',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.ospf/check-ospf-neighbor-information',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.ospf/check-ospf-statistics-information',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.ospf/fpc-link-stats',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'protocol.ospf/pfe-ddos-policer',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-routing-engine-cpu-utilization',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-system-input-queues',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-system-output-queues',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-system-statistics-ip',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-system-storage-capacity',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-system-virtual-memory-information',
               'variable-value': []},
              {'@': {'changed-seconds': 1564722219},
               'instance-id': 'test1',
               'playbook': 'rca-ospf-playbook',
               'rule': 'system.statistics/check-version',
               'variable-value': []},
              {'@': {'changed-seconds': 1565263889},
               'instance-id': 'set1',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics',
               'variable-value': [{'name': 'host-var', 'value': '10.221.11.11'},
                                  {'name': 'count-var', 'value': '2'}]}]}]

We can also update any given device group

print(hb.device_group.get('edge'))
{'authentication': None,
 'description': 'All devices on the edge',
 'device_group_name': 'edge',
 'devices': ['vmx', 'demo'],
 'logging': {'log-level': 'warn'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1565668543},
               'instance-id': 'HbEZ-instance',
               'playbook': 'forwarding-table-summary',
               'rule': 'protocol.routesummary/check-fib-summary'},
              {'@': {'changed-seconds': 1565669467},
               'instance-id': 'HbEZ-instance',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics'}]}
dgs = hb.device_group.get('edge')
dgs.devices.append('vmx')
hb.device_group.update(dgs)
True
# Check for devices list
dgs = hb.device_group.get('edge')
print(dgs)
{'authentication': None,
 'description': 'All devices on the edge',
 'device_group_name': 'edge',
 'devices': ['vmx', 'demo'],
 'logging': {'log-level': 'warn'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1565668543},
               'instance-id': 'HbEZ-instance',
               'playbook': 'forwarding-table-summary',
               'rule': 'protocol.routesummary/check-fib-summary'},
              {'@': {'changed-seconds': 1565669467},
               'instance-id': 'HbEZ-instance',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics'}]}
dgs.devices = ['edge']
hb.device_group.update(dgs)
True
dgs = hb.device_group.get('edge')
print(dgs)
{'authentication': None,
 'description': 'All devices on the edge',
 'device_group_name': 'edge',
 'devices': ['edge'],
 'logging': {'log-level': 'warn'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1565668543},
               'instance-id': 'HbEZ-instance',
               'playbook': 'forwarding-table-summary',
               'rule': 'protocol.routesummary/check-fib-summary'},
              {'@': {'changed-seconds': 1565669467},
               'instance-id': 'HbEZ-instance',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics'}]}
# can also update by passing Device Group Schema kwargs
dgs = hb.device_group.get('edge')
pprint(dgs)
from jnpr.healthbot import DevicegroupSchemaLogging
logSchema = DevicegroupSchemaLogging('warn')
hb.device_group.update(device_group_name='edge', logging=logSchema)
{'authentication': None,
 'description': 'All devices on the edge',
 'device_group_name': 'edge',
 'devices': ['edge'],
 'logging': {'log-level': 'warn'},
 'native_gpb': None,
 'notification': {},
 'playbooks': [],
 'reports': [],
 'retention_policy': None,
 'variable': [{'@': {'changed-seconds': 1565668543},
               'instance-id': 'HbEZ-instance',
               'playbook': 'forwarding-table-summary',
               'rule': 'protocol.routesummary/check-fib-summary'},
              {'@': {'changed-seconds': 1565669467},
               'instance-id': 'HbEZ-instance',
               'playbook': 'icmp-probe',
               'rule': 'protocol.icmp/check-icmp-statistics'}]}





True
### Delete device and device group
hb.device_group.delete('edge')
True
hb.device.delete('demo')
True
# Lets commit all the changes
hb.commit()
True

Add Network Group

hb.network_group.add(network_group_name="HbEZ")
True
print(hb.network_group.get(network_group_name="HbEZ"))
hb.network_group.delete(network_group_name="HbEZ")
{'description': None,
 'network_group_name': 'HbEZ',
 'notification': {},
 'playbooks': [],
 'reports': [],
 'variable': None}





True

Add Network Group using Schema

from jnpr.healthbot import NetworkGroupSchema
ngs = NetworkGroupSchema(network_group_name="HbEZ")
hb.network_group.add(ngs)
True
hb.network_group.get(network_group_name="HbEZ")
{'description': None,
 'network_group_name': 'HbEZ',
 'notification': {},
 'playbooks': [],
 'reports': [],
 'variable': None}

Use Case: Rules

hb.rule.get('linecard.ospf', 'check-ddos-statistics')
{'description': 'Monitors ospf related distributed denial of service '
                'statistics',
 'field': [{'constant': {'value': '{{ddos-arrival-rate-threshold}}'},
            'description': 'This field is for ddos arive rate threshold',
            'field-name': 'ddos-arrival-rate-threshold'},
           {'constant': {'value': '{{ddos-drop-count-threshold}}'},
            'description': 'This field is for ddos drop count threshold',
            'field-name': 'ddos-drop-count-threshold'},
           {'constant': {'value': '{{ddos-drop-rate-threshold}}'},
            'description': 'This field is for ddos drop rate threshold',
            'field-name': 'ddos-drop-rate-threshold'}],
 'function': None,
 'keys': ['group-name', 'protocol-states-locale'],
 'network_rule': None,
 'rule_frequency': None,
 'rule_name': 'check-ddos-statistics',
 'rule_properties': {'catalogue': {'tier': '1'},
                     'contributor': 'juniper',
                     'helper-files': [{'file-type': 'other',
                                       'list-of-files': ['ddos-statistics.yml']}],
                     'supported-devices': {'juniper': {'operating-system': [{'os-name': 'junos',
                                                                             'products': [{'product-name': 'ACX',
                                                                                           'releases': [{'platform': ['All'],
                                                                                                         'release-name': '15.2R1',
                                                                                                         'release-support': 'min-supported-release'}]},
                                                                                          {'product-name': 'EX',
                                                                                           'releases': [{'platform': ['All'],
                                                                                                         'release-name': '15.2R1',
                                                                                                         'release-support': 'min-supported-release'}]},
                                                                                          {'product-name': 'MX',
                                                                                           'releases': [{'platform': ['All'],
                                                                                                         'release-name': '15.2R1',
                                                                                                         'release-support': 'min-supported-release'}]},
                                                                                          {'product-name': 'PTX',
                                                                                           'releases': [{'platform': ['All'],
                                                                                                         'release-name': '15.2R1',
                                                                                                         'release-support': 'min-supported-release'}]},
                                                                                          {'product-name': 'QFX',
                                                                                           'releases': [{'platform': ['All'],
                                                                                                         'release-name': '15.2R1',
                                                                                                         'release-support': 'min-supported-release'}]},
                                                                                          {'product-name': 'SRX',
                                                                                           'releases': [{'platform': ['All'],
                                                                                                         'release-name': '15.2R1',
                                                                                                         'release-support': 'min-supported-release'}]}]}]}},
                     'supported-healthbot-version': '1.0.1',
                     'version': 2},
 'sensor': [{'description': 'Netconf rpc get-ddos-ospf-information iAgent '
                            'sensor to collect telemetry data from network '
                            'device',
             'iAgent': {'file': 'ddos-statistics.yml',
                        'frequency': '60s',
                        'table': 'ddosStats'},
             'sensor-name': 'ddosstats',
             'synopsis': 'ddos statistics sensor definition'}],
 'synopsis': 'OSPF distributed denial of service statistics analyzer',
 'trigger': [{'description': 'Sets health based on DDOS packet drop rate',
              'frequency': '60s',
              'synopsis': 'DDOS packet drops kpi',
              'term': [{'term-name': 'is-ddos-drops-increasing',
                        'then': {'status': {'color': 'red',
                                            'message': 'DDOS packet drops '
                                                       '($dropped-packets) '
                                                       'increasing'}},
                        'when': {'min-rate-of-increase': [{'field-name': '$dropped-packets',
                                                           'rate': '$ddos-drop-rate-threshold',
                                                           'time-range': '5m'}]}},
                       {'term-name': 'are-ddos-drops-over-threshold',
                        'then': {'status': {'color': 'yellow',
                                            'message': 'DDOS packet drops '
                                                       '($dropped-packets) '
                                                       'over threshold '
                                                       '($ddos-drop-count-threshold)'}},
                        'when': {'greater-than': [{'left-operand': '$dropped-packets',
                                                   'right-operand': '$ddos-drop-count-threshold'}]}},
                       {'term-name': 'ddos-drops-not-increasing',
                        'then': {'status': {'color': 'green'}}}],
              'trigger-name': 'ddos-drops'},
             {'description': 'Sets health based on DDOS packet arrival rate',
              'frequency': '60s',
              'synopsis': 'DDOS packet arrival kpi',
              'term': [{'term-name': 'is-max-packet-arrival-rate-greater-than-threshold',
                        'then': {'status': {'color': 'yellow',
                                            'message': 'DDOS packet max '
                                                       'arrival rate is over '
                                                       'threshold '
                                                       '($ddos-arrival-rate-threshold)'}},
                        'when': {'greater-than-or-equal-to': [{'left-operand': '$packet-arrival-rate-max',
                                                               'right-operand': '$ddos-arrival-rate-threshold'}]}},
                       {'term-name': 'max-packet-arrival-rate-less-than-threshold',
                        'then': {'status': {'color': 'green'}}}],
              'trigger-name': 'ddos-packet-arrival-rate'},
             {'description': 'Sets health based on DDOS packet drop others',
              'frequency': '60s',
              'synopsis': 'DDOS packet drop other kpi',
              'term': [{'term-name': 'is-ddos-packet-dropped-others-increasing',
                        'then': {'status': {'color': 'red',
                                            'message': 'DDOS packet dropped '
                                                       'others '
                                                       '($dropped-packets-others) '
                                                       'increasing'}},
                        'when': {'min-rate-of-increase': [{'field-name': '$dropped-packets-others',
                                                           'rate': '$ddos-drop-rate-threshold',
                                                           'time-range': '5m'}]}},
                       {'term-name': 'is-ddos-packet-drop-others-over-threshold',
                        'then': {'status': {'color': 'yellow',
                                            'message': 'DDOS packet dropped '
                                                       'others '
                                                       '($dropped-packets-others) '
                                                       'over threshold '
                                                       '($ddos-drop-count-threshold)'}},
                        'when': {'greater-than': [{'left-operand': '$dropped-packets-others',
                                                   'right-operand': '$ddos-drop-count-threshold'}]}},
                       {'term-name': 'ddos-packet-drop-others-not-increasing',
                        'then': {'status': {'color': 'green'}}}],
              'trigger-name': 'ddos-packet-dropped-others'}],
 'variable': [{'description': 'DDOS arrival rate threshold value',
               'name': 'ddos-arrival-rate-threshold',
               'type': 'int',
               'value': '1000'},
              {'description': 'DDOS drop count threshold value',
               'name': 'ddos-drop-count-threshold',
               'type': 'int',
               'value': '0'},
              {'description': 'DDOS drop rate threshold value',
               'name': 'ddos-drop-rate-threshold',
               'type': 'int',
               'value': '1'}],
 'vector': None}

Add new rule

from jnpr.healthbot.modules.rules import RuleSchema
rs = RuleSchema(rule_name="hbez-fpc-heap-utilization")

setting rule schema params

rs.description = "HealthBot EZ example"
rs.synopsis = "Using python client for demo"
rs.sensor = [{'description': 'Monitors FPC buffer, heap and cpu utilization',
              'iAgent': {'file': 'fpc-utilization.yml',
                         'frequency': '30s',
                         'table': 'FPCCPUHEAPutilizationTable'},
              'sensor-name': 'fpccpuheaputilization'}]
from jnpr.healthbot.swagger.models.rule_schema_field import RuleSchemaField
from jnpr.healthbot.swagger.models.rule_schema_constant import RuleSchemaConstant

rs.field = [RuleSchemaField(constant=RuleSchemaConstant(value='{{fpc-buffer-usage-threshold}}'),
                            description='This field is for buffer usage threshold',
                            field_name='linecard-buffer-usage-threshold'),
            RuleSchemaField(constant=RuleSchemaConstant(value='{{fpc-cpu-usage-threshold}}'),
                            description='This field is for linecard cpu usage threshold',
                            field_name='linecard-cpu-usage-threshold'),
            RuleSchemaField(constant=RuleSchemaConstant(value='{{fpc-heap-usage-threshold}}'),
                            description='This field is for linecard heap usage threshold',
                            field_name='linecard-heap-usage-threshold')]

rs.keys = ['slot']
rs.variable = [{'description': 'Linecard Buffer Memory usage threshold value',
               'name': 'fpc-buffer-usage-threshold',
               'type': 'int',
               'value': '80'},
              {'description': 'Linecard CPU usage threshold value',
               'name': 'fpc-cpu-usage-threshold',
               'type': 'int',
               'value': '80'},
              {'description': 'Linecard Heap Memory usage threshold value',
               'name': 'fpc-heap-usage-threshold',
               'type': 'int',
               'value': '80'}]
rs.trigger = [{'description': 'Sets health based on linecard buffer memory',
               'frequency': '60s',
               'synopsis': 'Linecard buffer memory kpi',
               'term': [{'term-name': 'is-buffer-memory-utilization-greater-than-threshold',
                         'then': {'status': {'color': 'red',
                                             'message': 'FPC buffer memory '
                                                        'utilization '
                                                        '($memory-buffer-utilization) '
                                                        'is over threshold '
                                                        '($linecard-buffer-usage-threshold)'}},
                         'when': {'greater-than': [{'left-operand': '$memory-buffer-utilization',
                                                    'right-operand': '$linecard-buffer-usage-threshold'}]}},
                        {'term-name': 'buffer-utilization-less-than-threshold',
                         'then': {'status': {'color': 'green'}}}],
               'trigger-name': 'fpc-buffer-memory-utilization'},
              {'description': 'Sets health based on linecard cpu utilization',
               'frequency': '60s',
               'synopsis': 'Linecard cpu utilization kpi',
               'term': [{'term-name': 'is-cpu-utilization-greater-than-80',
                         'then': {'status': {'color': 'red',
                                             'message': 'FPC CPU utilization '
                                                        '($cpu-total) is over '
                                                        'threshold '
                                                        '($linecard-cpu-usage-threshold)'}},
                         'when': {'greater-than': [{'left-operand': '$cpu-total',
                                                    'right-operand': '$linecard-cpu-usage-threshold',
                                                    'time-range': '180s'}]}},
                        {'term-name': 'cpu-utilization-less-than-threshold',
                         'then': {'status': {'color': 'green'}}}],
               'trigger-name': 'fpc-cpu-utilization'},
              {'description': 'Sets health based on linecard heap memory '
                              'utilization',
               'frequency': '60s',
               'synopsis': 'Linecard heap memory kpi',
               'term': [{'term-name': 'is-heap-memory-utilization-greater-than-threshold',
                         'then': {'status': {'color': 'red',
                                             'message': 'FPC heap memory '
                                                        'utilization '
                                                        '($memory-heap-utilization) '
                                                        'is over threshold '
                                                        '($linecard-heap-usage-threshold)'}},
                         'when': {'greater-than': [{'left-operand': '$memory-heap-utilization',
                                                    'right-operand': '$linecard-heap-usage-threshold'}]}},
                        {'term-name': 'heap-memory-utilization-less-than-threshold',
                         'then': {'status': {'color': 'green'}}}],
               'trigger-name': 'fpc-heap-memory-utilization'}]

If the topic name is not present, first it will create given topic

hb.rule.add('hbez', schema=rs)
True
# hb.rules.delete_rule(topic_name='external', rule_name="hbez-fpc-heap-utilization")

Use Case: Playbooks

pprint(hb.playbook.get('linecard-kpis-playbook'))
{'description': 'Playbook checks linecard health i.e. cpu, memory and CM '
                'errors',
 'playbook_name': 'linecard-kpis-playbook',
 'rules': ['linecard.cm-events/check-cm-events',
           'linecard.fpc/check-fpc-cpu',
           'linecard.fpc/check-fpc-memory'],
 'synopsis': 'Linecards key performance indicators'}
from jnpr.healthbot.modules.playbooks import PlaybookSchema
pbs = PlaybookSchema(playbook_name="HbEZ-example")
pbs.description = "HbEZ Demo Examples"
pbs.synopsis = 'fpc status'
pbs.rules = ['hbez/hbez-fpc-heap-utilization']
hb.playbook.add(pbs)
True
hb.playbook.delete(playbook_name="HbEZ-example")
True

Use Case: Health

pprint(hb.health.get_device_health('edge'))
{'children': [{'children': [{'children': [], 'name': 'external'}],
               'name': 'real'}],
 'color': None,
 'data': None,
 'name': 'edge',
 'timestamp': None}
pprint(hb.health.get_device_group_health('real'))
{'children': [{'children': [{'children': [], 'name': 'external'}],
               'name': 'edge'}],
 'color': None,
 'data': None,
 'name': 'real',
 'timestamp': None}

Use Case: Database

This we might need to take it off
print (hb.tsdb.query("show databases"))
ResultSet({'('databases', None)': [{'name': 'health'}, {'name': '_internal'}, {'name': 'Core:vmx'}, {'name': 'real:edge'}, {'name': 'Core:demo'}, {'name': 'EVO_Core:EVO'}, {'name': 'EVO_CORE:EVO'}, {'name': 'vmx_db:vmx_db'}, {'name': 'vmx_db:core_db'}]})
obj = hb.tsdb.query('select * from "protocol-eventd-host/check-host-traffic/packet-loss" limit 10', database='Core:vmx')
pprint(obj.raw)
{'statement_id': 0}
print(hb.version)
2.0.1
### Load any helper file
hb.upload_helper_file('/Users/nitinkr/xxx/xyz.rule')

Use Case: Notification

from jnpr.healthbot import NotificationSchema
from jnpr.healthbot import NotificationSchemaSlack


ns = NotificationSchema(notification_name='HbEZ-notification')
ns.description = "example of adding notification via API"
nss = NotificationSchemaSlack(channel="HbEZ", url='http://testing')
ns.slack = nss
hb.settings.notification.add(ns)
True
print(hb.settings.notification.get())
[{'description': 'example of adding notification via API',
 'http_post': None,
 'kafka_publish': None,
 'notification_name': 'HbEZ-notification',
 'slack': {'channel': 'HbEZ', 'url': 'http://testing'}}]
pprint(hb.settings.notification.delete('HbEZ-notification'))
True

Use Case: Settings

from jnpr.healthbot import RetentionPolicySchema

rps = RetentionPolicySchema(retention_policy_name='HbEZ-testing')
hb.settings.retention_policy.add(rps)
True
print(hb.settings.retention_policy.get())
[{'duration': None, 'replication': None, 'retention_policy_name': 'HbEZ-testing'}, {'duration': None,
 'replication': None,
 'retention_policy_name': 'HbEZ-testing1'}, {'duration': None,
 'replication': None,
 'retention_policy_name': 'HbEZ-testing2'}]
from jnpr.healthbot import SchedulerSchema
sc = SchedulerSchema(name='HbEZ-schedule', repeat={'every': 'week'}, start_time="2019-07-22T05:32:23Z")
hb.settings.scheduler.add(sc)

from jnpr.healthbot import DestinationSchema
ds = DestinationSchema(name='HbEZ-destination', email={'id': 'nitinkr@juniper.net'})
hb.settings.destination.add(ds)

from jnpr.healthbot import ReportSchema
rs = ReportSchema(name="HbEZ-report", destination=['HbEZ-destination'], format="html", schedule=["HbEZ-schedule"])
hb.settings.report.add(rs)
True

Use Case: PlayBook Instance

from jnpr.healthbot.modules.playbooks import PlayBookInstanceBuilder

# case where we dont need to set any variable
pbb = PlayBookInstanceBuilder(hb, 'forwarding-table-summary', 'HbEZ-instance', 'Core')
pbb.apply()

#hb.commit()
True

when we need to set any rule variable for given device/group in playbook instance

from jnpr.healthbot.modules.playbooks import PlayBookInstanceBuilder

pbb = PlayBookInstanceBuilder(hb, 'forwarding-table-summary', 'HbEZ-instance', 'Core')

variable = pbb.rule_variables["protocol.routesummary/check-fib-summary"]


variable.route_address_family = 'pqr'
variable.route_count_threshold = 100

# Apply variable to given device(s)
pbb.apply(device_ids=['vmx'])

#clear all the variable if you want to set it something else for group or other device(s)
pbb.clear()

variable = pbb.rule_variables["protocol.routesummary/check-fib-summary"]
variable.route_address_family = 'abc'
variable.route_count_threshold = 200

pbb.apply()

#hb.commit()
True

Configure hb charts when there is device-group present and there is a running playbook for it

from jnpr.healthbot.swagger.models.hb_graphs_query import HbGraphsQuery
from jnpr.healthbot.swagger.models.hb_graphs import HbGraphs
from jnpr.healthbot import HealthBotClient

with HealthBotClient(ip, gui_username, gui_password, port=8080) as hb:

    # group_name, device_name, measurement_name, field_name are compulsory fields here
    query1 = HbGraphsQuery(group_name='dg-junos', device_name="d2", measurement_name="system.commit/commit-history",
                           transformation=None, field_name="l1-threshold", field_aggregation="mean",
                           where=[{'key': "comment", "operator": '=', "value": "new"}],
                           group_by_interval="1s", group_by_fill="fill(null)", group_by_tag_key=[])
    # Multiple queries can be present for a graph

    # graph_name, graph_type, time_range are compulsory here
    graph1 = HbGraphs(graph_name="graph1", graph_description=None, graph_type="Heatmap",
                      time_range='3h', query=[query1], y_label=None, y_max=None,
                      y_min=None, unit_type=None, decimals=None)
    # Multiple graphs can be present for a canvas 

    # Adding a new canvas with a single graph
    hb.charts.add_canvas(canvas_name="mycanvas", graphs=[graph1])
    hb.commit()
True

VERSIONS

Healthbot versions upto 3.2.0 are supported by https://pypi.org/project/hbez/2.0.0/

Healthbot/Paragon Insights 4.0.0 and above will be supported by https://pypi.org/project/hbez/4.0.0/ and above

LICENSE

Apache 2.0

CONTRIBUTORS

Juniper Networks is actively contributing to and maintaining this repo. Please contact healthbot-hackers at juniper.net for any queries.

Contributors:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hbez-4.1.0.tar.gz (372.0 kB view details)

Uploaded Source

Built Distribution

hbez-4.1.0-py2.py3-none-any.whl (945.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file hbez-4.1.0.tar.gz.

File metadata

  • Download URL: hbez-4.1.0.tar.gz
  • Upload date:
  • Size: 372.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.8.2 requests/2.26.0 setuptools/44.1.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/2.7.16

File hashes

Hashes for hbez-4.1.0.tar.gz
Algorithm Hash digest
SHA256 1c90b321a693a89653aa5dd1ab0976f3f0fba32c507871f2f8798770b90ba4c4
MD5 7d8a188ef1f4d9a3f5bb40b474141611
BLAKE2b-256 56b55f038badf11284529de37323934f9b5a89ba9906cd213e970347a62515a6

See more details on using hashes here.

File details

Details for the file hbez-4.1.0-py2.py3-none-any.whl.

File metadata

  • Download URL: hbez-4.1.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 945.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.8.2 requests/2.26.0 setuptools/44.1.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/2.7.16

File hashes

Hashes for hbez-4.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 dac1a545eb1fdbc38463560932a1533aa65181f31fb92bedaa4fe62e6adc9df4
MD5 5ac17a407ff85dbe68986fb60ef48616
BLAKE2b-256 479a2ff821e6db095cdb03cbbb911c999f6efa317b2959e990603de684804e89

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page