summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/network/cloudengine/ce_multicast_igmp_enable.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/modules/network/cloudengine/ce_multicast_igmp_enable.py')
-rw-r--r--lib/ansible/modules/network/cloudengine/ce_multicast_igmp_enable.py545
1 files changed, 0 insertions, 545 deletions
diff --git a/lib/ansible/modules/network/cloudengine/ce_multicast_igmp_enable.py b/lib/ansible/modules/network/cloudengine/ce_multicast_igmp_enable.py
deleted file mode 100644
index d8fbba55e4..0000000000
--- a/lib/ansible/modules/network/cloudengine/ce_multicast_igmp_enable.py
+++ /dev/null
@@ -1,545 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Copyright 2019 Red Hat
-# GNU General Public License v3.0+
-# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
-
-from __future__ import (absolute_import, division, print_function)
-__metaclass__ = type
-
-
-ANSIBLE_METADATA = {'metadata_version': '1.1',
- 'status': ['preview'],
- 'supported_by': 'community'}
-
-DOCUMENTATION = '''
----
-module: ce_multicast_igmp_enable
-version_added: "2.10"
-author: xuxiaowei0512 (@CloudEngine-Ansible)
-short_description: Manages multicast igmp enable configuration on HUAWEI CloudEngine switches.
-description:
- - Manages multicast igmp on HUAWEI CloudEngine switches.
-notes:
- - If no vrf is supplied, vrf is set to default.
- If I(state=absent), the route will be removed, regardless of the
- non-required parameters.
- - This module requires the netconf system service be enabled on
- the remote device being managed.
- - This module works with connection C(netconf).
-options:
- aftype:
- description:
- - Destination ip address family type of static route.
- required: true
- type: str
- choices: ['v4','v6']
- features:
- description:
- - Distinguish between Globally Enabled IGMP or
- - Enabled IGMP under vlanID.
- required: true
- type: str
- choices: ['global','vlan']
- vlan_id:
- description:
- - Virtual LAN identity.
- type: int
- igmp:
- description:
- - Enable Layer 2 multicast Snooping in a VLAN.
- type: bool
- version:
- description:
- - Specifies the IGMP version that can be processed.
- default: 2
- type: int
- proxy:
- description:
- - Layer 2 multicast snooping proxy is enabled.
- type: bool
- state:
- description:
- - Specify desired state of the resource.
- choices: ['present','absent']
- default: present
- type: str
-'''
-
-EXAMPLES = '''
-
- - name: configure global igmp enable
- ce_multicast_igmp_enable:
- aftype: v4
- features: 'global'
- state: present
-
- - name: configure global igmp disable
- ce_multicast_igmp_enable:
- features: 'global'
- aftype: v4
- state: absent
-
- - name: configure vlan igmp enable
- ce_multicast_igmp_enable:
- features: 'vlan'
- aftype: v4
- vlan_id: 1
- igmp: true
-
- - name: new proxy,igmp,version
- ce_multicast_igmp_enable:
- features: 'vlan'
- aftype: v4
- vlan_id: 1
- proxy: true
- igmp: true
- version: 1
-
- - name: modify proxy,igmp,version
- ce_multicast_igmp_enable:
- features: 'vlan'
- aftype: v4
- vlan_id: 1
- version: 2
-
- - name: delete proxy,igmp,version
- ce_multicast_igmp_enable:
- features: 'vlan'
- aftype: v4
- vlan_id: 1
- state: absent
-'''
-RETURN = '''
-proposed:
- description: k/v pairs of parameters passed into module
- returned: always
- type: dict
- sample: {"addrFamily": "ipv4unicast", "features": "vlan", "proxyEnable": "false",
- "snoopingEnable": "false", "state": "absent", "version": 2, "vlanId": 1}
-existing:
- description: k/v pairs of existing switchport
- returned: always
- type: dict
- sample: {}
-end_state:
- description: k/v pairs of switchport after module execution
- returned: always
- type: dict
- sample: {}
-updates:
- description: command list sent to the device
- returned: always
- type: list
- sample: ["undo igmp snooping enable",
- "undo igmp snooping version",
- "undo igmp snooping proxy"]
-changed:
- description: check if a change was made on the device
- returned: always
- type: bool
- sample: true
-'''
-
-from xml.etree import ElementTree
-from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils.network.cloudengine.ce import get_nc_config, set_nc_config
-
-CE_NC_GET_IGMP_GLOBAL = """
-<filter type="subtree">
- <l2mc xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
- <l2McSnpgEnables>
- <l2McSnpgEnable>
- <addrFamily>%s</addrFamily>
- </l2McSnpgEnable>
- </l2McSnpgEnables>
- </l2mc>
-</filter>
-"""
-CE_NC_MERGE_IGMP_SYSVIEW = """
-<l2mc xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
- <l2McSnpgEnables>
- <l2McSnpgEnable operation="merge">
- <addrFamily>%s</addrFamily>
- </l2McSnpgEnable>
- </l2McSnpgEnables>
-</l2mc>
-"""
-CE_NC_DELETE_IGMP_SYSVIEW = """
-<l2mc xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
- <l2McSnpgEnables>
- <l2McSnpgEnable operation="delete">
- <addrFamily>%s</addrFamily>
- </l2McSnpgEnable>
- </l2McSnpgEnables>
-</l2mc>
-"""
-CE_NC_GET_IGMP_VLAN_INFO = """
-<filter type="subtree">
- <l2mc xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
- <vlan>
- <l2McVlanCfgs>
- <l2McVlanCfg>
- <addrFamily>%s</addrFamily>
- <vlanId>%s</vlanId>
- <snoopingEnable></snoopingEnable>
- <version></version>
- <proxyEnable></proxyEnable>
- </l2McVlanCfg>
- </l2McVlanCfgs>
- </vlan>
- </l2mc>
-</filter>
-"""
-CE_NC_MERGE_IGMP_VLANVIEW = """
-<l2mc xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
- <vlan>
- <l2McVlanCfgs>
- <l2McVlanCfg operation="merge">
- <addrFamily>%s</addrFamily>
- <vlanId>%s</vlanId>%s%s%s
- </l2McVlanCfg>
- </l2McVlanCfgs>
- </vlan>
-</l2mc>
-"""
-CE_NC_MERGE_IGMP_VLANVIEW_SNOENABLE = """
-<snoopingEnable>%s</snoopingEnable>
-"""
-CE_NC_MERGE_IGMP_VLANVIEW_VERSION = """
-<version>%s</version>
-"""
-CE_NC_MERGE_IGMP_VLANVIEW_PROXYENABLE = """
-<proxyEnable>%s</proxyEnable>
-"""
-CE_NC_DELETE_IGMP_VLANVIEW = """
-<l2mc xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
- <vlan>
- <l2McVlanCfgs>
- <l2McVlanCfg operation="delete">
- <addrFamily>%s</addrFamily>
- <vlanId>%s</vlanId>
- </l2McVlanCfg>
- </l2McVlanCfgs>
- </vlan>
-</l2mc>
-"""
-
-
-def get_xml(xml, value):
- """operate xml"""
- tempxml = xml % value
- return tempxml
-
-
-def build_config_xml(xmlstr):
- """build config xml"""
-
- return '<config> ' + xmlstr + ' </config>'
-
-
-class IgmpSnoop(object):
- """igmp snooping module"""
-
- def __init__(self, argument_spec):
- """igmp snooping info"""
- self.spec = argument_spec
- self.module = None
- self._initmodule_()
-
- self.aftype = self.module.params['aftype']
- self.state = self.module.params['state']
- if self.aftype == "v4":
- self.addr_family = "ipv4unicast"
- else:
- self.addr_family = "ipv6unicast"
- self.features = self.module.params['features']
- self.vlan_id = self.module.params['vlan_id']
- self.igmp = str(self.module.params['igmp']).lower()
- self.version = self.module.params['version']
- if self.version is None:
- self.version = 2
- self.proxy = str(self.module.params['proxy']).lower()
- # state
- self.changed = False
- self.updates_cmd = list()
- self.results = dict()
- self.proposed = dict()
- self.existing = dict()
- self.end_state = dict()
- self.igmp_info_data = dict()
-
- def _initmodule_(self):
- """init module"""
- self.module = AnsibleModule(
- argument_spec=self.spec, supports_check_mode=False)
-
- def _checkresponse_(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 _checkparams_(self):
- """check all input params"""
- # check vlan id
- if self.features == 'vlan':
- if not self.vlan_id:
- self.module.fail_json(msg='Error: missing required arguments: vlan_id.')
-
- if self.vlan_id:
- if self.vlan_id <= 0 or self.vlan_id > 4094:
- self.module.fail_json(
- msg='Error: Vlan id is not in the range from 1 to 4094.')
- # check version
- if self.version:
- if self.version <= 0 or self.version > 3:
- self.module.fail_json(
- msg='Error: Version id is not in the range from 1 to 3.')
-
- def set_change_state(self):
- """set change state"""
- state = self.state
- change = False
- # vlan view igmp
- if self.features == 'vlan':
- self.get_igmp_vlan()
- change = self.compare_data()
- else:
- # sys view igmp(global)
- self.get_igmp_global()
- # new or edit
- if state == 'present':
- if not self.igmp_info_data["igmp_info"]:
- # igmp_info_data has not igmp_info value.
- change = True
- else:
- # delete
- if self.igmp_info_data["igmp_info"]:
- # igmp_info_data has not igmp_info value.
- change = True
- self.changed = change
-
- def compare_data(self):
- """compare new data and old data"""
- state = self.state
- change = False
- # new or edit
- if state == 'present':
- # edit
- if self.igmp_info_data["igmp_info"]:
- for data in self.igmp_info_data["igmp_info"]:
- if self.addr_family == data["addrFamily"] and str(self.vlan_id) == data["vlanId"]:
- if self.igmp:
- if self.igmp != data["snoopingEnable"]:
- change = True
- if self.version:
- if str(self.version) != data["version"]:
- change = True
- if self.proxy:
- if self.proxy != data["proxyEnable"]:
- change = True
- # new
- else:
- change = True
- else:
- # delete
- if self.igmp_info_data["igmp_info"]:
- change = True
- return change
-
- def get_igmp_vlan(self):
- """get igmp vlan info data"""
- self.igmp_info_data["igmp_info"] = list()
- getxmlstr = CE_NC_GET_IGMP_VLAN_INFO % (self.addr_family, self.vlan_id)
- xml_str = get_nc_config(self.module, getxmlstr)
- if 'data/' in xml_str:
- return
- 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)
- igmp_enable = root.findall(
- "l2mc/vlan/l2McVlanCfgs/l2McVlanCfg")
- if igmp_enable:
- # igmp_enable = [{addressFamily:'xx'}]
- for igmp_enable_key in igmp_enable:
- # igmp_enable_key = {addressFamily:'xx'}
- igmp_global_info = dict()
- for ele in igmp_enable_key:
- if ele.tag in ["addrFamily", "vlanId", "snoopingEnable", "version", "proxyEnable"]:
- igmp_global_info[ele.tag] = ele.text
- self.igmp_info_data["igmp_info"].append(igmp_global_info)
-
- def get_igmp_global(self):
- """get igmp global data"""
- self.igmp_info_data["igmp_info"] = list()
- getxmlstr = CE_NC_GET_IGMP_GLOBAL % (
- self.addr_family)
- xml_str = get_nc_config(self.module, getxmlstr)
- if 'data/' in xml_str:
- return
- 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)
- igmp_enable = root.findall(
- 'l2mc/l2McSnpgEnables/l2McSnpgEnable')
- if igmp_enable:
- # igmp_enable = [{addressFamily:'xx'}]
- for igmp_enable_key in igmp_enable:
- # igmp_enable_key = {addressFamily:'xx'}
- igmp_global_info = dict()
- for ele in igmp_enable_key:
- if ele.tag in ["addrFamily"]:
- igmp_global_info[ele.tag] = ele.text
- self.igmp_info_data["igmp_info"].append(igmp_global_info)
-
- def set_vlanview_igmp(self):
- """set igmp of vlanview"""
- if not self.changed:
- return
- addr_family = self.addr_family
- state = self.state
- igmp_xml = """\n"""
- version_xml = """\n"""
- proxy_xml = """\n"""
- if state == "present":
- if self.igmp:
- igmp_xml = get_xml(CE_NC_MERGE_IGMP_VLANVIEW_SNOENABLE, self.igmp.lower())
- if str(self.version):
- version_xml = get_xml(CE_NC_MERGE_IGMP_VLANVIEW_VERSION, self.version)
- if self.proxy:
- proxy_xml = get_xml(CE_NC_MERGE_IGMP_VLANVIEW_PROXYENABLE, self.proxy.lower())
- configxmlstr = CE_NC_MERGE_IGMP_VLANVIEW % (
- addr_family, self.vlan_id, igmp_xml, version_xml, proxy_xml)
- else:
- configxmlstr = CE_NC_DELETE_IGMP_VLANVIEW % (addr_family, self.vlan_id)
- conf_str = build_config_xml(configxmlstr)
- recv_xml = set_nc_config(self.module, conf_str)
- self._checkresponse_(recv_xml, "SET_VLANVIEW_IGMP")
-
- def set_sysview_igmp(self):
- """set igmp of sysview"""
- if not self.changed:
- return
- version = self.addr_family
- state = self.state
- if state == "present":
- configxmlstr = CE_NC_MERGE_IGMP_SYSVIEW % (version)
- else:
- configxmlstr = CE_NC_DELETE_IGMP_SYSVIEW % (version)
-
- conf_str = build_config_xml(configxmlstr)
- recv_xml = set_nc_config(self.module, conf_str)
- self._checkresponse_(recv_xml, "SET_SYSVIEW_IGMP")
-
- def set_sysview_cmd(self):
- """set sysview update command"""
- if not self.changed:
- return
- if self.state == "present":
- self.updates_cmd.append('igmp snooping enable')
- else:
- self.updates_cmd.append('undo igmp snooping enable')
-
- def set_vlanview_cmd(self):
- """set vlanview update command"""
- if not self.changed:
- return
- if self.state == "present":
- if self.igmp:
- if self.igmp.lower() == 'true':
- self.updates_cmd.append('igmp snooping enable')
- else:
- self.updates_cmd.append('undo igmp snooping enable')
- if str(self.version):
- self.updates_cmd.append('igmp snooping version %s' % (self.version))
- else:
- self.updates_cmd.append('undo igmp snooping version')
- if self.proxy:
- if self.proxy.lower() == 'true':
- self.updates_cmd.append('igmp snooping proxy')
- else:
- self.updates_cmd.append('undo igmp snooping proxy')
-
- else:
- self.updates_cmd.append('undo igmp snooping enable')
- self.updates_cmd.append('undo igmp snooping version')
- self.updates_cmd.append('undo igmp snooping proxy')
-
- def get_existing(self):
- """get existing information"""
- self.set_change_state()
- self.existing["igmp_info"] = self.igmp_info_data["igmp_info"]
-
- def get_proposed(self):
- """get proposed information"""
- self.proposed['addrFamily'] = self.addr_family
- self.proposed['features'] = self.features
- if self.features == 'vlan':
- self.proposed['snoopingEnable'] = self.igmp
- self.proposed['version'] = self.version
- self.proposed['vlanId'] = self.vlan_id
- self.proposed['proxyEnable'] = self.proxy
- self.proposed['state'] = self.state
-
- def set_igmp_netconf(self):
- """config netconf"""
- if self.features == 'vlan':
- self.set_vlanview_igmp()
- else:
- self.set_sysview_igmp()
-
- def set_update_cmd(self):
- """set update command"""
- if self.features == 'vlan':
- self.set_vlanview_cmd()
- else:
- self.set_sysview_cmd()
-
- def get_end_state(self):
- """get end state information"""
- if self.features == 'vlan':
- self.get_igmp_vlan()
- else:
- # sys view igmp(global)
- self.get_igmp_global()
- self.end_state["igmp_info"] = self.igmp_info_data["igmp_info"]
-
- def work(self):
- """worker"""
- self._checkparams_()
- self.get_existing()
- self.get_proposed()
- self.set_igmp_netconf()
- self.set_update_cmd()
- self.get_end_state()
- self.results['changed'] = self.changed
- self.results['existing'] = self.existing
- self.results['proposed'] = self.proposed
- 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(
- aftype=dict(choices=['v4', 'v6'], required=True),
- features=dict(required=True, choices=['global', 'vlan'], type='str'),
- vlan_id=dict(type='int'),
- igmp=dict(type='bool', default=False),
- version=dict(type='int', default=2),
- proxy=dict(type='bool', default=False),
- state=dict(choices=['absent', 'present'], default='present'),
- )
- interface = IgmpSnoop(argument_spec)
- interface.work()
-
-
-if __name__ == '__main__':
- main()