check point commit to ensure things are saved in more than one place. this commit contains the first integration of the docker build artifacts as well as the first integration of an automation test environment for MAAS based on virtual box

Change-Id: I236f12392501b4ed589aba2b748ba0c45e148f2e
diff --git a/automation/node.go b/automation/node.go
new file mode 100644
index 0000000..d364fe0
--- /dev/null
+++ b/automation/node.go
@@ -0,0 +1,116 @@
+package main
+
+import (
+	"fmt"
+
+	maas "github.com/juju/gomaasapi"
+)
+
+// MaasNodeStatus MAAS lifecycle status for nodes
+type MaasNodeStatus int
+
+// MAAS Node Statuses
+const (
+	Invalid             MaasNodeStatus = -1
+	New                 MaasNodeStatus = 0
+	Commissioning       MaasNodeStatus = 1
+	FailedCommissioning MaasNodeStatus = 2
+	Missing             MaasNodeStatus = 3
+	Ready               MaasNodeStatus = 4
+	Reserved            MaasNodeStatus = 5
+	Deployed            MaasNodeStatus = 6
+	Retired             MaasNodeStatus = 7
+	Broken              MaasNodeStatus = 8
+	Deploying           MaasNodeStatus = 9
+	Allocated           MaasNodeStatus = 10
+	FailedDeployment    MaasNodeStatus = 11
+	Releasing           MaasNodeStatus = 12
+	FailedReleasing     MaasNodeStatus = 13
+	DiskErasing         MaasNodeStatus = 14
+	FailedDiskErasing   MaasNodeStatus = 15
+)
+
+var names = []string{"New", "Commissioning", "FailedCommissioning", "Missing", "Ready", "Reserved",
+	"Deployed", "Retired", "Broken", "Deploying", "Allocated", "FailedDeployment",
+	"Releasing", "FailedReleasing", "DiskErasing", "FailedDiskErasing"}
+
+func (v MaasNodeStatus) String() string {
+	return names[v]
+}
+
+// FromString lookup the constant value for a given node state name
+func FromString(name string) (MaasNodeStatus, error) {
+	for i, v := range names {
+		if v == name {
+			return MaasNodeStatus(i), nil
+		}
+	}
+	return -1, fmt.Errorf("Unknown MAAS node state name, '%s'", name)
+}
+
+// MaasNode convenience wrapper for an MAAS node on top of a generic MAAS object
+type MaasNode struct {
+	maas.MAASObject
+}
+
+// GetString get attribute value as string
+func (n *MaasNode) GetString(key string) (string, error) {
+	return n.GetMap()[key].GetString()
+}
+
+// GetFloat64 get attribute value as float64
+func (n *MaasNode) GetFloat64(key string) (float64, error) {
+	return n.GetMap()[key].GetFloat64()
+}
+
+// ID get the system id of the node
+func (n *MaasNode) ID() string {
+	id, _ := n.GetString("system_id")
+	return id
+}
+
+func (n *MaasNode) PowerState() string {
+	state, _ := n.GetString("power_state")
+	return state
+}
+
+// Hostname get the hostname
+func (n *MaasNode) Hostname() string {
+	hn, _ := n.GetString("hostname")
+	return hn
+}
+
+// MACs get the MAC Addresses
+func (n *MaasNode) MACs() []string {
+	macsObj, _ := n.GetMap()["macaddress_set"]
+	macs, _ := macsObj.GetArray()
+	if len(macs) == 0 {
+		return []string{}
+	}
+	result := make([]string, len(macs))
+	for i, mac := range macs {
+		obj, _ := mac.GetMap()
+		addr, _ := obj["mac_address"]
+		s, _ := addr.GetString()
+		result[i] = s
+	}
+
+	return result
+}
+
+// Zone get the zone
+func (n *MaasNode) Zone() string {
+	zone := n.GetMap()["zone"]
+	attrs, _ := zone.GetMap()
+	v, _ := attrs["name"].GetString()
+	return v
+}
+
+// GetInteger get attribute value as integer
+func (n *MaasNode) GetInteger(key string) (int, error) {
+	v, err := n.GetMap()[key].GetFloat64()
+	if err != nil {
+		return 0, err
+	}
+	return int(v), nil
+}