module OmfEc::Backward::DefaultEvents

Public Class Methods

all_apps_ready?(state) click to toggle source
# File lib/omf_ec/backward/default_events.rb, line 38
def all_apps_ready?(state)
  results = []
  all_groups? do |g|
    plan = g.app_contexts.size * g.members.values.uniq.size
    actual = state.count { |v| v.joined?(g.address("application")) && v[:state] == "created" }
    results << (plan == actual) unless (plan == 0)
  end
  !results.include?(false)
end
all_interfaces_ready?(state) click to toggle source
# File lib/omf_ec/backward/default_events.rb, line 28
def all_interfaces_ready?(state)
  results = []
  all_groups? do |g|
    plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
    actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) && v[:state] == 'UP' }
    results << (plan == actual) unless (plan == 0)
  end
  !results.include?(false)
end
all_nodes_up?(state) click to toggle source
# File lib/omf_ec/backward/default_events.rb, line 12
def all_nodes_up?(state)
  all_groups? do |g|
    plan = g.members.values.uniq.sort
    actual = state.find_all { |v| v.joined?(g.address) }.map { |v| v[:address].to_s }.sort

    debug "Planned: #{g.name}(#{g.address}): #{plan}"
    debug "Actual: #{g.name}(#{g.address}): #{actual}"

    if plan.empty? && actual.empty?
      warn "Group '#{g.name}' is empty"
    end

    plan.empty? ? true : plan == actual
  end
end
all_nodes_up_cbk() click to toggle source
# File lib/omf_ec/backward/default_events.rb, line 48
def all_nodes_up_cbk
  all_groups do |group|
    # Deal with brilliant net.w0.ip syntax...
    group.net_ifs && group.net_ifs.each do |nif|
      nif.map_channel_freq
      r_type = nif.conf[:type]
      r_if_name = nif.conf[:if_name]
      r_index = nif.conf[:index]

      conf_to_send =
        if r_type == 'wlan'
          { type: r_type,
            if_name: r_if_name,
            mode: nif.conf.merge(:phy => "%#{r_index}%").except(:if_name, :type, :index)
          }
        else
          nif.conf.merge(type: r_type).except(:index)
        end

      group.create_resource(r_if_name, conf_to_send)
    end
    # Create proxies for each apps that were added to this group
    group.app_contexts.each { |a| group.create_resource(a.name, a.properties) }
  end
end
included(base) click to toggle source
# File lib/omf_ec/backward/default_events.rb, line 10
def included(base)
  base.class_eval do
    def all_nodes_up?(state)
      all_groups? do |g|
        plan = g.members.values.uniq.sort
        actual = state.find_all { |v| v.joined?(g.address) }.map { |v| v[:address].to_s }.sort

        debug "Planned: #{g.name}(#{g.address}): #{plan}"
        debug "Actual: #{g.name}(#{g.address}): #{actual}"

        if plan.empty? && actual.empty?
          warn "Group '#{g.name}' is empty"
        end

        plan.empty? ? true : plan == actual
      end
    end

    def all_interfaces_ready?(state)
      results = []
      all_groups? do |g|
        plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
        actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) && v[:state] == 'UP' }
        results << (plan == actual) unless (plan == 0)
      end
      !results.include?(false)
    end

    def all_apps_ready?(state)
      results = []
      all_groups? do |g|
        plan = g.app_contexts.size * g.members.values.uniq.size
        actual = state.count { |v| v.joined?(g.address("application")) && v[:state] == "created" }
        results << (plan == actual) unless (plan == 0)
      end
      !results.include?(false)
    end

    def all_nodes_up_cbk
      all_groups do |group|
        # Deal with brilliant net.w0.ip syntax...
        group.net_ifs && group.net_ifs.each do |nif|
          nif.map_channel_freq
          r_type = nif.conf[:type]
          r_if_name = nif.conf[:if_name]
          r_index = nif.conf[:index]

          conf_to_send =
            if r_type == 'wlan'
              { type: r_type,
                if_name: r_if_name,
                mode: nif.conf.merge(:phy => "%#{r_index}%").except(:if_name, :type, :index)
              }
            else
              nif.conf.merge(type: r_type).except(:index)
            end

          group.create_resource(r_if_name, conf_to_send)
        end
        # Create proxies for each apps that were added to this group
        group.app_contexts.each { |a| group.create_resource(a.name, a.properties) }
      end
    end

    def_event :ALL_NODES_UP do |state|
      all_nodes_up?(state)
    end

    alias_event :ALL_UP, :ALL_NODES_UP

    on_event :ALL_NODES_UP do
      all_nodes_up_cbk
    end

    def_event :ALL_RESOURCE_UP do |state|
      all_nodes_up?(state) && all_interfaces_ready?(state) && all_apps_ready?(state)
    end

    def_event :ALL_INTERFACE_UP do |state|
      all_nodes_up?(state) &&  all_interfaces_ready?(state)
    end

    def_event :ALL_APPS_UP do |state|
      all_nodes_up?(state) && all_apps_ready?(state)
    end

    alias_event :ALL_UP_AND_INSTALLED, :ALL_APPS_UP

    def_event :ALL_APPS_DONE do |state|
      all_nodes_up?(state) &&
        all_groups? do |g|
          plan = (g.execs.size + g.app_contexts.size) * g.members.values.uniq.size
          actual = state.count { |v| v.joined?(g.address("application")) && v[:event] == 'EXIT' }
          plan == 0 ? false : plan == actual
        end
    end
  end
end