blob: 6bffedef550132471735790e2894010d60d40310 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package controller
import (
"context"
"fmt"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes"
"go.chromium.org/luci/common/logging"
"go.chromium.org/luci/server/auth"
ufspb "infra/unifiedfleet/api/v1/models"
chromeosLab "infra/unifiedfleet/api/v1/models/chromeos/lab"
"infra/unifiedfleet/app/model/history"
"infra/unifiedfleet/app/util"
)
// HistoryClient is a client for managing change histories
type HistoryClient struct {
netUdt *networkUpdater
stUdt *stateUpdater
changes []*ufspb.ChangeEvent
msgs []*history.SnapshotMsgEntity
errs []string
}
// SaveChangeEvents saves change events to database
func (hc *HistoryClient) SaveChangeEvents(ctx context.Context) error {
if err := hc.saveMsgs(ctx); err != nil {
return err
}
changes := hc.changes
if hc.netUdt != nil {
changes = append(changes, hc.netUdt.Changes...)
}
if hc.stUdt != nil {
changes = append(changes, hc.stUdt.Changes...)
}
logging.Infof(ctx, "Logging %d changes", len(changes))
user := auth.CurrentUser(ctx)
for _, c := range changes {
c.UserEmail = user.Email
}
_, err := history.CreateBatchChangeEvents(ctx, changes)
if err != nil {
logging.Warningf(ctx, "fail to log changes: %s", err.Error())
return err
}
logging.Infof(ctx, "Finish logging change events successfully")
return nil
}
func (hc *HistoryClient) saveMsgs(ctx context.Context) error {
msgs := hc.msgs
if hc.netUdt != nil {
msgs = append(msgs, hc.netUdt.Msgs...)
}
if hc.stUdt != nil {
msgs = append(msgs, hc.stUdt.Msgs...)
}
logging.Debugf(ctx, "Logging %d snapshot msgs", len(msgs))
if err := history.BatchUpdateSnapshotMsg(ctx, msgs); err != nil {
return err
}
logging.Debugf(ctx, "Finish logging snapshot msgs successfully")
return nil
}
const (
// LifeCycleRegistration indicates the registration of a resource.
LifeCycleRegistration = "REGISTRATION"
// LifeCycleDeployment indicates the deployment of a device.
LifeCycleDeployment = "DEPLOYMENT"
// LifeCycleDecomm indicates the decommission of a device.
LifeCycleDecomm = "DECOMMISSION"
// LifeCycleRetire indicates the retirement of a device.
LifeCycleRetire = "RETIREMENT"
// LifeCycleRename indicates the renaming of a device.
LifeCycleRename = "RENAME"
)
// logLifeCycle logs the life cycle event of a ChromeOSDevice.
func logLifeCycle(resourceName, resourceType, lifeCycleType string) (changes []*ufspb.ChangeEvent) {
return []*ufspb.ChangeEvent{
{
Name: resourceName,
EventLabel: resourceType,
OldValue: lifeCycleType,
NewValue: lifeCycleType,
},
}
}
func (hc *HistoryClient) logMsgEntity(resourceName string, delete bool, pm proto.Message) {
if e, err := history.NewSnapshotMsgEntity(resourceName, delete, pm); err != nil {
hc.errs = append(hc.errs, err.Error())
} else {
hc.msgs = append(hc.msgs, e)
}
}
// LogAssetChanges logs the change of the given asset.
func (hc *HistoryClient) LogAssetChanges(oldData, newData *ufspb.Asset) {
if oldData == nil && newData == nil {
return
}
var oldResName, newResName string
if oldData != nil {
prefix, _ := util.GetResourcePrefix(oldData)
oldResName = util.AddPrefix(prefix, oldData.GetName())
}
if newData != nil {
prefix, _ := util.GetResourcePrefix(newData)
newResName = util.AddPrefix(prefix, newData.GetName())
}
if newData == nil {
// Asset is being deleted
hc.changes = append(hc.changes, logLifeCycle(oldResName, "asset", LifeCycleRetire)...)
hc.logMsgEntity(oldResName, true, oldData)
return
}
if oldData == nil {
// Asset is being registered
hc.changes = append(hc.changes, logLifeCycle(newResName, "asset", LifeCycleRegistration)...)
hc.logMsgEntity(newResName, false, newData)
return
}
if oldData.GetName() != newData.GetName() {
hc.changes = append(hc.changes, logLifeCycle(oldResName, "asset", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(oldResName, "asset.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logLifeCycle(newResName, "asset", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(newResName, "asset.name", oldData.GetName(), newData.GetName())...)
hc.logMsgEntity(oldResName, true, oldData)
hc.logMsgEntity(newResName, false, newData)
return
}
hc.changes = append(hc.changes, logCommon(newResName, "asset.type", oldData.GetType(), newData.GetType())...)
hc.changes = append(hc.changes, logCommon(newResName, "asset.model", oldData.GetModel(), newData.GetModel())...)
hc.changes = append(hc.changes, logCommon(newResName, "asset.location", oldData.GetLocation(), newData.GetLocation())...)
var oldInfo, newInfo *ufspb.AssetInfo
// Assign blank infos to avoid panic in the following code.
if oldInfo = oldData.GetInfo(); oldInfo == nil {
oldInfo = &ufspb.AssetInfo{}
}
if newInfo = newData.GetInfo(); newInfo == nil {
newInfo = &ufspb.AssetInfo{}
}
hc.LogAssetInfoChanges(newResName, oldInfo, newInfo)
hc.logMsgEntity(newResName, false, newData)
}
// LogAssetInfoChanges logs the change of a give asset info
func (hc *HistoryClient) LogAssetInfoChanges(resName string, oldInfo, newInfo *ufspb.AssetInfo) {
hc.changes = append(hc.changes, logCommon(resName, "asset.info.serial_number", oldInfo.GetSerialNumber(), newInfo.GetSerialNumber())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.cost_center", oldInfo.GetCostCenter(), newInfo.GetCostCenter())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.google_code_name", oldInfo.GetGoogleCodeName(), newInfo.GetGoogleCodeName())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.model", oldInfo.GetModel(), newInfo.GetModel())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.build_target", oldInfo.GetBuildTarget(), newInfo.GetBuildTarget())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.reference_board", oldInfo.GetReferenceBoard(), newInfo.GetReferenceBoard())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.ethernet_mac_address", oldInfo.GetEthernetMacAddress(), newInfo.GetEthernetMacAddress())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.sku", oldInfo.GetSku(), newInfo.GetSku())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.phase", oldInfo.GetPhase(), newInfo.GetPhase())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.gpn", oldInfo.GetGpn(), newInfo.GetGpn())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.reference_design", oldInfo.GetReferenceDesign(), newInfo.GetReferenceDesign())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.product_status", oldInfo.GetProductStatus(), newInfo.GetProductStatus())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.fingerprint_sensor", oldInfo.GetFingerprintSensor(), newInfo.GetFingerprintSensor())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.hw_x_compliance_version", oldInfo.GetHwXComplianceVersion(), newInfo.GetHwXComplianceVersion())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.touch_screen", oldInfo.GetTouchScreen(), newInfo.GetTouchScreen())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.is_cbx", oldInfo.GetIsCbx(), newInfo.GetIsCbx())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.cbx_feature_type", oldInfo.GetCbxFeatureType(), newInfo.GetCbxFeatureType())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.is_mixed_x", oldInfo.GetIsMixedX(), newInfo.GetIsMixedX())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.has_wifi_bt", oldInfo.GetHasWifiBt(), newInfo.GetHasWifiBt())...)
hc.changes = append(hc.changes, logCommon(resName, "asset.info.wifi_bluetooth", oldInfo.GetWifiBluetooth(), newInfo.GetWifiBluetooth())...)
}
// LogMachineChanges logs the change of the given machine.
func (hc *HistoryClient) LogMachineChanges(oldData *ufspb.Machine, newData *ufspb.Machine) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.MachineCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.MachineCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
if oldData.GetName() != newData.GetName() {
oldResourceName := util.AddPrefix(util.MachineCollection, oldData.GetName())
hc.changes = append(hc.changes, logLifeCycle(oldResourceName, "machine", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(oldResourceName, "machine.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine.name", oldData.GetName(), newData.GetName())...)
hc.logMsgEntity(oldResourceName, true, oldData)
hc.logMsgEntity(resourceName, false, newData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "machine.serial_number", oldData.GetSerialNumber(), newData.GetSerialNumber())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine.location", oldData.GetLocation(), newData.GetLocation())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine.realm", oldData.GetRealm(), newData.GetRealm())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine.resource_state", oldData.GetResourceState(), newData.GetResourceState())...)
if newData.GetChromeBrowserMachine() != nil {
hc.changes = append(hc.changes, logChromeBrowserMachine(resourceName, oldData.GetChromeBrowserMachine(), newData.GetChromeBrowserMachine())...)
} else {
hc.changes = append(hc.changes, logChromeOSMachine(resourceName, oldData.GetChromeosMachine(), newData.GetChromeosMachine())...)
}
hc.logMsgEntity(resourceName, false, newData)
}
// LogMachineLSEDeploymentChanges logs the change of a given machine lse deployment record.
func (hc *HistoryClient) LogMachineLSEDeploymentChanges(oldData, newData *ufspb.MachineLSEDeployment) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.MachineLSEDeploymentCollection, newData.GetSerialNumber())
if newData == nil {
resourceName = util.AddPrefix(util.MachineLSEDeploymentCollection, oldData.GetSerialNumber())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine_lse_deployment", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine_lse_deployment", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse_deployment.hostname", oldData.GetHostname(), newData.GetHostname())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse_deployment.deployment_identifier", oldData.GetDeploymentIdentifier(), newData.GetDeploymentIdentifier())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse_deployment.deployment_env", oldData.GetDeploymentEnv(), newData.GetDeploymentEnv())...)
if newData.GetConfigsToPush() != nil {
hc.changes = append(hc.changes, logDeploymentConfigs(resourceName, oldData.GetConfigsToPush(), newData.GetConfigsToPush())...)
}
hc.logMsgEntity(resourceName, false, newData)
}
func logDeploymentConfigs(resourceName string, oldData, newData []*ufspb.Payload) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
if oldData == nil && newData == nil {
return changes
}
oldMap := make(map[string]*ufspb.Payload)
newMap := make(map[string]*ufspb.Payload)
for _, r := range oldData {
oldMap[r.GetName()] = r
}
for _, r := range newData {
newMap[r.GetName()] = r
if old, ok := oldMap[r.GetName()]; !ok {
changes = append(changes, logCommon(resourceName, "machine_lse_deployment.configs_to_push", "", r.GetName())...)
} else {
changes = append(changes, logCommon(resourceName, "machine_lse_deployment.configs_to_push.config", combinePayloadConfig(old), combinePayloadConfig(r))...)
changes = append(changes, logCommon(resourceName, "machine_lse_deployment.configs_to_push.path", combinePayloadPath(old), combinePayloadPath(r))...)
}
}
for _, r := range oldData {
if _, ok := newMap[r.GetName()]; !ok {
changes = append(changes, logCommon(resourceName, "machine_lse_deployment.configs_to_push", r.GetName(), "")...)
}
}
return changes
}
func combinePayloadConfig(p *ufspb.Payload) string {
return fmt.Sprintf("%s:%s", p.GetName(), p.GetConfig().String())
}
func combinePayloadPath(p *ufspb.Payload) string {
return fmt.Sprintf("%s:%s", p.GetName(), p.GetPath())
}
// LogMachineLSEChanges logs the change of the given machine lse.
func (hc *HistoryClient) LogMachineLSEChanges(oldData *ufspb.MachineLSE, newData *ufspb.MachineLSE) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.HostCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.HostCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine_lse", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine_lse", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
if oldData.GetName() != newData.GetName() {
oldResourceName := util.AddPrefix(util.HostCollection, oldData.GetName())
hc.changes = append(hc.changes, logLifeCycle(oldResourceName, "machine_lse", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(oldResourceName, "machine_lse.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logLifeCycle(resourceName, "machine_lse", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.name", oldData.GetName(), newData.GetName())...)
hc.logMsgEntity(oldResourceName, true, oldData)
hc.logMsgEntity(resourceName, false, newData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.machine_lse_prototype", oldData.GetMachineLsePrototype(), newData.GetMachineLsePrototype())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.hostname", oldData.GetHostname(), newData.GetHostname())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.machines", oldData.GetMachines(), newData.GetMachines())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.nic", oldData.GetNic(), newData.GetNic())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.vlan", oldData.GetVlan(), newData.GetVlan())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.ip", oldData.GetIp(), newData.GetIp())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.realm", approxZone(oldData.GetRealm()), approxZone(newData.GetRealm()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.rack", oldData.GetRack(), newData.GetRack())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.manufacturer", oldData.GetManufacturer(), newData.GetManufacturer())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.deployment_ticket", oldData.GetDeploymentTicket(), newData.GetDeploymentTicket())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.description", oldData.GetDescription(), newData.GetDescription())...)
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.logical_zone", oldData.GetLogicalZone(), newData.GetLogicalZone())...)
if newData.GetChromeBrowserMachineLse() != nil {
hc.changes = append(hc.changes, logChromeBrowserMachineLse(resourceName, oldData.GetChromeBrowserMachineLse(), newData.GetChromeBrowserMachineLse())...)
} else {
hc.changes = append(hc.changes, logChromeOSMachineLse(resourceName, oldData.GetChromeosMachineLse(), newData.GetChromeosMachineLse())...)
}
if oldDevboard := oldData.GetChromeosMachineLse().GetDeviceLse().GetDevboard(); oldDevboard != nil {
if newDevboard := newData.GetChromeosMachineLse().GetDeviceLse().GetDevboard(); newDevboard != nil {
hc.changes = append(hc.changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.device_lse.devboard.pools", oldDevboard.GetPools(), newDevboard.GetPools())...)
}
}
hc.logMsgEntity(resourceName, false, newData)
}
// LogVMChanges logs the change of the given vms.
func (hc *HistoryClient) LogVMChanges(oldData *ufspb.VM, newData *ufspb.VM) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.VMCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.VMCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "vm", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "vm", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
if oldData.GetName() != newData.GetName() {
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "vm.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.os_version", oldData.GetOsVersion(), newData.GetOsVersion())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.vlan", oldData.GetVlan(), newData.GetVlan())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.ip", oldData.GetIp(), newData.GetIp())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.machine_lse_id", oldData.GetMachineLseId(), newData.GetMachineLseId())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.description", oldData.GetDescription(), newData.GetDescription())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.resource_state", oldData.GetResourceState().String(), newData.GetResourceState().String())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vm.deployment_ticket", oldData.GetDeploymentTicket(), newData.GetDeploymentTicket())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogRackChanges logs the change of the given rack.
func (hc *HistoryClient) LogRackChanges(oldData *ufspb.Rack, newData *ufspb.Rack) {
if oldData == nil && newData == nil {
return
}
newResName := util.AddPrefix(util.RackCollection, newData.GetName())
oldResName := util.AddPrefix(util.RackCollection, oldData.GetName())
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(newResName, "rack", LifeCycleRegistration)...)
hc.logMsgEntity(newResName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(oldResName, "rack", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(oldResName, true, oldData)
return
}
if oldData.GetName() != newData.GetName() {
hc.changes = append(hc.changes, logLifeCycle(oldResName, "rack", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(oldResName, "rack.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logLifeCycle(newResName, "rack", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(newResName, "rack.name", oldData.GetName(), newData.GetName())...)
hc.logMsgEntity(oldResName, true, oldData)
hc.logMsgEntity(newResName, false, newData)
return
}
hc.changes = append(hc.changes, logCommon(newResName, "rack.location", oldData.GetLocation(), newData.GetLocation())...)
hc.changes = append(hc.changes, logCommon(newResName, "rack.capacity_ru", oldData.GetCapacityRu(), newData.GetCapacityRu())...)
hc.changes = append(hc.changes, logCommon(newResName, "rack.realm", oldData.GetRealm(), newData.GetRealm())...)
hc.changes = append(hc.changes, logCommon(newResName, "rack.description", oldData.GetDescription(), newData.GetDescription())...)
hc.changes = append(hc.changes, logCommon(newResName, "rack.resource_state", oldData.GetResourceState(), newData.GetResourceState())...)
if newData.GetChromeBrowserRack() != nil {
hc.changes = append(hc.changes, logChromeBrowserRack(newResName, oldData.GetChromeBrowserRack(), newData.GetChromeBrowserRack())...)
}
hc.logMsgEntity(newResName, false, newData)
}
// LogNicChanges logs the change of the given nic.
func (hc *HistoryClient) LogNicChanges(oldData, newData *ufspb.Nic) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.NicCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.NicCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "nic", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "nic", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
if oldData.GetName() != newData.GetName() {
oldResourceName := util.AddPrefix(util.NicCollection, oldData.GetName())
hc.changes = append(hc.changes, logLifeCycle(oldResourceName, "nic", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(oldResourceName, "nic.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logCommon(oldResourceName, "nic.machine", oldData.GetMachine(), newData.GetMachine())...)
hc.changes = append(hc.changes, logLifeCycle(resourceName, "nic", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(resourceName, "nic.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logCommon(resourceName, "nic.machine", oldData.GetMachine(), newData.GetMachine())...)
hc.logMsgEntity(oldResourceName, true, oldData)
hc.logMsgEntity(resourceName, false, newData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "nic.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
hc.changes = append(hc.changes, logCommon(resourceName, "nic.machine", oldData.GetMachine(), newData.GetMachine())...)
hc.changes = append(hc.changes, logCommon(resourceName, "nic.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "nic.rack", oldData.GetRack(), newData.GetRack())...)
hc.changes = append(hc.changes, logSwitchInterface(resourceName, oldData.GetSwitchInterface(), newData.GetSwitchInterface())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogDracChanges logs the change of the given drac.
func (hc *HistoryClient) LogDracChanges(oldData, newData *ufspb.Drac) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.DracCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.DracCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "drac", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "drac", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "drac.display_name", oldData.GetDisplayName(), newData.GetDisplayName())...)
hc.changes = append(hc.changes, logCommon(resourceName, "drac.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
hc.changes = append(hc.changes, logCommon(resourceName, "drac.machine", oldData.GetMachine(), newData.GetMachine())...)
hc.changes = append(hc.changes, logCommon(resourceName, "drac.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "drac.rack", oldData.GetRack(), newData.GetRack())...)
hc.changes = append(hc.changes, logSwitchInterface(resourceName, oldData.GetSwitchInterface(), newData.GetSwitchInterface())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogKVMChanges logs the change of the given kvm.
func (hc *HistoryClient) LogKVMChanges(oldData, newData *ufspb.KVM) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.KVMCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.KVMCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "kvm", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "kvm", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "kvm.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
hc.changes = append(hc.changes, logCommon(resourceName, "kvm.chrome_platform", oldData.GetChromePlatform(), newData.GetChromePlatform())...)
hc.changes = append(hc.changes, logCommon(resourceName, "kvm.capacity_port", oldData.GetCapacityPort(), newData.GetCapacityPort())...)
hc.changes = append(hc.changes, logCommon(resourceName, "kvm.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "kvm.rack", oldData.GetRack(), newData.GetRack())...)
hc.changes = append(hc.changes, logCommon(resourceName, "kvm.description", oldData.GetDescription(), newData.GetDescription())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogSwitchChanges logs the change of the given switch.
func (hc *HistoryClient) LogSwitchChanges(oldData, newData *ufspb.Switch) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.SwitchCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.SwitchCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "switch", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "switch", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
if oldData.GetName() != newData.GetName() {
oldResourceName := util.AddPrefix(util.SwitchCollection, oldData.GetName())
hc.changes = append(hc.changes, logLifeCycle(oldResourceName, "switch", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(oldResourceName, "switch.name", oldData.GetName(), newData.GetName())...)
hc.changes = append(hc.changes, logLifeCycle(resourceName, "switch", LifeCycleRename)...)
hc.changes = append(hc.changes, logCommon(resourceName, "switch.name", oldData.GetName(), newData.GetName())...)
hc.logMsgEntity(oldResourceName, true, oldData)
hc.logMsgEntity(resourceName, false, newData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "switch.description", oldData.GetDescription(), newData.GetDescription())...)
hc.changes = append(hc.changes, logCommon(resourceName, "switch.capacity_port", oldData.GetCapacityPort(), newData.GetCapacityPort())...)
hc.changes = append(hc.changes, logCommon(resourceName, "switch.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "switch.rack", oldData.GetRack(), newData.GetRack())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogRPMChanges logs the change of the given rpms.
func (hc *HistoryClient) LogRPMChanges(oldData, newData *ufspb.RPM) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.RPMCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.RPMCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "rpm", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "rpm", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "rpm.description", oldData.GetDescription(), newData.GetDescription())...)
hc.changes = append(hc.changes, logCommon(resourceName, "rpm.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
hc.changes = append(hc.changes, logCommon(resourceName, "rpm.capacity_port", oldData.GetCapacityPort(), newData.GetCapacityPort())...)
hc.changes = append(hc.changes, logCommon(resourceName, "rpm.zone", approxZone(oldData.GetZone()), approxZone(newData.GetZone()))...)
hc.changes = append(hc.changes, logCommon(resourceName, "rpm.rack", oldData.GetRack(), newData.GetRack())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogVLANChanges logs the change of the given vlan.
func (hc *HistoryClient) LogVLANChanges(oldData, newData *ufspb.Vlan) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.VlanCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.VlanCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "vlan", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "vlan", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "vlan.vlan_address", oldData.GetVlanAddress(), newData.GetVlanAddress())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vlan.description", oldData.GetDescription(), newData.GetDescription())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vlan.reserved_ips", oldData.GetReservedIps(), newData.GetReservedIps())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vlan.zones", oldData.GetZones(), newData.GetZones())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vlan.free_start_ip", oldData.GetFreeStartIpv4Str(), newData.GetFreeStartIpv4Str())...)
hc.changes = append(hc.changes, logCommon(resourceName, "vlan.free_end_ip", oldData.GetFreeEndIpv4Str(), newData.GetFreeEndIpv4Str())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogDutStateChanges logs the change of a dut state record.
func (hc *HistoryClient) LogDutStateChanges(oldData, newData *chromeosLab.DutState) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.DutStateCollection, newData.GetId().GetValue())
if oldData != nil {
resourceName = util.AddPrefix(util.DutStateCollection, oldData.GetId().GetValue())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "dut_state", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "dut_state", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.servo", oldData.GetServo(), newData.GetServo())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.reason", oldData.GetDutStateReason(), newData.GetDutStateReason())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.chameleon", oldData.GetChameleon(), newData.GetChameleon())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.audio_loopback_dongle", oldData.GetAudioLoopbackDongle(), newData.GetAudioLoopbackDongle())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.working_bluetooth_btpeer", oldData.GetWorkingBluetoothBtpeer(), newData.GetWorkingBluetoothBtpeer())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.storage_state", oldData.GetStorageState(), newData.GetStorageState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.servo_usb_state", oldData.GetServoUsbState(), newData.GetServoUsbState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.battery_state", oldData.GetBatteryState(), newData.GetBatteryState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.wifi_state", oldData.GetWifiState(), newData.GetWifiState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.bluetooth_state", oldData.GetBluetoothState(), newData.GetBluetoothState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.rpm_state", oldData.GetRpmState(), newData.GetRpmState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.repair_requests", oldData.GetRepairRequests(), newData.GetRepairRequests())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.realm", oldData.GetRealm(), newData.GetRealm())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.version_info", oldData.GetVersionInfo(), newData.GetVersionInfo())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.dolos", oldData.GetDolosState(), newData.GetDolosState())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.fw_ec_target", oldData.GetFwEcTarget(), newData.GetFwEcTarget())...)
hc.changes = append(hc.changes, logCommon(resourceName, "dut_state.fw_ap_target", oldData.GetFwApTarget(), newData.GetFwApTarget())...)
hc.logMsgEntity(resourceName, false, newData)
}
// LogDHCPChanges logs the change of the given dhcp.
func LogDHCPChanges(oldData, newData *ufspb.DHCPConfig) ([]*ufspb.ChangeEvent, *history.SnapshotMsgEntity) {
changes := make([]*ufspb.ChangeEvent, 0)
if oldData == nil && newData == nil {
return changes, nil
}
resourceName := util.AddPrefix(util.DHCPCollection, newData.GetHostname())
if newData == nil {
resourceName = util.AddPrefix(util.DHCPCollection, oldData.GetHostname())
}
if oldData == nil {
e, _ := history.NewSnapshotMsgEntity(resourceName, false, newData)
return logCommon(resourceName, "dhcp_config.ip", "", newData.GetIp()), e
}
if newData == nil {
oldData.UpdateTime = ptypes.TimestampNow()
e, _ := history.NewSnapshotMsgEntity(resourceName, true, oldData)
return logCommon(resourceName, "dhcp_config.ip", oldData.GetIp(), ""), e
}
changes = append(changes, logCommon(resourceName, "dhcp_config.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
changes = append(changes, logCommon(resourceName, "dhcp_config.ip", oldData.GetIp(), newData.GetIp())...)
changes = append(changes, logCommon(resourceName, "dhcp_config.vlan", oldData.GetVlan(), newData.GetVlan())...)
e, _ := history.NewSnapshotMsgEntity(resourceName, false, newData)
return changes, e
}
// LogIPChanges logs the change of the given ip.
func LogIPChanges(oldData, newData *ufspb.IP) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
if oldData == nil && newData == nil {
return changes
}
var resourceName string
if oldData != nil {
resourceName = util.AddPrefix(util.IPCollection, oldData.GetId())
} else {
resourceName = util.AddPrefix(util.IPCollection, newData.GetId())
}
changes = append(changes, logCommon(resourceName, "ip.occupied", oldData.GetOccupied(), newData.GetOccupied())...)
changes = append(changes, logCommon(resourceName, "ip.reserved", oldData.GetReserve(), newData.GetReserve())...)
return changes
}
// LogStateChanges logs the change of the given state record.
func LogStateChanges(oldData, newData *ufspb.StateRecord) ([]*ufspb.ChangeEvent, *history.SnapshotMsgEntity) {
changes := make([]*ufspb.ChangeEvent, 0)
if oldData == nil && newData == nil {
return changes, nil
}
var resourceName string
if oldData != nil {
resourceName = util.AddPrefix(util.StateCollection, oldData.GetResourceName())
} else {
resourceName = util.AddPrefix(util.StateCollection, newData.GetResourceName())
}
var e *history.SnapshotMsgEntity
if newData != nil {
e, _ = history.NewSnapshotMsgEntity(resourceName, false, newData)
} else {
oldData.UpdateTime = ptypes.TimestampNow()
e, _ = history.NewSnapshotMsgEntity(resourceName, true, oldData)
}
return logCommon(resourceName, "state_record.state", oldData.GetState().String(), newData.GetState().String()), e
}
func logChromeBrowserRack(resourceName string, oldData, newData *ufspb.ChromeBrowserRack) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
// Keep this func for future logging
return changes
}
func logChromeBrowserMachineLse(resourceName string, oldData, newData *ufspb.ChromeBrowserMachineLSE) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine_lse.chrome_browser_machine_lse.vm_capacity", oldData.GetVmCapacity(), newData.GetVmCapacity())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chrome_browser_machine_lse.os_version", oldData.GetOsVersion(), newData.GetOsVersion())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chrome_browser_machine_lse.virtual_datacenter", oldData.GetVirtualDatacenter(), newData.GetVirtualDatacenter())...)
return changes
}
func logChromeOSMachineLse(resourceName string, oldData, newData *ufspb.ChromeOSMachineLSE) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logDut(resourceName, oldData.GetDeviceLse().GetDut(), newData.GetDeviceLse().GetDut())...)
changes = append(changes, logLabstation(resourceName, oldData.GetDeviceLse().GetLabstation(), newData.GetDeviceLse().GetLabstation())...)
changes = append(changes, logSwitchInterface(resourceName, oldData.GetDeviceLse().GetNetworkDeviceInterface(), newData.GetDeviceLse().GetNetworkDeviceInterface())...)
return changes
}
func logDut(resourceName string, oldData, newData *chromeosLab.DeviceUnderTest) []*ufspb.ChangeEvent {
if oldData == nil && newData == nil {
return nil
}
if oldData == nil {
oldData = &chromeosLab.DeviceUnderTest{}
}
if newData == nil {
newData = &chromeosLab.DeviceUnderTest{}
}
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.pools", oldData.GetPools(), newData.GetPools())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.hive", oldData.GetHive(), newData.GetHive())...)
if oldData.GetPeripherals() == nil {
oldData.Peripherals = &chromeosLab.Peripherals{}
}
if newData.GetPeripherals() == nil {
oldData.Peripherals = &chromeosLab.Peripherals{}
}
changes = append(changes, logServo(resourceName, "machine_lse.chromeos_machine_lse.dut.servo", oldData.GetPeripherals().GetServo(), newData.GetPeripherals().GetServo())...)
changes = append(changes, logRPM(resourceName, "machine_lse.chromeos_machine_lse.dut.rpm", oldData.GetPeripherals().GetRpm(), newData.GetPeripherals().GetRpm())...)
// Log chameleon if either of them contains one.
if oldData.GetPeripherals().GetChameleon() != nil || newData.GetPeripherals().GetChameleon() != nil {
oldChameleon := oldData.GetPeripherals().GetChameleon()
newChameleon := newData.GetPeripherals().GetChameleon()
if oldChameleon == nil {
oldChameleon = &chromeosLab.Chameleon{}
}
if newChameleon == nil {
newChameleon = &chromeosLab.Chameleon{}
}
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.chameleon.type", oldChameleon.GetChameleonPeripherals(), newChameleon.GetChameleonPeripherals())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.chameleon.audioboard", oldChameleon.GetAudioBoard(), newChameleon.GetAudioBoard())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.chameleon.audiobox_jackplugger", oldChameleon.GetAudioboxJackplugger(), newChameleon.GetAudioboxJackplugger())...)
}
// Log wifi if either of them contains one.
if oldData.GetPeripherals().GetWifi() != nil || newData.GetPeripherals().GetWifi() != nil {
oldWifi := oldData.GetPeripherals().GetWifi()
newWifi := newData.GetPeripherals().GetWifi()
if oldWifi == nil {
oldWifi = &chromeosLab.Wifi{}
}
if newWifi == nil {
newWifi = &chromeosLab.Wifi{}
}
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.wifi.antennaconn", oldWifi.GetAntennaConn(), newWifi.GetAntennaConn())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.wifi.wificell", oldWifi.GetWificell(), newWifi.GetWificell())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.wifi.router", oldWifi.GetRouter(), newWifi.GetRouter())...)
}
// Log audio if either of them contains one.
if oldData.GetPeripherals().GetAudio() != nil || newData.GetPeripherals().GetAudio() != nil {
oldAudio := oldData.GetPeripherals().GetAudio()
newAudio := newData.GetPeripherals().GetAudio()
if oldAudio == nil {
oldAudio = &chromeosLab.Audio{}
}
if newAudio == nil {
newAudio = &chromeosLab.Audio{}
}
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.audio.box", oldAudio.GetAudioBox(), newAudio.GetAudioBox())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.audio.atrus", oldAudio.GetAtrus(), newAudio.GetAtrus())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.audio.cable", oldAudio.GetAudioCable(), newAudio.GetAudioCable())...)
}
// Log camera box if either of them contains one.
if oldData.GetPeripherals().GetCameraboxInfo() != nil || newData.GetPeripherals().GetCameraboxInfo() != nil {
oldCameraboxInfo := oldData.GetPeripherals().GetCameraboxInfo()
newCameraboxInfo := newData.GetPeripherals().GetCameraboxInfo()
if oldCameraboxInfo == nil {
oldCameraboxInfo = &chromeosLab.Camerabox{}
}
if newCameraboxInfo == nil {
newCameraboxInfo = &chromeosLab.Camerabox{}
}
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.camerabox.facing", oldCameraboxInfo.GetFacing(), newCameraboxInfo.GetFacing())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.camerabox.light", oldCameraboxInfo.GetLight(), newCameraboxInfo.GetLight())...)
}
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.camerabox", oldData.GetPeripherals().GetCamerabox(), newData.GetPeripherals().GetCamerabox())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.carrier", oldData.GetPeripherals().GetCarrier(), newData.GetPeripherals().GetCarrier())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.starfishSlotMapping", oldData.GetPeripherals().GetStarfishSlotMapping(), newData.GetPeripherals().GetStarfishSlotMapping())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.chaos", oldData.GetPeripherals().GetChaos(), newData.GetPeripherals().GetChaos())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.usb.smarthub", oldData.GetPeripherals().GetSmartUsbhub(), newData.GetPeripherals().GetSmartUsbhub())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.camera.type", oldData.GetPeripherals().GetConnectedCamera(), newData.GetPeripherals().GetConnectedCamera())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.cable.type", oldData.GetPeripherals().GetCable(), newData.GetPeripherals().GetCable())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.dut.touch.mimo", oldData.GetPeripherals().GetTouch(), newData.GetPeripherals().GetTouch())...)
return changes
}
func logServo(resourceName, labelPrefix string, oldServo, newServo *chromeosLab.Servo) []*ufspb.ChangeEvent {
if oldServo == nil && newServo == nil {
return nil
}
changes := make([]*ufspb.ChangeEvent, 0)
if oldServo == nil {
oldServo = &chromeosLab.Servo{}
}
if newServo == nil {
newServo = &chromeosLab.Servo{}
}
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.hostname", labelPrefix), oldServo.GetServoHostname(), newServo.GetServoHostname())...)
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.port", labelPrefix), oldServo.GetServoPort(), newServo.GetServoPort())...)
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.serial", labelPrefix), oldServo.GetServoSerial(), newServo.GetServoSerial())...)
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.setup", labelPrefix), oldServo.GetServoSetup(), newServo.GetServoSetup())...)
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.type", labelPrefix), oldServo.GetServoType(), newServo.GetServoType())...)
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.doccker_container", labelPrefix), oldServo.GetDockerContainerName(), newServo.GetDockerContainerName())...)
return changes
}
func logRPM(resourceName, labelPrefix string, oldRpm, newRpm *chromeosLab.OSRPM) []*ufspb.ChangeEvent {
if oldRpm == nil && newRpm == nil {
return nil
}
changes := make([]*ufspb.ChangeEvent, 0)
if oldRpm == nil {
oldRpm = &chromeosLab.OSRPM{}
}
if newRpm == nil {
newRpm = &chromeosLab.OSRPM{}
}
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.name", labelPrefix), oldRpm.GetPowerunitName(), newRpm.GetPowerunitName())...)
changes = append(changes, logCommon(resourceName, fmt.Sprintf("%s.outlet", labelPrefix), oldRpm.GetPowerunitOutlet(), newRpm.GetPowerunitOutlet())...)
return changes
}
func logLabstation(resourceName string, oldData, newData *chromeosLab.Labstation) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.labstation.pools", oldData.GetPools(), newData.GetPools())...)
changes = append(changes, logCommon(resourceName, "machine_lse.chromeos_machine_lse.labstation.servos", oldData.GetServos(), newData.GetServos())...)
// Log labstation rpm changes.
changes = append(changes, logRPM(resourceName, "machine_lse.chromeos_machine_lse.labstation.rpm", oldData.GetRpm(), newData.GetRpm())...)
return changes
}
func logChromeBrowserMachine(resourceName string, oldData, newData *ufspb.ChromeBrowserMachine) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine.chrome_browser_machine.display_name", oldData.GetDisplayName(), newData.GetDisplayName())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_browser_machine.chrome_platform", oldData.GetChromePlatform(), newData.GetChromePlatform())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_browser_machine.deployment_ticket", oldData.GetDeploymentTicket(), newData.GetDeploymentTicket())...)
changes = append(changes, logKVMInterface(resourceName, oldData.GetKvmInterface(), newData.GetKvmInterface())...)
changes = append(changes, logRPMInterface(resourceName, oldData.GetRpmInterface(), newData.GetRpmInterface())...)
return changes
}
func logChromeOSMachine(resourceName string, oldData, newData *ufspb.ChromeOSMachine) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.reference_board", oldData.GetReferenceBoard(), newData.GetReferenceBoard())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.build_target", oldData.GetBuildTarget(), newData.GetBuildTarget())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.model", oldData.GetModel(), newData.GetModel())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.google_code_name", oldData.GetGoogleCodeName(), newData.GetGoogleCodeName())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.mac_address", oldData.GetMacAddress(), newData.GetMacAddress())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.sku", oldData.GetSku(), newData.GetSku())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.phase", oldData.GetPhase(), newData.GetPhase())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.cost_center", oldData.GetCostCenter(), newData.GetCostCenter())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.hwid", oldData.GetHwid(), newData.GetHwid())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.device_type", oldData.GetDeviceType(), newData.GetDeviceType())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.gpn", oldData.GetGpn(), newData.GetGpn())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.hw_x_compliance_version", oldData.GetHwXComplianceVersion(), newData.GetHwXComplianceVersion())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.is_cbx", oldData.GetIsCbx(), newData.GetIsCbx())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.cbx_feature_type", oldData.GetCbxFeatureType(), newData.GetCbxFeatureType())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.is_mixed_x", oldData.GetIsMixedX(), newData.GetIsMixedX())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.has_wifi_bt", oldData.GetHasWifiBt(), newData.GetHasWifiBt())...)
changes = append(changes, logCommon(resourceName, "machine.chrome_os_machine.wifi_bluetooth", oldData.GetWifiBluetooth(), newData.GetWifiBluetooth())...)
return changes
}
func logKVMInterface(resourceName string, oldData, newData *ufspb.KVMInterface) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine.chrome_browser_machine.kvm_interface.kvm", oldData.GetKvm(), newData.GetKvm())...)
return append(changes, logCommon(resourceName, "machine.chrome_browser_machine.kvm_interface.port", oldData.GetPortName(), newData.GetPortName())...)
}
func logRPMInterface(resourceName string, oldData, newData *ufspb.RPMInterface) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "machine.chrome_browser_machine.rpm_interface.rpm", oldData.GetRpm(), newData.GetRpm())...)
return append(changes, logCommon(resourceName, "machine.chrome_browser_machine.rpm_interface.port", oldData.GetPortName(), newData.GetPortName())...)
}
func logSwitchInterface(resourceName string, oldData, newData *ufspb.SwitchInterface) []*ufspb.ChangeEvent {
changes := make([]*ufspb.ChangeEvent, 0)
changes = append(changes, logCommon(resourceName, "switch_interface.switch", oldData.GetSwitch(), newData.GetSwitch())...)
return append(changes, logCommon(resourceName, "switch_interface.port", oldData.GetPortName(), newData.GetPortName())...)
}
// logCachingServiceChanges logs the change of the given CachingService.
func (hc *HistoryClient) logCachingServiceChanges(oldData, newData *ufspb.CachingService) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.CachingServiceCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.CachingServiceCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "cachingservice", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "cachingservice", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "cachingservice.port", oldData.GetPort(), newData.GetPort())...)
hc.changes = append(hc.changes, logCommon(resourceName, "cachingservice.serving_subnet", oldData.GetServingSubnet(), newData.GetServingSubnet())...)
hc.changes = append(hc.changes, logCommon(resourceName, "cachingservice.primary_node", oldData.GetPrimaryNode(), newData.GetPrimaryNode())...)
hc.changes = append(hc.changes, logCommon(resourceName, "cachingservice.secondary_node", oldData.GetSecondaryNode(), newData.GetSecondaryNode())...)
hc.changes = append(hc.changes, logCommon(resourceName, "cachingservice.state", oldData.GetState().String(), newData.GetState().String())...)
hc.changes = append(hc.changes, logCommon(resourceName, "cachingservice.description", oldData.GetDescription(), newData.GetDescription())...)
hc.logMsgEntity(resourceName, false, newData)
}
// logSchedulingUnitChanges logs the change of the given SchedulingUnit.
func (hc *HistoryClient) logSchedulingUnitChanges(oldData, newData *ufspb.SchedulingUnit) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.SchedulingUnitCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.SchedulingUnitCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "schedulingunit", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "schedulingunit", LifeCycleRetire)...)
oldData.UpdateTime = ptypes.TimestampNow()
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "schedulingunit.pools", oldData.GetPools(), newData.GetPools())...)
hc.changes = append(hc.changes, logCommon(resourceName, "schedulingunit.type", oldData.GetType().String(), newData.GetType().String())...)
hc.changes = append(hc.changes, logCommon(resourceName, "schedulingunit.machinelses", oldData.GetMachineLSEs(), newData.GetMachineLSEs())...)
hc.changes = append(hc.changes, logCommon(resourceName, "schedulingunit.tags", oldData.GetTags(), newData.GetTags())...)
hc.changes = append(hc.changes, logCommon(resourceName, "schedulingunit.description", oldData.GetDescription(), newData.GetDescription())...)
hc.logMsgEntity(resourceName, false, newData)
}
// logDefaultWifiChanges logs the change of the given DefaultWifi.
func (hc *HistoryClient) logDefaultWifiChanges(oldData, newData *ufspb.DefaultWifi) {
if oldData == nil && newData == nil {
return
}
resourceName := util.AddPrefix(util.DefaultWifiCollection, newData.GetName())
if newData == nil {
resourceName = util.AddPrefix(util.DefaultWifiCollection, oldData.GetName())
}
if oldData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "defaultwifi", LifeCycleRegistration)...)
hc.logMsgEntity(resourceName, false, newData)
return
}
if newData == nil {
hc.changes = append(hc.changes, logLifeCycle(resourceName, "defaultwifi", LifeCycleRetire)...)
hc.logMsgEntity(resourceName, true, oldData)
return
}
hc.changes = append(hc.changes, logCommon(resourceName, "defaultwifi.secret.project_id", oldData.GetWifiSecret().GetProjectId(), newData.GetWifiSecret().GetProjectId())...)
hc.changes = append(hc.changes, logCommon(resourceName, "defaultwifi.secret.secret_name", oldData.GetWifiSecret().GetSecretName(), newData.GetWifiSecret().GetSecretName())...)
hc.logMsgEntity(resourceName, false, newData)
}
func logCommon(resourceName, label string, oldValue interface{}, newValue interface{}) []*ufspb.ChangeEvent {
oldValueStr := fmt.Sprintf("%v", oldValue)
newValueStr := fmt.Sprintf("%v", newValue)
if oldValueStr == newValueStr {
return nil
}
return []*ufspb.ChangeEvent{
{
Name: resourceName,
EventLabel: label,
OldValue: oldValueStr,
NewValue: newValueStr,
},
}
}
func approxZone(zone string) string {
if zone == "" {
return ufspb.Zone_ZONE_UNSPECIFIED.String()
}
return zone
}
func approxState(s string) string {
if s == "" {
return ufspb.State_STATE_UNSPECIFIED.String()
}
return s
}