Statistics
| Branch: | Tag: | Revision:

root / ncclient / operations / edit.py @ cb96607b

History | View | Annotate | Download (5.6 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 ebf2bbc6 Shikhar Bhushan
from ncclient import content
16 11d9e642 Shikhar Bhushan
17 cc9af1c3 Shikhar Bhushan
from rpc import RPC
18 cc9af1c3 Shikhar Bhushan
19 d6688264 Shikhar Bhushan
import util
20 1fca349b Shikhar Bhushan
21 0b7d3b31 Shikhar Bhushan
import logging
22 0b7d3b31 Shikhar Bhushan
logger = logging.getLogger('ncclient.operations.edit')
23 0b7d3b31 Shikhar Bhushan
24 0b7d3b31 Shikhar Bhushan
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 216bb34c Shikhar Bhushan
        :arg test_option: optional; one of {'stop-on-error', 'continue-on-error', 'rollback-on-error'}. Last option depends on the *:rollback-on-error* capability
47 216bb34c Shikhar Bhushan
        :type test_option: string
48 216bb34c Shikhar Bhushan

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

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

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

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

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

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

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

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