blob: 86c2d03a8bd8ae807d15209e4dcac6c0f0021f3e [file] [log] [blame]
// Copyright 2016 Open Networking Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"fmt"
maas "github.com/juju/gomaasapi"
"net/url"
)
// 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
RescueMode MaasNodeStatus = 16
EnteringRescueMode MaasNodeStatus = 17
FailedEnteringRescueMode MaasNodeStatus = 18
ExitingRescueMode MaasNodeStatus = 19
FailedExitingRescueMode MaasNodeStatus = 20
Testing MaasNodeStatus = 21
FailedTesting MaasNodeStatus = 22
)
var names = []string{"New", "Commissioning", "FailedCommissioning", "Missing", "Ready", "Reserved",
"Deployed", "Retired", "Broken", "Deploying", "Allocated", "FailedDeployment",
"Releasing", "FailedReleasing", "DiskErasing", "FailedDiskErasing","RescueMode",
"EnteringRescueMode", "FailedEnteringRescueMode", "ExitingRescueMode", "FailedExitingRescueMode",
"Testing", "FailedTesting"}
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) PowerType() string {
ptype, _ := n.GetString("power_type")
return ptype
}
func (n *MaasNode) PowerState() string {
state, _ := n.GetString("power_state")
return state
}
func (n *MaasNode) UpdatePowerParameters(ptype string, params map[string]string) {
values := url.Values{}
values.Add("power_type", ptype)
for k, v := range params {
values.Add("power_parameters_"+k, v)
}
_, err := n.Update(values)
if err != nil {
log.Errorf("error updating power settings : %s", err.Error())
}
}
// Hostname get the hostname
func (n *MaasNode) Hostname() string {
hn, _ := n.GetString("hostname")
return hn
}
// IPs get the IP Addresses
func (n *MaasNode) IPs() []string {
ifaceObj, _ := n.GetMap()["interface_set"]
ifaces, _ := ifaceObj.GetArray()
result := []string{}
for _, iface := range ifaces {
obj, _ := iface.GetMap()
linksObj, _ := obj["links"]
links, _ := linksObj.GetArray()
for _, link := range links {
linkObj, _ := link.GetMap()
ipObj, _ := linkObj["ip_address"]
ip, _ := ipObj.GetString()
if ip != "" {
result = append(result, ip)
}
}
}
return result
}
// MACs get the MAC Addresses
func (n *MaasNode) MACs() []string {
ifaceObj, _ := n.GetMap()["interface_set"]
ifaces, _ := ifaceObj.GetArray()
if len(ifaces) == 0 {
return []string{}
}
result := make([]string, len(ifaces))
for i, iface := range ifaces {
obj, _ := iface.GetMap()
macAddressObj, _ := obj["mac_address"]
macAddress,_ := macAddressObj.GetString()
result[i] = macAddress
}
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
}