| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package pdu |
| |
| import ( |
| "net/http" |
| "strconv" |
| |
| "fuchsia.googlesource.com/tools/pdu/amt" |
| "fuchsia.googlesource.com/tools/pdu/arduinorelay" |
| "fuchsia.googlesource.com/tools/pdu/webcardlx" |
| "fuchsia.googlesource.com/tools/pdu/wol" |
| ) |
| |
| // Controller machines use 192.168.42.1/24 for swarming bots |
| // This will broadcast to that entire subnet. |
| const botBroadcastAddr = "192.168.42.255:9" |
| |
| // Controller machines have multiple interfaces, currently |
| // 'eno2' is used for swarming bots. |
| const botInterface = "eno2" |
| |
| // Config represents a PDU configuration for a particular device. |
| type Config struct { |
| // Type is the type of PDU to use. |
| Type string `json:"type"` |
| |
| // Host is the network hostname of the PDU e.g. fuchsia-tests-pdu-001. |
| Host string `json:"host"` |
| |
| // HostHwAddr is the ethernet MAC address of the PDU e.g. 10:10:10:10:10:10 |
| HostMACAddr string `json:"host_mac_addr"` |
| |
| // Username is the username used to log in to the PDU. |
| Username string `json:"username"` |
| |
| // Password is the password used to log in to the PDU. |
| Password string `json:"password"` |
| |
| // DevicePath is the path to the device on the local machine. |
| DevicePath string `json:"device_path"` |
| |
| // DevicePort is the PDU-specific string which identifies the |
| // hardware device we're testing on in the PDU. |
| DevicePort string `json:"device_port"` |
| } |
| |
| // RebootDevice uses the given configuration to reboot the device. |
| func RebootDevice(cfg *Config) error { |
| switch cfg.Type { |
| case "amt": |
| return amt.Reboot(cfg.Host, cfg.Username, cfg.Password) |
| case "arduinorelay": |
| return arduinorelay.Reboot(cfg.DevicePath, cfg.DevicePort) |
| case "wol": |
| return wol.Reboot(botBroadcastAddr, botInterface, cfg.HostMACAddr) |
| case "webcardlx": |
| fallthrough |
| default: |
| // TODO(mknyszek): Require a type to be specified for this. |
| wc := webcardlx.Webcardlx{ |
| Client: &http.Client{}, |
| Host: cfg.Host, |
| Username: cfg.Username, |
| Password: cfg.Password, |
| } |
| if err := wc.Login(); err != nil { |
| return err |
| } |
| defer wc.Logout() |
| |
| port, err := strconv.Atoi(cfg.DevicePort) |
| if err != nil { |
| return err |
| } |
| return wc.Loads(port, webcardlx.Cycle) |
| } |
| } |