module Pio::OpenFlow

Common OpenFlow modules/classes.

Public Class Methods

read(binary) click to toggle source
# File lib/pio/open_flow.rb, line 24
def self.read(binary)
  header = OpenFlow::Header.read(binary)
  self.version = header.version
  Parser.find_by_type!(header.type).read(binary)
end
version=(version) click to toggle source
# File lib/pio/open_flow.rb, line 14
def self.version=(version)
  return if OpenFlow.version == version.to_sym
  find_all_class_by_version(version).each do |each|
    alias_open_flow_class each
  end
  @@version = version.to_sym # rubocop:disable ClassVars
rescue NameError
  raise "#{version} is not supported yet."
end

Private Class Methods

alias_open_flow_class(klass) click to toggle source

Pio::OpenFlow10::Hello -> Pio::Hello

# File lib/pio/open_flow.rb, line 42
def self.alias_open_flow_class(klass)
  version = klass.name.split('::').second
  class_name = klass.name.split('::').third
  if Pio.const_defined?(class_name)
    Pio.module_eval { remove_const class_name }
  end
  Pio.const_set(class_name, "Pio::#{version}::#{class_name}".constantize)
end
find_all_class_by_version(version) click to toggle source
# File lib/pio/open_flow.rb, line 30
def self.find_all_class_by_version(version)
  all_class = [Message, Instruction, Action, FlowMatch].
              inject([]) do |result, each|
    result + each.descendants
  end
  all_class.select do |each|
    each.parents.include?(Class.const_get("Pio::#{version}"))
  end
end