| // 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(sgPublishSb, devKey.Key()) |
| devRow := db.CollectionForId(sbmodel.CollectionId(devKey)).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} |
| if _, err := db.Syncgroup(devSgName).Join(ctx, sgMemberInfo); err != nil { |
| return nil, err |
| } |
| |
| return devKey, devRow.Put(ctx, &devVal) |
| } |