diff --git a/lib/ansible/modules/net_tools/ip_netns.py b/lib/ansible/modules/net_tools/ip_netns.py new file mode 100644 index 0000000000..e4a553e17c --- /dev/null +++ b/lib/ansible/modules/net_tools/ip_netns.py @@ -0,0 +1,145 @@ +#!/usr/bin/python +# (c) 2017, Arie Bregman +# +# This file is a module for Ansible that interacts with Network Manager +# +# 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 . +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: ip_netns +version_added: 2.5 +author: "Arie Bregman (@bregman-arie)" +short_description: Manage network namespaces +requirements: [ ip ] +description: + - Create or delete network namespaces using the ip command. +options: + name: + required: false + description: + - Name of the namespace + state: + required: false + default: "present" + choices: [ present, absent ] + description: + - Whether the namespace should exist +''' + +EXAMPLES = ''' +# Create a namespace named mario +- name: Create a namespace named mario + namespace: + name: mario + state: present +- name: Delete a namespace named luigi + namespace: + name: luigi + state: absent +''' + +RETURN = ''' +# Default return values +''' + +from ansible.module_utils.basic import AnsibleModule + + +class Namespace(object): + """Interface to network namespaces. """ + + def __init__(self, module): + self.module = module + self.name = module.params['name'] + self.state = module.params['state'] + + def _netns(self, command): + '''Run ip nents command''' + return self.module.run_command(['ip', 'netns'] + command) + + def exists(self): + '''Check if the namespace already exists''' + rtc, out, err = self._netns(['exec', self.name, 'ls']) + if rtc != 0: + self.module.fail_json(msg=err) + + def add(self): + '''Create network namespace''' + rtc, out, err = self._netns(['add', self.name]) + + if rtc != 0: + self.module.fail_json(msg=err) + + def delete(self): + '''Delete network namespace''' + rtc, out, err = self._netns(['del', self.name]) + if rtc != 0: + self.module.fail_json(msg=err) + + def check(self): + '''Run check mode''' + changed = False + + if self.state == 'present' and self.exists(): + changed = True + + elif self.state == 'absent' and self.exists(): + changed = True + elif self.state == 'present' and not self.exists(): + changed = True + + self.module.exit_json(changed=changed) + + def run(self): + '''Make the necessary changes''' + changed = False + + if self.state == 'absent': + if self.exists(): + self.delete() + changed = True + elif self.state == 'present': + if not self.exists(): + self.add() + changed = True + + self.module.exit_json(changed=changed) + + +def main(): + """Entry point.""" + module = AnsibleModule( + argument_spec={ + 'name': {'default': None}, + 'state': {'default': 'present', 'choices': ['present', 'absent']}, + }, + supports_check_mode=True, + ) + + network_namespace = Namespace(module) + if module.check_mode: + network_namespace.check() + else: + network_namespace.run() + + +if __name__ == '__main__': + main()