����JFIF���������
__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
#
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = '''
---
module: ce_vrf_af
short_description: Manages VPN instance address family on HUAWEI CloudEngine switches.
description:
- Manages VPN instance address family of HUAWEI CloudEngine switches.
author: Yang yang (@QijunPan)
notes:
- If I(state=absent), the vrf will be removed, regardless of the non-required parameters.
- This module requires the netconf system service be enabled on the remote device being managed.
- Recommended connection is C(netconf).
- This module also works with C(local) connections for legacy playbooks.
options:
vrf:
description:
- VPN instance.
required: true
vrf_aftype:
description:
- VPN instance address family.
choices: ['v4','v6']
default: v4
route_distinguisher:
description:
- VPN instance route distinguisher,the RD used to distinguish same route prefix from different vpn.
The RD must be setted before setting vpn_target_value.
vpn_target_state:
description:
- Manage the state of the vpn target.
choices: ['present','absent']
vpn_target_type:
description:
- VPN instance vpn target type.
choices: ['export_extcommunity', 'import_extcommunity']
vpn_target_value:
description:
- VPN instance target value. Such as X.X.X.X:number<0-65535> or number<0-65535>:number<0-4294967295>
or number<0-65535>.number<0-65535>:number<0-65535> or number<65536-4294967295>:number<0-65535>
but not support 0:0 and 0.0:0.
evpn:
description:
- Is extend vpn or normal vpn.
type: bool
default: 'no'
state:
description:
- Manage the state of the af.
choices: ['present','absent']
default: present
'''
EXAMPLES = '''
- name: Vrf af module test
hosts: cloudengine
connection: local
gather_facts: no
vars:
cli:
host: "{{ inventory_hostname }}"
port: "{{ ansible_ssh_port }}"
username: "{{ username }}"
password: "{{ password }}"
transport: cli
tasks:
- name: Config vpna, set address family is ipv4
community.network.ce_vrf_af:
vrf: vpna
vrf_aftype: v4
state: present
provider: "{{ cli }}"
- name: Config vpna, delete address family is ipv4
community.network.ce_vrf_af:
vrf: vpna
vrf_aftype: v4
state: absent
provider: "{{ cli }}"
- name: Config vpna, set address family is ipv4,rd=1:1,set vpn_target_type=export_extcommunity,vpn_target_value=2:2
community.network.ce_vrf_af:
vrf: vpna
vrf_aftype: v4
route_distinguisher: 1:1
vpn_target_type: export_extcommunity
vpn_target_value: 2:2
vpn_target_state: present
state: present
provider: "{{ cli }}"
- name: Config vpna, set address family is ipv4,rd=1:1,delete vpn_target_type=export_extcommunity,vpn_target_value=2:2
community.network.ce_vrf_af:
vrf: vpna
vrf_aftype: v4
route_distinguisher: 1:1
vpn_target_type: export_extcommunity
vpn_target_value: 2:2
vpn_target_state: absent
state: present
provider: "{{ cli }}"
'''
RETURN = '''
proposed:
description: k/v pairs of parameters passed into module
returned: always
type: dict
sample: {"vrf": "vpna",
"vrf_aftype": "v4",
"state": "present",
"vpn_targe_state":"absent",
"evpn": "none",
"vpn_target_type": "none",
"vpn_target_value": "none"}
existing:
description: k/v pairs of existing switchport
returned: always
type: dict
sample: {
"route_distinguisher": [
"1:1",
"2:2"
],
"vpn_target_type": [],
"vpn_target_value": [],
"vrf": "vpna",
"vrf_aftype": [
"ipv4uni",
"ipv6uni"
]
}
end_state:
description: k/v pairs of switchport after module execution
returned: always
type: dict
sample: {
"route_distinguisher": [
"1:1",
"2:2"
],
"vpn_target_type": [
"import_extcommunity",
"3:3"
],
"vpn_target_value": [],
"vrf": "vpna",
"vrf_aftype": [
"ipv4uni",
"ipv6uni"
]
}
updates:
description: command list sent to the device
returned: always
type: list
sample: [
"ip vpn-instance vpna",
"vpn-target 3:3 import_extcommunity"
]
changed:
description: check to see if a change was made on the device
returned: always
type: bool
sample: true
'''
import re
from xml.etree import ElementTree
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.community.network.plugins.module_utils.network.cloudengine.ce import get_nc_config, set_nc_config, ce_argument_spec
CE_NC_GET_VRF = """
<filter type="subtree">
<l3vpn xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
<l3vpncomm>
<l3vpnInstances>
<l3vpnInstance>
<vrfName></vrfName>
<vrfDescription></vrfDescription>
</l3vpnInstance>
</l3vpnInstances>
</l3vpncomm>
</l3vpn>
</filter>
"""
CE_NC_GET_VRF_AF = """
<filter type="subtree">
<l3vpn xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
<l3vpncomm>
<l3vpnInstances>
<l3vpnInstance>
<vrfName>%s</vrfName>
<vpnInstAFs>
<vpnInstAF>
<afType></afType>
<vrfRD></vrfRD>%s
</vpnInstAF>
</vpnInstAFs>
</l3vpnInstance>
</l3vpnInstances>
</l3vpncomm>
</l3vpn>
</filter>
"""
CE_NC_DELETE_VRF_AF = """
<l3vpn xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
<l3vpncomm>
<l3vpnInstances>
<l3vpnInstance>
<vrfName>%s</vrfName>
<vpnInstAFs>
<vpnInstAF operation="delete">
<afType>%s</afType>
</vpnInstAF>
</vpnInstAFs>
</l3vpnInstance>
</l3vpnInstances>
</l3vpncomm>
</l3vpn>
"""
CE_NC_CREATE_VRF_AF = """
<l3vpn xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
<l3vpncomm>
<l3vpnInstances>
<l3vpnInstance>
<vrfName>%s</vrfName>
<vpnInstAFs>
<vpnInstAF operation="merge">
<afType>%s</afType>
<vrfRD>%s</vrfRD>%s
</vpnInstAF>
</vpnInstAFs>
</l3vpnInstance>
</l3vpnInstances>
</l3vpncomm></l3vpn>
"""
CE_NC_CREATE_VRF_TARGET = """
<vpnTargets>
<vpnTarget operation="merge">
<vrfRTType>%s</vrfRTType>
<vrfRTValue>%s</vrfRTValue>
</vpnTarget>
</vpnTargets>
"""
CE_NC_DELETE_VRF_TARGET = """
<vpnTargets>
<vpnTarget operation="delete">
<vrfRTType>%s</vrfRTType>
<vrfRTValue>%s</vrfRTValue>
</vpnTarget>
</vpnTargets>
"""
CE_NC_GET_VRF_TARGET = """
<vpnTargets>
<vpnTarget>
<vrfRTValue></vrfRTValue>
<vrfRTType></vrfRTType>
</vpnTarget>
</vpnTargets>
"""
CE_NC_CREATE_EXTEND_VRF_TARGET = """
<exVpnTargets>
<exVpnTarget operation="merge">
<vrfRTType>%s</vrfRTType>
<vrfRTValue>%s</vrfRTValue>
<extAddrFamily>evpn</extAddrFamily>
</exVpnTarget>
</exVpnTargets>
"""
CE_NC_DELETE_EXTEND_VRF_TARGET = """
<exVpnTargets>
<exVpnTarget operation="delete">
<vrfRTType>%s</vrfRTType>
<vrfRTValue>%s</vrfRTValue>
<extAddrFamily>evpn</extAddrFamily>
</exVpnTarget>
</exVpnTargets>
"""
CE_NC_GET_EXTEND_VRF_TARGET = """
<exVpnTargets>
<exVpnTarget>
<vrfRTType></vrfRTType>
<vrfRTValue></vrfRTValue>
<extAddrFamily></extAddrFamily>
</exVpnTarget>
</exVpnTargets>
"""
def build_config_xml(xmlstr):
"""build_config_xml"""
return '<config> ' + xmlstr + ' </config>'
def is_valid_value(vrf_targe_value):
"""check if the vrf target value is valid"""
each_num = None
if len(vrf_targe_value) > 21 or len(vrf_targe_value) < 3:
return False
if vrf_targe_value.find(':') == -1:
return False
elif vrf_targe_value == '0:0':
return False
elif vrf_targe_value == '0.0:0':
return False
else:
value_list = vrf_targe_value.split(':')
if value_list[0].find('.') != -1:
if not value_list[1].isdigit():
return False
if int(value_list[1]) > 65535:
return False
value = value_list[0].split('.')
if len(value) == 4:
for each_num in value:
if not each_num.isdigit():
return False
if int(each_num) > 255:
return False
return True
elif len(value) == 2:
for each_num in value:
if not each_num.isdigit():
return False
if int(each_num) > 65535:
return False
return True
else:
return False
elif not value_list[0].isdigit():
return False
elif not value_list[1].isdigit():
return False
elif int(value_list[0]) < 65536 and int(value_list[1]) < 4294967296:
return True
elif int(value_list[0]) > 65535 and int(value_list[0]) < 4294967296:
return bool(int(value_list[1]) < 65536)
else:
return False
class VrfAf(object):
"""manage the vrf address family and export/import target"""
def __init__(self, argument_spec, ):
self.spec = argument_spec
self.module = None
self.init_module()
# vpn instance info
self.vrf = self.module.params['vrf']
self.vrf_aftype = self.module.params['vrf_aftype']
if self.vrf_aftype == 'v4':
self.vrf_aftype = 'ipv4uni'
else:
self.vrf_aftype = 'ipv6uni'
self.route_distinguisher = self.module.params['route_distinguisher']
self.evpn = self.module.params['evpn']
self.vpn_target_type = self.module.params['vpn_target_type']
self.vpn_target_value = self.module.params['vpn_target_value']
self.vpn_target_state = self.module.params['vpn_target_state']
self.state = self.module.params['state']
# state
self.changed = False
self.updates_cmd = list()
self.results = dict()
self.proposed = dict()
self.existing = dict()
self.end_state = dict()
self.vpn_target_changed = False
self.vrf_af_type_changed = False
self.vrf_rd_changed = False
self.vrf_af_info = dict()
def init_module(self):
"""init_module"""
self.module = AnsibleModule(
argument_spec=self.spec, supports_check_mode=True)
def check_response(self, xml_str, xml_name):
"""Check if response message is already succeed."""
if "<ok/>" not in xml_str:
self.module.fail_json(msg='Error: %s failed.' % xml_name)
def is_vrf_af_exist(self):
"""is vrf address family exist"""
if not self.vrf_af_info:
return False
for vrf_af_ele in self.vrf_af_info["vpnInstAF"]:
if vrf_af_ele["afType"] == self.vrf_aftype:
return True
else:
continue
return False
def get_exist_rd(self):
"""get exist route distinguisher """
if not self.vrf_af_info:
return None
for vrf_af_ele in self.vrf_af_info["vpnInstAF"]:
if vrf_af_ele["afType"] == self.vrf_aftype:
if vrf_af_ele["vrfRD"] is None:
return None
else:
return vrf_af_ele["vrfRD"]
else:
continue
return None
def is_vrf_rd_exist(self):
"""is vrf route distinguisher exist"""
if not self.vrf_af_info:
return False
for vrf_af_ele in self.vrf_af_info["vpnInstAF"]:
if vrf_af_ele["afType"] == self.vrf_aftype:
if vrf_af_ele["vrfRD"] is None:
return False
if self.route_distinguisher is not None:
return bool(vrf_af_ele["vrfRD"] == self.route_distinguisher)
else:
return True
else:
continue
return False
def is_vrf_rt_exist(self):
"""is vpn target exist"""
if not self.vrf_af_info:
return False
for vrf_af_ele in self.vrf_af_info["vpnInstAF"]:
if vrf_af_ele["afType"] == self.vrf_aftype:
if self.evpn is False:
if not vrf_af_ele.get("vpnTargets"):
return False
for vpn_target in vrf_af_ele.get("vpnTargets"):
if vpn_target["vrfRTType"] == self.vpn_target_type \
and vpn_target["vrfRTValue"] == self.vpn_target_value:
return True
else:
continue
else:
if not vrf_af_ele.get("evpnTargets"):
return False
for evpn_target in vrf_af_ele.get("evpnTargets"):
if evpn_target["vrfRTType"] == self.vpn_target_type \
and evpn_target["vrfRTValue"] == self.vpn_target_value:
return True
else:
continue
else:
continue
return False
def set_update_cmd(self):
""" set update command"""
if not self.changed:
return
if self.vpn_target_type:
if self.vpn_target_type == "export_extcommunity":
vpn_target_type = "export-extcommunity"
else:
vpn_target_type = "import-extcommunity"
if self.state == "present":
self.updates_cmd.append('ip vpn-instance %s' % (self.vrf))
if self.vrf_aftype == 'ipv4uni':
self.updates_cmd.append('ipv4-family')
elif self.vrf_aftype == 'ipv6uni':
self.updates_cmd.append('ipv6-family')
if self.route_distinguisher:
if not self.is_vrf_rd_exist():
self.updates_cmd.append(
'route-distinguisher %s' % self.route_distinguisher)
else:
if self.get_exist_rd() is not None:
self.updates_cmd.append(
'undo route-distinguisher %s' % self.get_exist_rd())
if self.vpn_target_state == "present":
if not self.is_vrf_rt_exist():
if self.evpn is False:
self.updates_cmd.append(
'vpn-target %s %s' % (self.vpn_target_value, vpn_target_type))
else:
self.updates_cmd.append(
'vpn-target %s %s evpn' % (self.vpn_target_value, vpn_target_type))
elif self.vpn_target_state == "absent":
if self.is_vrf_rt_exist():
if self.evpn is False:
self.updates_cmd.append(
'undo vpn-target %s %s' % (self.vpn_target_value, vpn_target_type))
else:
self.updates_cmd.append(
'undo vpn-target %s %s evpn' % (self.vpn_target_value, vpn_target_type))
else:
self.updates_cmd.append('ip vpn-instance %s' % (self.vrf))
if self.vrf_aftype == 'ipv4uni':
self.updates_cmd.append('undo ipv4-family')
elif self.vrf_aftype == 'ipv6uni':
self.updates_cmd.append('undo ipv6-family')
def get_vrf(self):
""" check if vrf is need to change"""
getxmlstr = CE_NC_GET_VRF
xmlstr_new_1 = (self.vrf.lower())
xml_str = get_nc_config(self.module, getxmlstr)
re_find_1 = re.findall(
r'.*<vrfname>(.*)</vrfname>.*', xml_str.lower())
if re_find_1 is None:
return False
return xmlstr_new_1 in re_find_1
def get_vrf_af(self):
""" check if vrf is need to change"""
self.vrf_af_info["vpnInstAF"] = list()
if self.evpn is True:
getxmlstr = CE_NC_GET_VRF_AF % (
self.vrf, CE_NC_GET_EXTEND_VRF_TARGET)
else:
getxmlstr = CE_NC_GET_VRF_AF % (self.vrf, CE_NC_GET_VRF_TARGET)
xml_str = get_nc_config(self.module, getxmlstr)
if 'data/' in xml_str:
return self.state == 'present'
xml_str = xml_str.replace('\r', '').replace('\n', '').\
replace('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\
replace('xmlns="http://www.huawei.com/netconf/vrp"', "")
root = ElementTree.fromstring(xml_str)
# get the vpn address family and RD text
vrf_addr_types = root.findall(
"l3vpn/l3vpncomm/l3vpnInstances/l3vpnInstance/vpnInstAFs/vpnInstAF")
if vrf_addr_types:
for vrf_addr_type in vrf_addr_types:
vrf_af_info = dict()
for vrf_addr_type_ele in vrf_addr_type:
if vrf_addr_type_ele.tag in ["vrfName", "afType", "vrfRD"]:
vrf_af_info[vrf_addr_type_ele.tag] = vrf_addr_type_ele.text
if vrf_addr_type_ele.tag == 'vpnTargets':
vrf_af_info["vpnTargets"] = list()
for rtargets in vrf_addr_type_ele:
rt_dict = dict()
for rtarget in rtargets:
if rtarget.tag in ["vrfRTValue", "vrfRTType"]:
rt_dict[rtarget.tag] = rtarget.text
vrf_af_info["vpnTargets"].append(rt_dict)
if vrf_addr_type_ele.tag == 'exVpnTargets':
vrf_af_info["evpnTargets"] = list()
for rtargets in vrf_addr_type_ele:
rt_dict = dict()
for rtarget in rtargets:
if rtarget.tag in ["vrfRTValue", "vrfRTType"]:
rt_dict[rtarget.tag] = rtarget.text
vrf_af_info["evpnTargets"].append(rt_dict)
self.vrf_af_info["vpnInstAF"].append(vrf_af_info)
def check_params(self):
"""Check all input params"""
# vrf and description check
if self.vrf == '_public_':
self.module.fail_json(
msg='Error: The vrf name _public_ is reserved.')
if not self.get_vrf():
self.module.fail_json(
msg='Error: The vrf name do not exist.')
if self.state == 'present':
if self.route_distinguisher:
if not is_valid_value(self.route_distinguisher):
self.module.fail_json(msg='Error:The vrf route distinguisher length must between 3 ~ 21,'
'i.e. X.X.X.X:number<0-65535> or number<0-65535>:number<0-4294967295>'
'or number<0-65535>.number<0-65535>:number<0-65535>'
'or number<65536-4294967295>:number<0-65535>'
' but not be 0:0 or 0.0:0.')
if not self.vpn_target_state:
if self.vpn_target_value or self.vpn_target_type:
self.module.fail_json(
msg='Error: The vpn target state should be exist.')
if self.vpn_target_state:
if not self.vpn_target_value or not self.vpn_target_type:
self.module.fail_json(
msg='Error: The vpn target value and type should be exist.')
if self.vpn_target_value:
if not is_valid_value(self.vpn_target_value):
self.module.fail_json(msg='Error:The vrf target value length must between 3 ~ 21,'
'i.e. X.X.X.X:number<0-65535> or number<0-65535>:number<0-4294967295>'
'or number<0-65535>.number<0-65535>:number<0-65535>'
'or number<65536-4294967295>:number<0-65535>'
' but not be 0:0 or 0.0:0.')
def operate_vrf_af(self):
"""config/delete vrf"""
vrf_target_operate = ''
if self.route_distinguisher is None:
route_d = ''
else:
route_d = self.route_distinguisher
if self.state == 'present':
if self.vrf_aftype:
if self.is_vrf_af_exist():
self.vrf_af_type_changed = False
else:
self.vrf_af_type_changed = True
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
else:
self.vrf_af_type_changed = bool(self.is_vrf_af_exist())
if self.vpn_target_state == 'present':
if self.evpn is False and not self.is_vrf_rt_exist():
vrf_target_operate = CE_NC_CREATE_VRF_TARGET % (
self.vpn_target_type, self.vpn_target_value)
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
self.vpn_target_changed = True
if self.evpn is True and not self.is_vrf_rt_exist():
vrf_target_operate = CE_NC_CREATE_EXTEND_VRF_TARGET % (
self.vpn_target_type, self.vpn_target_value)
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
self.vpn_target_changed = True
elif self.vpn_target_state == 'absent':
if self.evpn is False and self.is_vrf_rt_exist():
vrf_target_operate = CE_NC_DELETE_VRF_TARGET % (
self.vpn_target_type, self.vpn_target_value)
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
self.vpn_target_changed = True
if self.evpn is True and self.is_vrf_rt_exist():
vrf_target_operate = CE_NC_DELETE_EXTEND_VRF_TARGET % (
self.vpn_target_type, self.vpn_target_value)
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
self.vpn_target_changed = True
else:
if self.route_distinguisher:
if not self.is_vrf_rd_exist():
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
self.vrf_rd_changed = True
else:
self.vrf_rd_changed = False
else:
if self.is_vrf_rd_exist():
configxmlstr = CE_NC_CREATE_VRF_AF % (
self.vrf, self.vrf_aftype, route_d, vrf_target_operate)
self.vrf_rd_changed = True
else:
self.vrf_rd_changed = False
if not self.vrf_rd_changed and not self.vrf_af_type_changed and not self.vpn_target_changed:
self.changed = False
else:
self.changed = True
else:
if self.is_vrf_af_exist():
configxmlstr = CE_NC_DELETE_VRF_AF % (
self.vrf, self.vrf_aftype)
self.changed = True
else:
self.changed = False
if not self.changed:
return
conf_str = build_config_xml(configxmlstr)
recv_xml = set_nc_config(self.module, conf_str)
self.check_response(recv_xml, "OPERATE_VRF_AF")
def get_proposed(self):
"""get_proposed"""
if self.state == 'present':
self.proposed['vrf'] = self.vrf
if self.vrf_aftype is None:
self.proposed['vrf_aftype'] = 'ipv4uni'
else:
self.proposed['vrf_aftype'] = self.vrf_aftype
if self.route_distinguisher is not None:
self.proposed['route_distinguisher'] = self.route_distinguisher
else:
self.proposed['route_distinguisher'] = list()
if self.vpn_target_state == 'present':
self.proposed['evpn'] = self.evpn
self.proposed['vpn_target_type'] = self.vpn_target_type
self.proposed['vpn_target_value'] = self.vpn_target_value
else:
self.proposed['vpn_target_type'] = list()
self.proposed['vpn_target_value'] = list()
else:
self.proposed = dict()
self.proposed['state'] = self.state
self.proposed['vrf'] = self.vrf
self.proposed['vrf_aftype'] = list()
self.proposed['route_distinguisher'] = list()
self.proposed['vpn_target_value'] = list()
self.proposed['vpn_target_type'] = list()
def get_existing(self):
"""get_existing"""
self.get_vrf_af()
self.existing['vrf'] = self.vrf
self.existing['vrf_aftype'] = list()
self.existing['route_distinguisher'] = list()
self.existing['vpn_target_value'] = list()
self.existing['vpn_target_type'] = list()
self.existing['evpn_target_value'] = list()
self.existing['evpn_target_type'] = list()
if self.vrf_af_info["vpnInstAF"] is None:
return
for vrf_af_ele in self.vrf_af_info["vpnInstAF"]:
self.existing['vrf_aftype'].append(vrf_af_ele["afType"])
self.existing['route_distinguisher'].append(
vrf_af_ele["vrfRD"])
if vrf_af_ele.get("vpnTargets"):
for vpn_target in vrf_af_ele.get("vpnTargets"):
self.existing['vpn_target_type'].append(
vpn_target["vrfRTType"])
self.existing['vpn_target_value'].append(
vpn_target["vrfRTValue"])
if vrf_af_ele.get("evpnTargets"):
for evpn_target in vrf_af_ele.get("evpnTargets"):
self.existing['evpn_target_type'].append(
evpn_target["vrfRTType"])
self.existing['evpn_target_value'].append(
evpn_target["vrfRTValue"])
def get_end_state(self):
"""get_end_state"""
self.get_vrf_af()
self.end_state['vrf'] = self.vrf
self.end_state['vrf_aftype'] = list()
self.end_state['route_distinguisher'] = list()
self.end_state['vpn_target_value'] = list()
self.end_state['vpn_target_type'] = list()
self.end_state['evpn_target_value'] = list()
self.end_state['evpn_target_type'] = list()
if self.vrf_af_info["vpnInstAF"] is None:
return
for vrf_af_ele in self.vrf_af_info["vpnInstAF"]:
self.end_state['vrf_aftype'].append(vrf_af_ele["afType"])
self.end_state['route_distinguisher'].append(vrf_af_ele["vrfRD"])
if vrf_af_ele.get("vpnTargets"):
for vpn_target in vrf_af_ele.get("vpnTargets"):
self.end_state['vpn_target_type'].append(
vpn_target["vrfRTType"])
self.end_state['vpn_target_value'].append(
vpn_target["vrfRTValue"])
if vrf_af_ele.get("evpnTargets"):
for evpn_target in vrf_af_ele.get("evpnTargets"):
self.end_state['evpn_target_type'].append(
evpn_target["vrfRTType"])
self.end_state['evpn_target_value'].append(
evpn_target["vrfRTValue"])
def work(self):
"""worker"""
self.check_params()
self.get_existing()
self.get_proposed()
self.operate_vrf_af()
self.set_update_cmd()
self.get_end_state()
self.results['changed'] = self.changed
self.results['proposed'] = self.proposed
self.results['existing'] = self.existing
self.results['end_state'] = self.end_state
if self.changed:
self.results['updates'] = self.updates_cmd
else:
self.results['updates'] = list()
self.module.exit_json(**self.results)
def main():
"""main"""
argument_spec = dict(
vrf=dict(required=True, type='str'),
vrf_aftype=dict(choices=['v4', 'v6'],
default='v4', required=False),
route_distinguisher=dict(required=False, type='str'),
evpn=dict(type='bool', default=False),
vpn_target_type=dict(
choices=['export_extcommunity', 'import_extcommunity'], required=False),
vpn_target_value=dict(required=False, type='str'),
vpn_target_state=dict(choices=['absent', 'present'], required=False),
state=dict(choices=['absent', 'present'],
default='present', required=False),
)
argument_spec.update(ce_argument_spec)
interface = VrfAf(argument_spec)
interface.work()
if __name__ == '__main__':
main()
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| __init__.py | File | 0 B | 0644 |
|
| a10_server.py | File | 10.45 KB | 0644 |
|
| a10_server_axapi3.py | File | 8.67 KB | 0644 |
|
| a10_service_group.py | File | 12.91 KB | 0644 |
|
| a10_virtual_server.py | File | 10.92 KB | 0644 |
|
| aireos_command.py | File | 6.93 KB | 0644 |
|
| aireos_config.py | File | 13.73 KB | 0644 |
|
| apconos_command.py | File | 5.96 KB | 0644 |
|
| aruba_command.py | File | 6.7 KB | 0644 |
|
| aruba_config.py | File | 16.41 KB | 0644 |
|
| avi_actiongroupconfig.py | File | 5.3 KB | 0644 |
|
| avi_alertconfig.py | File | 12.43 KB | 0644 |
|
| avi_alertemailconfig.py | File | 3.73 KB | 0644 |
|
| avi_alertscriptconfig.py | File | 3.53 KB | 0644 |
|
| avi_alertsyslogconfig.py | File | 3.69 KB | 0644 |
|
| avi_analyticsprofile.py | File | 31.36 KB | 0644 |
|
| avi_api_session.py | File | 8.86 KB | 0644 |
|
| avi_api_version.py | File | 2.65 KB | 0644 |
|
| avi_applicationpersistenceprofile.py | File | 6.47 KB | 0644 |
|
| avi_applicationprofile.py | File | 7.58 KB | 0644 |
|
| avi_authprofile.py | File | 5.06 KB | 0644 |
|
| avi_autoscalelaunchconfig.py | File | 4.38 KB | 0644 |
|
| avi_backup.py | File | 3.95 KB | 0644 |
|
| avi_backupconfiguration.py | File | 5.35 KB | 0644 |
|
| avi_certificatemanagementprofile.py | File | 3.64 KB | 0644 |
|
| avi_cloud.py | File | 11.09 KB | 0644 |
|
| avi_cloudconnectoruser.py | File | 4.57 KB | 0644 |
|
| avi_cloudproperties.py | File | 3.66 KB | 0644 |
|
| avi_cluster.py | File | 3.79 KB | 0644 |
|
| avi_clusterclouddetails.py | File | 3.47 KB | 0644 |
|
| avi_controllerproperties.py | File | 19.1 KB | 0644 |
|
| avi_customipamdnsprofile.py | File | 3.76 KB | 0644 |
|
| avi_dnspolicy.py | File | 3.69 KB | 0644 |
|
| avi_errorpagebody.py | File | 3.78 KB | 0644 |
|
| avi_errorpageprofile.py | File | 4.44 KB | 0644 |
|
| avi_gslb.py | File | 14.35 KB | 0644 |
|
| avi_gslbgeodbprofile.py | File | 4.07 KB | 0644 |
|
| avi_gslbservice.py | File | 9.43 KB | 0644 |
|
| avi_gslbservice_patch_member.py | File | 10.19 KB | 0644 |
|
| avi_hardwaresecuritymodulegroup.py | File | 3.5 KB | 0644 |
|
| avi_healthmonitor.py | File | 7.44 KB | 0644 |
|
| avi_httppolicyset.py | File | 5.22 KB | 0644 |
|
| avi_ipaddrgroup.py | File | 4.8 KB | 0644 |
|
| avi_ipamdnsproviderprofile.py | File | 6.04 KB | 0644 |
|
| avi_l4policyset.py | File | 4.03 KB | 0644 |
|
| avi_microservicegroup.py | File | 3.78 KB | 0644 |
|
| avi_network.py | File | 5.13 KB | 0644 |
|
| avi_networkprofile.py | File | 4.14 KB | 0644 |
|
| avi_networksecuritypolicy.py | File | 4.15 KB | 0644 |
|
| avi_pkiprofile.py | File | 5.32 KB | 0644 |
|
| avi_pool.py | File | 22.34 KB | 0644 |
|
| avi_poolgroup.py | File | 5.87 KB | 0644 |
|
| avi_poolgroupdeploymentpolicy.py | File | 5.49 KB | 0644 |
|
| avi_prioritylabels.py | File | 3.62 KB | 0644 |
|
| avi_role.py | File | 3.25 KB | 0644 |
|
| avi_scheduler.py | File | 5.08 KB | 0644 |
|
| avi_seproperties.py | File | 3.51 KB | 0644 |
|
| avi_serverautoscalepolicy.py | File | 7.22 KB | 0644 |
|
| avi_serviceengine.py | File | 5.74 KB | 0644 |
|
| avi_serviceenginegroup.py | File | 53.38 KB | 0644 |
|
| avi_snmptrapprofile.py | File | 3.4 KB | 0644 |
|
| avi_sslkeyandcertificate.py | File | 6.75 KB | 0644 |
|
| avi_sslprofile.py | File | 8.21 KB | 0644 |
|
| avi_stringgroup.py | File | 4.08 KB | 0644 |
|
| avi_systemconfiguration.py | File | 6.76 KB | 0644 |
|
| avi_tenant.py | File | 3.87 KB | 0644 |
|
| avi_trafficcloneprofile.py | File | 4.01 KB | 0644 |
|
| avi_user.py | File | 6.12 KB | 0644 |
|
| avi_useraccount.py | File | 5.02 KB | 0644 |
|
| avi_useraccountprofile.py | File | 4.65 KB | 0644 |
|
| avi_virtualservice.py | File | 29.62 KB | 0644 |
|
| avi_vrfcontext.py | File | 4.51 KB | 0644 |
|
| avi_vsdatascriptset.py | File | 4.86 KB | 0644 |
|
| avi_vsvip.py | File | 5.21 KB | 0644 |
|
| avi_webhook.py | File | 3.77 KB | 0644 |
|
| bcf_switch.py | File | 4.86 KB | 0644 |
|
| bigmon_chain.py | File | 3.99 KB | 0644 |
|
| bigmon_policy.py | File | 6.23 KB | 0644 |
|
| ce_aaa_server.py | File | 69.09 KB | 0644 |
|
| ce_aaa_server_host.py | File | 101.81 KB | 0644 |
|
| ce_acl.py | File | 35.95 KB | 0644 |
|
| ce_acl_advance.py | File | 73.4 KB | 0644 |
|
| ce_acl_interface.py | File | 10.36 KB | 0644 |
|
| ce_bfd_global.py | File | 21.02 KB | 0644 |
|
| ce_bfd_session.py | File | 21.99 KB | 0644 |
|
| ce_bfd_view.py | File | 19.71 KB | 0644 |
|
| ce_bgp.py | File | 79.52 KB | 0644 |
|
| ce_bgp_af.py | File | 133.02 KB | 0644 |
|
| ce_bgp_neighbor.py | File | 72.12 KB | 0644 |
|
| ce_bgp_neighbor_af.py | File | 110.55 KB | 0644 |
|
| ce_command.py | File | 7.79 KB | 0644 |
|
| ce_config.py | File | 17.88 KB | 0644 |
|
| ce_dldp.py | File | 18.62 KB | 0644 |
|
| ce_dldp_interface.py | File | 22.41 KB | 0644 |
|
| ce_eth_trunk.py | File | 22.44 KB | 0644 |
|
| ce_evpn_bd_vni.py | File | 39.01 KB | 0644 |
|
| ce_evpn_bgp.py | File | 26.71 KB | 0644 |
|
| ce_evpn_bgp_rr.py | File | 18 KB | 0644 |
|
| ce_evpn_global.py | File | 6.93 KB | 0644 |
|
| ce_facts.py | File | 11.4 KB | 0644 |
|
| ce_file_copy.py | File | 13.18 KB | 0644 |
|
| ce_info_center_debug.py | File | 21.33 KB | 0644 |
|
| ce_info_center_global.py | File | 67.85 KB | 0644 |
|
| ce_info_center_log.py | File | 20.09 KB | 0644 |
|
| ce_info_center_trap.py | File | 24.65 KB | 0644 |
|
| ce_interface.py | File | 31 KB | 0644 |
|
| ce_interface_ospf.py | File | 30.25 KB | 0644 |
|
| ce_ip_interface.py | File | 23.63 KB | 0644 |
|
| ce_is_is_instance.py | File | 8.95 KB | 0644 |
|
| ce_is_is_interface.py | File | 27.75 KB | 0644 |
|
| ce_is_is_view.py | File | 76.21 KB | 0644 |
|
| ce_lacp.py | File | 17.68 KB | 0644 |
|
| ce_link_status.py | File | 21.76 KB | 0644 |
|
| ce_lldp.py | File | 31.85 KB | 0644 |
|
| ce_lldp_interface.py | File | 68.35 KB | 0644 |
|
| ce_mdn_interface.py | File | 12.96 KB | 0644 |
|
| ce_mlag_config.py | File | 34.52 KB | 0644 |
|
| ce_mlag_interface.py | File | 36.1 KB | 0644 |
|
| ce_mtu.py | File | 18.87 KB | 0644 |
|
| ce_multicast_global.py | File | 8.98 KB | 0644 |
|
| ce_multicast_igmp_enable.py | File | 17.36 KB | 0644 |
|
| ce_netconf.py | File | 5.81 KB | 0644 |
|
| ce_netstream_aging.py | File | 18.14 KB | 0644 |
|
| ce_netstream_export.py | File | 18.9 KB | 0644 |
|
| ce_netstream_global.py | File | 36.93 KB | 0644 |
|
| ce_netstream_template.py | File | 16.57 KB | 0644 |
|
| ce_ntp.py | File | 20.32 KB | 0644 |
|
| ce_ntp_auth.py | File | 16.36 KB | 0644 |
|
| ce_ospf.py | File | 33.93 KB | 0644 |
|
| ce_ospf_vrf.py | File | 67.18 KB | 0644 |
|
| ce_reboot.py | File | 4.28 KB | 0644 |
|
| ce_rollback.py | File | 15.86 KB | 0644 |
|
| ce_sflow.py | File | 44.08 KB | 0644 |
|
| ce_snmp_community.py | File | 34.64 KB | 0644 |
|
| ce_snmp_contact.py | File | 7.23 KB | 0644 |
|
| ce_snmp_location.py | File | 6.96 KB | 0644 |
|
| ce_snmp_target_host.py | File | 32.84 KB | 0644 |
|
| ce_snmp_traps.py | File | 19.59 KB | 0644 |
|
| ce_snmp_user.py | File | 36.66 KB | 0644 |
|
| ce_startup.py | File | 15.45 KB | 0644 |
|
| ce_static_route.py | File | 29 KB | 0644 |
|
| ce_static_route_bfd.py | File | 60.9 KB | 0644 |
|
| ce_stp.py | File | 36.76 KB | 0644 |
|
| ce_switchport.py | File | 38.54 KB | 0644 |
|
| ce_vlan.py | File | 20.88 KB | 0644 |
|
| ce_vrf.py | File | 10.73 KB | 0644 |
|
| ce_vrf_af.py | File | 30.04 KB | 0644 |
|
| ce_vrf_interface.py | File | 15.17 KB | 0644 |
|
| ce_vrrp.py | File | 52.15 KB | 0644 |
|
| ce_vxlan_arp.py | File | 24.02 KB | 0644 |
|
| ce_vxlan_gateway.py | File | 33.38 KB | 0644 |
|
| ce_vxlan_global.py | File | 18.3 KB | 0644 |
|
| ce_vxlan_tunnel.py | File | 30.95 KB | 0644 |
|
| ce_vxlan_vap.py | File | 33.03 KB | 0644 |
|
| cnos_backup.py | File | 9.69 KB | 0644 |
|
| cnos_banner.py | File | 5.64 KB | 0644 |
|
| cnos_bgp.py | File | 43.15 KB | 0644 |
|
| cnos_command.py | File | 5.84 KB | 0644 |
|
| cnos_conditional_command.py | File | 5.62 KB | 0644 |
|
| cnos_conditional_template.py | File | 6.68 KB | 0644 |
|
| cnos_config.py | File | 10.86 KB | 0644 |
|
| cnos_factory.py | File | 3.36 KB | 0644 |
|
| cnos_facts.py | File | 17.45 KB | 0644 |
|
| cnos_image.py | File | 8.65 KB | 0644 |
|
| cnos_interface.py | File | 15.57 KB | 0644 |
|
| cnos_l2_interface.py | File | 17.75 KB | 0644 |
|
| cnos_l3_interface.py | File | 12.54 KB | 0644 |
|
| cnos_linkagg.py | File | 9.84 KB | 0644 |
|
| cnos_lldp.py | File | 4.13 KB | 0644 |
|
| cnos_logging.py | File | 12.73 KB | 0644 |
|
| cnos_reload.py | File | 3.25 KB | 0644 |
|
| cnos_rollback.py | File | 10.32 KB | 0644 |
|
| cnos_save.py | File | 3.42 KB | 0644 |
|
| cnos_showrun.py | File | 3.34 KB | 0644 |
|
| cnos_static_route.py | File | 9.47 KB | 0644 |
|
| cnos_system.py | File | 12.93 KB | 0644 |
|
| cnos_template.py | File | 5.25 KB | 0644 |
|
| cnos_user.py | File | 12.28 KB | 0644 |
|
| cnos_vlag.py | File | 15.19 KB | 0644 |
|
| cnos_vlan.py | File | 10.69 KB | 0644 |
|
| cnos_vrf.py | File | 11.64 KB | 0644 |
|
| cv_server_provision.py | File | 23.67 KB | 0644 |
|
| dladm_etherstub.py | File | 3.93 KB | 0644 |
|
| dladm_iptun.py | File | 7.49 KB | 0644 |
|
| dladm_linkprop.py | File | 7.53 KB | 0644 |
|
| dladm_vlan.py | File | 5.15 KB | 0644 |
|
| dladm_vnic.py | File | 6.43 KB | 0644 |
|
| edgeos_command.py | File | 5.57 KB | 0644 |
|
| edgeos_config.py | File | 10.65 KB | 0644 |
|
| edgeos_facts.py | File | 8.06 KB | 0644 |
|
| edgeswitch_facts.py | File | 7.56 KB | 0644 |
|
| edgeswitch_vlan.py | File | 15.03 KB | 0644 |
|
| enos_command.py | File | 6.07 KB | 0644 |
|
| enos_config.py | File | 10.95 KB | 0644 |
|
| enos_facts.py | File | 15.23 KB | 0644 |
|
| eric_eccli_command.py | File | 6.89 KB | 0644 |
|
| exos_command.py | File | 7.23 KB | 0644 |
|
| exos_config.py | File | 16.96 KB | 0644 |
|
| exos_facts.py | File | 5.72 KB | 0644 |
|
| exos_l2_interfaces.py | File | 26.19 KB | 0644 |
|
| exos_lldp_global.py | File | 10.39 KB | 0644 |
|
| exos_lldp_interfaces.py | File | 13.68 KB | 0644 |
|
| exos_vlans.py | File | 16.07 KB | 0644 |
|
| flowadm.py | File | 14.32 KB | 0644 |
|
| ftd_configuration.py | File | 4.93 KB | 0644 |
|
| ftd_file_download.py | File | 4.26 KB | 0644 |
|
| ftd_file_upload.py | File | 3.54 KB | 0644 |
|
| ftd_install.py | File | 11.54 KB | 0644 |
|
| iap_start_workflow.py | File | 5.21 KB | 0644 |
|
| iap_token.py | File | 3.83 KB | 0644 |
|
| icx_banner.py | File | 6.54 KB | 0644 |
|
| icx_command.py | File | 7.22 KB | 0644 |
|
| icx_config.py | File | 18.28 KB | 0644 |
|
| icx_copy.py | File | 15.16 KB | 0644 |
|
| icx_facts.py | File | 17 KB | 0644 |
|
| icx_interface.py | File | 23.05 KB | 0644 |
|
| icx_l3_interface.py | File | 14.56 KB | 0644 |
|
| icx_linkagg.py | File | 10.03 KB | 0644 |
|
| icx_lldp.py | File | 5.13 KB | 0644 |
|
| icx_logging.py | File | 18.1 KB | 0644 |
|
| icx_ping.py | File | 7.84 KB | 0644 |
|
| icx_static_route.py | File | 9.38 KB | 0644 |
|
| icx_system.py | File | 16.14 KB | 0644 |
|
| icx_user.py | File | 13.05 KB | 0644 |
|
| icx_vlan.py | File | 26.24 KB | 0644 |
|
| ig_config.py | File | 16 KB | 0644 |
|
| ig_unit_information.py | File | 3.9 KB | 0644 |
|
| ipadm_addr.py | File | 11.31 KB | 0644 |
|
| ipadm_addrprop.py | File | 6.86 KB | 0644 |
|
| ipadm_if.py | File | 5.47 KB | 0644 |
|
| ipadm_ifprop.py | File | 7.94 KB | 0644 |
|
| ipadm_prop.py | File | 6.79 KB | 0644 |
|
| ironware_command.py | File | 5.07 KB | 0644 |
|
| ironware_config.py | File | 11.11 KB | 0644 |
|
| ironware_facts.py | File | 19.45 KB | 0644 |
|
| nclu.py | File | 8.02 KB | 0644 |
|
| netact_cm_command.py | File | 11.77 KB | 0644 |
|
| netscaler_cs_action.py | File | 8.71 KB | 0644 |
|
| netscaler_cs_policy.py | File | 9.28 KB | 0644 |
|
| netscaler_cs_vserver.py | File | 42.83 KB | 0644 |
|
| netscaler_gslb_service.py | File | 23.35 KB | 0644 |
|
| netscaler_gslb_site.py | File | 13.73 KB | 0644 |
|
| netscaler_gslb_vserver.py | File | 32.98 KB | 0644 |
|
| netscaler_lb_monitor.py | File | 46.23 KB | 0644 |
|
| netscaler_lb_vserver.py | File | 70.58 KB | 0644 |
|
| netscaler_nitro_request.py | File | 27.82 KB | 0644 |
|
| netscaler_save_config.py | File | 4.67 KB | 0644 |
|
| netscaler_server.py | File | 12.88 KB | 0644 |
|
| netscaler_service.py | File | 30.9 KB | 0644 |
|
| netscaler_servicegroup.py | File | 34.33 KB | 0644 |
|
| netscaler_ssl_certkey.py | File | 11.6 KB | 0644 |
|
| nos_command.py | File | 7.15 KB | 0644 |
|
| nos_config.py | File | 14.61 KB | 0644 |
|
| nos_facts.py | File | 13.44 KB | 0644 |
|
| nuage_vspk.py | File | 41.3 KB | 0644 |
|
| opx_cps.py | File | 12.18 KB | 0644 |
|
| ordnance_config.py | File | 12.03 KB | 0644 |
|
| ordnance_facts.py | File | 8.26 KB | 0644 |
|
| pn_access_list.py | File | 4.29 KB | 0644 |
|
| pn_access_list_ip.py | File | 4.42 KB | 0644 |
|
| pn_admin_service.py | File | 5.62 KB | 0644 |
|
| pn_admin_session_timeout.py | File | 2.96 KB | 0644 |
|
| pn_admin_syslog.py | File | 6.4 KB | 0644 |
|
| pn_connection_stats_settings.py | File | 10.3 KB | 0644 |
|
| pn_cpu_class.py | File | 5.65 KB | 0644 |
|
| pn_cpu_mgmt_class.py | File | 3.75 KB | 0644 |
|
| pn_dhcp_filter.py | File | 4.66 KB | 0644 |
|
| pn_dscp_map.py | File | 4.03 KB | 0644 |
|
| pn_dscp_map_pri_map.py | File | 3.99 KB | 0644 |
|
| pn_fabric_local.py | File | 4.71 KB | 0644 |
|
| pn_igmp_snooping.py | File | 6.22 KB | 0644 |
|
| pn_ipv6security_raguard.py | File | 6.64 KB | 0644 |
|
| pn_ipv6security_raguard_port.py | File | 3.73 KB | 0644 |
|
| pn_ipv6security_raguard_vlan.py | File | 4.77 KB | 0644 |
|
| pn_log_audit_exception.py | File | 5.65 KB | 0644 |
|
| pn_port_config.py | File | 11.93 KB | 0644 |
|
| pn_port_cos_bw.py | File | 3.96 KB | 0644 |
|
| pn_port_cos_rate_setting.py | File | 5.67 KB | 0644 |
|
| pn_prefix_list.py | File | 4.12 KB | 0644 |
|
| pn_prefix_list_network.py | File | 5.06 KB | 0644 |
|
| pn_role.py | File | 6.14 KB | 0644 |
|
| pn_snmp_community.py | File | 4.99 KB | 0644 |
|
| pn_snmp_trap_sink.py | File | 6 KB | 0644 |
|
| pn_snmp_vacm.py | File | 6.09 KB | 0644 |
|
| pn_stp.py | File | 5.91 KB | 0644 |
|
| pn_stp_port.py | File | 5.02 KB | 0644 |
|
| pn_switch_setup.py | File | 12.88 KB | 0644 |
|
| pn_user.py | File | 5.11 KB | 0644 |
|
| pn_vflow_table_profile.py | File | 3.62 KB | 0644 |
|
| pn_vrouter_bgp.py | File | 16.33 KB | 0644 |
|
| pn_vrouter_bgp_network.py | File | 5.06 KB | 0644 |
|
| pn_vrouter_interface_ip.py | File | 7.05 KB | 0644 |
|
| pn_vrouter_loopback_interface.py | File | 6.4 KB | 0644 |
|
| pn_vrouter_ospf.py | File | 5.57 KB | 0644 |
|
| pn_vrouter_ospf6.py | File | 5.49 KB | 0644 |
|
| pn_vrouter_packet_relay.py | File | 5.49 KB | 0644 |
|
| pn_vrouter_pim_config.py | File | 4.77 KB | 0644 |
|
| pn_vtep.py | File | 5.1 KB | 0644 |
|
| slxos_command.py | File | 7.19 KB | 0644 |
|
| slxos_config.py | File | 17.87 KB | 0644 |
|
| slxos_facts.py | File | 13.43 KB | 0644 |
|
| slxos_interface.py | File | 14.25 KB | 0644 |
|
| slxos_l2_interface.py | File | 16.58 KB | 0644 |
|
| slxos_l3_interface.py | File | 9.41 KB | 0644 |
|
| slxos_linkagg.py | File | 9.57 KB | 0644 |
|
| slxos_lldp.py | File | 3.33 KB | 0644 |
|
| slxos_vlan.py | File | 9.39 KB | 0644 |
|
| sros_command.py | File | 6.66 KB | 0644 |
|
| sros_config.py | File | 10.97 KB | 0644 |
|
| sros_rollback.py | File | 6.26 KB | 0644 |
|
| vdirect_commit.py | File | 12.58 KB | 0644 |
|
| vdirect_file.py | File | 8.99 KB | 0644 |
|
| vdirect_runnable.py | File | 13.38 KB | 0644 |
|
| voss_command.py | File | 7.75 KB | 0644 |
|
| voss_config.py | File | 18.33 KB | 0644 |
|
| voss_facts.py | File | 15.67 KB | 0644 |
|