Repository: ansible/ansible

Issue:
[WIP] Make network plugins PY3 complaint
<!---

-->

##### ISSUE TYPE
<!--- Pick one below and delete the rest: -->
 - Bug Report


##### COMPONENT NAME
<!--- Name of the module/plugin/task/feature -->
asa
dellos6
dellos9
dellos10
eos
ios
iosxr
junos
nxos
sros
vyos

##### ANSIBLE VERSION
<!--- Paste verbatim output from “ansible --version” between quotes below -->
```
2.4
```

##### CONFIGURATION
<!---
Mention any settings you have changed/added/removed in ansible.cfg
(or using the ANSIBLE_* environment variables).
-->

##### OS / ENVIRONMENT
<!---
Mention the OS you are running Ansible from, and the OS you are
managing, or say “N/A” for anything that is not platform-specific.
-->

##### SUMMARY
<!--- Explain the problem briefly -->
Issue to track py3 compliance for network modules
##### STEPS TO REPRODUCE
<!---
For bugs, show exactly how to reproduce the problem, using a minimal test-case.
For new features, show how the feature would be used.
-->

<!--- Paste example playbooks or commands between quotes below -->
```yaml

```

<!--- You can also paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- What did you expect to happen when running the steps above? -->

##### ACTUAL RESULTS
<!--- What actually happened? If possible run with extra verbosity (-vvvv) -->

<!--- Paste verbatim command output between quotes below -->
```

```



Discussion:
@ganeshrn Let me know if you need any help in this ? I would like to help here.

Resolving patch:
diff --git a/lib/ansible/module_utils/sros.py b/lib/ansible/module_utils/sros.py
--- a/lib/ansible/module_utils/sros.py
+++ b/lib/ansible/module_utils/sros.py
@@ -28,7 +28,11 @@
 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
+import re
+
+from ansible.module_utils._text import to_text
 from ansible.module_utils.basic import env_fallback, return_values
+from ansible.module_utils.network import NetworkError
 from ansible.module_utils.network_common import to_list, ComplexList
 from ansible.module_utils.connection import exec_command
 
@@ -44,18 +48,19 @@
     'provider': dict(type='dict')
 }
 
+
 def check_args(module, warnings):
     provider = module.params['provider'] or {}
     for key in sros_argument_spec:
         if key != 'provider' and module.params[key]:
-            warnings.append('argument %s has been deprecated and will be '
-                    'removed in a future version' % key)
+            warnings.append('argument %s has been deprecated and will be removed in a future version' % key)
 
     if provider:
         for param in ('password',):
             if provider.get(param):
                 module.no_log_values.update(return_values(provider[param]))
 
+
 def get_config(module, flags=[]):
     cmd = 'admin display-config '
     cmd += ' '.join(flags)
@@ -66,11 +71,12 @@ def get_config(module, flags=[]):
     except KeyError:
         rc, out, err = exec_command(module, cmd)
         if rc != 0:
-            module.fail_json(msg='unable to retrieve current config', stderr=err)
-        cfg = str(out).strip()
+            module.fail_json(msg='unable to retrieve current config', stderr=to_text(err, errors='surrogate_or_strict'))
+        cfg = to_text(out, errors='surrogate_or_strict').strip()
         _DEVICE_CONFIGS[cmd] = cfg
         return cfg
 
+
 def to_commands(module, commands):
     spec = {
         'command': dict(key=True),
@@ -88,38 +94,14 @@ def run_commands(module, commands, check_rc=True):
         cmd = module.jsonify(cmd)
         rc, out, err = exec_command(module, cmd)
         if check_rc and rc != 0:
-            module.fail_json(msg=err, rc=rc)
-        responses.append(out)
+            module.fail_json(msg=to_text(err, errors='surrogate_or_strict'), rc=rc)
+        responses.append(to_text(out, errors='surrogate_or_strict'))
     return responses
 
+
 def load_config(module, commands):
     for command in to_list(commands):
         rc, out, err = exec_command(module, command)
         if rc != 0:
-            module.fail_json(msg=err, command=command, rc=rc)
+            module.fail_json(msg=to_text(err, errors='surrogate_or_strict'), command=command, rc=rc)
     exec_command(module, 'exit all')
-
-def rollback_enabled(self):
-    if self._rollback_enabled is not None:
-        return self._rollback_enabled
-    resp = self.execute(['show system rollback'])
-    match = re.search(r'^Rollback Location\s+:\s(\S+)', resp[0], re.M)
-    self._rollback_enabled = match.group(1) != 'None'
-    return self._rollback_enabled
-
-def load_config_w_rollback(self, commands):
-    if self.rollback_enabled:
-        self.execute(['admin rollback save'])
-
-    try:
-        self.configure(commands)
-    except NetworkError:
-        if self.rollback_enabled:
-            self.execute(['admin rollback revert latest-rb',
-                            'admin rollback delete latest-rb'])
-        raise
-
-    if self.rollback_enabled:
-        self.execute(['admin rollback delete latest-rb'])
-
-
diff --git a/lib/ansible/plugins/terminal/sros.py b/lib/ansible/plugins/terminal/sros.py
--- a/lib/ansible/plugins/terminal/sros.py
+++ b/lib/ansible/plugins/terminal/sros.py
@@ -20,7 +20,6 @@
 __metaclass__ = type
 
 import re
-import json
 
 from ansible.plugins.terminal import TerminalBase
 from ansible.errors import AnsibleConnectionFailure
@@ -29,16 +28,16 @@
 class TerminalModule(TerminalBase):
 
     terminal_stdout_re = [
-        re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"),
-        re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$")
+        re.compile(br"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"),
+        re.compile(br"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$")
     ]
 
     terminal_stderr_re = [
-        re.compile(r"Error:"),
+        re.compile(br"Error:"),
     ]
 
     def on_open_shell(self):
         try:
-            self._exec_cli_command('environment no more')
+            self._exec_cli_command(b'environment no more')
         except AnsibleConnectionFailure:
             raise AnsibleConnectionFailure('unable to set terminal parameters')


Test patch:
diff --git a/test/sanity/pep8/legacy-files.txt b/test/sanity/pep8/legacy-files.txt
--- a/test/sanity/pep8/legacy-files.txt
+++ b/test/sanity/pep8/legacy-files.txt
@@ -95,7 +95,6 @@ lib/ansible/module_utils/service.py
 lib/ansible/module_utils/shell.py
 lib/ansible/module_utils/six/_six.py
 lib/ansible/module_utils/splitter.py
-lib/ansible/module_utils/sros.py
 lib/ansible/module_utils/univention_umc.py
 lib/ansible/module_utils/urls.py
 lib/ansible/module_utils/vca.py