Skip to content

Commit

Permalink
Merge 834c986 into 1b06ad0
Browse files Browse the repository at this point in the history
  • Loading branch information
attila123 committed Jun 15, 2018
2 parents 1b06ad0 + 834c986 commit ef000ed
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
23 changes: 19 additions & 4 deletions ncclient/operations/third_party/juniper/rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from ncclient.operations.rpc import RPCReply
from ncclient.operations.rpc import RPCError
from ncclient import NCClientError
import math


class GetConfiguration(RPC):
def request(self, format='xml', filter=None):
Expand Down Expand Up @@ -64,7 +66,7 @@ class Commit(RPC):

DEPENDS = [':candidate']

def request(self, confirmed=False, timeout=None, comment=None, synchronize=False, at_time=None):
def request(self, confirmed=False, timeout=None, comment=None, synchronize=False, at_time=None, check=False):
"""Commit the candidate configuration as the device's new current configuration. Depends on the `:candidate` capability.
A confirmed commit (i.e. if *confirmed* is `True`) is reverted if there is no followup commit within the *timeout* interval. If no timeout is specified the confirm timeout defaults to 600 seconds (10 minutes). A confirming commit may have the *confirmed* parameter but this is not required. Depends on the `:confirmed-commit` capability.
Expand All @@ -79,21 +81,34 @@ def request(self, confirmed=False, timeout=None, comment=None, synchronize=False
*at_time* Mutually exclusive with confirmed. The time at which the commit should happen. Junos expects either of these two formats:
A time value of the form hh:mm[:ss] (hours, minutes, and, optionally, seconds)
A date and time value of the form yyyy-mm-dd hh:mm[:ss] (year, month, date, hours, minutes, and, optionally, seconds)"""
node = new_ele("commit")
A date and time value of the form yyyy-mm-dd hh:mm[:ss] (year, month, date, hours, minutes, and, optionally, seconds)
*check* Verify the syntactic correctness of the candidate configuration"""
# NOTE: non netconf standard, Junos specific commit-configuration element, see
# https://www.juniper.net/documentation/en_US/junos/topics/reference/tag-summary/junos-xml-protocol-commit-configuration.html
node = new_ele_ns("commit-configuration", "")
if confirmed and at_time is not None:
raise NCClientError("'Commit confirmed' and 'commit at' are mutually exclusive.")
if confirmed:
self._assert(":confirmed-commit")
sub_ele(node, "confirmed")
if timeout is not None:
sub_ele(node, "confirm-timeout").text = timeout
# NOTE: For Junos, confirm-timeout has to be given in minutes:
# https://www.juniper.net/documentation/en_US/junos/topics/reference/tag-summary/junos-xml-protocol-commit-configuration.html
# but the netconf standard and ncclient library uses seconds:
# https://tools.ietf.org/html/rfc6241#section-8.4.5
# http://ncclient.readthedocs.io/en/latest/manager.html#ncclient.manager.Manager.commit
# so need to convert the value in seconds to minutes.
timeout_int = int(timeout) if isinstance(timeout, str) else timeout
sub_ele(node, "confirm-timeout").text = str(math.ceil(timeout_int/60))
elif at_time is not None:
sub_ele(node, "at-time").text = at_time
if comment is not None:
sub_ele(node, "log").text = comment
if synchronize:
sub_ele(node, "synchronize")
if check:
sub_ele(node, "check")
return self._request(node)

class Rollback(RPC):
Expand Down
9 changes: 5 additions & 4 deletions test/unit/operations/third_party/juniper/test_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,10 @@ def test_commit_confirmed(self, mock_assert, mock_request, mock_session):
session = ncclient.transport.SSHSession(device_handler)
obj = Commit(session, device_handler, raise_mode=RaiseMode.ALL)
obj.request(confirmed=True, comment="message", timeout="50")
node = new_ele("commit")
node = new_ele_ns("commit-configuration", "")
sub_ele(node, "confirmed")
sub_ele(node, "confirm-timeout").text = "50"
# confirm-timeout need to be provided in minutes for this Junos specific rpc
sub_ele(node, "confirm-timeout").text = "1"
sub_ele(node, "log").text = "message"
xml = ElementTree.tostring(node)
call = mock_request.call_args_list[0][0][0]
Expand All @@ -221,7 +222,7 @@ def test_commit(self, mock_assert, mock_request, mock_session):
session = ncclient.transport.SSHSession(device_handler)
obj = Commit(session, device_handler, raise_mode=RaiseMode.ALL)
obj.request()
node = new_ele("commit")
node = new_ele_ns("commit-configuration", "")
xml = ElementTree.tostring(node)
call = mock_request.call_args_list[0][0][0]
call = ElementTree.tostring(call)
Expand All @@ -236,7 +237,7 @@ def test_commit_at_time(self, mock_assert, mock_request, mock_session):
session = ncclient.transport.SSHSession(device_handler)
obj = Commit(session, device_handler, raise_mode=RaiseMode.ALL)
obj.request(at_time="1111-11-11 00:00:00", synchronize=True)
node = new_ele("commit")
node = new_ele_ns("commit-configuration", "")
sub_ele(node, "at-time").text = "1111-11-11 00:00:00"
sub_ele(node, "synchronize")
xml = ElementTree.tostring(node)
Expand Down

0 comments on commit ef000ed

Please sign in to comment.