lib/vagrant/compose/util/cluster.rb in vagrant-compose-0.2.1 vs lib/vagrant/compose/util/cluster.rb in vagrant-compose-0.2.2

- old
+ new

@@ -1,207 +1,214 @@ require_relative "node_group" -# Definisce un cluster, ovvero l'insieme di 1..n gruppi di nodi con caratteristiche simili. -class Cluster - attr_reader :name - attr_reader :multimachine_filter - attr_accessor :box - attr_accessor :domain - attr_accessor :ansible_playbook_path - attr_accessor :ansible_context_vars - attr_accessor :ansible_group_vars - attr_accessor :ansible_host_vars +module VagrantPlugins + module Compose - # Costruttore di una istanza di cluster. - def initialize(name) - @group_index = 0 - @node_groups = {} - @ansible_context_vars = {} - @ansible_group_vars = {} - @ansible_host_vars = {} - @multimachine_filter = "" - @ansible_playbook_path = File.join(Dir.pwd, 'provisioning') + # Definisce un cluster, ovvero l'insieme di 1..n gruppi di nodi con caratteristiche simili. + class Cluster - @name = name - @box = 'ubuntu/trusty64' - @domain = 'vagrant' - end + attr_reader :name + attr_reader :multimachine_filter + attr_accessor :box + attr_accessor :domain + attr_accessor :ansible_playbook_path + attr_accessor :ansible_context_vars + attr_accessor :ansible_group_vars + attr_accessor :ansible_host_vars - # Metodo per la creazione di un gruppo di nodi; in fase di creazione, il blocco inizializza - # i valori/le expressioni da utilizzarsi nella valorizzazione degli attributi dei nodi in fase di compose. - # - # Oltre alla creazione dei nodi, il metodo prevede anche l'esecuzione di un blocco di codice per - # la configurazione del gruppo di nodi stesso. - def nodes(instances, name, &block) - raise RuntimeError, "Nodes #{name} already exists in this cluster." unless not @node_groups.has_key?(name) + # Costruttore di una istanza di cluster. + def initialize(name) + @group_index = 0 + @node_groups = {} + @ansible_context_vars = {} + @ansible_group_vars = {} + @ansible_host_vars = {} + @multimachine_filter = "" + @ansible_playbook_path = File.join(Dir.pwd, 'provisioning') - @node_groups[name] = NodeGroup.new(@group_index, instances, name) - @node_groups[name].box = @box - @node_groups[name].boxname = lambda { |group_index, group_name, node_index| return "#{group_name}#{node_index + 1}" } - @node_groups[name].hostname = lambda { |group_index, group_name, node_index| return "#{group_name}#{node_index + 1}" } - @node_groups[name].aliases = [] - @node_groups[name].ip = lambda { |group_index, group_name, node_index| return "172.31.#{group_index}.#{100 + node_index + 1}" } - @node_groups[name].cpus = 1 - @node_groups[name].memory = 256 - @node_groups[name].ansible_groups = [] - @node_groups[name].attributes = {} + @name = name + @box = 'ubuntu/trusty64' + @domain = 'vagrant' + end - @group_index += 1 + # Metodo per la creazione di un gruppo di nodi; in fase di creazione, il blocco inizializza + # i valori/le expressioni da utilizzarsi nella valorizzazione degli attributi dei nodi in fase di compose. + # + # Oltre alla creazione dei nodi, il metodo prevede anche l'esecuzione di un blocco di codice per + # la configurazione del gruppo di nodi stesso. + def nodes(instances, name, &block) + raise RuntimeError, "Nodes #{name} already exists in this cluster." unless not @node_groups.has_key?(name) - block.call(@node_groups[name]) if block_given? - end + @node_groups[name] = NodeGroup.new(@group_index, instances, name) + @node_groups[name].box = @box + @node_groups[name].boxname = lambda { |group_index, group_name, node_index| return "#{group_name}#{node_index + 1}" } + @node_groups[name].hostname = lambda { |group_index, group_name, node_index| return "#{group_name}#{node_index + 1}" } + @node_groups[name].aliases = [] + @node_groups[name].ip = lambda { |group_index, group_name, node_index| return "172.31.#{group_index}.#{100 + node_index + 1}" } + @node_groups[name].cpus = 1 + @node_groups[name].memory = 256 + @node_groups[name].ansible_groups = [] + @node_groups[name].attributes = {} - # Prepara il provisioning del cluster - def compose + @group_index += 1 - @multimachine_filter = ARGV.length > 1 ? ARGV[1] : "" # detect if running vagrant up/provision MACHINE + block.call(@node_groups[name]) if block_given? + end - ## Fase1: Creazione dei nodi + # Prepara il provisioning del cluster + def compose - # sviluppa i vari gruppi di nodi, creando i singoli nodi - nodes = [] + @multimachine_filter = ARGV.length > 1 ? ARGV[1] : "" # detect if running vagrant up/provision MACHINE - @node_groups.each do |key, group| - group.compose(@name, @domain, nodes.size) do |node| - nodes << node - end - end + ## Fase1: Creazione dei nodi - # sviluppa i gruppi abbinando a ciascono i nodi creati - # NB. tiene in considerazione anche l'eventualità che un gruppo possa essere composto da nodi appartenenti a diversi node_groups - ansible_groups= {} - nodes.each do |node| - node.ansible_groups.each do |ansible_group| - ansible_groups[ansible_group] = [] unless ansible_groups.has_key? (ansible_group) - ansible_groups[ansible_group] << node - end - end + # sviluppa i vari gruppi di nodi, creando i singoli nodi + nodes = [] - ## Fase2: Configurazione provisioning del cluster via Ansible - # Ogni nodo diventerà una vm su cui sarà fatto il provisioning, ovvero un host nell'inventory di ansible - # Ad ogni gruppo corrispondono nodi con caratteristiche simili + @node_groups.each do |key, group| + group.compose(@name, @domain, nodes.size) do |node| + nodes << node + end + end - # genearazione inventory file per ansible, aka ansible_groups in Vagrant (NB. 1 group = 1 gruppo ansible) - ansible_groups_provision = {} - ansible_groups.each do |ansible_group, ansible_group_nodes| - ansible_groups_provision[ansible_group] = [] - ansible_group_nodes.each do |node| - ansible_groups_provision[ansible_group] << node.hostname if @multimachine_filter.empty? or @multimachine_filter == node.boxname #filter ansible groups if vagrant command on one node - end - end - ansible_groups_provision['all_groups:children'] = ansible_groups.keys + # sviluppa i gruppi abbinando a ciascono i nodi creati + # NB. tiene in considerazione anche l'eventualità che un gruppo possa essere composto da nodi appartenenti a diversi node_groups + ansible_groups= {} + nodes.each do |node| + node.ansible_groups.each do |ansible_group| + ansible_groups[ansible_group] = [] unless ansible_groups.has_key? (ansible_group) + ansible_groups[ansible_group] << node + end + end - # Oltre alla creazione del file di inventory per ansible, contenente gruppi e host, è supportata: - # - la creazione di file ansible_group_vars, ovvero di file preposti a contenere una serie di variabili - specifico di ogni gruppo di host - - # per condizionare il provisioning ansible sulla base delle caratteristiche del cluster specifico - # - la creazione di file ansible_host_vars, ovvero di file preposti a contenere una serie di variabili - specifico di ogni host - - # per condizionare il provisioning ansible sulla base delle caratteristiche del cluster specifico + ## Fase2: Configurazione provisioning del cluster via Ansible + # Ogni nodo diventerà una vm su cui sarà fatto il provisioning, ovvero un host nell'inventory di ansible + # Ad ogni gruppo corrispondono nodi con caratteristiche simili - # La generazione delle variabili utilizza una serie di VariableProvisioner, uno o più d'uno per ogni gruppo di hosts, configurati durante la - # definizione del cluster. + # genearazione inventory file per ansible, aka ansible_groups in Vagrant (NB. 1 group = 1 gruppo ansible) + ansible_groups_provision = {} + ansible_groups.each do |ansible_group, ansible_group_nodes| + ansible_groups_provision[ansible_group] = [] + ansible_group_nodes.each do |node| + ansible_groups_provision[ansible_group] << node.hostname if @multimachine_filter.empty? or @multimachine_filter == node.boxname #filter ansible groups if vagrant command on one node + end + end + ansible_groups_provision['all_groups:children'] = ansible_groups.keys - context = {} + # Oltre alla creazione del file di inventory per ansible, contenente gruppi e host, è supportata: + # - la creazione di file ansible_group_vars, ovvero di file preposti a contenere una serie di variabili - specifico di ogni gruppo di host - + # per condizionare il provisioning ansible sulla base delle caratteristiche del cluster specifico + # - la creazione di file ansible_host_vars, ovvero di file preposti a contenere una serie di variabili - specifico di ogni host - + # per condizionare il provisioning ansible sulla base delle caratteristiche del cluster specifico - #genearazione context (NB. 1 group = 1 gruppo host ansible) - ansible_groups.each do |ansible_group, ansible_group_nodes| - - # genero le variabili per il group - provisioners = @ansible_context_vars[ansible_group] - unless provisioners.nil? - # se necessario, normalizzo provisioner in array provisioners - provisioners = [ provisioners ] if not provisioners.respond_to?('each') - # per tutti i provisioners abbinati al ruolo - provisioners.each do |provisioner| - begin - vars = provisioner.call(context, ansible_group_nodes) + # La generazione delle variabili utilizza una serie di VariableProvisioner, uno o più d'uno per ogni gruppo di hosts, configurati durante la + # definizione del cluster. - #TODO: gestire conflitto (n>=2 gruppi che generano la stessa variabile - con valori diversi) - context = context.merge(vars) - rescue Exception => e - raise VagrantPlugins::Compose::Errors::ContextVarExpressionError, :message => e.message, :ansible_group => ansible_group + context = {} + + #genearazione context (NB. 1 group = 1 gruppo host ansible) + ansible_groups.each do |ansible_group, ansible_group_nodes| + + # genero le variabili per il group + provisioners = @ansible_context_vars[ansible_group] + unless provisioners.nil? + # se necessario, normalizzo provisioner in array provisioners + provisioners = [ provisioners ] if not provisioners.respond_to?('each') + # per tutti i provisioners abbinati al ruolo + provisioners.each do |provisioner| + begin + vars = provisioner.call(context, ansible_group_nodes) + + #TODO: gestire conflitto (n>=2 gruppi che generano la stessa variabile - con valori diversi) + context = context.merge(vars) + rescue Exception => e + raise VagrantPlugins::Compose::Errors::ContextVarExpressionError, :message => e.message, :ansible_group => ansible_group + end + end end - end - end - end + end - # cleanup ansible_group_vars files - # TODO: make variable public - @ansible_group_vars_path = File.join(@ansible_playbook_path, 'group_vars') - # TODO: make safe - FileUtils.mkdir_p(@ansible_group_vars_path) unless File.exists?(@ansible_group_vars_path) - Dir.foreach(@ansible_group_vars_path) {|f| fn = File.join(@ansible_group_vars_path, f); File.delete(fn) if f.end_with?(".yml")} + # cleanup ansible_group_vars files + # TODO: make variable public + @ansible_group_vars_path = File.join(@ansible_playbook_path, 'group_vars') + # TODO: make safe + FileUtils.mkdir_p(@ansible_group_vars_path) unless File.exists?(@ansible_group_vars_path) + Dir.foreach(@ansible_group_vars_path) {|f| fn = File.join(@ansible_group_vars_path, f); File.delete(fn) if f.end_with?(".yml")} - #generazione ansible_group_vars file (NB. 1 group = 1 gruppo host ansible) - ansible_groups.each do |ansible_group, ansible_group_nodes| - ansible_group_vars = {} - # genero le variabili per il group - provisioners = @ansible_group_vars[ansible_group] - unless provisioners.nil? - # se necessario, normalizzo provisioner in array provisioners - provisioners = [ provisioners ] if not provisioners.respond_to?('each') - # per tutti i provisioners abbinati al ruolo - provisioners.each do |provisioner| - begin - vars = provisioner.call(context, ansible_group_nodes) + #generazione ansible_group_vars file (NB. 1 group = 1 gruppo host ansible) + ansible_groups.each do |ansible_group, ansible_group_nodes| + ansible_group_vars = {} + # genero le variabili per il group + provisioners = @ansible_group_vars[ansible_group] + unless provisioners.nil? + # se necessario, normalizzo provisioner in array provisioners + provisioners = [ provisioners ] if not provisioners.respond_to?('each') + # per tutti i provisioners abbinati al ruolo + provisioners.each do |provisioner| + begin + vars = provisioner.call(context, ansible_group_nodes) - #TODO: gestire conflitto (n>=2 gruppi che generano la stessa variabile - con valori diversi) - ansible_group_vars = ansible_group_vars.merge(vars) - rescue Exception => e - raise VagrantPlugins::Compose::Errors::GroupVarExpressionError, :message => e.message, :ansible_group => ansible_group + #TODO: gestire conflitto (n>=2 gruppi che generano la stessa variabile - con valori diversi) + ansible_group_vars = ansible_group_vars.merge(vars) + rescue Exception => e + raise VagrantPlugins::Compose::Errors::GroupVarExpressionError, :message => e.message, :ansible_group => ansible_group + end + end end - end - end - # crea il file (se sono state generate delle variabili) - unless ansible_group_vars.empty? - # TODO: make safe - File.open(File.join(@ansible_group_vars_path,"#{ansible_group}.yml") , 'w+') do |file| - file.puts YAML::dump(ansible_group_vars) - end - end - end + # crea il file (se sono state generate delle variabili) + unless ansible_group_vars.empty? + # TODO: make safe + File.open(File.join(@ansible_group_vars_path,"#{ansible_group}.yml") , 'w+') do |file| + file.puts YAML::dump(ansible_group_vars) + end + end + end - # cleanup ansible_host_vars files (NB. 1 nodo = 1 host) - # TODO: make variable public - @ansible_host_vars_path = File.join(@ansible_playbook_path, 'host_vars') - # TODO: make safe - FileUtils.mkdir_p(@ansible_host_vars_path) unless File.exists?(@ansible_host_vars_path) - Dir.foreach(@ansible_host_vars_path) {|f| fn = File.join(@ansible_host_vars_path, f); File.delete(fn) if f.end_with?(".yml")} + # cleanup ansible_host_vars files (NB. 1 nodo = 1 host) + # TODO: make variable public + @ansible_host_vars_path = File.join(@ansible_playbook_path, 'host_vars') + # TODO: make safe + FileUtils.mkdir_p(@ansible_host_vars_path) unless File.exists?(@ansible_host_vars_path) + Dir.foreach(@ansible_host_vars_path) {|f| fn = File.join(@ansible_host_vars_path, f); File.delete(fn) if f.end_with?(".yml")} - #generazione ansible_host_vars file - nodes.each do |node| - # genero le variabili per il nodo; il nodo, può essere abbinato a diversi gruppi - ansible_host_vars = {} - node.ansible_groups.each do |ansible_group| - # genero le variabili per il gruppo - provisioners = @ansible_host_vars[ansible_group] - unless provisioners.nil? - # se necessario, normalizzo provisioner in array provisioners - provisioners = [ provisioners ] if not provisioners.respond_to?('each') - # per tutti i provisioners abbinati al gruppo - provisioners.each do |provisioner| - begin - vars = provisioner.call(context, node) + #generazione ansible_host_vars file + nodes.each do |node| + # genero le variabili per il nodo; il nodo, può essere abbinato a diversi gruppi + ansible_host_vars = {} + node.ansible_groups.each do |ansible_group| + # genero le variabili per il gruppo + provisioners = @ansible_host_vars[ansible_group] + unless provisioners.nil? + # se necessario, normalizzo provisioner in array provisioners + provisioners = [ provisioners ] if not provisioners.respond_to?('each') + # per tutti i provisioners abbinati al gruppo + provisioners.each do |provisioner| + begin + vars = provisioner.call(context, node) - #TODO: gestire conflitto (n>=2 gruppi che generano la stessa variabile - con valori diversi) - ansible_host_vars = ansible_host_vars.merge(vars) - rescue Exception => e - raise VagrantPlugins::Compose::Errors::HostVarExpressionError, :message => e.message, :host => node.hostname, :ansible_group => ansible_group + #TODO: gestire conflitto (n>=2 gruppi che generano la stessa variabile - con valori diversi) + ansible_host_vars = ansible_host_vars.merge(vars) + rescue Exception => e + raise VagrantPlugins::Compose::Errors::HostVarExpressionError, :message => e.message, :host => node.hostname, :ansible_group => ansible_group + end + end end - end + end + + # crea il file (se sono state generate delle variabili) + unless ansible_host_vars.empty? + # TODO: make safe + File.open(File.join(@ansible_host_vars_path,"#{node.hostname}.yml") , 'w+') do |file| + file.puts YAML::dump(ansible_host_vars) + end + end end - end - # crea il file (se sono state generate delle variabili) - unless ansible_host_vars.empty? - # TODO: make safe - File.open(File.join(@ansible_host_vars_path,"#{node.hostname}.yml") , 'w+') do |file| - file.puts YAML::dump(ansible_host_vars) - end + return nodes, ansible_groups_provision end - end + end - return nodes, ansible_groups_provision - end + end +end -end \ No newline at end of file