Skip to content

Commit

Permalink
Merge pull request #36 from ktbyers/develop
Browse files Browse the repository at this point in the history
Add Python3 support
  • Loading branch information
ebeahan authored Feb 10, 2017
2 parents 3af1c05 + 2ccad99 commit 73afe43
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 38 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
language: python
python:
- 2.7
- 3.4
- 3.5
install:
- pip install tox-travis
- pip install coveralls
Expand Down
48 changes: 26 additions & 22 deletions napalm_fortios/fortios.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
from __future__ import unicode_literals

import re
from pyFG.fortios import FortiOS, FortiConfig, logger
from pyFG.exceptions import FailedCommit, CommandExecutionException
from napalm_base.base import NetworkDriver
from napalm_base.exceptions import ReplaceConfigException, MergeConfigException
from napalm_base.utils.string_parsers import colon_separated_string_to_dict,\
convert_uptime_string_seconds
from napalm_base.utils import py23_compat


class FortiOSDriver(NetworkDriver):
Expand Down Expand Up @@ -164,7 +167,7 @@ def get_config(self, retrieve="all"):

return {
'startup': u"",
'running': unicode(text_result),
'running': py23_compat.text_type(text_result),
'candidate': u"",
}

Expand All @@ -188,12 +191,12 @@ def get_facts(self):
vdom='global')['domain']

return {
'vendor': unicode('Fortigate'),
'os_version': unicode(system_status['Version'].split(',')[0].split()[1]),
'vendor': py23_compat.text_type('Fortigate'),
'os_version': py23_compat.text_type(system_status['Version'].split(',')[0].split()[1]),
'uptime': convert_uptime_string_seconds(performance_status['Uptime']),
'serial_number': unicode(system_status['Serial-Number']),
'model': unicode(system_status['Version'].split(',')[0].split()[0]),
'hostname': unicode(system_status['Hostname']),
'serial_number': py23_compat.text_type(system_status['Serial-Number']),
'model': py23_compat.text_type(system_status['Version'].split(',')[0].split()[0]),
'hostname': py23_compat.text_type(system_status['Hostname']),
'fqdn': u'{}.{}'.format(system_status['Hostname'], domain),
'interface_list': interface_list
}
Expand Down Expand Up @@ -239,7 +242,7 @@ def get_interfaces(self):
elif line.startswith('Link'):
parsed_data['is_up'] = line.split('\t')[-1] is 'up'
elif line.startswith('Current_HWaddr'):
parsed_data['mac_address'] = unicode(line.split('\t')[-1])
parsed_data['mac_address'] = py23_compat.text_type(line.split('\t')[-1])
parsed_data['is_enabled'] = True
parsed_data['description'] = u''
parsed_data['last_flapped'] = -1.0
Expand All @@ -252,7 +255,7 @@ def get_interfaces(self):
elif line.startswith('PHY Speed'):
parsed_data['speed'] = int(line.split(':')[-1])
elif line.startswith('Current_HWaddr'):
parsed_data['mac_address'] = unicode(line.split(' ')[-1])
parsed_data['mac_address'] = py23_compat.text_type(line.split(' ')[-1])
parsed_data['description'] = u''
parsed_data['last_flapped'] = -1.0
interface_statistics[interface] = parsed_data
Expand Down Expand Up @@ -294,16 +297,16 @@ def get_firewall_policies(self):
policy_item['position'] = position
policy_item['packet_hits'] = -1
policy_item['byte_hits'] = -1
policy_item['id'] = unicode(key)
policy_item['id'] = py23_compat.text_type(key)
policy_item['enabled'] = enabled
policy_item['schedule'] = unicode(policy[key]['schedule'])
policy_item['log'] = unicode(logtraffic)
policy_item['l3_src'] = unicode(policy[key]['srcaddr'])
policy_item['l3_dst'] = unicode(policy[key]['dstaddr'])
policy_item['service'] = unicode(policy[key]['service'])
policy_item['src_zone'] = unicode(policy[key]['srcintf'])
policy_item['dst_zone'] = unicode(policy[key]['dstintf'])
policy_item['action'] = unicode(action)
policy_item['schedule'] = py23_compat.text_type(policy[key]['schedule'])
policy_item['log'] = py23_compat.text_type(logtraffic)
policy_item['l3_src'] = py23_compat.text_type(policy[key]['srcaddr'])
policy_item['l3_dst'] = py23_compat.text_type(policy[key]['dstaddr'])
policy_item['service'] = py23_compat.text_type(policy[key]['service'])
policy_item['src_zone'] = py23_compat.text_type(policy[key]['srcintf'])
policy_item['dst_zone'] = py23_compat.text_type(policy[key]['dstintf'])
policy_item['action'] = py23_compat.text_type(action)
default_policy[key].append(policy_item)

position = position + 1
Expand All @@ -325,7 +328,7 @@ def get_bgp_neighbors(self):

self.device.load_config('router bgp')

for neighbor, parameters in neighbors.iteritems():
for neighbor, parameters in neighbors.items():
logger.debug('NEW PEER')
neigh_conf = self.device.running_config['router bgp']['neighbor']['{}'.format(neighbor)]

Expand All @@ -346,7 +349,7 @@ def get_bgp_neighbors(self):
self._execute_command_with_vdom(command_detail.format(neighbor))]
m = re.search('remote router id (.+?)\n', '\n'.join(detail_output))
if m:
neighbor_dict['remote_id'] = unicode(m.group(1))
neighbor_dict['remote_id'] = py23_compat.text_type(m.group(1))
else:
raise Exception('cannot find remote router id for %s' % neighbor)

Expand All @@ -355,7 +358,7 @@ def get_bgp_neighbors(self):
x = detail_output.index(' for address family: {} unicast'.format(family))
block = detail_output[x:]

for term, fortiname in terms.iteritems():
for term, fortiname in terms.items():
text = self._search_line_in_lines('%s prefixes' % fortiname, block)
t = [int(s) for s in text.split() if s.isdigit()][0]
neighbor_dict['address_family'][family][term] = t
Expand All @@ -371,7 +374,7 @@ def get_bgp_neighbors(self):

return {
'global': {
'router_id': unicode(bgp_sum[0].split()[3]),
'router_id': py23_compat.text_type(bgp_sum[0].split()[3]),
'peers': peers
}
}
Expand Down Expand Up @@ -465,9 +468,10 @@ def get_temperature(temperature_lines, detail_block):

v = int(self._search_line_in_lines('upper_non_recoverable',
sensor_block).split('=')[1])
temp_value = int(temp_value)

output[sensor_name] = dict(temperature=float(temp_value), is_alert=is_alert,
is_critical=True if v > temp_value else False)
is_critical=True if temp_value > v else False)

return output

Expand Down
1 change: 0 additions & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,4 @@ pytest-json
pytest-pythonpath
pylama
flake8-import-order
coveralls
-r requirements.txt
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
napalm-base>=0.18.0
pyFG
napalm-base>=0.23.0
pyFG>=0.48
future
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"1": [{"src_zone": "any", "log": "False", "service": "ALL", "schedule": "always", "l3_src": "all", "enabled": false, "packet_hits": -1, "l3_dst": "all", "dst_zone": "any", "action": "permit", "position": 1, "byte_hits": -1, "id": "1"}], "2": [{"src_zone": "port3", "log": "all", "service": "ALL", "schedule": "always", "l3_src": "all", "enabled": false, "packet_hits": -1, "l3_dst": "all", "dst_zone": "port2", "action": "reject", "position": 2, "byte_hits": -1, "id": "2"}]}
{"1": [{"src_zone": "any", "log": "False", "service": "ALL", "schedule": "always", "l3_src": "all", "enabled": false, "packet_hits": -1, "l3_dst": "all", "dst_zone": "any", "action": "permit", "position": 1, "byte_hits": -1, "id": "1"}] }
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,4 @@ config firewall policy
set schedule "always"
set service "ALL"
next
edit 2
set name "bla"
set uuid de597b64-aca8-51e6-5d00-b7874e6b72b8
set srcintf "port3"
set dstintf "port2"
set srcaddr "all"
set dstaddr "all"
set schedule "always"
set service "ALL"
set logtraffic all
next
end
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[tox]
envlist = py27
envlist = py27,py34,py35

[testenv]
deps =
Expand Down

0 comments on commit 73afe43

Please sign in to comment.