From eb0d021f2dd7e536f1655b7ab312bdec1def209d Mon Sep 17 00:00:00 2001 From: Mircea Ulinic Date: Wed, 15 Mar 2017 11:28:21 +0000 Subject: [PATCH 1/2] Support multiple config formats --- napalm_junos/junos.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/napalm_junos/junos.py b/napalm_junos/junos.py index c3e7b05..fa90f81 100644 --- a/napalm_junos/junos.py +++ b/napalm_junos/junos.py @@ -116,6 +116,14 @@ def is_alive(self): 'is_alive': self.device._conn._session.transport.is_active() and self.device.connected } + def _detect_config_format(config): + fmt = 'text' + if config.strip().startswith('<'): + return 'xml' + elif config.strip().startswith('set'): + return 'set' + return fmt + def _load_candidate(self, filename, config, overwrite): if filename is None: configuration = config @@ -130,7 +138,8 @@ def _load_candidate(self, filename, config, overwrite): # and the device will be locked till first commit/rollback try: - self.device.cu.load(configuration, format='text', overwrite=overwrite) + fmt = self._detect_config_format(configuration) + self.device.cu.load(configuration, format=fmt, overwrite=overwrite) except ConfigLoadError as e: if self.config_replace: raise ReplaceConfigException(e.message) From a563339ff289c393d66acd8e5dccdfda60b71984 Mon Sep 17 00:00:00 2001 From: Mircea Ulinic Date: Wed, 15 Mar 2017 11:28:30 +0000 Subject: [PATCH 2/2] Check also for JSON --- napalm_junos/junos.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/napalm_junos/junos.py b/napalm_junos/junos.py index fa90f81..70ab318 100644 --- a/napalm_junos/junos.py +++ b/napalm_junos/junos.py @@ -19,6 +19,7 @@ # import stdlib import re +import json import logging import collections from copy import deepcopy @@ -116,12 +117,22 @@ def is_alive(self): 'is_alive': self.device._conn._session.transport.is_active() and self.device.connected } - def _detect_config_format(config): + @staticmethod + def _is_json_format(config): + try: + _ = json.loads(config) # noqa + except (TypeError, ValueError): + return False + return True + + def _detect_config_format(self, config): fmt = 'text' if config.strip().startswith('<'): return 'xml' elif config.strip().startswith('set'): return 'set' + elif self._is_json_format(config): + return 'json' return fmt def _load_candidate(self, filename, config, overwrite):