Statistics
| Branch: | Tag: | Revision:

root / ncclient / operations / edit.py @ dd225c7a

History | View | Annotate | Download (5.8 kB)

1 11d9e642 Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 11d9e642 Shikhar Bhushan
#
3 11d9e642 Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 11d9e642 Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 11d9e642 Shikhar Bhushan
# You may obtain a copy of the License at
6 11d9e642 Shikhar Bhushan
#
7 11d9e642 Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 11d9e642 Shikhar Bhushan
#
9 11d9e642 Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 11d9e642 Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 11d9e642 Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 11d9e642 Shikhar Bhushan
# See the License for the specific language governing permissions and
13 11d9e642 Shikhar Bhushan
# limitations under the License.
14 11d9e642 Shikhar Bhushan
15 ce5fb329 Shikhar Bhushan
from copy import deepcopy
16 ce5fb329 Shikhar Bhushan
17 57b5f922 Shikhar Bhushan
from ncclient import xml_
18 11d9e642 Shikhar Bhushan
19 cc9af1c3 Shikhar Bhushan
from rpc import RPC
20 cc9af1c3 Shikhar Bhushan
21 d6688264 Shikhar Bhushan
import util
22 1fca349b Shikhar Bhushan
23 0b7d3b31 Shikhar Bhushan
import logging
24 0b7d3b31 Shikhar Bhushan
logger = logging.getLogger('ncclient.operations.edit')
25 0b7d3b31 Shikhar Bhushan
26 216bb34c Shikhar Bhushan
"Operations related to changing device configuration"
27 c2a5b930 Shikhar Bhushan
28 11d9e642 Shikhar Bhushan
class EditConfig(RPC):
29 a7cb58ce Shikhar Bhushan
30 216bb34c Shikhar Bhushan
    "*<edit-config>* RPC"
31 216bb34c Shikhar Bhushan
32 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'edit-config', 'subtree': []}
33 a7cb58ce Shikhar Bhushan
34 216bb34c Shikhar Bhushan
    def request(self, target, config, default_operation=None, test_option=None,
35 216bb34c Shikhar Bhushan
                error_option=None):
36 216bb34c Shikhar Bhushan
        """
37 216bb34c Shikhar Bhushan
        :arg target: see :ref:`source_target`
38 216bb34c Shikhar Bhushan
        :type target: string
39 216bb34c Shikhar Bhushan

40 216bb34c Shikhar Bhushan
        :arg config: a config element in :ref:`dtree`
41 216bb34c Shikhar Bhushan
        :type config: `string` or `dict` or :class:`~xml.etree.ElementTree.Element`
42 216bb34c Shikhar Bhushan

43 216bb34c Shikhar Bhushan
        :arg default_operation: optional; one of {'merge', 'replace', 'none'}
44 216bb34c Shikhar Bhushan
        :type default_operation: `string`
45 216bb34c Shikhar Bhushan

46 b5d5a1b1 Shikhar Bhushan
        :arg error_option: optional; one of {'stop-on-error', 'continue-on-error', 'rollback-on-error'}. Last option depends on the *:rollback-on-error* capability
47 b5d5a1b1 Shikhar Bhushan
        :type error_option: string
48 b5d5a1b1 Shikhar Bhushan

49 b5d5a1b1 Shikhar Bhushan
        :arg test_option: optional; one of {'test-then-set', 'set'}. Depends on *:validate* capability.
50 216bb34c Shikhar Bhushan
        :type test_option: string
51 216bb34c Shikhar Bhushan

52 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
53 216bb34c Shikhar Bhushan
        """
54 ce5fb329 Shikhar Bhushan
        spec = deepcopy(EditConfig.SPEC)
55 c2a5b930 Shikhar Bhushan
        subtree = spec['subtree']
56 d771dffc Shikhar Bhushan
        subtree.append(util.store_or_url('target', target, self._assert))
57 2abf9522 Shikhar Bhushan
        if error_option is not None:
58 2abf9522 Shikhar Bhushan
            if error_option == 'rollback-on-error':
59 2abf9522 Shikhar Bhushan
                self._assert(':rollback-on-error')
60 c2a5b930 Shikhar Bhushan
            subtree.append({
61 2abf9522 Shikhar Bhushan
                'tag': 'error-option',
62 2abf9522 Shikhar Bhushan
                'text': error_option
63 179b00d4 Shikhar Bhushan
                })
64 2f8bc438 Shikhar Bhushan
        if test_option is not None:
65 c2a5b930 Shikhar Bhushan
            self._assert(':validate')
66 c2a5b930 Shikhar Bhushan
            subtree.append({
67 179b00d4 Shikhar Bhushan
                'tag': 'test-option',
68 179b00d4 Shikhar Bhushan
                'text': test_option
69 179b00d4 Shikhar Bhushan
                })
70 2abf9522 Shikhar Bhushan
        if default_operation is not None:
71 c2a5b930 Shikhar Bhushan
            subtree.append({
72 2abf9522 Shikhar Bhushan
                'tag': 'default-operation',
73 2abf9522 Shikhar Bhushan
                'text': default_operation
74 179b00d4 Shikhar Bhushan
                })
75 57b5f922 Shikhar Bhushan
        subtree.append(xml_.validated_element(config, ('config', xml_.qualify('config'))))
76 a7cb58ce Shikhar Bhushan
        return self._request(spec)
77 179b00d4 Shikhar Bhushan
78 2f8bc438 Shikhar Bhushan
class DeleteConfig(RPC):
79 a7cb58ce Shikhar Bhushan
80 216bb34c Shikhar Bhushan
    "*<delete-config>* RPC"
81 216bb34c Shikhar Bhushan
82 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'delete-config', 'subtree': []}
83 a7cb58ce Shikhar Bhushan
84 d771dffc Shikhar Bhushan
    def request(self, target):
85 216bb34c Shikhar Bhushan
        """
86 216bb34c Shikhar Bhushan
        :arg target: See :ref:`source_target`
87 216bb34c Shikhar Bhushan
        :type target: `string` or `dict` or :class:`~xml.etree.ElementTree.Element`
88 216bb34c Shikhar Bhushan

89 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
90 216bb34c Shikhar Bhushan
        """
91 ce5fb329 Shikhar Bhushan
        spec = deepcopy(DeleteConfig.SPEC)
92 a7cb58ce Shikhar Bhushan
        spec['subtree'].append(util.store_or_url('target', target, self._assert))
93 d6688264 Shikhar Bhushan
        return self._request(spec)
94 d6688264 Shikhar Bhushan
95 1fca349b Shikhar Bhushan
96 2f8bc438 Shikhar Bhushan
class CopyConfig(RPC):
97 a7cb58ce Shikhar Bhushan
98 216bb34c Shikhar Bhushan
    "*<copy-config>* RPC"
99 216bb34c Shikhar Bhushan
100 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'copy-config', 'subtree': []}
101 a7cb58ce Shikhar Bhushan
102 d771dffc Shikhar Bhushan
    def request(self, source, target):
103 216bb34c Shikhar Bhushan
        """
104 216bb34c Shikhar Bhushan
        :arg source: See :ref:`source_target`
105 216bb34c Shikhar Bhushan
        :type source: `string` or `dict` or :class:`~xml.etree.ElementTree.Element`
106 216bb34c Shikhar Bhushan

107 216bb34c Shikhar Bhushan
        :arg target: See :ref:`source_target`
108 216bb34c Shikhar Bhushan
        :type target: `string` or `dict` or :class:`~xml.etree.ElementTree.Element`
109 216bb34c Shikhar Bhushan

110 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
111 216bb34c Shikhar Bhushan
        """
112 ce5fb329 Shikhar Bhushan
        spec = deepcopy(CopyConfig.SPEC)
113 a7cb58ce Shikhar Bhushan
        spec['subtree'].append(util.store_or_url('target', target, self._assert))
114 0b7d3b31 Shikhar Bhushan
        spec['subtree'].append(util.store_or_url('source', source, self._assert))
115 d6688264 Shikhar Bhushan
        return self._request(spec)
116 11d9e642 Shikhar Bhushan
117 d6688264 Shikhar Bhushan
118 2f8bc438 Shikhar Bhushan
class Validate(RPC):
119 a7cb58ce Shikhar Bhushan
120 216bb34c Shikhar Bhushan
    "*<validate>* RPC. Depends on the *:validate* capability."
121 216bb34c Shikhar Bhushan
122 d6688264 Shikhar Bhushan
    DEPENDS = [':validate']
123 a7cb58ce Shikhar Bhushan
124 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'validate', 'subtree': []}
125 a7cb58ce Shikhar Bhushan
126 a7cb58ce Shikhar Bhushan
    def request(self, source):
127 216bb34c Shikhar Bhushan
        """
128 216bb34c Shikhar Bhushan
        :arg source: See :ref:`source_target`
129 216bb34c Shikhar Bhushan
        :type source: `string` or `dict` or :class:`~xml.etree.ElementTree.Element`
130 216bb34c Shikhar Bhushan

131 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
132 216bb34c Shikhar Bhushan
        """
133 ce5fb329 Shikhar Bhushan
        spec = deepcopy(Validate.SPEC)
134 a7cb58ce Shikhar Bhushan
        try:
135 57b5f922 Shikhar Bhushan
            src = markup.validated_element(source, ('config', markup.qualify('config')))
136 0b7d3b31 Shikhar Bhushan
        except Exception as e:
137 0b7d3b31 Shikhar Bhushan
            logger.debug(e)
138 0b7d3b31 Shikhar Bhushan
            src = util.store_or_url('source', source, self._assert)
139 0b7d3b31 Shikhar Bhushan
        spec['subtree'].append({
140 0b7d3b31 Shikhar Bhushan
            'tag': 'source',
141 0b7d3b31 Shikhar Bhushan
            'subtree': src
142 0b7d3b31 Shikhar Bhushan
            })
143 d6688264 Shikhar Bhushan
        return self._request(spec)
144 1fca349b Shikhar Bhushan
145 2f8bc438 Shikhar Bhushan
146 2f8bc438 Shikhar Bhushan
class Commit(RPC):
147 a7cb58ce Shikhar Bhushan
148 216bb34c Shikhar Bhushan
    "*<commit>* RPC. Depends on the *:candidate* capability."
149 216bb34c Shikhar Bhushan
150 d6688264 Shikhar Bhushan
    DEPENDS = [':candidate']
151 a7cb58ce Shikhar Bhushan
152 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'commit', 'subtree': []}
153 a7cb58ce Shikhar Bhushan
154 d6688264 Shikhar Bhushan
    def _parse_hook(self):
155 d6688264 Shikhar Bhushan
        pass
156 a7cb58ce Shikhar Bhushan
157 216bb34c Shikhar Bhushan
    def request(self, confirmed=False, timeout=None):
158 216bb34c Shikhar Bhushan
        """
159 216bb34c Shikhar Bhushan
        Requires *:confirmed-commit* capability if *confirmed* argument is
160 216bb34c Shikhar Bhushan
        :const:`True`.
161 216bb34c Shikhar Bhushan

162 216bb34c Shikhar Bhushan
        :arg confirmed: optional; request a confirmed commit
163 216bb34c Shikhar Bhushan
        :type confirmed: `bool`
164 216bb34c Shikhar Bhushan

165 216bb34c Shikhar Bhushan
        :arg timeout: specify timeout for confirmed commit
166 216bb34c Shikhar Bhushan
        :type timeout: `int`
167 216bb34c Shikhar Bhushan

168 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
169 216bb34c Shikhar Bhushan
        """
170 ce5fb329 Shikhar Bhushan
        spec = deepcopy(Commit.SPEC)
171 d6688264 Shikhar Bhushan
        if confirmed:
172 cc9af1c3 Shikhar Bhushan
            self._assert(':confirmed-commit')
173 179b00d4 Shikhar Bhushan
            spec['subtree'].append({'tag': 'confirmed'})
174 d6688264 Shikhar Bhushan
            if timeout is not None:
175 179b00d4 Shikhar Bhushan
                spec['subtree'].append({
176 d6688264 Shikhar Bhushan
                    'tag': 'confirm-timeout',
177 d6688264 Shikhar Bhushan
                    'text': timeout
178 d6688264 Shikhar Bhushan
                })
179 94803aaf Shikhar Bhushan
        return self._request(Commit.SPEC)
180 94803aaf Shikhar Bhushan
181 1fca349b Shikhar Bhushan
182 d771dffc Shikhar Bhushan
class DiscardChanges(RPC):
183 a7cb58ce Shikhar Bhushan
184 6a2dfeb4 Shikhar Bhushan
    # TESTED
185 6a2dfeb4 Shikhar Bhushan
186 216bb34c Shikhar Bhushan
    "*<discard-changes>* RPC. Depends on the *:candidate* capability."
187 216bb34c Shikhar Bhushan
188 d771dffc Shikhar Bhushan
    DEPENDS = [':candidate']
189 a7cb58ce Shikhar Bhushan
190 d771dffc Shikhar Bhushan
    SPEC = {'tag': 'discard-changes'}
191 0b7d3b31 Shikhar Bhushan
192 0b7d3b31 Shikhar Bhushan
    def request(self):
193 0b7d3b31 Shikhar Bhushan
        ":seealso: :ref:`return`"
194 0b7d3b31 Shikhar Bhushan
        return self._request(DiscardChanges.SPEC)