require "virtus" require "docktor/container" module Docktor class Manifest include Virtus.model class ContainerNotFound < StandardError; end values do attribute :containers_for_execution, Array[String] attribute :containers, Array[Docktor::Container] end def select_container_for_execution(container_name) select_containers_for_execution([container_name]) end def select_containers_for_execution(container_names) self.containers_for_execution = [] container_names.each do |name| container = find_container_by_name(name) fail ContainerNotFound, %(There is no container "#{name}") if container.nil? containers_for_execution << container self.containers_for_execution += find_container_links(container) end containers_for_execution.uniq! sort_containers_for_execution! end def find_container_by_name(name) containers.find { |container| container.name == name } end def find_container_links(container) container.links.map { |link| find_container_by_name link } end def sort_containers_for_execution! sorted_containers = [] containers_for_execution.each do |container| links_indexes = container.links.map { |link| sorted_containers.index link } sorted_containers.insert((links_indexes.max || -1) + 1, container) end self.containers_for_execution = sorted_containers end end end