Class: Bosh::Agent::Message::Apply

Inherits:
Base show all
Defined in:
lib/bosh_agent/message/apply.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#base_dir, #handler_error, #logger, #logs_dir, #settings, #store_migration_target, #store_path

Constructor Details

#initialize(args) ⇒ Apply

Returns a new instance of Apply.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
# File 'lib/bosh_agent/message/apply.rb', line 11

def initialize(args)
  @platform = Bosh::Agent::Config.platform

  if args.size < 1
    raise ArgumentError, "not enough arguments"
  end

  @new_spec = args.first
  unless @new_spec.is_a?(Hash)
    raise ArgumentError, "invalid spec, Hash expected, " +
                         "#{@new_spec.class} given"
  end

  # Note: new spec needs to be updated before a plan is
  # created which binds to this new spec
  #
  # Collect network state from the infrastructure
  # - Loop through each network
  # - Get network settings for each network
  if @new_spec["networks"]
    @new_spec["networks"].each do |network, properties|
      infrastructure = Bosh::Agent::Config.infrastructure
      network_settings =
          infrastructure.get_network_settings(network, properties)
      logger.debug("current network settings from VM: #{network_settings.inspect}")
      logger.debug("new network settings to be applied: #{properties.inspect}")
      if network_settings
        @new_spec["networks"][network].merge!(network_settings)
        logger.debug("merged network settings: #{@new_spec["networks"].inspect}")
      end
    end
  end

  @old_spec = Bosh::Agent::Config.state.to_hash

  @old_plan = Bosh::Agent::ApplyPlan::Plan.new(@old_spec)
  @new_plan = Bosh::Agent::ApplyPlan::Plan.new(@new_spec)

  %w(bosh jobs packages monit).each do |dir|
    FileUtils.mkdir_p(File.join(base_dir, dir))
  end
end

Class Method Details

.long_running?Boolean

Returns:

  • (Boolean)


5
# File 'lib/bosh_agent/message/apply.rb', line 5

def self.long_running?; true end

.process(args) ⇒ Object



7
8
9
# File 'lib/bosh_agent/message/apply.rb', line 7

def self.process(args)
  self.new(args).apply
end

Instance Method Details

#applyObject



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
# File 'lib/bosh_agent/message/apply.rb', line 54

def apply
  logger.info("Applying: #{@new_spec.inspect}")

  if !@old_plan.deployment.empty? &&
      @old_plan.deployment != @new_plan.deployment
    raise Bosh::Agent::MessageHandlerError,
          "attempt to apply #{@new_plan.deployment} " +
          "to #{old_plan.deployment}"
  end

  # FIXME: tests
  # if @state["configuration_hash"] == @new_spec["configuration_hash"]
  #   return @state
  # end

  if @new_plan.configured?
    begin
      delete_job_monit_files
      apply_job
      apply_packages
      configure_job
      reload_monit
      @platform.update_logging(@new_spec)
    rescue Exception => e
      raise Bosh::Agent::MessageHandlerError,
            "#{e.message}: #{e.backtrace}"
    end
  end

  # FIXME: assumption right now: if apply succeeds state should be
  # identical with apply spec
  Bosh::Agent::Config.state.write(@new_spec)
  @new_spec

rescue Bosh::Agent::StateError => e
  raise Bosh::Agent::MessageHandlerError, e
end