blob: d0d5c37e78a487a2a0d5c122920b8a570ac238e0 [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"
wire "v.io/v23/services/syncbase"
"v.io/v23/syncbase"
"v.io/v23/verror"
"v.io/x/sensorlog/internal/config"
"v.io/x/sensorlog/internal/sbmodel"
"v.io/x/sensorlog/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 syncbase.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(devKey.Key())
devRow := db.Collection(ctx, devKey.Collection()).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 := wire.SyncgroupMemberInfo{SyncPriority: config.SyncPriority}
sgId := wire.Id{Name: devSgName, Blessing: "blessing"}
if _, err := db.SyncgroupForId(sgId).Join(ctx, sgPublishSb, nil, sgMemberInfo); err != nil {
return nil, err
}
return devKey, devRow.Put(ctx, &devVal)
}