Class: Ironfan::Broker::Computer

Inherits:
Ironfan::Builder show all
Defined in:
lib/ironfan/headers.rb,
lib/ironfan/broker/computer.rb

Instance Method Summary collapse

Methods inherited from Ironfan::Builder

ui, #ui

Constructor Details

#initialize(*args) ⇒ Computer

Returns a new instance of Computer.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/ironfan/broker/computer.rb', line 21

def initialize(*args)
  super
  providers[:chef] ||=    Ironfan::Provider::ChefServer
  return unless server
  providers[:iaas]   = server.selected_cloud.provider
  volumes            = server.volumes.values
  puts server.selected_cloud
  region = server.selected_cloud.region


  # Turn snapshot names into snapshot ids corresponding to the server region
  volumes.each do |vol|
    vol.snapshot_id || vol.snapshot_id(lookup_snapshot_id(region, vol.snapshot_name))
  end

  volumes           += server.implied_volumes
  volumes.each{|vol| self.drive vol.name, :volume => vol }

rescue StandardError => err ; err.polish("#{self.class} on '#{args.inspect}'") rescue nil ; raise
end

Instance Method Details

#bogusObject

Accessors



184
185
186
# File 'lib/ironfan/broker/computer.rb', line 184

def bogus
  resources.values.map(&:bogus).flatten
end

#bogus?Boolean

Status flags

Returns:

  • (Boolean)


232
233
234
# File 'lib/ironfan/broker/computer.rb', line 232

def bogus?
  resources.values.any?(&:bogus?)
end

#bootstrap_distroObject



214
# File 'lib/ironfan/broker/computer.rb', line 214

def bootstrap_distro ; (server && server.selected_cloud) ? server.selected_cloud.bootstrap_distro : nil ; end

#chef_client_script_contentObject



144
145
146
147
148
149
150
# File 'lib/ironfan/broker/computer.rb', line 144

def chef_client_script_content
  cloud = server.selected_cloud
  return @chef_client_script_content if @chef_client_script_content
  return unless cloud.chef_client_script
  script_filename = File.expand_path("../../../config/#{cloud.chef_client_script}", File.dirname(File.realdirpath(__FILE__)))
  @chef_client_script_content = Ironfan.safely{ File.read(script_filename) }
end

#chef_providerObject



118
# File 'lib/ironfan/broker/computer.rb', line 118

def chef_provider ; providers[:chef] ; end

#chosen_providers(options = {}) ⇒ Object

Utility



124
125
126
127
128
129
# File 'lib/ironfan/broker/computer.rb', line 124

def chosen_providers(options={})
  case options[:providers]
  when :all,nil   then    [:chef,:iaas]
  else                    [ (options[:providers]) ]
  end
end

#chosen_resources(options = {}) ⇒ Object



131
132
133
134
135
# File 'lib/ironfan/broker/computer.rb', line 131

def chosen_resources(options={})
  chosen_providers(options).map do |name|
    providers[name].resources
  end.flatten
end

#clientObject

client



199
200
201
# File 'lib/ironfan/broker/computer.rb', line 199

def client
  self[:client]
end

#client?Boolean

Returns:

  • (Boolean)


235
236
237
# File 'lib/ironfan/broker/computer.rb', line 235

def client?
  not client.nil?
end

#correlateObject

Discovery



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ironfan/broker/computer.rb', line 51

def correlate
  Chef::Log.info chosen_resources
  chosen_resources.each do |res|
    res.expected_ids(self).each do |id|
      next unless res.recall? id

      recalled =  res.recall id
      recalled.users << self

      target  = res.resource_type.to_s
      target += "__#{id}" if res.multiple?
      self[target.to_sym] = recalled

      recalled.on_correlate(self)
    end
  end
end

#created?Boolean

Returns:

  • (Boolean)


238
239
240
# File 'lib/ironfan/broker/computer.rb', line 238

def created?
  machine? && machine.created?
end

#display_boolean(value) ⇒ Object



179
# File 'lib/ironfan/broker/computer.rb', line 179

def display_boolean(value)        value ? "yes" : "no";   end

#dns_nameObject



213
# File 'lib/ironfan/broker/computer.rb', line 213

def dns_name         ; machine? ? machine.dns_name : nil ; end

#ensure_dependenciesObject



137
138
139
140
141
142
# File 'lib/ironfan/broker/computer.rb', line 137

def ensure_dependencies
  chosen_resources.each do |res|
    # ensure_resource res unless res < Ironfan::IaasProvider::Machine
    res.create! self unless res < Ironfan::IaasProvider::Machine
  end
end

#environmentObject



194
# File 'lib/ironfan/broker/computer.rb', line 194

def environment ; server && server.environment ; end

#iaas_providerObject



119
# File 'lib/ironfan/broker/computer.rb', line 119

def iaas_provider ; providers[:iaas] ; end

#keypairObject



216
217
218
# File 'lib/ironfan/broker/computer.rb', line 216

def keypair
  resources[:keypair]
end

#kill(options = {}) ⇒ Object

Manipulation



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/ironfan/broker/computer.rb', line 77

def kill(options={})
  target_resources = chosen_resources(options)
  resources.each do |res|
    next unless target_resources.include? res.class
    descriptor = "#{res.class.resource_type} named #{res.name}"
    if res.shared?
      Chef::Log.debug("Not killing shared resource #{descriptor}")
    else
      Ironfan.step(self.name, "Killing #{descriptor}")
      res.destroy
    end
  end
end

#killable?Boolean

Returns:

  • (Boolean)


244
245
246
# File 'lib/ironfan/broker/computer.rb', line 244

def killable?
  (not bogus?) && (not permanent?) && (node? || client? || created?)
end

#launchObject



91
92
93
94
95
96
97
98
99
100
# File 'lib/ironfan/broker/computer.rb', line 91

def launch
  ensure_dependencies
  iaas_provider.machine_class.create! self
  node.announce_state :started
  server.to_machine_manifest.components.each do |component|
    component.announce_to(node)
  end
  save
  self
end

#launchable?Boolean

Returns:

  • (Boolean)


247
248
249
# File 'lib/ironfan/broker/computer.rb', line 247

def launchable?
  (not bogus?) && (not created?)
end

#lookup_snapshot_id(region, snapshot_name) ⇒ Object



16
17
18
19
# File 'lib/ironfan/broker/computer.rb', line 16

def lookup_snapshot_id(region, snapshot_name) 
  keys = [region.to_s, snapshot_name.to_s]
  return Chef::Config[:ec2_snapshot_info][ keys ][:snapshot_id] rescue nil
end

#machineObject

Machine



207
208
209
# File 'lib/ironfan/broker/computer.rb', line 207

def machine
  self[:machine]
end

#machine=(value) ⇒ Object



210
211
212
# File 'lib/ironfan/broker/computer.rb', line 210

def machine=(value)
  self[:machine] = value
end

#machine?Boolean

Returns:

  • (Boolean)


241
242
243
# File 'lib/ironfan/broker/computer.rb', line 241

def machine?
  not machine.nil?
end

#nameObject



42
43
44
45
46
# File 'lib/ironfan/broker/computer.rb', line 42

def name
  return server.full_name if server?
  return @name            if @name
  "unnamed:#{object_id}"
end

#nodeObject



187
188
189
# File 'lib/ironfan/broker/computer.rb', line 187

def node
  self[:node]
end

#node=(value) ⇒ Object



190
191
192
# File 'lib/ironfan/broker/computer.rb', line 190

def node=(value)
  self[:node]= value
end

#node?Boolean

Returns:

  • (Boolean)


250
251
252
# File 'lib/ironfan/broker/computer.rb', line 250

def node?
  not node.nil?
end

#permanent?Boolean

Returns:

  • (Boolean)


253
254
255
256
257
# File 'lib/ironfan/broker/computer.rb', line 253

def permanent?
  return false unless server?
  return false unless server.selected_cloud.respond_to? :permanent
  [true, :true, 'true'].include? server.selected_cloud.permanent
end

#private_keyObject



202
# File 'lib/ironfan/broker/computer.rb', line 202

def private_key ; client? ? client.private_key : nil ; end

#receive_providers(objs) ⇒ Object



274
275
276
277
278
279
280
# File 'lib/ironfan/broker/computer.rb', line 274

def receive_providers(objs)
  objs = objs.map do |obj|
    if obj.is_a?(String) then obj = Gorillib::Inflector.constantize(Gorillib::Inflector.camelize(obj.gsub(/\./, '/'))) ; end
    obj
  end
  super(objs)
end

#running?Boolean

Returns:

  • (Boolean)


258
259
260
# File 'lib/ironfan/broker/computer.rb', line 258

def running?
  machine? && machine.running?
end

#save(options = {}) ⇒ Object



114
115
116
# File 'lib/ironfan/broker/computer.rb', line 114

def save(options={})
  chosen_resources(options).each {|res| res.save! self}
end

#server?Boolean

Returns:

  • (Boolean)


261
262
263
# File 'lib/ironfan/broker/computer.rb', line 261

def server?
  not server.nil?
end

#ssh_identity_fileObject



222
223
224
225
226
227
# File 'lib/ironfan/broker/computer.rb', line 222

def ssh_identity_file
  if    keypair                         then keypair.key_filename
  elsif server && server.selected_cloud then server.selected_cloud.ssh_identity_file(self)
  else nil
  end
end

#ssh_userObject



220
# File 'lib/ironfan/broker/computer.rb', line 220

def ssh_user         ; (server && server.selected_cloud) ? server.selected_cloud.ssh_user : nil ; end

#sshable?Boolean

Returns true if machine is likely to be reachable by ssh.

Returns:

  • (Boolean)

    true if machine is likely to be reachable by ssh



269
270
271
272
# File 'lib/ironfan/broker/computer.rb', line 269

def sshable?
  # if there's any hope of success, give it a try.
  running? || node?
end

#startObject



107
108
109
110
111
112
# File 'lib/ironfan/broker/computer.rb', line 107

def start
  ensure_dependencies
  machine.start
  node.announce_state :started
  save
end

#stopObject



102
103
104
105
# File 'lib/ironfan/broker/computer.rb', line 102

def stop
  machine.stop
  node.announce_state :stopped
end

#stopped?Boolean

Returns:

  • (Boolean)


264
265
266
# File 'lib/ironfan/broker/computer.rb', line 264

def stopped?
  machine? && machine.stopped?
end

#to_display(style, values = {}) ⇒ Object

Display



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/ironfan/broker/computer.rb', line 155

def to_display(style,values={})
  unless [:minimal,:default,:expanded].include? style
    raise "Bad display style #{style}"
  end

  values["Name"] =        name
  # We expect these to be over-ridden by the contained classes
  values["Chef?"] =       "no"
  values["State"] =       "not running"

  [ server, node, machine ].compact.each do |part|
    part.to_display style, values
  end

  if style == :expanded
    values["Startable"]  = display_boolean(stopped?)
    values["Launchable"] = display_boolean(launchable?)
  end
  values["Bogus"] =       bogus.join(',')

  # Only show values that actually have something to show
  values.delete_if {|k,v| v.to_s.empty?}
  values
end

#to_sObject



282
283
284
# File 'lib/ironfan/broker/computer.rb', line 282

def to_s
  "<#{self.class}(server=#{server}, resources=#{resources && resources.inspect_compact}, providers=#{providers && providers.inspect_compact})>"
end

#validateObject



69
70
71
72
# File 'lib/ironfan/broker/computer.rb', line 69

def validate
  computer = self
  chosen_resources.each {|r| r.validate_computer! computer }
end