Class: Cosmos::MicroserviceOperator

Inherits:
Operator show all
Defined in:
lib/cosmos/operators/microservice_operator.rb

Overview

Creates new OperatorProcess objects based on querying the Redis key value store. Any keys under ‘cosmos_microservices’ will be created into microservices.

Constant Summary

Constants inherited from Operator

Operator::CYCLE_TIME

Instance Attribute Summary

Attributes inherited from Operator

#cycle_time, #processes

Instance Method Summary collapse

Methods inherited from Operator

instance, processes, #remove_old, #respawn_changed, #respawn_dead, #run, run, #shutdown_processes, #start_new, #stop

Constructor Details

#initializeMicroserviceOperator

Returns a new instance of MicroserviceOperator.



30
31
32
33
34
35
36
37
38
39
# File 'lib/cosmos/operators/microservice_operator.rb', line 30

def initialize
  Logger.microservice_name = "MicroserviceOperator"
  super

  @microservices = {}
  @previous_microservices = {}
  @new_microservices = {}
  @changed_microservices = {}
  @removed_microservices = {}
end

Instance Method Details

#convert_microservice_to_process_definition(microservice_name, microservice_config) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/cosmos/operators/microservice_operator.rb', line 41

def convert_microservice_to_process_definition(microservice_name, microservice_config)
  process_definition = ["ruby", "plugin_microservice.rb", microservice_name]
  work_dir = "/cosmos/lib/cosmos/microservices"
  env = microservice_config["env"].dup
  if microservice_config["needs_dependencies"]
    env['GEM_HOME'] = '/gems'
  else
    env['GEM_HOME'] = nil
  end
  container = microservice_config["container"]
  scope = microservice_name.split("__")[0]
  return process_definition, work_dir, env, scope, container
end

#updateObject



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
# File 'lib/cosmos/operators/microservice_operator.rb', line 55

def update
  @previous_microservices = @microservices.dup
  # Get all the microservice configuration
  @microservices = MicroserviceModel.all

  # Detect new and changed microservices
  @new_microservices = {}
  @changed_microservices = {}
  @microservices.each do |microservice_name, microservice_config|
    if @previous_microservices[microservice_name]
      if @previous_microservices[microservice_name] != microservice_config
        scope = microservice_name.split("__")[0]
        Logger.info("Changed microservice detected: #{microservice_name}\nWas: #{@previous_microservices[microservice_name]}\nIs: #{microservice_config}", scope: scope)
        @changed_microservices[microservice_name] = microservice_config
      end
    else
      scope = microservice_name.split("__")[0]
      Logger.info("New microservice detected: #{microservice_name}", scope: scope)
      @new_microservices[microservice_name] = microservice_config
    end
  end

  # Detect removed microservices
  @removed_microservices = {}
  @previous_microservices.each do |microservice_name, microservice_config|
    unless @microservices[microservice_name]
      scope = microservice_name.split("__")[0]
      Logger.info("Removed microservice detected: #{microservice_name}", scope: scope)
      @removed_microservices[microservice_name] = microservice_config
    end
  end

  # Convert to processes
  @mutex.synchronize do
    @new_microservices.each do |microservice_name, microservice_config|
      cmd_array, work_dir, env, scope, container = convert_microservice_to_process_definition(microservice_name, microservice_config)
      if cmd_array
        process = OperatorProcess.new(cmd_array, work_dir: work_dir, env: env, scope: scope, container: container)
        @new_processes[microservice_name] = process
        @processes[microservice_name] = process
      end
    end

    @changed_microservices.each do |microservice_name, microservice_config|
      cmd_array, work_dir, env, scope, container = convert_microservice_to_process_definition(microservice_name, microservice_config)
      if cmd_array
        process = @processes[microservice_name]
        if process
          process.process_definition = cmd_array
          process.work_dir = work_dir
          process.new_temp_dir = nil
          process.env = env
          @changed_processes[microservice_name] = process
        else # TODO: How is this even possible?
          Logger.error("Changed microservice #{microservice_name} does not exist. Creating new...", scope: scope)
          process = OperatorProcess.new(cmd_array, work_dir: work_dir, env: env, scope: scope, container: container)
          @new_processes[microservice_name] = process
          @processes[microservice_name] = process
        end
      end
    end

    @removed_microservices.each do |microservice_name, microservice_config|
      process = @processes[microservice_name]
      @processes.delete(microservice_name)
      @removed_processes[microservice_name] = process
    end
  end
end