shopify-junos-ez-stdlib 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 +7 -0
- data/CHANGELOG.md +91 -0
- data/LICENSE +26 -0
- data/README.md +199 -0
- data/docs/Facts.md +192 -0
- data/docs/Providers/Group.md +61 -0
- data/docs/Providers/IPports.md +61 -0
- data/docs/Providers/L1ports.md +29 -0
- data/docs/Providers/L2ports.md +43 -0
- data/docs/Providers/LAGports.md +57 -0
- data/docs/Providers/StaticHosts.md +26 -0
- data/docs/Providers/StaticRoutes.md +37 -0
- data/docs/Providers/UserAuths.md +32 -0
- data/docs/Providers/Users.md +122 -0
- data/docs/Providers/Vlans.md +43 -0
- data/docs/Providers_Resources.md +353 -0
- data/docs/README_FIRST.md +27 -0
- data/docs/Utils/Config.md +160 -0
- data/docs/Utils/Filesystem.md +360 -0
- data/docs/Utils/Routing-Engine.md +379 -0
- data/docs/Utils/SCP.md +24 -0
- data/examples/config/config_file.rb +72 -0
- data/examples/config/config_template_object.rb +81 -0
- data/examples/config/config_template_simple.rb +76 -0
- data/examples/config/multi_config.rb +60 -0
- data/examples/fs_utils.rb +31 -0
- data/examples/lag_port.rb +27 -0
- data/examples/re_upgrade.rb +99 -0
- data/examples/re_utils.rb +33 -0
- data/examples/simple.rb +46 -0
- data/examples/st_hosts.rb +33 -0
- data/examples/user.rb +32 -0
- data/examples/vlans.rb +31 -0
- data/junos-ez-stdlib.gemspec +15 -0
- data/lib/junos-ez/exceptions.rb +3 -0
- data/lib/junos-ez/facts.rb +83 -0
- data/lib/junos-ez/facts/chassis.rb +51 -0
- data/lib/junos-ez/facts/ifd_style.rb +17 -0
- data/lib/junos-ez/facts/personality.rb +25 -0
- data/lib/junos-ez/facts/switch_style.rb +31 -0
- data/lib/junos-ez/facts/version.rb +58 -0
- data/lib/junos-ez/group.rb +206 -0
- data/lib/junos-ez/ip_ports.rb +30 -0
- data/lib/junos-ez/ip_ports/classic.rb +188 -0
- data/lib/junos-ez/l1_ports.rb +121 -0
- data/lib/junos-ez/l1_ports/classic.rb +87 -0
- data/lib/junos-ez/l1_ports/switch.rb +134 -0
- data/lib/junos-ez/l2_ports.rb +66 -0
- data/lib/junos-ez/l2_ports/bridge_domain.rb +499 -0
- data/lib/junos-ez/l2_ports/vlan.rb +433 -0
- data/lib/junos-ez/l2_ports/vlan_l2ng.rb +502 -0
- data/lib/junos-ez/lag_ports.rb +268 -0
- data/lib/junos-ez/provider.rb +619 -0
- data/lib/junos-ez/stdlib.rb +18 -0
- data/lib/junos-ez/system.rb +48 -0
- data/lib/junos-ez/system/st_hosts.rb +92 -0
- data/lib/junos-ez/system/st_routes.rb +159 -0
- data/lib/junos-ez/system/syscfg.rb +103 -0
- data/lib/junos-ez/system/userauths.rb +84 -0
- data/lib/junos-ez/system/users.rb +217 -0
- data/lib/junos-ez/utils/config.rb +236 -0
- data/lib/junos-ez/utils/fs.rb +385 -0
- data/lib/junos-ez/utils/re.rb +558 -0
- data/lib/junos-ez/version.rb +6 -0
- data/lib/junos-ez/vlans.rb +38 -0
- data/lib/junos-ez/vlans/bridge_domain.rb +89 -0
- data/lib/junos-ez/vlans/vlan.rb +119 -0
- data/lib/junos-ez/vlans/vlan_l2ng.rb +126 -0
- data/shipit.yml +4 -0
- data/tmp +7 -0
- metadata +129 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 35f03b58ce9cfea7aee6a2bf7cb00f69721692d8
|
4
|
+
data.tar.gz: a38199a944c32a844c185d01508d9e704de28744
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 032c27f113348d914b8441470bf784efdb34acbbea615d5d7d5612fd7620b72c7273dc88414aac38a39d1356f7ac45412bbbf3ab7c8511aa75b0b4f08936aff9
|
7
|
+
data.tar.gz: 3a947882c3ca848b08daea12cbe66ab104536ebbec5ac0473db3f26d737f63025e12e3d72e0080927c3f5fe63694b2a6ca5a54734f8af598fa62d805f53dec66
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# 2013-April
|
2
|
+
|
3
|
+
0.0.10: 2013-04-26
|
4
|
+
|
5
|
+
Initial release of code into RubyGems. Code tested on EX and SRX-branch. Consider this code
|
6
|
+
as "early-adopter". Comments/feedback is welcome and appreciated.
|
7
|
+
|
8
|
+
0.0.11: 2013-04-26
|
9
|
+
|
10
|
+
Updated Junos::Ez::RE::Utils
|
11
|
+
#memory changed :procs from Hash to Array
|
12
|
+
#users changed return from Hash to Array
|
13
|
+
|
14
|
+
0.0.12: 2013-04-26
|
15
|
+
|
16
|
+
Updated Junos::Ez::FS:Utils#ls to include :symlink information
|
17
|
+
Adding Junos::Ez::Users::Provider for login management
|
18
|
+
Adding Junos::Ez::UserAuths::Provider for SSH-key management
|
19
|
+
|
20
|
+
0.0.14: 2013-04-28
|
21
|
+
|
22
|
+
Completed initial documentation. Still more work to be done with these files
|
23
|
+
but the "enough to get started" information is now available
|
24
|
+
|
25
|
+
# 2013-May
|
26
|
+
|
27
|
+
0.0.15: 2013-05-02
|
28
|
+
|
29
|
+
L2ports - added support for framework to read [edit vlans] stanza to recognize interfaces configured
|
30
|
+
there vs. under [edit interfaces]
|
31
|
+
|
32
|
+
IPports - added :acl_in and :acl_out for stateless ACL filtering. added .status method to return
|
33
|
+
runtime status information about the port
|
34
|
+
|
35
|
+
RE::Utils - misc updates, and documentation
|
36
|
+
|
37
|
+
0.0.16: 2013-05-03
|
38
|
+
|
39
|
+
RE::Utils - added support for license-key management. Renamed "software" methods from "xxx_software"
|
40
|
+
to "software_xxx" to be consistent with other naming usage. Updated docs.
|
41
|
+
|
42
|
+
0.0.17: 2013-05-05
|
43
|
+
|
44
|
+
FS::Utils - updated docs. fixed methods so that all "error" scenarios raise IOError excaptions.
|
45
|
+
|
46
|
+
0.1.0: 2013-05-06
|
47
|
+
|
48
|
+
All docs and code _finished_ for the inital release of code. Always more to do, but at this
|
49
|
+
point, declaring the framework "good for early adopter testing". Looking forward to bug-reports,
|
50
|
+
please open issues against this repo. Thank you!
|
51
|
+
|
52
|
+
0.1.1: 2013-05-29
|
53
|
+
|
54
|
+
Fixed a small bug in fact gathering for hardwaremodel
|
55
|
+
|
56
|
+
# 2013-July
|
57
|
+
|
58
|
+
0.1.2: 2013-07-04
|
59
|
+
|
60
|
+
Fixed issue#3. Previously this gem would not work with non-VC capable EX switches. Updated
|
61
|
+
the `facts/version.rb` file to handle these devices. Also added a new fact `:vc_capable` that
|
62
|
+
is set to `true` if the EX can support virtual-chassis, and `false` if it cannot.
|
63
|
+
|
64
|
+
# 2013-Aug
|
65
|
+
|
66
|
+
0.2.0:
|
67
|
+
|
68
|
+
Fixed issue #6. Added support for EX4300 platform. Added new provider for Link Aggregation Group
|
69
|
+
resources (LAGports)
|
70
|
+
|
71
|
+
# 2016-March
|
72
|
+
|
73
|
+
1.0.0:
|
74
|
+
|
75
|
+
Fixed issues
|
76
|
+
Issue #17 Add support for OCX device.
|
77
|
+
Issue #20 "under development" error is thrown while importing the interface_create recipe from the Chef-Server.
|
78
|
+
Issue #22 "netdev_vlan" resource action delete is not working fine while invoking from the JUNOS Chef-Client.
|
79
|
+
Issue #23 RPC command error: commit-configuration is getting thrown on Invoking the "netdev_lag" resource from
|
80
|
+
JUNOS Chef Client.
|
81
|
+
Issue #27 Duplicate declaration of lag configuration in a recipe is giving NoMethodError: undefined method
|
82
|
+
`properties' for nil:NilClass.
|
83
|
+
Issue #30 Error in rerunning netdev_lag interface.
|
84
|
+
Issue #33 undefined method `properties' for nil:NilClass error is thrown if the backup RE is unreachable.
|
85
|
+
Issue #35 Error in running chef client from Backup RE.
|
86
|
+
Issue #39 Getting 'Junos::Ez::NoProviderError' error on qfx device.
|
87
|
+
Issue #42 Raise exception to handle warnings in <error-severity>.
|
88
|
+
|
89
|
+
Enhancement
|
90
|
+
* Add support for configuring l2_interface on MX device.
|
91
|
+
* Add support for provider 'group' for configuring JUNOS groups.
|
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
LICENSE (BSD-2)
|
2
|
+
===============
|
3
|
+
Copyright (c) 2013, Jeremy Schulman, Juniper Networks
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
Redistributions of source code must retain the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in
|
14
|
+
the documentation and/or other materials provided with the distribution.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
20
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
21
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
22
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
23
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
24
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
25
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
26
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
# OVERVIEW
|
2
|
+
|
3
|
+
Ruby framework to support Junos OS based device management automation.
|
4
|
+
|
5
|
+
This is the "standard library" or "core" set of functionality that should work on most/all Junos OS based devices.
|
6
|
+
|
7
|
+
This framework is build on top of the NETCONF gem which uses XML as the fundamental data-exchange. So no
|
8
|
+
"automating the CLI" or using SNMP. The purpose of this framework is to **enable automation development
|
9
|
+
without requiring specific Junos XML knowledge**.
|
10
|
+
|
11
|
+
Further documentation can be found in the *docs* subdirectory.
|
12
|
+
|
13
|
+
# FRAMEWORK
|
14
|
+
|
15
|
+
The framework is comprised of these basic eloements:
|
16
|
+
|
17
|
+
- Facts:
|
18
|
+
|
19
|
+
A Hash of name/value pairs of information auto-collected. Fact values can be Hash structures as well
|
20
|
+
so you can have deeply nested fact data. You can also define your own facts in addition to the "stdlib" facts.
|
21
|
+
The facts are used by the framework to create a platform indepent layer of abstraction. This means
|
22
|
+
that managing a VLAN, for example, is the same regardless of the underlying hardware platofrm (EX, QFX,
|
23
|
+
MX, SRX, ...)
|
24
|
+
|
25
|
+
- Resources:
|
26
|
+
|
27
|
+
Resources allow you to easily configure and perform operational functions on specific items within Junos,
|
28
|
+
for example VLANs, or switch ports. A resource has *properties* that you manipuate as Hash. You can
|
29
|
+
interact with Junos using resource methods like `read!`, `write!`, `delete!`, `activate!`, `deactivate!`, etc.
|
30
|
+
For a complete listing of resource methods, refer to the *docs* directory
|
31
|
+
|
32
|
+
- Providers:
|
33
|
+
|
34
|
+
Providers allow you to manage a collection of resource, and most commonly, select a resource.
|
35
|
+
The purpose of a provider/resource is to automate the life-cycle of common changes, like adding
|
36
|
+
VLANs, or ports to a VLAN. A provider also allows you to obtain a `list` of resources
|
37
|
+
(Array of *names*) or a `catalog` (Hash of resource properties). Providers may include resource
|
38
|
+
specific functionality, like using complex YAML/Hash data for easy import/export and provisioning
|
39
|
+
with Junos. If you need the ability to simply apply config-snippets that you do not need to model
|
40
|
+
as resources (as you might for initial device commissioning), the Utilities library is where you
|
41
|
+
want to start.
|
42
|
+
|
43
|
+
- Utilities:
|
44
|
+
|
45
|
+
Utilities are simply collections of functions. The **configuration** utilities, for example, will
|
46
|
+
allow you to easily push config snippets in "curly-brace", "set", or XML formats. Very useful
|
47
|
+
for unmanaged provider/resources (like initial configuration of the device). The
|
48
|
+
**routing-engine** utilities, for example, will allow you to easily upgrade software, check
|
49
|
+
memory usage, and do `ping` operations.
|
50
|
+
|
51
|
+
# EXAMPLE USAGE
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
require 'pp'
|
55
|
+
require 'net/netconf/jnpr'
|
56
|
+
require 'junos-ez/stdlib'
|
57
|
+
|
58
|
+
unless ARGV[0]
|
59
|
+
puts "You must specify a target"
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
|
63
|
+
# login information for NETCONF session
|
64
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
65
|
+
|
66
|
+
## create a NETCONF object to manage the device and open the connection ...
|
67
|
+
|
68
|
+
ndev = Netconf::SSH.new( login )
|
69
|
+
print "Connecting to device #{login[:target]} ... "
|
70
|
+
ndev.open
|
71
|
+
puts "OK!"
|
72
|
+
|
73
|
+
## Now bind providers to the device object. The 'Junos::Ez::Provider' must be first.
|
74
|
+
## This will retrieve the device 'facts'. The other providers allow you to define the
|
75
|
+
## provider variables; so this example is using 'l1_ports' and 'ip_ports', but you could name
|
76
|
+
## them what you like, yo!
|
77
|
+
|
78
|
+
Junos::Ez::Provider( ndev )
|
79
|
+
Junos::Ez::L1ports::Provider( ndev, :l1_ports )
|
80
|
+
Junos::Ez::IPports::Provider( ndev, :ip_ports )
|
81
|
+
Junos::Ez::Config::Utils( ndev, :cu )
|
82
|
+
|
83
|
+
# -----------------------------------------------------------
|
84
|
+
# Facts ...
|
85
|
+
# -----------------------------------------------------------
|
86
|
+
|
87
|
+
# show the device softare version fact
|
88
|
+
pp ndev.fact :version
|
89
|
+
|
90
|
+
# show the device serial-number face
|
91
|
+
pp ndev.fact :serialnumber
|
92
|
+
|
93
|
+
# get a list of all available facts (Array)
|
94
|
+
pp ndev.facts.list
|
95
|
+
|
96
|
+
# get a hash of all facts and their associated values
|
97
|
+
pp ndev.facts.catalog
|
98
|
+
|
99
|
+
# -----------------------------------------------------------
|
100
|
+
# Layer 1 (physical ports) Resources ...
|
101
|
+
# -----------------------------------------------------------
|
102
|
+
|
103
|
+
pp ndev.l1_ports.list
|
104
|
+
pp ndev.l1_ports.catalog
|
105
|
+
|
106
|
+
# select port 'ge-0/0/0' and display the contents
|
107
|
+
# of the properties (like port, speed, description)
|
108
|
+
|
109
|
+
ge_0 = ndev.l1_ports['ge-0/0/0']
|
110
|
+
pp ge_0.to_h
|
111
|
+
|
112
|
+
# change port to disable, this will write the change
|
113
|
+
# but not commit it.
|
114
|
+
|
115
|
+
ge_0[:admin] = :down
|
116
|
+
ge_0.write!
|
117
|
+
|
118
|
+
# show the diff of the change to the screen
|
119
|
+
|
120
|
+
puts ndev.cu.diff?
|
121
|
+
|
122
|
+
# now rollback the change, since we don't want to save it.
|
123
|
+
|
124
|
+
ndev.cu.rollback!
|
125
|
+
|
126
|
+
ndev.close
|
127
|
+
```
|
128
|
+
|
129
|
+
# PROVIDERS
|
130
|
+
|
131
|
+
Providers manage access to individual resources and their associated properties. Providers/resources exists
|
132
|
+
for managing life-cycle common changes that you generally need as part of a larger workflow process. For more
|
133
|
+
documentation on Providers/Resources, see the *docs* directory.
|
134
|
+
|
135
|
+
- L1ports: Physical port management
|
136
|
+
- L2ports: Ethernet port (VLAN) management
|
137
|
+
- Vlans: VLAN resource management
|
138
|
+
- IPports: IP v4 port management
|
139
|
+
- StaticHosts: Static Hosts [system static-host-mapping ...]
|
140
|
+
- StaticRoutes: Static Routes [routing-options static ...]
|
141
|
+
- Group: JUNOS groups management
|
142
|
+
|
143
|
+
# UTILITIES
|
144
|
+
|
145
|
+
- Config:
|
146
|
+
|
147
|
+
These functions allow you to load config snippets, do commit checks, look at config diffs, etc.
|
148
|
+
Generally speaking, you would want to use the Providers/Resources framework to manage specific
|
149
|
+
items in the config. This utility library is very useful when doing the initial commissioning
|
150
|
+
process, where you do not (cannot) model every aspect of Junos. These utilities can also be
|
151
|
+
used in conjunction with Providers/Resources, specifically around locking/unlocking and committing
|
152
|
+
the configuration.
|
153
|
+
|
154
|
+
- Filesystem:
|
155
|
+
|
156
|
+
These functions provide you "unix-like" commands that return data in Hash forms rather than
|
157
|
+
as string output you'd normally have to screen-scraps. These methods include `ls`, `df`, `pwd`,
|
158
|
+
`cwd`, `cleanup`, and `cleanup!`
|
159
|
+
|
160
|
+
- Routing-Engine:
|
161
|
+
|
162
|
+
These functions provide a general collection to information and functioanlity for handling
|
163
|
+
routing-engine (RE) processes. These functions `reboot!`, `shutdown!`, `install_software!`,
|
164
|
+
`ping`. Information gathering such as memory-usage, current users, and RE status information
|
165
|
+
is also made available through this collection.
|
166
|
+
|
167
|
+
# DEPENDENCIES
|
168
|
+
|
169
|
+
* gem netconf
|
170
|
+
* Junos OS based products
|
171
|
+
|
172
|
+
# INSTALLATION
|
173
|
+
|
174
|
+
* gem install junos-ez-stdlib
|
175
|
+
|
176
|
+
# CONTRIBUTORS
|
177
|
+
Juniper Networks is actively contributing to and maintaining this repo. Please contact jnpr-community-netdev@juniper.net
|
178
|
+
for any queries.
|
179
|
+
|
180
|
+
Contributors:
|
181
|
+
[John Deatherage](https://github.com/routelastresort), [Nitin Kumar](https://github.com/vnitinv),
|
182
|
+
[Priyal Jain](https://github.com/jainpriyal), [Ganesh Nalawade](https://github.com/ganeshnalawade)
|
183
|
+
|
184
|
+
Former Contributors:
|
185
|
+
[Jeremy Schulman](https://github.com/jeremyschulman)
|
186
|
+
|
187
|
+
# LICENSES
|
188
|
+
|
189
|
+
BSD-2, See LICENSE file
|
190
|
+
|
191
|
+
# SUPPORT
|
192
|
+
|
193
|
+
Support for this software is made available exclusively through Github repo issue tracking. You are also welcome to contact the CONTRIBUTORS directly via their provided contact information.
|
194
|
+
|
195
|
+
If you find a bug, please open an issue against this repo.
|
196
|
+
|
197
|
+
If you have suggestions or ideas, please write them up and add them to the "SUGGESTION-BOX" folder of this repo (via pull request). This way we can share the ideas with the community and crowdsource for feature delivery.
|
198
|
+
|
199
|
+
Thank you!
|
data/docs/Facts.md
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
# FACT KEEPING
|
2
|
+
|
3
|
+
This framework is *fact based*, meaning that the provider libraries will have access to information about each
|
4
|
+
target. Facts enable the framework to abstract the physical differences of the underlying hardware.
|
5
|
+
|
6
|
+
For example,the `Junos::Ez::Vlans::Provider` allows you to manage vlans without having to worry about the differences between the EX product family and the MX product family. To you, the programmer, you simply obtain a resource and manage the associated properties.
|
7
|
+
|
8
|
+
There are collection of standard facts that are always read by the framework. You can find a list of these and the assocaited code in the *libs/../facts* subdirectory. These facts are also avaialble to your program as well. So you can make programmatic decisions based on the facts of the device.
|
9
|
+
|
10
|
+
You can also define your own facts, and then go on to building your own provider libraries (but we're getting ahead of ourselfs here ...)
|
11
|
+
|
12
|
+
# USAGE
|
13
|
+
|
14
|
+
Usage rule: you **MUST** call `Junos::Ez::Provider` on your netconf object:
|
15
|
+
|
16
|
+
- **AFTER** the object has connected to the target, since it will read facts
|
17
|
+
- **BEFORE** you add any other providers, since these may use the facts
|
18
|
+
|
19
|
+
Here is a basic example:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
require 'pp'
|
23
|
+
require 'net/netconf/jnpr'
|
24
|
+
require 'junos-ez/stdlib'
|
25
|
+
|
26
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
27
|
+
|
28
|
+
# create a NETCONF object to manage the device
|
29
|
+
|
30
|
+
ndev = Netconf::SSH.new( login )
|
31
|
+
|
32
|
+
# open the NETCONF connetion, if this fails, the object will throw an exception
|
33
|
+
ndev.open
|
34
|
+
|
35
|
+
# now that the netconf session has been established, initialize the object for the
|
36
|
+
# Junos::Ez framework. This will add an instance variable called `@facts` and
|
37
|
+
# retrieve all known facts from the target
|
38
|
+
|
39
|
+
Junos::Ez::Provider( ndev )
|
40
|
+
|
41
|
+
# do a quick dump of all facts
|
42
|
+
|
43
|
+
pp ndev.facts.catalog
|
44
|
+
->
|
45
|
+
{:hardwaremodel=>"SRX210H",
|
46
|
+
:serialnumber=>"AD2909AA0096",
|
47
|
+
:hostname=>"srx210",
|
48
|
+
:domain=>"workflowsherpas.com",
|
49
|
+
:fqdn=>"srx210.workflowsherpas.com",
|
50
|
+
:RE=>
|
51
|
+
{:status=>"OK",
|
52
|
+
:model=>"RE-SRX210H",
|
53
|
+
:up_time=>"26 days, 15 hours, 46 minutes, 4 seconds",
|
54
|
+
:last_reboot_reason=>"0x200:normal shutdown"},
|
55
|
+
:personality=>:SRX_BRANCH,
|
56
|
+
:ifd_style=>:CLASSIC,
|
57
|
+
:switch_style=>:VLAN,
|
58
|
+
:version=>"12.1X44-D10.4"}
|
59
|
+
```
|
60
|
+
|
61
|
+
# STANDARD FACTS
|
62
|
+
|
63
|
+
The following facts are provided by the `Junos::Ez::Provider` framework:
|
64
|
+
```
|
65
|
+
:hardwaremodel => String
|
66
|
+
```
|
67
|
+
Identifies the target hardware model as obtained from the chassis inventory information
|
68
|
+
```
|
69
|
+
:serialnumber => String
|
70
|
+
```
|
71
|
+
Identifies the target chassis serial-number as obtained from the chassis inventory information
|
72
|
+
```
|
73
|
+
:hostname => String
|
74
|
+
```
|
75
|
+
Identifies the target host-name as obtained from the system configuration
|
76
|
+
```
|
77
|
+
:domain => String
|
78
|
+
```
|
79
|
+
Identifies the target domain-name as obtained from the system configuration
|
80
|
+
```
|
81
|
+
:fqdn => String
|
82
|
+
```
|
83
|
+
Identifies the target Fully-Qualified-Domain-Name (FQDN), which is the composite of the `:hostname` and `:domain` facts.
|
84
|
+
```
|
85
|
+
:version => String
|
86
|
+
```
|
87
|
+
Identifies the Junos version string, e.g. "12.3R2.5" running on the master routing-engine.
|
88
|
+
```
|
89
|
+
:version_<RE | FPC + ID> => String
|
90
|
+
```
|
91
|
+
When the target is a multi-routing-engine or virtual-chassis system, the version loaded on each control processor is provided as a separate version fact. All version facts begin with `version_`. So and MX router with two routing-engines would have `:version_RE0` and `:version_RE1` in additon to the `:version` fact. An EX vritual chassis with two members would have `:version_FPC0` and `:version_FPC1` facts in additon to the `:version` fact.
|
92
|
+
```
|
93
|
+
:master => String
|
94
|
+
```
|
95
|
+
If the target is a multi-routing-engine capabile, this fact will identify the master RE, for example "0".
|
96
|
+
```
|
97
|
+
:RE<SLOD_ID> => Hash
|
98
|
+
```
|
99
|
+
For each routing-engine, a Hash structure of information is obtained.
|
100
|
+
The following illustrates an EX virtual-chassis:
|
101
|
+
```ruby
|
102
|
+
ndev.facts.catalog
|
103
|
+
->
|
104
|
+
{:hardwaremodel=>"Virtual Chassis",
|
105
|
+
:serialnumber=>"BP0208207236",
|
106
|
+
:hostname=>"jex",
|
107
|
+
:domain=>"workflowsherpas.com",
|
108
|
+
:fqdn=>"jex.workflowsherpas.com",
|
109
|
+
:RE0=>
|
110
|
+
{:mastership_state=>"master",
|
111
|
+
:status=>"OK",
|
112
|
+
:model=>"EX4200-48T, 8 POE",
|
113
|
+
:up_time=>"14 minutes, 12 seconds",
|
114
|
+
:last_reboot_reason=>"0x2:watchdog "},
|
115
|
+
:master=>"0",
|
116
|
+
:RE1=>
|
117
|
+
{:mastership_state=>"backup",
|
118
|
+
:status=>"OK",
|
119
|
+
:model=>"EX4200-48T, 8 POE",
|
120
|
+
:up_time=>"14 minutes, 12 seconds",
|
121
|
+
:last_reboot_reason=>"0x2:watchdog "},
|
122
|
+
:personality=>:SWITCH,
|
123
|
+
:ifd_style=>:SWITCH,
|
124
|
+
:switch_style=>:VLAN,
|
125
|
+
:version_FPC0=>"12.2R3.5",
|
126
|
+
:version_FPC1=>"12.2R3.5",
|
127
|
+
:version_FPC2=>"12.2R3.5",
|
128
|
+
:version=>"12.2R3.5"}
|
129
|
+
```
|
130
|
+
Note the presense of`:RE0` and `:RE1` facts, each contains the Hash information for each routing-engine. If a target does not support multiple routing-engnies, then there will be a `:RE` fact (no slot-id).
|
131
|
+
```
|
132
|
+
:switch_style => [:VLAN, :BRIDGE_DOMAIN, :VLAN_ELS, :NONE]
|
133
|
+
```
|
134
|
+
Identifies the target style for handing vlan configurations. If the target does not support vlan briding (for example the vSRX), then the style will be set to `:NONE`.
|
135
|
+
```
|
136
|
+
:personality => [:SWITCH, :MX, :SRX_BRANCH, :SRX_HIGHEND]
|
137
|
+
```
|
138
|
+
Identifies the personality of the target.
|
139
|
+
```
|
140
|
+
:ifd_style => [:CLASSIC, :SWITCH]
|
141
|
+
```
|
142
|
+
Identifies the target style for handling interface configuration differences.
|
143
|
+
```
|
144
|
+
:virtual => true
|
145
|
+
```
|
146
|
+
Set if the target is a virtual-machine, like the vSRX
|
147
|
+
|
148
|
+
# METHODS
|
149
|
+
|
150
|
+
- `read!` - reloads the facts from the target
|
151
|
+
- `facts[]` - retrieve a specific fact from the keeper
|
152
|
+
- `fact` - alternative method to retrieve a specific fact from the keeper
|
153
|
+
- `list`, `list!` - returns an Array of fact names (symbols)
|
154
|
+
- `catalog`, `catalog!` - returns a Hash of fact names and values
|
155
|
+
|
156
|
+
The bang (!) indicates that the method will re-read the value from the target, which the non-bang method uses the values cached in memory. If the cache does not exist, the framework will read the values. The use of the bang-methods are handy if/when you have facts whose values change at runtime, like the `ndev.fact(:RE)[:up_time]`
|
157
|
+
|
158
|
+
# CREATING CUSTOM FACTS
|
159
|
+
|
160
|
+
You can define your own facts using `Junos::Ez::Facts::Keeper.define`. You can review the stdlib facts by looking the *libs/../facts* subdirectory of this repo. Here is the code for the `:chassis` fact. What is interesting about this example, is this code will actually create multiple facts about the chassis. So there is not a required one-to-one relationship between createing a custom fact and the actual number of facts it creates, yo!
|
161
|
+
|
162
|
+
When you define your fact, you must give it a unique "fact name*, and a block. The block takee two arguments: the first is the netconf object, which will provide you access to the underlying Junos XML netconf, an a Hash that allows you to write your facts into the Keeper:
|
163
|
+
|
164
|
+
```ruby
|
165
|
+
Junos::Ez::Facts::Keeper.define( :chassis ) do |ndev, facts|
|
166
|
+
|
167
|
+
inv_info = ndev.rpc.get_chassis_inventory
|
168
|
+
chassis = inv_info.xpath('chassis')
|
169
|
+
|
170
|
+
facts[:hardwaremodel] = chassis.xpath('description').text
|
171
|
+
facts[:serialnumber] = chassis.xpath('serial-number').text
|
172
|
+
|
173
|
+
cfg = ndev.rpc.get_configuration{|xml|
|
174
|
+
xml.system {
|
175
|
+
xml.send(:'host-name')
|
176
|
+
xml.send(:'domain-name')
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
facts[:hostname] = cfg.xpath('//host-name').text
|
181
|
+
facts[:domain] = cfg.xpath('//domain-name').text
|
182
|
+
facts[:fqdn] = facts[:hostname]
|
183
|
+
facts[:fqdn] += ".#{facts[:domain]}" unless facts[:domain].empty?
|
184
|
+
|
185
|
+
end
|
186
|
+
```
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|