Statistics
| Branch: | Tag: | Revision:

root / ncclient / operations / edit.py @ b5d5a1b1

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 ebf2bbc6 Shikhar Bhushan
from ncclient import content
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 0b7d3b31 Shikhar Bhushan
27 0b7d3b31 Shikhar Bhushan
28 216bb34c Shikhar Bhushan
"Operations related to changing device configuration"
29 c2a5b930 Shikhar Bhushan
30 11d9e642 Shikhar Bhushan
class EditConfig(RPC):
31 a7cb58ce Shikhar Bhushan
32 6a2dfeb4 Shikhar Bhushan
    # TESTED
33 6a2dfeb4 Shikhar Bhushan
34 216bb34c Shikhar Bhushan
    "*<edit-config>* RPC"
35 216bb34c Shikhar Bhushan
36 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'edit-config', 'subtree': []}
37 a7cb58ce Shikhar Bhushan
38 216bb34c Shikhar Bhushan
    def request(self, target, config, default_operation=None, test_option=None,
39 216bb34c Shikhar Bhushan
                error_option=None):
40 216bb34c Shikhar Bhushan
        """
41 216bb34c Shikhar Bhushan
        :arg target: see :ref:`source_target`
42 216bb34c Shikhar Bhushan
        :type target: string
43 216bb34c Shikhar Bhushan

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

47 216bb34c Shikhar Bhushan
        :arg default_operation: optional; one of {'merge', 'replace', 'none'}
48 216bb34c Shikhar Bhushan
        :type default_operation: `string`
49 216bb34c Shikhar Bhushan

50 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
51 b5d5a1b1 Shikhar Bhushan
        :type error_option: string
52 b5d5a1b1 Shikhar Bhushan

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

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

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

115 216bb34c Shikhar Bhushan
        :arg target: See :ref:`source_target`
116 216bb34c Shikhar Bhushan
        :type target: `string` or `dict` or :class:`~xml.etree.ElementTree.Element`
117 216bb34c Shikhar Bhushan

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

141 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
142 216bb34c Shikhar Bhushan
        """
143 ce5fb329 Shikhar Bhushan
        spec = deepcopy(Validate.SPEC)
144 a7cb58ce Shikhar Bhushan
        try:
145 0b7d3b31 Shikhar Bhushan
            src = content.validated_element(source, ('config', content.qualify('config')))
146 0b7d3b31 Shikhar Bhushan
        except Exception as e:
147 0b7d3b31 Shikhar Bhushan
            logger.debug(e)
148 0b7d3b31 Shikhar Bhushan
            src = util.store_or_url('source', source, self._assert)
149 0b7d3b31 Shikhar Bhushan
        spec['subtree'].append({
150 0b7d3b31 Shikhar Bhushan
            'tag': 'source',
151 0b7d3b31 Shikhar Bhushan
            'subtree': src
152 0b7d3b31 Shikhar Bhushan
            })
153 d6688264 Shikhar Bhushan
        return self._request(spec)
154 1fca349b Shikhar Bhushan
155 2f8bc438 Shikhar Bhushan
156 2f8bc438 Shikhar Bhushan
class Commit(RPC):
157 a7cb58ce Shikhar Bhushan
158 6a2dfeb4 Shikhar Bhushan
    # TESTED
159 6a2dfeb4 Shikhar Bhushan
160 216bb34c Shikhar Bhushan
    "*<commit>* RPC. Depends on the *:candidate* capability."
161 216bb34c Shikhar Bhushan
162 d6688264 Shikhar Bhushan
    DEPENDS = [':candidate']
163 a7cb58ce Shikhar Bhushan
164 cc9af1c3 Shikhar Bhushan
    SPEC = {'tag': 'commit', 'subtree': []}
165 a7cb58ce Shikhar Bhushan
166 d6688264 Shikhar Bhushan
    def _parse_hook(self):
167 d6688264 Shikhar Bhushan
        pass
168 a7cb58ce Shikhar Bhushan
169 216bb34c Shikhar Bhushan
    def request(self, confirmed=False, timeout=None):
170 216bb34c Shikhar Bhushan
        """
171 216bb34c Shikhar Bhushan
        Requires *:confirmed-commit* capability if *confirmed* argument is
172 216bb34c Shikhar Bhushan
        :const:`True`.
173 216bb34c Shikhar Bhushan

174 216bb34c Shikhar Bhushan
        :arg confirmed: optional; request a confirmed commit
175 216bb34c Shikhar Bhushan
        :type confirmed: `bool`
176 216bb34c Shikhar Bhushan

177 216bb34c Shikhar Bhushan
        :arg timeout: specify timeout for confirmed commit
178 216bb34c Shikhar Bhushan
        :type timeout: `int`
179 216bb34c Shikhar Bhushan

180 216bb34c Shikhar Bhushan
        :seealso: :ref:`return`
181 216bb34c Shikhar Bhushan
        """
182 ce5fb329 Shikhar Bhushan
        spec = deepcopy(Commit.SPEC)
183 d6688264 Shikhar Bhushan
        if confirmed:
184 cc9af1c3 Shikhar Bhushan
            self._assert(':confirmed-commit')
185 179b00d4 Shikhar Bhushan
            spec['subtree'].append({'tag': 'confirmed'})
186 d6688264 Shikhar Bhushan
            if timeout is not None:
187 179b00d4 Shikhar Bhushan
                spec['subtree'].append({
188 d6688264 Shikhar Bhushan
                    'tag': 'confirm-timeout',
189 d6688264 Shikhar Bhushan
                    'text': timeout
190 d6688264 Shikhar Bhushan
                })
191 94803aaf Shikhar Bhushan
        return self._request(Commit.SPEC)
192 94803aaf Shikhar Bhushan
193 1fca349b Shikhar Bhushan
194 d771dffc Shikhar Bhushan
class DiscardChanges(RPC):
195 a7cb58ce Shikhar Bhushan
196 6a2dfeb4 Shikhar Bhushan
    # TESTED
197 6a2dfeb4 Shikhar Bhushan
198 216bb34c Shikhar Bhushan
    "*<discard-changes>* RPC. Depends on the *:candidate* capability."
199 216bb34c Shikhar Bhushan
200 d771dffc Shikhar Bhushan
    DEPENDS = [':candidate']
201 a7cb58ce Shikhar Bhushan
202 d771dffc Shikhar Bhushan
    SPEC = {'tag': 'discard-changes'}
203 0b7d3b31 Shikhar Bhushan
204 0b7d3b31 Shikhar Bhushan
    def request(self):
205 0b7d3b31 Shikhar Bhushan
        ":seealso: :ref:`return`"
206 0b7d3b31 Shikhar Bhushan
        return self._request(DiscardChanges.SPEC)