update acl (#57268)

This commit is contained in:
xuxiaowei0512 2019-06-13 00:58:16 +08:00 committed by Nathaniel Case
parent 6d21cebd7d
commit e009936f87
3 changed files with 100 additions and 54 deletions

View file

@ -427,7 +427,7 @@ class BaseAcl(object):
if self.acl_type: if self.acl_type:
conf_str += "<aclType></aclType>" conf_str += "<aclType></aclType>"
if self.acl_num: if self.acl_num or self.acl_name.isdigit():
conf_str += "<aclNumber></aclNumber>" conf_str += "<aclNumber></aclNumber>"
if self.acl_step: if self.acl_step:
conf_str += "<aclStep></aclStep>" conf_str += "<aclStep></aclStep>"
@ -444,12 +444,11 @@ class BaseAcl(object):
xml_str = recv_xml.replace('\r', '').replace('\n', '').\ xml_str = recv_xml.replace('\r', '').replace('\n', '').\
replace('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replace('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\
replace('xmlns="http://www.huawei.com/netconf/vrp"', "") replace('xmlns="http://www.huawei.com/netconf/vrp"', "")
root = ElementTree.fromstring(xml_str) root = ElementTree.fromstring(xml_str)
# parse acl # parse acl
acl_info = root.findall( acl_info = root.findall(
"data/acl/aclGroups/aclGroup") "acl/aclGroups/aclGroup")
if acl_info: if acl_info:
for tmp in acl_info: for tmp in acl_info:
tmp_dict = dict() tmp_dict = dict()
@ -460,22 +459,43 @@ class BaseAcl(object):
self.cur_acl_cfg["acl_info"].append(tmp_dict) self.cur_acl_cfg["acl_info"].append(tmp_dict)
if self.cur_acl_cfg["acl_info"]: if self.cur_acl_cfg["acl_info"]:
find_list = list()
for tmp in self.cur_acl_cfg["acl_info"]: for tmp in self.cur_acl_cfg["acl_info"]:
find_flag = True cur_cfg_dict = dict()
exist_cfg_dict = dict()
if self.acl_name:
if self.acl_name.isdigit() and tmp.get("aclNumber"):
cur_cfg_dict["aclNumber"] = self.acl_name
exist_cfg_dict["aclNumber"] = tmp.get("aclNumber")
else:
cur_cfg_dict["aclNumOrName"] = self.acl_name
exist_cfg_dict["aclNumOrName"] = tmp.get("aclNumOrName")
if self.acl_type:
cur_cfg_dict["aclType"] = self.acl_type
exist_cfg_dict["aclType"] = tmp.get("aclType")
if self.acl_num:
cur_cfg_dict["aclNumber"] = self.acl_num
exist_cfg_dict["aclNumber"] = tmp.get("aclNumber")
if self.acl_step:
cur_cfg_dict["aclStep"] = self.acl_step
exist_cfg_dict["aclStep"] = tmp.get("aclStep")
if self.acl_description:
cur_cfg_dict["aclDescription"] = self.acl_description
exist_cfg_dict["aclDescription"] = tmp.get("aclDescription")
if self.acl_name and tmp.get("aclNumOrName") != self.acl_name: if cur_cfg_dict == exist_cfg_dict:
find_flag = False find_bool = True
if self.acl_type and tmp.get("aclType") != self.acl_type: else:
find_flag = False find_bool = False
if self.acl_num and tmp.get("aclNumber") != self.acl_num: find_list.append(find_bool)
find_flag = False
if self.acl_step and tmp.get("aclStep") != self.acl_step:
find_flag = False
if self.acl_description and tmp.get("aclDescription") != self.acl_description:
find_flag = False
if find_flag: for mem in find_list:
if mem:
find_flag = True
break break
else:
find_flag = False
else: else:
find_flag = False find_flag = False
@ -593,7 +613,7 @@ class BaseAcl(object):
# parse base rule # parse base rule
base_rule_info = root.findall( base_rule_info = root.findall(
"data/acl/aclGroups/aclGroup/aclRuleBas4s/aclRuleBas4") "acl/aclGroups/aclGroup/aclRuleBas4s/aclRuleBas4")
if base_rule_info: if base_rule_info:
for tmp in base_rule_info: for tmp in base_rule_info:
tmp_dict = dict() tmp_dict = dict()

View file

@ -602,7 +602,7 @@ class AdvanceAcl(object):
if self.acl_type: if self.acl_type:
conf_str += "<aclType></aclType>" conf_str += "<aclType></aclType>"
if self.acl_num: if self.acl_num or self.acl_name.isdigit():
conf_str += "<aclNumber></aclNumber>" conf_str += "<aclNumber></aclNumber>"
if self.acl_step: if self.acl_step:
conf_str += "<aclStep></aclStep>" conf_str += "<aclStep></aclStep>"
@ -624,7 +624,7 @@ class AdvanceAcl(object):
# parse acl # parse acl
acl_info = root.findall( acl_info = root.findall(
"data/acl/aclGroups/aclGroup") "acl/aclGroups/aclGroup")
if acl_info: if acl_info:
for tmp in acl_info: for tmp in acl_info:
tmp_dict = dict() tmp_dict = dict()
@ -635,22 +635,42 @@ class AdvanceAcl(object):
self.cur_acl_cfg["acl_info"].append(tmp_dict) self.cur_acl_cfg["acl_info"].append(tmp_dict)
if self.cur_acl_cfg["acl_info"]: if self.cur_acl_cfg["acl_info"]:
find_list = list()
for tmp in self.cur_acl_cfg["acl_info"]: for tmp in self.cur_acl_cfg["acl_info"]:
find_flag = True cur_cfg_dict = dict()
exist_cfg_dict = dict()
if self.acl_name and tmp.get("aclNumOrName") != self.acl_name: if self.acl_name:
find_flag = False if self.acl_name.isdigit() and tmp.get("aclNumber"):
if self.acl_type and tmp.get("aclType") != self.acl_type: cur_cfg_dict["aclNumber"] = self.acl_name
find_flag = False exist_cfg_dict["aclNumber"] = tmp.get("aclNumber")
if self.acl_num and tmp.get("aclNumber") != self.acl_num: else:
find_flag = False cur_cfg_dict["aclNumOrName"] = self.acl_name
if self.acl_step and tmp.get("aclStep") != self.acl_step: exist_cfg_dict["aclNumOrName"] = tmp.get("aclNumOrName")
find_flag = False if self.acl_type:
if self.acl_description and tmp.get("aclDescription") != self.acl_description: cur_cfg_dict["aclType"] = self.acl_type
find_flag = False exist_cfg_dict["aclType"] = tmp.get("aclType")
if self.acl_num:
cur_cfg_dict["aclNumber"] = self.acl_num
exist_cfg_dict["aclNumber"] = tmp.get("aclNumber")
if self.acl_step:
cur_cfg_dict["aclStep"] = self.acl_step
exist_cfg_dict["aclStep"] = tmp.get("aclStep")
if self.acl_description:
cur_cfg_dict["aclDescription"] = self.acl_description
exist_cfg_dict["aclDescription"] = tmp.get("aclDescription")
if find_flag: if cur_cfg_dict == exist_cfg_dict:
find_bool = True
else:
find_bool = False
find_list.append(find_bool)
for mem in find_list:
if mem:
find_flag = True
break break
else:
find_flag = False
else: else:
find_flag = False find_flag = False
@ -1001,7 +1021,7 @@ class AdvanceAcl(object):
# parse advance rule # parse advance rule
adv_rule_info = root.findall( adv_rule_info = root.findall(
"data/acl/aclGroups/aclGroup/aclRuleAdv4s/aclRuleAdv4") "acl/aclGroups/aclGroup/aclRuleAdv4s/aclRuleAdv4")
if adv_rule_info: if adv_rule_info:
for tmp in adv_rule_info: for tmp in adv_rule_info:
tmp_dict = dict() tmp_dict = dict()

View file

@ -122,7 +122,7 @@ updates:
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.network.cloudengine.ce import get_config, load_config from ansible.module_utils.network.cloudengine.ce import get_config, load_config, exec_command
from ansible.module_utils.network.cloudengine.ce import ce_argument_spec from ansible.module_utils.network.cloudengine.ce import ce_argument_spec
@ -169,11 +169,18 @@ class AclInterface(object):
msg='Error: The len of acl_name is out of [1 - 32].') msg='Error: The len of acl_name is out of [1 - 32].')
if self.interface: if self.interface:
regular = "| ignore-case section include ^interface %s$" % self.interface cmd = "display current-configuration | ignore-case section include ^interface %s$" % self.interface
result = self.cli_get_config(regular) rc, out, err = exec_command(self.module, cmd)
if not result: if rc != 0:
self.module.fail_json( self.module.fail_json(msg=err)
msg='Error: The interface %s is not in the device.' % self.interface) result = str(out).strip()
if result:
tmp = result.split('\n')
if "display" in tmp[0]:
tmp.pop(0)
if not tmp:
self.module.fail_json(
msg='Error: The interface %s is not in the device.' % self.interface)
def get_proposed(self): def get_proposed(self):
""" Get proposed config """ """ Get proposed config """
@ -192,28 +199,36 @@ class AclInterface(object):
def get_existing(self): def get_existing(self):
""" Get existing config """ """ Get existing config """
regular = "| ignore-case section include ^interface %s$ | include traffic-filter" % self.interface cmd = "display current-configuration | ignore-case section include ^interface %s$ | include traffic-filter" % self.interface
result = self.cli_get_config(regular) rc, out, err = exec_command(self.module, cmd)
if rc != 0:
self.module.fail_json(msg=err)
result = str(out).strip()
end = [] end = []
if result: if result:
tmp = result.split('\n') tmp = result.split('\n')
if "display" in tmp[0]:
tmp.pop(0)
for item in tmp: for item in tmp:
end.append(item) end.append(item.strip())
self.cur_cfg["acl interface"] = end self.cur_cfg["acl interface"] = end
self.existing["acl interface"] = end self.existing["acl interface"] = end
def get_end_state(self): def get_end_state(self):
""" Get config end state """ """ Get config end state """
regular = "| ignore-case section include ^interface %s$ | include traffic-filter" % self.interface cmd = "display current-configuration | ignore-case section include ^interface %s$ | include traffic-filter" % self.interface
result = self.cli_get_config(regular) rc, out, err = exec_command(self.module, cmd)
if rc != 0:
self.module.fail_json(msg=err)
result = str(out).strip()
end = [] end = []
if result: if result:
tmp = result.split('\n') tmp = result.split('\n')
if "display" in tmp[0]:
tmp.pop(0)
for item in tmp: for item in tmp:
item = item[1:-1] end.append(item.strip())
end.append(item)
self.end_state["acl interface"] = end self.end_state["acl interface"] = end
def cli_load_config(self, commands): def cli_load_config(self, commands):
@ -222,15 +237,6 @@ class AclInterface(object):
if not self.module.check_mode: if not self.module.check_mode:
load_config(self.module, commands) load_config(self.module, commands)
def cli_get_config(self, regular):
""" Cli method to get config """
flags = list()
flags.append(regular)
tmp_cfg = get_config(self.module, flags)
return tmp_cfg
def work(self): def work(self):
""" Work function """ """ Work function """