Class: RSpecSystem::NodeSet::Base Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec-system/node_set/base.rb

Overview

This class is abstract.

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.

Direct Known Subclasses

Vagrant, Vsphere

Instance Attribute Summary collapse

Abstract Methods collapse

Common Methods collapse

Constructor Details

#initialize(setname, config, custom_prefabs_path, options) ⇒ Base

This method is abstract.

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, options)
  @setname = setname
  @config = config
  @custom_prefabs_path = custom_prefabs_path
  @destroy = options[: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

#configObject (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_pathObject (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

#destroyObject (readonly)

Returns the value of attribute destroy.



11
12
13
# File 'lib/rspec-system/node_set/base.rb', line 11

def destroy
  @destroy
end

#nodesObject (readonly)

Returns the value of attribute nodes.



10
11
12
# File 'lib/rspec-system/node_set/base.rb', line 10

def nodes
  @nodes
end

#setnameObject (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_nodeRSpecSystem::Node

Return default node

Returns:



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_typeObject

Return environment type



70
71
72
# File 'lib/rspec-system/node_set/base.rb', line 70

def env_type
  self.class::ENV_TYPE
end

#randmacString

Return a random mac address

Returns:

  • (String)

    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

Returns:

  • (String)

    string of 50 random characters A-Z and a-z



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

This method is abstract.

Override this method providing your own file transfer code

Copy a file to the host in the NodeSet.

Parameters:

  • opts (Hash)

    options

Options Hash (opts):

  • :d (RSpecHelper::Node)

    destination node

  • :sp (String)

    source path

  • :dp (String)

    destination path

Returns:

  • (Boolean)

    returns true if command succeeded, false otherwise



63
64
65
# File 'lib/rspec-system/node_set/base.rb', line 63

def rcp(opts)
  raise "Unimplemented method #rcp"
end

#run(opts) ⇒ Hash

This method is abstract.

Override this method providing your own shell running code

Run a command on a host in the NodeSet.

Parameters:

  • opts (Hash)

    options hash containing :n (node) and :c (command)

Returns:

  • (Hash)

    a hash containing :stderr, :stdout and :exit_code



51
52
53
# File 'lib/rspec-system/node_set/base.rb', line 51

def run(opts)
  raise "Unimplemented method #run"
end

#setupvoid

This method is abstract.

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.

Parameters:

  • ssh (Net::SSH::Connection::Session)

    an active ssh session

  • command (String)

    command to execute

Returns:

  • (Hash)

    a hash of results



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

#teardownvoid

This method is abstract.

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

#tmppathString

TODO:

Very Linux dependant, probably need to consider OS X and Windows at least.

Generates a random string for use in remote transfers.

Returns:

  • (String)

    a random path



104
105
106
# File 'lib/rspec-system/node_set/base.rb', line 104

def tmppath
  '/tmp/' + random_string
end