blob: ee266e323cd150aeda2fcff293d97e0b62f89cc0 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Client methods for measuring device configuration.
package client
import (
"fmt"
"v.io/v23/context"
nosql_wire "v.io/v23/services/syncbase/nosql"
"v.io/v23/syncbase/nosql"
"v.io/v23/verror"
"v.io/x/sensorlog_lite/internal/config"
"v.io/x/sensorlog_lite/internal/sbmodel"
"v.io/x/sensorlog_lite/internal/sbmodel/keyutil"
)
// AddDevice joins the syncgroup of the measuring device identified by devId,
// expected to be published at sgPublishSb, and makes it available for stream
// configuration.
func AddDevice(ctx *context.T, db nosql.Database, devId, sgPublishSb, desc string) (*sbmodel.KDeviceCfg, error) {
if err := keyutil.ValidateId(devId); err != nil {
return nil, fmt.Errorf("invalid devId: %v", err)
}
devKey := sbmodel.KDeviceCfg{
DevId: devId,
}
if desc == "" {
desc = "device:" + devKey.Key()
}
devVal := sbmodel.VDeviceCfg{
Desc: desc,
SgPublishSb: sgPublishSb,
}
devSgName := config.SyncgroupName(sgPublishSb, devKey.Key())
devRow := db.Table(devKey.Table()).Row(devKey.Key())
if exists, err := devRow.Exists(ctx); err != nil {
return nil, err
} else if exists {
return nil, verror.New(verror.ErrExist, ctx, "Device '"+devKey.Key()+"' was already added")
}
// TODO(ivanpi): Lack of atomicity here can result in a duplicate join, not
// really relevant until syncgroup Leave is implemented.
sgMemberInfo := nosql_wire.SyncgroupMemberInfo{SyncPriority: config.SyncPriority}
if _, err := db.Syncgroup(devSgName).Join(ctx, sgMemberInfo); err != nil {
return nil, err
}
return &devKey, devRow.Put(ctx, &devVal)
}