shopify-junos-ez-stdlib 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|