junos-ez-stdlib 0.0.17 → 0.1.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.
data/CHANGELOG.md CHANGED
@@ -21,6 +21,8 @@
21
21
 
22
22
  Completed initial documentation. Still more work to be done with these files
23
23
  but the "enough to get started" information is now available
24
+
25
+ # 2013-May
24
26
 
25
27
  0.0.15: 2013-05-02
26
28
 
@@ -37,4 +39,8 @@
37
39
  RE::Utils - added support for license-key management. Renamed "software" methods from "xxx_software"
38
40
  to "software_xxx" to be consistent with other naming usage. Updated docs.
39
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
+
40
46
 
data/docs/Facts.md CHANGED
@@ -1,4 +1,4 @@
1
- # Fact Keeping
1
+ # FACT KEEPING
2
2
 
3
3
  This framework is *fact based*, meaning that the provider libraries will have access to information about each
4
4
  target. Facts enable the framework to abstract the physical differences of the underlying hardware.
@@ -9,12 +9,11 @@ There are collection of standard facts that are always read by the framework. Y
9
9
 
10
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
11
 
12
- # Usage
12
+ # USAGE
13
13
 
14
14
  Usage rule: you **MUST** call `Junos::Ez::Provider` on your netconf object:
15
15
 
16
16
  - **AFTER** the object has connected to the target, since it will read facts
17
-
18
17
  - **BEFORE** you add any other providers, since these may use the facts
19
18
 
20
19
  Here is a basic example:
@@ -59,17 +58,104 @@ pp ndev.facts.catalog
59
58
  :version=>"12.1X44-D10.4"}
60
59
  ```
61
60
 
62
- # Methods
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
63
149
 
64
150
  - `read!` - reloads the facts from the target
65
- - `[]` - retrieve a specific fact from the keeper
151
+ - `facts[]` - retrieve a specific fact from the keeper
66
152
  - `fact` - alternative method to retrieve a specific fact from the keeper
67
153
  - `list`, `list!` - returns an Array of fact names (symbols)
68
154
  - `catalog`, `catalog!` - returns a Hash of fact names and values
69
155
 
70
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]`
71
157
 
72
- # Definig Custom Facts
158
+ # CREATING CUSTOM FACTS
73
159
 
74
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!
75
161
 
@@ -314,7 +314,7 @@ port.write!
314
314
 
315
315
  ### Interating Resources
316
316
 
317
- You can use the `each` method to interate through each managed resource. For example:
317
+ You can use the `each` method to iterate through each managed resource, as provided by the `list` provider instance variable. For example:
318
318
 
319
319
  ```ruby
320
320
  ndev.l1_ports.each do |port|
@@ -324,3 +324,30 @@ ndev.l1_ports.each do |port|
324
324
  end
325
325
  end
326
326
  ```
327
+
328
+ You can use the `with` method to iterate through a given list of managed resources. For example:
329
+
330
+ ```ruby
331
+ # dump the status for just these two IP ports ...
332
+
333
+ ip_list = ["ge-0/0/1.719","ge-0/0/1.335"]
334
+
335
+ ndev.ip_ports.with(ip_list) do |ip|
336
+ pp ip.name
337
+ pp ip.status
338
+ end
339
+
340
+ ->
341
+ "ge-0/0/1.719"
342
+ {:l1_oper_status=>:up,
343
+ :oper_status=>:down,
344
+ :snmp_index=>616,
345
+ :packets_rx=>0,
346
+ :packets_tx=>0}
347
+ "ge-0/0/1.335"
348
+ {:l1_oper_status=>:up,
349
+ :oper_status=>:up,
350
+ :snmp_index=>613,
351
+ :packets_rx=>0,
352
+ :packets_tx=>0}
353
+ ```
data/docs/Utils/SCP.md ADDED
@@ -0,0 +1,24 @@
1
+ # `Net::SCP`
2
+
3
+ The NETCONF object already provides a mechanism to use secure-copy (SCP), so technically this is _not_ part of the `Junos::EZ` framework. That being said, this is some quick documentation and URLs so you can copy files to and from Junos devices.
4
+
5
+ # DOCS
6
+
7
+ For documentation on `Net::SCP`, please refer to this website: http://net-ssh.github.io/scp/v1/api/index.html
8
+
9
+ # USAGE
10
+
11
+ The NETCONF object includes an instance variable `scp` that is class `Net::SCP`.
12
+
13
+ To copy a file from the server to the Junos target, you use the `upload` or `upload!` method. The bang(!) version is blocking, meaning the code execution will resume only after the file has been completely transfered.
14
+
15
+ ```ruby
16
+ file_on_server = "/cygwin/junos/junos-ex4200-image.tgz"
17
+ location_on_junos = "/var/tmp"
18
+
19
+ ndev.scp.upload!( from_on_server, location_on_junos )
20
+ ```
21
+
22
+ To copy a file from the Junos target to the server, you use the `download` or `download!` method.
23
+
24
+ Both upload and download methods can take a Ruby block which is used to provide progress updates on the transfer. There is a complete "software upgrade" example that illustrates this technique in the _examples_ directory.
@@ -23,7 +23,7 @@ puts "OK!"
23
23
  ## attach our private & utils that we need ...
24
24
 
25
25
  Junos::Ez::Provider( ndev )
26
- Junos::Ez::RE::Utils( ndev, :re ) # routine-engine utils
26
+ Junos::Ez::RE::Utils( ndev, :re ) # routing-engine utils
27
27
  Junos::Ez::FS::Utils( ndev, :fs ) # filesystem utils
28
28
 
29
29
  ## upload the software image to the target device
@@ -1,3 +1,3 @@
1
1
  module Junos::Ez
2
- class NoProvider < StandardError; end
2
+ class NoProviderError < StandardError; end
3
3
  end
@@ -1,8 +1,11 @@
1
1
  Junos::Ez::Facts::Keeper.define( :personality ) do |ndev, facts|
2
2
 
3
3
  model = uses :hardwaremodel
4
+ uses :routingengines
5
+
6
+ examine = ( model != "Virtual Chassis" ) ? model : facts[:RE0][:model]
4
7
 
5
- facts[:personality] = case model
8
+ facts[:personality] = case examine
6
9
  when /^(EX)|(QFX)/
7
10
  :SWITCH
8
11
  when /^MX/
@@ -14,7 +14,7 @@ require 'junos-ez/exceptions.rb'
14
14
 
15
15
  module Junos::Ez
16
16
 
17
- VERSION = "0.0.17"
17
+ VERSION = "0.1.0"
18
18
 
19
19
  ### ---------------------------------------------------------------
20
20
  ### rpc_errors - decodes the XML into an array of error/Hash
@@ -361,16 +361,26 @@ class Junos::Ez::Provider::Parent
361
361
  end
362
362
 
363
363
  ### ---------------------------------------------------------------
364
- ### Provider each method - this will go and create a managed
365
- ### object for each item in the list. This could get CPU
366
- ### intensive depending on the number of items under provider
367
- ### management, yo!
364
+ ### Provider `each` - iterate through each managed resource
365
+ ### as obtained from the `list` instance variable. select the
366
+ ### object and pass it to the provided block
368
367
  ### ---------------------------------------------------------------
369
368
 
370
369
  def each( &block )
371
370
  raise ArgumentError, "not a provider" unless is_provider?
372
371
  list.each{ |name| yield select(name ) }
373
372
  end
373
+
374
+ ### ---------------------------------------------------------------
375
+ ### Provider `with` - iterate through each managed resource
376
+ ### as obtained from the `given_list` instance variable.
377
+ ### select the object and pass it to the provided block
378
+ ### ---------------------------------------------------------------
379
+
380
+ def with( given_list, &block )
381
+ raise ArgumentError, "not a provider" unless is_provider?
382
+ given_list.each{ |name| yield select( name ) }
383
+ end
374
384
 
375
385
  ### ---------------------------------------------------------------
376
386
  ### Provider reader methods
@@ -16,7 +16,7 @@ module Junos::Ez::Vlans
16
16
  when :BRIDGE_DOMAIN
17
17
  Junos::Ez::Vlans::Provider::BRIDGE_DOMAIN.new( ndev )
18
18
  else
19
- raise Junos::Ez::NoProvider, "target does not support vlan bridges"
19
+ raise Junos::Ez::NoProviderError, "target does not support vlan bridges"
20
20
  end
21
21
  newbie.properties = Junos::Ez::Provider::PROPERTIES + PROPERTIES
22
22
  Junos::Ez::Provider.attach_instance_variable( ndev, varsym, newbie )
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: junos-ez-stdlib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-05 00:00:00.000000000 Z
12
+ date: 2013-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: netconf
@@ -92,6 +92,7 @@ files:
92
92
  - docs/Utils/Config.md
93
93
  - docs/Utils/Filesystem.md
94
94
  - docs/Utils/Routing-Engine.md
95
+ - docs/Utils/SCP.md
95
96
  homepage: https://github.com/jeremyschulman/ruby-junos-ez-stdlib
96
97
  licenses: []
97
98
  post_install_message: