Class: Spiceweasel::Nodes

Inherits:
Object
  • Object
show all
Includes:
CommandHelper
Defined in:
lib/spiceweasel/nodes.rb

Constant Summary collapse

PROVIDERS =
%w{bluebox clodo cs ec2 gandi hp joyent lxc openstack rackspace slicehost terremark vagrant voxel vsphere}

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CommandHelper

#create_command, #delete_command

Constructor Details

#initialize(nodes, cookbooks, environments, roles) ⇒ Nodes

Returns a new instance of Nodes.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/spiceweasel/nodes.rb', line 28

def initialize(nodes, cookbooks, environments, roles)
  @create = Array.new
  @delete = Array.new
  if nodes
    Spiceweasel::Log.debug("nodes: #{nodes}")
    nodes.each do |node|
      name = node.keys.first
      Spiceweasel::Log.debug("node: '#{name}' '#{node[name]}'")
      if node[name]
        #convert spaces to commas, drop multiple commas
        run_list = node[name]['run_list'] || ''
        run_list = run_list.gsub(/ /,',').gsub(/,+/,',')
        Spiceweasel::Log.debug("node: '#{name}' run_list: '#{run_list}'")
        validateRunList(name, run_list, cookbooks, roles) unless Spiceweasel::Config[:novalidation]
        options = node[name]['options'] || ''
        Spiceweasel::Log.debug("node: '#{name}' options: '#{options}'")
        validateOptions(name, options, environments) unless Spiceweasel::Config[:novalidation]
        create_command_options = {}
        %w(allow_create_failure timeout).each do |key|
          if(node[name].has_key?(key))
            create_command_options[key] = node[name][key]
          end
        end
        additional_commands = node[name]['additional_commands'] || []
      end
      #provider support
      provider = name.split()
      if PROVIDERS.member?(provider[0])
        count = 1
        if provider.length == 2
          count = provider[1]
        end
        provided_names = []
        if Spiceweasel::Config[:parallel]
          parallel = "seq #{count} | parallel -j 0 -v \""
          if provider[0].eql?('vsphere')
            parallel += "knife #{provider[0]}#{Spiceweasel::Config[:knife_options]} vm clone #{options}".gsub(/\{\{n\}\}/, '{}')
          else
            parallel += "knife #{provider[0]}#{Spiceweasel::Config[:knife_options]} server create #{options}".gsub(/\{\{n\}\}/, '{}')
          end
          parallel += " -r '#{run_list}'" unless run_list.empty?
          parallel += "\""
          create_command(parallel, create_command_options)
        else
          count.to_i.times do |i|
            if provider[0].eql?('vsphere')
              server = "knife #{provider[0]}#{Spiceweasel::Config[:knife_options]} vm clone #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
            else
              server = "knife #{provider[0]}#{Spiceweasel::Config[:knife_options]} server create #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
            end
            server += " -r '#{run_list}'" unless run_list.empty?
            provided_names << node[name]['name'].gsub('{{n}}', (i + 1).to_s) if node[name]['name']
            create_command(server, create_command_options)
          end
        end
        if Spiceweasel::Config[:bulkdelete] && provided_names.empty? && provider[0] != 'windows'
          if provider[0].eql?('vsphere')
            delete_command("knife node#{Spiceweasel::Config[:knife_options]} list | xargs knife #{provider[0]} vm delete -y")
          else
            delete_command("knife node#{Spiceweasel::Config[:knife_options]} list | xargs knife #{provider[0]} server delete -y")
          end
        else
          provided_names.each do |p_name|
            if provider[0].eql?('vsphere')
              delete_command("knife #{provider[0]} vm delete -y #{p_name}")
            else
              delete_command("knife #{provider[0]} server delete -y #{p_name}")
            end
            delete_command("knife node#{Spiceweasel::Config[:knife_options]} delete #{p_name} -y")
            delete_command("knife client#{Spiceweasel::Config[:knife_options]} delete #{p_name} -y")
          end
        end
      elsif name.start_with?("windows") #windows node bootstrap support
        nodeline = name.split()
        provider = nodeline.shift.split('_') #split on 'windows_ssh' etc
        nodeline.each do |server|
          servercommand = "knife bootstrap #{provider[0]} #{provider[1]}#{Spiceweasel::Config[:knife_options]} #{server} #{options}"
          servercommand += " -r '#{run_list}'" unless run_list.empty?
          create_command(servercommand, create_command_options)
          delete_command("knife node#{Spiceweasel::Config[:knife_options]} delete #{server} -y")
          delete_command("knife client#{Spiceweasel::Config[:knife_options]} delete #{server} -y")
        end
      else #node bootstrap support
        name.split.each_with_index do |server, i|
          servercommand = "knife bootstrap#{Spiceweasel::Config[:knife_options]} #{server} #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
          servercommand += " -r '#{run_list}'" unless run_list.empty?
          create_command(servercommand, create_command_options)
          delete_command("knife node#{Spiceweasel::Config[:knife_options]} delete #{server} -y")
          delete_command("knife client#{Spiceweasel::Config[:knife_options]} delete #{server} -y")
        end
      end
      unless additional_commands.empty?
        additional_commands.each do |cmd|
          create_command(cmd, create_command_options)
        end
      end
    end
  end
  if Spiceweasel::Config[:bulkdelete]
    delete_command("knife node#{Spiceweasel::Config[:knife_options]} bulk delete .* -y")
  end
end

Instance Attribute Details

#createObject (readonly)

Returns the value of attribute create.



26
27
28
# File 'lib/spiceweasel/nodes.rb', line 26

def create
  @create
end

#deleteObject (readonly)

Returns the value of attribute delete.



26
27
28
# File 'lib/spiceweasel/nodes.rb', line 26

def delete
  @delete
end

Instance Method Details

#validateOptions(node, options, environments) ⇒ Object

for now, just check that -E is legit



156
157
158
159
160
161
162
163
164
# File 'lib/spiceweasel/nodes.rb', line 156

def validateOptions(node, options, environments)
  if options =~ /-E/ #check for environments
    env = options.split('-E')[1].split()[0]
    unless environments.member?(env)
      STDERR.puts "ERROR: '#{node}' environment '#{env}' is missing from the list of environments in the manifest."
      exit(-1)
    end
  end
end

#validateRunList(node, run_list, cookbooks, roles) ⇒ Object

ensure run_list contents are listed previously.



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/spiceweasel/nodes.rb', line 132

def validateRunList(node, run_list, cookbooks, roles)
  run_list.split(',').each do |item|
    if item.start_with?("recipe[")
      #recipe[foo] or recipe[foo::bar]
      cb = item.split(/\[|\]/)[1].split(':')[0]
      unless cookbooks.member?(cb)
        STDERR.puts "ERROR: '#{node}' run list cookbook '#{cb}' is missing from the list of cookbooks in the manifest."
        exit(-1)
      end
    elsif item.start_with?("role[")
      #role[blah]
      role = item.split(/\[|\]/)[1]
      unless roles.member?(role)
        STDERR.puts "ERROR: '#{node}' run list role '#{role}' is missing from the list of roles in the manifest."
        exit(-1)
      end
    else
      STDERR.puts "ERROR: '#{node}' run list '#{item}' is an invalid run list entry in the manifest."
      exit(-1)
    end
  end
end