Class: HybridPlatformsConductor::PlatformsHandler

Inherits:
Object
  • Object
show all
Includes:
LoggerHelpers
Defined in:
lib/hybrid_platforms_conductor/platforms_handler.rb

Overview

Provide an API to access information given by Platform Handlers

Defined Under Namespace

Modules: ConfigDSLExtension

Constant Summary

Constants included from LoggerHelpers

LoggerHelpers::LEVELS_MODIFIERS, LoggerHelpers::LEVELS_TO_STDERR

Instance Method Summary collapse

Methods included from LoggerHelpers

#err, #init_loggers, #log_component=, #log_debug?, #log_level=, #out, #section, #set_loggers_format, #stderr_device, #stderr_device=, #stderr_displayed?, #stdout_device, #stdout_device=, #stdout_displayed?, #stdouts_to_s, #with_progress_bar

Constructor Details

#initialize(logger: Logger.new(STDOUT), logger_stderr: Logger.new(STDERR), config: Config.new, cmd_runner: CmdRunner.new) ⇒ PlatformsHandler

Constructor

Parameters
  • logger (Logger): Logger to be used [default: Logger.new(STDOUT)]

  • logger_stderr (Logger): Logger to be used for stderr [default: Logger.new(STDERR)]

  • config (Config): Config to be used. [default: Config.new]

  • cmd_runner (CmdRunner): Command executor to be used. [default: CmdRunner.new]



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
# File 'lib/hybrid_platforms_conductor/platforms_handler.rb', line 34

def initialize(
  logger: Logger.new(STDOUT),
  logger_stderr: Logger.new(STDERR),
  config: Config.new,
  cmd_runner: CmdRunner.new
)
  init_loggers(logger, logger_stderr)
  @config = config
  @cmd_runner = cmd_runner
  @platform_types = Plugins.new(:platform_handler, logger: @logger, logger_stderr: @logger_stderr)
  # Keep a list of instantiated platform handlers per platform type
  # Hash<Symbol, Array<PlatformHandler> >
  @platform_handlers = {}
  # Read all platforms from the config
  @config.platform_dirs.each do |platform_type, repositories|
    repositories.each do |repository_path|
      platform_handler = @platform_types[platform_type].new(
        platform_type,
        repository_path,
        logger: @logger,
        logger_stderr: @logger_stderr,
        config: @config,
        cmd_runner: @cmd_runner
      )
      # Check that this platform has unique name
      raise "Platform name #{platform_handler.name} is declared several times." if @platform_handlers.values.flatten.any? { |known_platform| known_platform.name == platform_handler.name }
      @platform_handlers[platform_type] = [] unless @platform_handlers.key?(platform_type)
      @platform_handlers[platform_type] << platform_handler
    end
  end
end

Instance Method Details

#inject_dependencies(nodes_handler: NodesHandler.new, actions_executor: ActionsExecutor.new) ⇒ Object

Inject dependencies that can’t be set at initialization time. This is due to the fact that a PlatformHandler is a single plugin handling both inventory and services from a single repository. If we split those plugins into an inventory-type plugin and service-type plugin, each part could be initialized without having cyclic dependencies. The inventory-type part does not need NodesHandler nor ActionsExecutor (as it would be used by NodesHandler). The service-type part would use NodesHandler and ActionsExecutor given to its initializer. TODO: Split this plugin type in 2 to avoid this late dependency injection.

Parameters
  • nodes_handler (NodesHandler): Nodes handler to be used. [default: NodesHandler.new]

  • actions_executor (ActionsExecutor): Actions Executor to be used. [default: ActionsExecutor.new]



104
105
106
107
108
109
110
111
112
113
114
# File 'lib/hybrid_platforms_conductor/platforms_handler.rb', line 104

def inject_dependencies(
  nodes_handler: NodesHandler.new,
  actions_executor: ActionsExecutor.new
)
  @nodes_handler = nodes_handler
  @actions_executor = actions_executor
  @platform_handlers.values.flatten.each do |platform|
    platform.nodes_handler = @nodes_handler
    platform.actions_executor = @actions_executor
  end
end

#known_platforms(platform_type: nil) ⇒ Object

Get the list of known platforms

Parameters
  • platform_type (Symbol or nil): Filter only platforms of a given platform type, or nil for all platforms [default: nil]

Result
  • Array<PlatformHandler>: List of platform handlers



80
81
82
# File 'lib/hybrid_platforms_conductor/platforms_handler.rb', line 80

def known_platforms(platform_type: nil)
  (platform_type.nil? ? @platform_handlers.keys : [platform_type]).map { |platform_type| (@platform_handlers[platform_type] || []) }.flatten
end

#platform(platform_name) ⇒ Object

Return the platform handler for a given platform name

Parameters
  • platform_name (String): The platform name

Result
  • PlatformHandler or nil: Corresponding platform handler, or nil if none



90
91
92
# File 'lib/hybrid_platforms_conductor/platforms_handler.rb', line 90

def platform(platform_name)
  @platform_handlers.values.flatten.find { |known_platform| known_platform.name == platform_name }
end

#platform_typesObject

The list of registered platform handler classes, per platform type.

Result
  • Hash<Symbol,Class>: The list of registered platform handler classes, per platform type.



70
71
72
# File 'lib/hybrid_platforms_conductor/platforms_handler.rb', line 70

def platform_types
  @platform_types.to_hash
end