= Bring Your Own Nodes to the jclouds ComputeService =
The bring your own node provider (byon) allows you to specify a source which jclouds will read
nodes from.  Using this, you can have jclouds control your standalone machines, or even cloud
hosts that are sitting idle.

== Constraints ==
The byon provider only supports the following functions of ComputeService:
  * listNodes
  * listNodesDetailsMatching
  * getNodeMetadata
  * runScriptOnNodesMatching

== How to use the byon provider == 
The byon provider requires you supply a list of nodes using a property.  Here are 
the valid properties you can use:
  * byon.endpoint - url to access the list, can be http://, file://, classpath://
  * byon.nodes    - inline defined yaml in string form.

Note:

The identity and credential fields of the ComputeServiceContextFactory are ignored.

=== Java example ===

Properties props = new Properties();

// if you built the yaml string by hand
props.setProperty("byon.nodes", stringLiteral);

// or you can specify an external reference
props.setProperty("byon.endpoint", "file://path/to/byon.yaml");

// or you can specify a file in your classpath
props.setProperty("byon.endpoint", "classpath:///byon.yaml");

context = new ComputeServiceContextFactory().createContext("byon", "foo", "bar", 
               ImmutableSet.<Module> of(new JschSshClientModule()), props);

== File format == 
You must define your nodes in yaml, and they must be in a collection called nodes.

Here are the properties:

  * id             - opaque unique id
  * name           - optional; user specified name
  * description    - optional; long description of this node 
                               * note this is not yet in jclouds NodeMetadata
  * hostname       - name or ip address to contact the node on
  * location_id    - optional; correlates to a ZONE-scoped Location
                               * note that if present for one node, must be present for all
  * os_arch        - ex. x86 
  * os_family      - must conform to org.jclouds.compute.domain.OsFamily in lower-hyphen format
                     ex. rhel, ubuntu, centos, debian, amzn-linux
  * os_description - long description of the os ex. Ubuntu with lamp stack 
  * os_version     - normalized to numbers when possible. ex. for centos: 5.3, ubuntu: 10.10 
  * login_port     - optional; alternate port for ssh access
  * group          - primary group of the machine. ex. hadoop 
  * tags           - optional; list of arbitrary tags. 
                               * note this list is not yet in jclouds NodeMetadata 
  * username       - primary login user. ex. ubuntu, toor, root 
  * sudo_password  - optional; when a script is run with the "runAsRoot" option true, yet the
                               username is not root, a sudo command is invoked. If sudo_password
                               is set, the contents will be passed to sudo -S.  
                               Ex. echo 'foobar'| sudo -S init 5
 
  one of:
  
    * credential     - RSA private key or password 
    * credential_url - location of plain-text RSA private key or password.
                       ex. file:///home/me/.ssh/id_rsa
                           classpath:///id_rsa

Note that username and credentials are optional if a CredentialStoreModule is configured in 
jclouds.

=== Example File ===

nodes:
    - id: i-sdfkjh7
      name: cluster-1
      description: accounting analytics cluster
      hostname: cluster-1.mydomain.com
      location_id: virginia
      os_arch: x86
      os_family: rhel
      os_description: redhat with CDH
      os_version: 5.3
      group: hadoop
      tags:
          - vanilla
      username: myUser
      credential: |
                  -----BEGIN RSA PRIVATE KEY-----
                  MIIEowIBAAKCAQEAuzaE6azgUxwESX1rCGdJ5xpdrc1XC311bOGZBCE8NA+CpFh2
                  u01Vfv68NC4u6LFgdXSY1vQt6hiA5TNqQk0TyVfFAunbXgTekF6XqDPQUf1nq9aZ
                  lMvo4vlaLDKBkhG5HJE/pIa0iB+RMZLS0GhxsIWerEDmYdHKM25o
                  -----END RSA PRIVATE KEY-----
      sudo_password: go panthers!
