Class: RSpecSystem::NodeSet::Base Abstract
- Inherits:
-
Object
- Object
- RSpecSystem::NodeSet::Base
- Defined in:
- lib/rspec-system/node_set/base.rb
Overview
Subclass and override methods to create a new NodeSet variant.
Base class for a NodeSet driver. If you want to create a new driver, you should sub-class this and override all the methods below.
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#custom_prefabs_path ⇒ Object
readonly
Returns the value of attribute custom_prefabs_path.
-
#destroy ⇒ Object
readonly
Returns the value of attribute destroy.
-
#nodes ⇒ Object
readonly
Returns the value of attribute nodes.
-
#setname ⇒ Object
readonly
Returns the value of attribute setname.
Abstract Methods collapse
-
#initialize(setname, config, custom_prefabs_path, options) ⇒ Base
constructor
abstract
Create new NodeSet, populating necessary data structures.
-
#rcp(opts) ⇒ Boolean
abstract
Copy a file to the host in the NodeSet.
-
#run(opts) ⇒ Hash
abstract
Run a command on a host in the NodeSet.
-
#setup ⇒ void
abstract
Setup the NodeSet by starting all nodes.
-
#teardown ⇒ void
abstract
Shutdown the NodeSet by shutting down or pausing all nodes.
Common Methods collapse
-
#default_node ⇒ RSpecSystem::Node
Return default node.
-
#env_type ⇒ Object
Return environment type.
-
#randmac ⇒ String
Return a random mac address.
-
#random_string(length = 50) ⇒ String
Return a random string of chars, used for temp dir creation.
-
#ssh_exec!(ssh, command) ⇒ Hash
Execute command via SSH.
-
#tmppath ⇒ String
Generates a random string for use in remote transfers.
Constructor Details
#initialize(setname, config, custom_prefabs_path, options) ⇒ Base
override for providing global storage and setup-level code
Create new NodeSet, populating necessary data structures.
18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/rspec-system/node_set/base.rb', line 18 def initialize(setname, config, custom_prefabs_path, ) @setname = setname @config = config @custom_prefabs_path = custom_prefabs_path @destroy = [:destroy] @nodes = {} config['nodes'].each do |k,v| @nodes[k] = RSpecSystem::Node.node_from_yaml(self, k, v, custom_prefabs_path) end end |
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
7 8 9 |
# File 'lib/rspec-system/node_set/base.rb', line 7 def config @config end |
#custom_prefabs_path ⇒ Object (readonly)
Returns the value of attribute custom_prefabs_path.
9 10 11 |
# File 'lib/rspec-system/node_set/base.rb', line 9 def custom_prefabs_path @custom_prefabs_path end |
#destroy ⇒ Object (readonly)
Returns the value of attribute destroy.
11 12 13 |
# File 'lib/rspec-system/node_set/base.rb', line 11 def destroy @destroy end |
#nodes ⇒ Object (readonly)
Returns the value of attribute nodes.
10 11 12 |
# File 'lib/rspec-system/node_set/base.rb', line 10 def nodes @nodes end |
#setname ⇒ Object (readonly)
Returns the value of attribute setname.
8 9 10 |
# File 'lib/rspec-system/node_set/base.rb', line 8 def setname @setname end |
Instance Method Details
#default_node ⇒ RSpecSystem::Node
Return default node
77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/rspec-system/node_set/base.rb', line 77 def default_node dn = config['default_node'] if dn.nil? if nodes.length == 1 dn = nodes.first[1] return dn else raise "No default node" end else return nodes[dn] end end |
#env_type ⇒ Object
Return environment type
70 71 72 |
# File 'lib/rspec-system/node_set/base.rb', line 70 def env_type self.class::ENV_TYPE end |
#randmac ⇒ String
Return a random mac address
161 162 163 |
# File 'lib/rspec-system/node_set/base.rb', line 161 def randmac "080027" + (1..3).map{"%0.2X"%rand(256)}.join end |
#random_string(length = 50) ⇒ String
Return a random string of chars, used for temp dir creation
94 95 96 97 |
# File 'lib/rspec-system/node_set/base.rb', line 94 def random_string(length = 50) o = [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten (0...length).map{ o[rand(o.length)] }.join end |
#rcp(opts) ⇒ Boolean
Override this method providing your own file transfer code
Copy a file to the host in the NodeSet.
63 64 65 |
# File 'lib/rspec-system/node_set/base.rb', line 63 def rcp(opts) raise "Unimplemented method #rcp" end |
#run(opts) ⇒ Hash
Override this method providing your own shell running code
Run a command on a host in the NodeSet.
51 52 53 |
# File 'lib/rspec-system/node_set/base.rb', line 51 def run(opts) raise "Unimplemented method #run" end |
#setup ⇒ void
Override this method and provide your own node launching code
This method returns an undefined value.
Setup the NodeSet by starting all nodes.
34 35 36 |
# File 'lib/rspec-system/node_set/base.rb', line 34 def setup raise "Unimplemented method #setup" end |
#ssh_exec!(ssh, command) ⇒ Hash
Execute command via SSH.
A special version of exec! from Net::SSH that returns exit code and exit signal as well. This method is blocking.
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/rspec-system/node_set/base.rb', line 116 def ssh_exec!(ssh, command) r = { :stdout => '', :stderr => '', :exit_code => nil, :exit_signal => nil, } ssh.open_channel do |channel| channel.exec(command) do |ch, success| unless success abort "FAILED: couldn't execute command (ssh.channel.exec)" end channel.on_data do |ch,data| d = data output << d r[:stdout]+=d end channel.on_extended_data do |ch,type,data| d = data output << d r[:stderr]+=d end channel.on_request("exit-status") do |ch,data| c = data.read_long output << bold("Exit code:") << " #{c}\n" r[:exit_code] = c end channel.on_request("exit-signal") do |ch, data| s = data.read_string output << bold("Exit signal:") << " #{s}\n" r[:exit_signal] = s end end end ssh.loop r end |
#teardown ⇒ void
Override this method and provide your own node teardown code
This method returns an undefined value.
Shutdown the NodeSet by shutting down or pausing all nodes.
42 43 44 |
# File 'lib/rspec-system/node_set/base.rb', line 42 def teardown raise "Unimplemented method #teardown" end |
#tmppath ⇒ String
Very Linux dependant, probably need to consider OS X and Windows at least.
Generates a random string for use in remote transfers.
104 105 106 |
# File 'lib/rspec-system/node_set/base.rb', line 104 def tmppath '/tmp/' + random_string end |