cisco_node_utils 0.9.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/CONTRIBUTING.md +33 -31
- data/SUPPORT.md +3 -0
- data/cisco_node_utils.gemspec +1 -1
- data/docs/.rubocop.yml +13 -0
- data/docs/README-develop-node-utils-APIs.md +659 -0
- data/docs/README-maintainers.md +78 -0
- data/docs/agent_files.png +0 -0
- data/docs/template-feature.rb +45 -0
- data/docs/template-router.rb +125 -0
- data/docs/template-test_feature.rb +51 -0
- data/docs/template-test_router.rb +107 -0
- data/lib/cisco_node_utils/command_reference_common.yaml +42 -1
- data/lib/cisco_node_utils/interface.rb +106 -0
- data/lib/cisco_node_utils/interface_ospf.rb +17 -3
- data/lib/cisco_node_utils/node.rb +2 -2
- data/lib/cisco_node_utils/router_ospf_vrf.rb +12 -0
- data/lib/cisco_node_utils/version.rb +1 -1
- data/lib/cisco_node_utils/vtp.rb +21 -12
- data/lib/cisco_node_utils/yum.rb +16 -6
- data/tests/n9000_sample-1.0.0-7.0.3.x86_64.rpm +0 -0
- data/tests/test_interface.rb +149 -7
- data/tests/test_interface_ospf.rb +33 -1
- data/tests/test_interface_switchport.rb +104 -1
- data/tests/test_router_ospf_vrf.rb +12 -0
- data/tests/test_snmpuser.rb +1 -1
- data/tests/test_vtp.rb +64 -48
- data/tests/test_yum.rb +11 -7
- metadata +32 -22
@@ -0,0 +1,78 @@
|
|
1
|
+
# Maintainers Guide
|
2
|
+
|
3
|
+
Guidelines for the core maintainers of the cisco-network-node-utils project - above and beyond the [general developer guidelines](https://github.com/cisco/cisco-network-node-utils/blob/master/CONTRIBUTING.md).
|
4
|
+
|
5
|
+
## Accepting Pull Requests
|
6
|
+
|
7
|
+
* Is the pull request correctly submitted against `develop`?
|
8
|
+
* Does `rubocop` pass? (TODO - this will be part of our CI integration to run automatically)
|
9
|
+
* Is `CHANGELOG.md` updated appropriately?
|
10
|
+
* Are new minitests added? Do they provide sufficient coverage and consistent results?
|
11
|
+
* Do minitests pass on both N9K and N3K?
|
12
|
+
|
13
|
+
## Setting up git-flow
|
14
|
+
|
15
|
+
If you don't already have [`git-flow`](https://github.com/petervanderdoes/gitflow/) installed, install it.
|
16
|
+
|
17
|
+
Either run `git flow init` from the repository root directory, or manually edit your `.git/config` file. Either way, when done, you should have the following in your config:
|
18
|
+
|
19
|
+
```ini
|
20
|
+
[gitflow "branch"]
|
21
|
+
master = master
|
22
|
+
develop = develop
|
23
|
+
[gitflow "prefix"]
|
24
|
+
feature = feature/
|
25
|
+
release = release/
|
26
|
+
hotfix = hotfix/
|
27
|
+
support = support/
|
28
|
+
versiontag = v
|
29
|
+
```
|
30
|
+
|
31
|
+
Most of these are default for git-flow except for the `versiontag` setting.
|
32
|
+
|
33
|
+
## Release Process
|
34
|
+
|
35
|
+
When we agree as a team that a new release should be published, the process is as follows:
|
36
|
+
|
37
|
+
1. Create a release branch. Follow [semantic versioning](http://semver.org) - a bugfix release is a 0.0.x version bump, a new feature is a 0.x.0 bump, and a backward-incompatible change is a new x.0.0 version.
|
38
|
+
|
39
|
+
```
|
40
|
+
git flow release start 1.0.1
|
41
|
+
```
|
42
|
+
|
43
|
+
2. In the newly created release branch, update `CHANGELOG.md`:
|
44
|
+
|
45
|
+
```diff
|
46
|
+
Changelog
|
47
|
+
=========
|
48
|
+
|
49
|
+
-(unreleased)
|
50
|
+
-------------
|
51
|
+
+1.0.1
|
52
|
+
+-----
|
53
|
+
```
|
54
|
+
|
55
|
+
and also update `version.rb`:
|
56
|
+
|
57
|
+
```diff
|
58
|
+
- VERSION = '1.0.0'
|
59
|
+
+ VERSION = '1.0.1'
|
60
|
+
```
|
61
|
+
|
62
|
+
3. Finish the release and push it to GitHub:
|
63
|
+
|
64
|
+
```
|
65
|
+
git flow release finish 1.0.1
|
66
|
+
git push origin master
|
67
|
+
git push origin develop
|
68
|
+
git push --tags
|
69
|
+
```
|
70
|
+
|
71
|
+
4. Add release notes on GitHub, for example `https://github.com/cisco/cisco-network-node-utils/releases/new?tag=v1.0.1`. Usually this will just be a copy-and-paste of the relevant section of the `CHANGELOG.md`.
|
72
|
+
|
73
|
+
5. Publish the new gem version to rubygems.org:
|
74
|
+
|
75
|
+
```
|
76
|
+
gem build cisco_node_utils.gemspec
|
77
|
+
gem push cisco_node_utils-0.9.0.gem
|
78
|
+
```
|
Binary file
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# NXAPI implementation of X__CLASS_NAME__X class
|
3
|
+
#
|
4
|
+
# Copyright (c) 2014-2015 Cisco and/or its affiliates.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), 'node')
|
19
|
+
module Cisco
|
20
|
+
# Class name syntax will typically be the resource name in camelCase
|
21
|
+
# format; for example: 'tacacs server host' becomes TacacsServerHost.
|
22
|
+
class X__CLASS_NAME__X
|
23
|
+
# Establish connection to node
|
24
|
+
@@node = Cisco::Node.instance
|
25
|
+
|
26
|
+
def feature_enable
|
27
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'feature', { :state => '' })
|
28
|
+
end
|
29
|
+
|
30
|
+
def feature_disable
|
31
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'feature', { :state => 'no' })
|
32
|
+
end
|
33
|
+
|
34
|
+
# Check current state of the configuration
|
35
|
+
def X__CLASS_NAME__X.feature_enabled
|
36
|
+
feat = @@node.config_get('X__RESOURCE_NAME__X', 'feature')
|
37
|
+
return (!feat.nil? and !feat.empty?)
|
38
|
+
rescue Cisco::CliError => e
|
39
|
+
# This cmd will syntax reject if feature is not
|
40
|
+
# enabled. Just catch the reject and return false.
|
41
|
+
return false if e.clierror =~ /Syntax error/
|
42
|
+
raise
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#
|
2
|
+
# NXAPI implementation of X__CLASS_NAME__X class
|
3
|
+
#
|
4
|
+
# Copyright (c) 2014-2015 Cisco and/or its affiliates.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), 'node')
|
19
|
+
|
20
|
+
module Cisco
|
21
|
+
class X__CLASS_NAME__X
|
22
|
+
attr_reader :name
|
23
|
+
|
24
|
+
# Establish connection to node
|
25
|
+
@@node = Cisco::Node.instance
|
26
|
+
|
27
|
+
# name: name of the router instance
|
28
|
+
# instantiate: true = create router instance
|
29
|
+
def initialize(name, instantiate=true)
|
30
|
+
raise ArgumentError unless name.length > 0
|
31
|
+
@name = name
|
32
|
+
create if instantiate
|
33
|
+
end
|
34
|
+
|
35
|
+
# Create a hash of all current router instances.
|
36
|
+
def X__CLASS_NAME__X.routers
|
37
|
+
instances = @@node.config_get('X__RESOURCE_NAME__X', 'router')
|
38
|
+
return {} if instances.nil?
|
39
|
+
hash = {}
|
40
|
+
instances.each do |name|
|
41
|
+
hash[name] = X__CLASS_NAME__X.new(name, false)
|
42
|
+
end
|
43
|
+
return hash
|
44
|
+
rescue Cisco::CliError => e
|
45
|
+
# cmd will syntax reject when feature is not enabled
|
46
|
+
raise unless e.clierror =~ /Syntax error/
|
47
|
+
return {}
|
48
|
+
end
|
49
|
+
|
50
|
+
def feature_enabled
|
51
|
+
feat = @@node.config_get('X__RESOURCE_NAME__X', 'feature')
|
52
|
+
return (!feat.nil? and !feat.empty?)
|
53
|
+
rescue Cisco::CliError => e
|
54
|
+
# This cmd will syntax reject if feature is not
|
55
|
+
# enabled. Just catch the reject and return false.
|
56
|
+
return false if e.clierror =~ /Syntax error/
|
57
|
+
raise
|
58
|
+
end
|
59
|
+
|
60
|
+
def feature_enable
|
61
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'feature', { :state => '' })
|
62
|
+
end
|
63
|
+
|
64
|
+
def feature_disable
|
65
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'feature', { :state => 'no' })
|
66
|
+
end
|
67
|
+
|
68
|
+
# Enable feature and create router instance
|
69
|
+
def create
|
70
|
+
feature_enable unless feature_enabled
|
71
|
+
X__RESOURCE_NAME__X_router
|
72
|
+
end
|
73
|
+
|
74
|
+
# Destroy a router instance; disable feature on last instance
|
75
|
+
def destroy
|
76
|
+
ids = @@node.config_get('X__RESOURCE_NAME__X', 'router')
|
77
|
+
return if ids.nil?
|
78
|
+
if ids.size == 1
|
79
|
+
feature_disable
|
80
|
+
else
|
81
|
+
X__RESOURCE_NAME__X_router('no')
|
82
|
+
end
|
83
|
+
rescue Cisco::CliError => e
|
84
|
+
# cmd will syntax reject when feature is not enabled
|
85
|
+
raise unless e.clierror =~ /Syntax error/
|
86
|
+
end
|
87
|
+
|
88
|
+
def X__RESOURCE_NAME__X_router(state='')
|
89
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'router', { :name => @name, :state => state })
|
90
|
+
end
|
91
|
+
|
92
|
+
# ----------
|
93
|
+
# PROPERTIES
|
94
|
+
# ----------
|
95
|
+
|
96
|
+
# Property methods for boolean property
|
97
|
+
def default_X__PROPERTY_BOOL__X
|
98
|
+
@@node.config_get_default('X__RESOURCE_NAME__X', 'X__PROPERTY_BOOL__X')
|
99
|
+
end
|
100
|
+
|
101
|
+
def X__PROPERTY_BOOL__X
|
102
|
+
state = @@node.config_get('X__RESOURCE_NAME__X', 'X__PROPERTY_BOOL__X', { :name => @name })
|
103
|
+
state ? true : false
|
104
|
+
end
|
105
|
+
|
106
|
+
def X__PROPERTY_BOOL__X=(state)
|
107
|
+
state = (state ? '' : 'no')
|
108
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'X__PROPERTY_BOOL__X', { :name => @name, :state => state })
|
109
|
+
end
|
110
|
+
|
111
|
+
# Property methods for integer property
|
112
|
+
def default_X__PROPERTY_INT__X
|
113
|
+
@@node.config_get_default('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X')
|
114
|
+
end
|
115
|
+
|
116
|
+
def X__PROPERTY_INT__X
|
117
|
+
val = @@node.config_get('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X', { :name => @name })
|
118
|
+
val.nil? ? default_X__PROPERTY_INT__X : val.first.to_i
|
119
|
+
end
|
120
|
+
|
121
|
+
def X__PROPERTY_INT__X=(val)
|
122
|
+
@@node.config_set('X__RESOURCE_NAME__X', 'X__PROPERTY_INT__X', { :name => @name, :val => val })
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#
|
2
|
+
# Minitest for X__CLASS_NAME__X class
|
3
|
+
#
|
4
|
+
# Copyright (c) 2014-2015 Cisco and/or its affiliates.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require File.expand_path("../ciscotest", __FILE__)
|
19
|
+
require File.expand_path("../../lib/cisco_node_utils/X__RESOURCE_NAME__X", __FILE__)
|
20
|
+
|
21
|
+
class TestX__CLASS_NAME__X < CiscoTestCase
|
22
|
+
def setup
|
23
|
+
# setup automatically runs at the beginning of each test
|
24
|
+
super
|
25
|
+
no_feature
|
26
|
+
end
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
# teardown automatically runs at the end of each test
|
30
|
+
no_feature
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def no_feature
|
35
|
+
# setup/teardown helper. Turn the feature off for a clean testbed.
|
36
|
+
@device.cmd('conf t ; no feature X__CLI_NAME__X ; end')
|
37
|
+
# Flush the cache since we've modified the device outside of the node_utils APIs
|
38
|
+
node.cache_flush()
|
39
|
+
end
|
40
|
+
|
41
|
+
# TESTS
|
42
|
+
|
43
|
+
def test_feature_on_off
|
44
|
+
feat = X__CLASS_NAME__X.new()
|
45
|
+
feat.feature_enable
|
46
|
+
assert(BashShell.feature_enabled)
|
47
|
+
|
48
|
+
feat.feature_disable
|
49
|
+
refute(BashShell.feature_enabled)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#
|
2
|
+
# Minitest for __CLASS_NAME__ class
|
3
|
+
#
|
4
|
+
# Copyright (c) 2014-2015 Cisco and/or its affiliates.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require File.expand_path("../ciscotest", __FILE__)
|
19
|
+
require File.expand_path("../../lib/cisco_node_utils/router___RESOURCE_NAME__", __FILE__)
|
20
|
+
|
21
|
+
class Test__CLASS_NAME__ < CiscoTestCase
|
22
|
+
def setup
|
23
|
+
# setup runs at the beginning of each test
|
24
|
+
super
|
25
|
+
no_feature___RESOURCE_NAME__
|
26
|
+
end
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
# teardown runs at the end of each test
|
30
|
+
no_feature___RESOURCE_NAME__
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def no_feature___RESOURCE_NAME__
|
35
|
+
# Turn the feature off for a clean test.
|
36
|
+
@device.cmd("conf t ; no feature __RESOURCE_NAME__ ; end")
|
37
|
+
# Flush the cache since we've modified the device outside of the node_utils APIs
|
38
|
+
node.cache_flush()
|
39
|
+
end
|
40
|
+
|
41
|
+
# TESTS
|
42
|
+
|
43
|
+
def test_router_create_destroy_one
|
44
|
+
id = "blue"
|
45
|
+
rtr = __CLASS_NAME__.new(id)
|
46
|
+
s = @device.cmd("show runn | i 'router __RESOURCE_NAME__ #{id}'")
|
47
|
+
assert_match(s, /^router __RESOURCE_NAME__ #{id}$/,
|
48
|
+
"Error: failed to create router __RESOURCE_NAME__ #{id}")
|
49
|
+
|
50
|
+
rtr.destroy
|
51
|
+
s = @device.cmd("show runn | i 'router __RESOURCE_NAME__ #{id}'")
|
52
|
+
refute_match(s, /^router __RESOURCE_NAME__ #{id}$/,
|
53
|
+
"Error: failed to destroy router __RESOURCE_NAME__ #{id}")
|
54
|
+
|
55
|
+
s = @device.cmd("show runn | i 'feature __RESOURCE_NAME__'")
|
56
|
+
refute_match(s, /^feature __RESOURCE_NAME__$/,
|
57
|
+
"Error: failed to disable feature __RESOURCE_NAME__")
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_router_create_destroy_multiple
|
61
|
+
id1 = "blue"
|
62
|
+
rtr1 = __CLASS_NAME__.new(id1)
|
63
|
+
id2 = "red"
|
64
|
+
rtr2 = __CLASS_NAME__.new(id2)
|
65
|
+
|
66
|
+
s = @device.cmd("show runn | i 'router __RESOURCE_NAME__'")
|
67
|
+
assert_match(s, /^router __RESOURCE_NAME__ #{id1}$/)
|
68
|
+
assert_match(s, /^router __RESOURCE_NAME__ #{id2}$/)
|
69
|
+
|
70
|
+
rtr1.destroy
|
71
|
+
s = @device.cmd("show runn | i 'router __RESOURCE_NAME__ #{id1}'")
|
72
|
+
refute_match(s, /^router __RESOURCE_NAME__ #{id1}$/,
|
73
|
+
"Error: failed to destroy router __RESOURCE_NAME__ #{id1}")
|
74
|
+
|
75
|
+
rtr2.destroy
|
76
|
+
s = @device.cmd("show runn | i 'router __RESOURCE_NAME__ #{id2}'")
|
77
|
+
refute_match(s, /^router __RESOURCE_NAME__ #{id2}$/,
|
78
|
+
"Error: failed to destroy router __RESOURCE_NAME__ #{id2}")
|
79
|
+
|
80
|
+
s = @device.cmd("show runn | i 'feature __RESOURCE_NAME__'")
|
81
|
+
refute_match(s, /^feature __RESOURCE_NAME__$/,
|
82
|
+
"Error: failed to disable feature __RESOURCE_NAME__")
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_router___PROPERTY_INT__
|
86
|
+
id = "blue"
|
87
|
+
rtr = __CLASS_NAME__.new(id)
|
88
|
+
val = 5 # This value depends on property bounds
|
89
|
+
rtr.__PROPERTY_INT__ = val
|
90
|
+
assert_equal(rtr.__PROPERTY_INT__, val, "__PROPERTY_INT__ is not #{val}")
|
91
|
+
|
92
|
+
# Get default value from yaml
|
93
|
+
val = node.config_get_default("__RESOURCE_NAME__", "__PROPERTY_INT__")
|
94
|
+
rtr.__PROPERTY_INT__ = val
|
95
|
+
assert_equal(rtr.__PROPERTY_INT__, val, "__PROPERTY_INT__ is not #{val}")
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_router___PROPERTY_BOOL__
|
99
|
+
id = "blue"
|
100
|
+
rtr = __CLASS_NAME__.new(id)
|
101
|
+
rtr.__PROPERTY_BOOL__ = true
|
102
|
+
assert(rtr.__PROPERTY_BOOL__, "__PROPERTY_BOOL__ state is not true")
|
103
|
+
|
104
|
+
rtr.__PROPERTY_BOOL__ = false
|
105
|
+
refute(rtr.__PROPERTY_BOOL__, "__PROPERTY_BOOL__ state is not false")
|
106
|
+
end
|
107
|
+
end
|
@@ -142,6 +142,17 @@ interface:
|
|
142
142
|
destroy:
|
143
143
|
config_set: "no interface %s"
|
144
144
|
|
145
|
+
encapsulation_dot1q:
|
146
|
+
config_get: "show running interface all"
|
147
|
+
config_get_token: ['/^interface %s$/i', '/^encapsulation dot1q (.*)/']
|
148
|
+
config_set: ["interface %s", "%s encapsulation dot1q %s"]
|
149
|
+
default_value: ""
|
150
|
+
|
151
|
+
feature_lacp:
|
152
|
+
config_get: "show running | i ^feature"
|
153
|
+
config_get_token: '/^feature lacp$/'
|
154
|
+
config_set: "%s feature lacp"
|
155
|
+
|
145
156
|
feature_vlan:
|
146
157
|
config_get: "show running | i ^feature"
|
147
158
|
config_get_token: '/^feature interface-vlan$/'
|
@@ -196,6 +207,12 @@ interface:
|
|
196
207
|
false: false
|
197
208
|
true: true
|
198
209
|
|
210
|
+
mtu:
|
211
|
+
config_get: "show running interface all"
|
212
|
+
config_get_token: ['/^interface %s$/i', '/^mtu (.*)$/']
|
213
|
+
config_set: ["interface %s", "%s mtu %s"]
|
214
|
+
default_value: ""
|
215
|
+
|
199
216
|
negotiate_auto_ethernet:
|
200
217
|
config_get: "show running interface all"
|
201
218
|
config_get_token: [
|
@@ -303,6 +320,24 @@ interface:
|
|
303
320
|
test_config_result:
|
304
321
|
false: RuntimeError
|
305
322
|
|
323
|
+
switchport_trunk_allowed_vlan:
|
324
|
+
config_get: "show running interface all"
|
325
|
+
config_get_token: [
|
326
|
+
'/^interface %s$/i',
|
327
|
+
'/^switchport trunk allowed vlan (.*)$/'
|
328
|
+
]
|
329
|
+
config_set: ["interface %s", "%s switchport trunk allowed vlan %s"]
|
330
|
+
default_value: "all"
|
331
|
+
|
332
|
+
switchport_trunk_native_vlan:
|
333
|
+
config_get: "show running interface all"
|
334
|
+
config_get_token: [
|
335
|
+
'/^interface %s$/i',
|
336
|
+
'/^switchport trunk native vlan (.*)$/'
|
337
|
+
]
|
338
|
+
config_set: ["interface %s", "%s switchport trunk native vlan %s"]
|
339
|
+
default_value: 1
|
340
|
+
|
306
341
|
svi_autostate:
|
307
342
|
config_get: "show running interface all"
|
308
343
|
config_get_token: ['/^interface %s$/i', '/^autostate$/']
|
@@ -318,6 +353,12 @@ interface:
|
|
318
353
|
config_set: ["interface %s", "%s management"]
|
319
354
|
default_value: false
|
320
355
|
|
356
|
+
vrf:
|
357
|
+
config_get: "show running interface all"
|
358
|
+
config_get_token: ['/^interface %s$/i', '/^vrf member (.*)/']
|
359
|
+
config_set: ["interface %s", "%s vrf member %s"]
|
360
|
+
default_value: ""
|
361
|
+
|
321
362
|
vtp:
|
322
363
|
config_get: "show running interface all"
|
323
364
|
config_get_token: ['/^interface %s$/i', '/^vtp *$/']
|
@@ -835,7 +876,7 @@ vtp:
|
|
835
876
|
|
836
877
|
yum:
|
837
878
|
install:
|
838
|
-
config_set: "install add %s activate"
|
879
|
+
config_set: "install add %s %s activate"
|
839
880
|
query:
|
840
881
|
config_get: "show install packages"
|
841
882
|
# pass in the pkg name, retrieve version
|