diff options
| author | ansible-zuul[bot] <48994755+ansible-zuul[bot]@users.noreply.github.com> | 2019-08-09 18:52:36 +0000 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-08-09 18:52:36 +0000 | 
| commit | fbe294b702e757252a66f64edf66bce060e87494 (patch) | |
| tree | 6910d3c526815c0e21f20cfbccd08bea727cf11c /plugins/modules/_vyos_interface.py | |
| parent | 4a485b24db1abf87cdf0d4ef2f7acb1159aaab68 (diff) | |
| parent | 5fb9df4e907a6ab2da7a6c2dafdec9c1971e8d44 (diff) | |
| download | vyos-ansible-collection-fbe294b702e757252a66f64edf66bce060e87494.tar.gz vyos-ansible-collection-fbe294b702e757252a66f64edf66bce060e87494.zip | |
Merge pull request #8 from ansible-network/bt_blacked
Bt blacked
Reviewed-by: Paul Belanger
             https://github.com/pabelanger
Diffstat (limited to 'plugins/modules/_vyos_interface.py')
| -rw-r--r-- | plugins/modules/_vyos_interface.py | 250 | 
1 files changed, 132 insertions, 118 deletions
| diff --git a/plugins/modules/_vyos_interface.py b/plugins/modules/_vyos_interface.py index e4b989e..ee82107 100644 --- a/plugins/modules/_vyos_interface.py +++ b/plugins/modules/_vyos_interface.py @@ -19,9 +19,11 @@  # along with Ansible.  If not, see <http://www.gnu.org/licenses/>.  # -ANSIBLE_METADATA = {'metadata_version': '1.1', -                    'status': ['deprecated'], -                    'supported_by': 'network'} +ANSIBLE_METADATA = { +    "metadata_version": "1.1", +    "status": ["deprecated"], +    "supported_by": "network", +}  DOCUMENTATION = """ @@ -174,17 +176,19 @@ from ansible.module_utils._text import to_text  from ansible.module_utils.basic import AnsibleModule  from ansible.module_utils.connection import exec_command  from ansible.module_utils.network.common.utils import conditional, remove_default_spec -from ansible_collections.vyos.vyos.plugins.module_utils.network. \ -  vyos.vyos import load_config, get_config - -from ansible_collections.vyos.vyos.plugins.module_utils.network. \ -  vyos.vyos import vyos_argument_spec +from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import ( +    load_config, +    get_config, +) +from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import ( +    vyos_argument_spec, +)  def search_obj_in_list(name, lst):      for o in lst: -        if o['name'] == name: +        if o["name"] == name:              return o      return None @@ -194,92 +198,92 @@ def map_obj_to_commands(updates):      commands = list()      want, have = updates -    params = ('speed', 'description', 'duplex', 'mtu') +    params = ("speed", "description", "duplex", "mtu")      for w in want: -        name = w['name'] -        disable = w['disable'] -        state = w['state'] +        name = w["name"] +        disable = w["disable"] +        state = w["state"]          obj_in_have = search_obj_in_list(name, have) -        set_interface = 'set interfaces ethernet ' + name -        delete_interface = 'delete interfaces ethernet ' + name +        set_interface = "set interfaces ethernet " + name +        delete_interface = "delete interfaces ethernet " + name -        if state == 'absent' and obj_in_have: +        if state == "absent" and obj_in_have:              commands.append(delete_interface) -        elif state in ('present', 'up', 'down'): +        elif state in ("present", "up", "down"):              if obj_in_have:                  for item in params:                      value = w.get(item)                      if value and value != obj_in_have.get(item): -                        if item == 'description': -                            value = "\'" + str(value) + "\'" -                        commands.append(set_interface + ' ' + item + ' ' + str(value)) - -                if disable and not obj_in_have.get('disable', False): -                    commands.append(set_interface + ' disable') -                elif not disable and obj_in_have.get('disable', False): -                    commands.append(delete_interface + ' disable') +                        if item == "description": +                            value = "'" + str(value) + "'" +                        commands.append(set_interface + " " + item + " " + str(value)) + +                if disable and not obj_in_have.get("disable", False): +                    commands.append(set_interface + " disable") +                elif not disable and obj_in_have.get("disable", False): +                    commands.append(delete_interface + " disable")              else:                  commands.append(set_interface)                  for item in params:                      value = w.get(item)                      if value: -                        if item == 'description': -                            value = "\'" + str(value) + "\'" -                        commands.append(set_interface + ' ' + item + ' ' + str(value)) +                        if item == "description": +                            value = "'" + str(value) + "'" +                        commands.append(set_interface + " " + item + " " + str(value))                  if disable: -                    commands.append(set_interface + ' disable') +                    commands.append(set_interface + " disable")      return commands  def map_config_to_obj(module): -    data = get_config(module, flags=['| grep interface']) +    data = get_config(module, flags=["| grep interface"])      obj = [] -    for line in data.split('\n'): -        if line.startswith('set interfaces ethernet'): -            match = re.search(r'set interfaces ethernet (\S+)', line, re.M) +    for line in data.split("\n"): +        if line.startswith("set interfaces ethernet"): +            match = re.search(r"set interfaces ethernet (\S+)", line, re.M)              name = match.group(1)              if name:                  interface = {}                  for item in obj: -                    if item['name'] == name: +                    if item["name"] == name:                          interface = item                          break                  if not interface: -                    interface = {'name': name} +                    interface = {"name": name}                      obj.append(interface) -                match = re.search(r'%s (\S+)' % name, line, re.M) +                match = re.search(r"%s (\S+)" % name, line, re.M)                  if match:                      param = match.group(1) -                    if param == 'description': -                        match = re.search(r'description (.+)', line, re.M) +                    if param == "description": +                        match = re.search(r"description (.+)", line, re.M)                          description = match.group(1).strip("'") -                        interface['description'] = description -                    elif param == 'speed': -                        match = re.search(r'speed (\S+)', line, re.M) +                        interface["description"] = description +                    elif param == "speed": +                        match = re.search(r"speed (\S+)", line, re.M)                          speed = match.group(1).strip("'") -                        interface['speed'] = speed -                    elif param == 'mtu': -                        match = re.search(r'mtu (\S+)', line, re.M) +                        interface["speed"] = speed +                    elif param == "mtu": +                        match = re.search(r"mtu (\S+)", line, re.M)                          mtu = match.group(1).strip("'") -                        interface['mtu'] = int(mtu) -                    elif param == 'duplex': -                        match = re.search(r'duplex (\S+)', line, re.M) +                        interface["mtu"] = int(mtu) +                    elif param == "duplex": +                        match = re.search(r"duplex (\S+)", line, re.M)                          duplex = match.group(1).strip("'") -                        interface['duplex'] = duplex -                    elif param.strip("'") == 'disable': -                        interface['disable'] = True +                        interface["duplex"] = duplex +                    elif param.strip("'") == "disable": +                        interface["disable"] = True      return obj  def map_params_to_obj(module):      obj = [] -    aggregate = module.params.get('aggregate') +    aggregate = module.params.get("aggregate")      if aggregate:          for item in aggregate:              for key in item: @@ -287,28 +291,28 @@ def map_params_to_obj(module):                      item[key] = module.params[key]              d = item.copy() -            if d['enabled']: -                d['disable'] = False +            if d["enabled"]: +                d["disable"] = False              else: -                d['disable'] = True +                d["disable"] = True              obj.append(d)      else:          params = { -            'name': module.params['name'], -            'description': module.params['description'], -            'speed': module.params['speed'], -            'mtu': module.params['mtu'], -            'duplex': module.params['duplex'], -            'delay': module.params['delay'], -            'state': module.params['state'], -            'neighbors': module.params['neighbors'] +            "name": module.params["name"], +            "description": module.params["description"], +            "speed": module.params["speed"], +            "mtu": module.params["mtu"], +            "duplex": module.params["duplex"], +            "delay": module.params["delay"], +            "state": module.params["state"], +            "neighbors": module.params["neighbors"],          } -        if module.params['enabled']: -            params.update({'disable': False}) +        if module.params["enabled"]: +            params.update({"disable": False})          else: -            params.update({'disable': True}) +            params.update({"disable": True})          obj.append(params)      return obj @@ -318,53 +322,65 @@ def check_declarative_intent_params(module, want, result):      failed_conditions = []      have_neighbors = None      for w in want: -        want_state = w.get('state') -        want_neighbors = w.get('neighbors') +        want_state = w.get("state") +        want_neighbors = w.get("neighbors") -        if want_state not in ('up', 'down') and not want_neighbors: +        if want_state not in ("up", "down") and not want_neighbors:              continue -        if result['changed']: -            sleep(w['delay']) +        if result["changed"]: +            sleep(w["delay"]) -        command = 'show interfaces ethernet %s' % w['name'] +        command = "show interfaces ethernet %s" % w["name"]          rc, out, err = exec_command(module, command)          if rc != 0: -            module.fail_json(msg=to_text(err, errors='surrogate_then_replace'), command=command, rc=rc) - -        if want_state in ('up', 'down'): -            match = re.search(r'%s (\w+)' % 'state', out, re.M) +            module.fail_json( +                msg=to_text(err, errors="surrogate_then_replace"), +                command=command, +                rc=rc, +            ) + +        if want_state in ("up", "down"): +            match = re.search(r"%s (\w+)" % "state", out, re.M)              have_state = None              if match:                  have_state = match.group(1) -            if have_state is None or not conditional(want_state, have_state.strip().lower()): -                failed_conditions.append('state ' + 'eq(%s)' % want_state) +            if have_state is None or not conditional( +                want_state, have_state.strip().lower() +            ): +                failed_conditions.append("state " + "eq(%s)" % want_state)          if want_neighbors:              have_host = []              have_port = []              if have_neighbors is None: -                rc, have_neighbors, err = exec_command(module, 'show lldp neighbors detail') +                rc, have_neighbors, err = exec_command( +                    module, "show lldp neighbors detail" +                )                  if rc != 0: -                    module.fail_json(msg=to_text(err, errors='surrogate_then_replace'), command=command, rc=rc) +                    module.fail_json( +                        msg=to_text(err, errors="surrogate_then_replace"), +                        command=command, +                        rc=rc, +                    )              if have_neighbors: -                lines = have_neighbors.strip().split('Interface: ') +                lines = have_neighbors.strip().split("Interface: ")                  for line in lines: -                    field = line.split('\n') -                    if field[0].split(',')[0].strip() == w['name']: +                    field = line.split("\n") +                    if field[0].split(",")[0].strip() == w["name"]:                          for item in field: -                            if item.strip().startswith('SysName:'): -                                have_host.append(item.split(':')[1].strip()) -                            if item.strip().startswith('PortDescr:'): -                                have_port.append(item.split(':')[1].strip()) +                            if item.strip().startswith("SysName:"): +                                have_host.append(item.split(":")[1].strip()) +                            if item.strip().startswith("PortDescr:"): +                                have_port.append(item.split(":")[1].strip())              for item in want_neighbors: -                host = item.get('host') -                port = item.get('port') +                host = item.get("host") +                port = item.get("port")                  if host and host not in have_host: -                    failed_conditions.append('host ' + host) +                    failed_conditions.append("host " + host)                  if port and port not in have_port: -                    failed_conditions.append('port ' + port) +                    failed_conditions.append("port " + port)      return failed_conditions @@ -372,75 +388,73 @@ def check_declarative_intent_params(module, want, result):  def main():      """ main entry point for module execution      """ -    neighbors_spec = dict( -        host=dict(), -        port=dict() -    ) +    neighbors_spec = dict(host=dict(), port=dict())      element_spec = dict(          name=dict(),          description=dict(),          speed=dict(), -        mtu=dict(type='int'), -        duplex=dict(choices=['full', 'half', 'auto']), -        enabled=dict(default=True, type='bool'), -        neighbors=dict(type='list', elements='dict', options=neighbors_spec), -        delay=dict(default=10, type='int'), -        state=dict(default='present', -                   choices=['present', 'absent', 'up', 'down']) +        mtu=dict(type="int"), +        duplex=dict(choices=["full", "half", "auto"]), +        enabled=dict(default=True, type="bool"), +        neighbors=dict(type="list", elements="dict", options=neighbors_spec), +        delay=dict(default=10, type="int"), +        state=dict(default="present", choices=["present", "absent", "up", "down"]),      )      aggregate_spec = deepcopy(element_spec) -    aggregate_spec['name'] = dict(required=True) +    aggregate_spec["name"] = dict(required=True)      # remove default in aggregate spec, to handle common arguments      remove_default_spec(aggregate_spec)      argument_spec = dict( -        aggregate=dict(type='list', elements='dict', options=aggregate_spec), +        aggregate=dict(type="list", elements="dict", options=aggregate_spec)      )      argument_spec.update(element_spec)      argument_spec.update(vyos_argument_spec) -    required_one_of = [['name', 'aggregate']] -    mutually_exclusive = [['name', 'aggregate']] +    required_one_of = [["name", "aggregate"]] +    mutually_exclusive = [["name", "aggregate"]] -    required_together = [['speed', 'duplex']] -    module = AnsibleModule(argument_spec=argument_spec, -                           required_one_of=required_one_of, -                           mutually_exclusive=mutually_exclusive, -                           required_together=required_together, -                           supports_check_mode=True) +    required_together = [["speed", "duplex"]] +    module = AnsibleModule( +        argument_spec=argument_spec, +        required_one_of=required_one_of, +        mutually_exclusive=mutually_exclusive, +        required_together=required_together, +        supports_check_mode=True, +    )      warnings = list() -    result = {'changed': False} +    result = {"changed": False}      if warnings: -        result['warnings'] = warnings +        result["warnings"] = warnings      want = map_params_to_obj(module)      have = map_config_to_obj(module)      commands = map_obj_to_commands((want, have)) -    result['commands'] = commands +    result["commands"] = commands      if commands:          commit = not module.check_mode          diff = load_config(module, commands, commit=commit)          if diff:              if module._diff: -                result['diff'] = {'prepared': diff} -        result['changed'] = True +                result["diff"] = {"prepared": diff} +        result["changed"] = True      failed_conditions = check_declarative_intent_params(module, want, result)      if failed_conditions: -        msg = 'One or more conditional statements have not been satisfied' +        msg = "One or more conditional statements have not been satisfied"          module.fail_json(msg=msg, failed_conditions=failed_conditions)      module.exit_json(**result) -if __name__ == '__main__': +if __name__ == "__main__":      main() | 
