Source code for jnpr.junos.facts.routing_engines

import re as RE


def _get_vc_status(dev, facts):
    try:
        rsp = dev.rpc.get_virtual_chassis_information()
        # MX issue where command returns, but without content
        if rsp is not True:
            facts['vc_capable'] = True
            return rsp
        else:
            facts['vc_capable'] = False
            return None
    except:
        facts['vc_capable'] = False
        return None


[docs]def facts_routing_engines(junos, facts): re_facts = [ 'mastership-state', 'status', 'model', 'up-time', 'last-reboot-reason'] master = [] vc_info = _get_vc_status(junos, facts) if vc_info is not None: facts['vc_mode'] = vc_info.findtext('.//virtual-chassis-mode') if len(vc_info.xpath(".//virtual-chassis-id-information[@style='fabric']")) > 0: facts['vc_fabric'] = True vc_list = vc_info.xpath(".//member-role[starts-with(.,'Master') or starts-with(.,'Backup')]") if len(vc_list) > 1: facts['2RE'] = True for member_id in vc_info.xpath(".//member-role[starts-with(.,'Master')]/preceding-sibling::member-id"): master.append("RE{0}".format(member_id.text)) try: re_info = junos.rpc.get_route_engine_information() except: # this means that the RPC failed. this should "never" # happen, but we will trap it cleanly for now return re_list = re_info.xpath('.//route-engine') if len(re_list) > 1: facts['2RE'] = True for re in re_list: x_re_name = re.xpath('ancestor::multi-routing-engine-item/re-name') if not x_re_name: # not a multi-instance routing engine platform, but could # have multiple RE slots re_name = "RE" x_slot = re.find('slot') slot_id = x_slot.text if x_slot is not None else "0" re_name = re_name + slot_id else: # multi-instance routing platform m = RE.search('(\d)', x_re_name[0].text) if vc_info is not None: re_name = "RE{0}-RE{1}".format(m.group(0), re.find('slot').text) # => RE0-RE0 | RE0-RE1 else: re_name = "RE" + m.group(0) # => RE0 | RE1 re_fd = {} facts[re_name] = re_fd for factoid in re_facts: x_f = re.find(factoid) if x_f is not None: re_fd[factoid.replace('-', '_')] = x_f.text if vc_info is None and 'mastership_state' in re_fd: if facts[re_name]['mastership_state'] == 'master': master.append(re_name) # --[ end for-each 're' ]------------------------------------------------- len_master = len(master) if len_master > 1: facts['master'] = master elif len_master == 1: facts['master'] = master[0]