module RSpecSystem
  # Base class for a NodeSet driver. If you want to create a new driver, you
  # should sub-class this and override all the methods below.
  #
  # @abstract Subclass and override methods to create a new NodeSet variant.
  class NodeSet::Base
    attr_reader :config
    attr_reader :setname
    attr_reader :nodes

    # Create new NodeSet, populating necessary data structures.
    def initialize(setname, config)
      @setname = setname
      @config = config

      @nodes = {}
      config['nodes'].each do |k,v|
        @nodes[k] = RSpecSystem::Node.node_from_yaml(self, k, v)
      end
    end

    # Setup the NodeSet by starting all nodes.
    def setup
      raise "Unimplemented method #setup"
    end

    # Shutdown the NodeSet by shutting down or pausing all nodes.
    def teardown
      raise "Unimplemented method #teardown"
    end

    # Run a command on a host in the NodeSet.
    def run(options)
      raise "Unimplemented method #run"
    end

    # Copy a file to the host in the NodeSet.
    def rcp(options)
      raise "Unimplemented method #rcp"
    end

    # Return environment type
    def env_type
      self.class::ENV_TYPE
    end

    # Return default node
    #
    # @return [RSpecSystem::Node] default node for this nodeset
    def default_node
      dn = config['default_node']
      if dn.nil?
        if nodes.length == 1
          dn = nodes.first[1]
          return dn
        else
          raise "No default node"
        end
      else
        return nodes[dn]
      end
    end
  end
end