Skip to content

Commit cdd8dfe

Browse files
authored
Merge pull request #93 from iptecharch/convert-tv-set-rpc
convert values written via the Set RPC
2 parents c03d6fc + 6154640 commit cdd8dfe

File tree

5 files changed

+51
-18
lines changed

5 files changed

+51
-18
lines changed

client/cmd/datastore_create.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"fmt"
1010
"os"
1111

12+
"github.com/iptecharch/data-server/pkg/datastore"
1213
sdcpb "github.com/iptecharch/sdc-protos/sdcpb"
1314
"github.com/spf13/cobra"
1415
"google.golang.org/protobuf/encoding/prototext"
@@ -96,7 +97,7 @@ func init() {
9697

9798
datastoreCreateCmd.Flags().StringVarP(&target, "target", "", "", "target definition file")
9899
datastoreCreateCmd.Flags().StringVarP(&syncFile, "sync", "", "", "target sync definition file")
99-
datastoreCreateCmd.Flags().StringVarP(&owner, "owner", "", "", "candidate owner")
100-
datastoreCreateCmd.Flags().Int32VarP(&priority, "priority", "", 0, "candidate priority")
100+
datastoreCreateCmd.Flags().StringVarP(&owner, "owner", "", datastore.DefaultOwner, "candidate owner")
101+
datastoreCreateCmd.Flags().Int32VarP(&priority, "priority", "", 1, "candidate priority")
101102

102103
}

pkg/datastore/data_rpc.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ import (
2424
"github.com/iptecharch/data-server/pkg/utils"
2525
)
2626

27+
const (
28+
// to be used for candidates created without an owner
29+
DefaultOwner = "__sdcio"
30+
)
31+
2732
func (d *Datastore) Get(ctx context.Context, req *sdcpb.GetDataRequest, nCh chan *sdcpb.GetDataResponse) error {
2833
defer close(nCh)
2934
switch req.GetDatastore().GetType() {
@@ -484,6 +489,11 @@ func (d *Datastore) validateUpdate(ctx context.Context, upd *sdcpb.Update) error
484489
if err != nil {
485490
return err
486491
}
492+
// 2. convert value to its YANG type
493+
upd.Value, err = convertTypedValueToYANGType(rsp.GetSchema(), upd.GetValue())
494+
if err != nil {
495+
return err
496+
}
487497
// 2. validate value
488498
val, err := utils.GetSchemaValue(upd.GetValue())
489499
if err != nil {
@@ -1282,15 +1292,19 @@ func (d *Datastore) convertTypedValueToProto(ctx context.Context, p *sdcpb.Path,
12821292
if err != nil {
12831293
return nil, err
12841294
}
1295+
return convertTypedValueToYANGType(rsp.GetSchema(), tv)
1296+
}
1297+
1298+
func convertTypedValueToYANGType(schemaElem *sdcpb.SchemaElem, tv *sdcpb.TypedValue) (*sdcpb.TypedValue, error) {
12851299
switch {
1286-
case rsp.GetSchema().GetContainer() != nil:
1287-
if rsp.GetSchema().GetContainer().IsPresence {
1300+
case schemaElem.GetContainer() != nil:
1301+
if schemaElem.GetContainer().IsPresence {
12881302
return &sdcpb.TypedValue{
12891303
Timestamp: tv.GetTimestamp(),
12901304
Value: &sdcpb.TypedValue_JsonVal{JsonVal: nil},
12911305
}, nil
12921306
}
1293-
case rsp.GetSchema().GetLeaflist() != nil:
1307+
case schemaElem.GetLeaflist() != nil:
12941308
switch tv.Value.(type) {
12951309
case *sdcpb.TypedValue_LeaflistVal:
12961310
return tv, nil
@@ -1303,8 +1317,8 @@ func (d *Datastore) convertTypedValueToProto(ctx context.Context, p *sdcpb.Path,
13031317
},
13041318
},
13051319
}, nil
1306-
case rsp.GetSchema().GetField() != nil:
1307-
switch rsp.GetSchema().GetField().GetType().GetType() {
1320+
case schemaElem.GetField() != nil:
1321+
switch schemaElem.GetField().GetType().GetType() {
13081322
default:
13091323
return tv, nil
13101324
case "string", "identityref":

pkg/datastore/datastore_rpc.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,15 @@ func (d *Datastore) Discard(ctx context.Context, req *sdcpb.DiscardRequest) erro
262262
}
263263

264264
func (d *Datastore) CreateCandidate(ctx context.Context, ds *sdcpb.DataStore) error {
265+
if ds.GetPriority() < 0 {
266+
return fmt.Errorf("invalid priority value must be >0")
267+
}
268+
if ds.GetPriority() <= 0 {
269+
ds.Priority = 1
270+
}
271+
if ds.GetOwner() == "" {
272+
ds.Owner = DefaultOwner
273+
}
265274
return d.cacheClient.CreateCandidate(ctx, d.Name(), ds.GetName(), ds.GetOwner(), ds.GetPriority())
266275
}
267276

pkg/server/datastore.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package server
33
import (
44
"context"
55
"fmt"
6+
"math"
7+
"strings"
68
"time"
79

810
sdcpb "github.com/iptecharch/sdc-protos/sdcpb"
@@ -52,7 +54,11 @@ func (s *Server) GetDataStore(ctx context.Context, req *sdcpb.GetDataStoreReques
5254
func (s *Server) CreateDataStore(ctx context.Context, req *sdcpb.CreateDataStoreRequest) (*sdcpb.CreateDataStoreResponse, error) {
5355
log.Debugf("Received CreateDataStoreRequest: %v", req)
5456
name := req.GetName()
55-
if name == "" {
57+
lName := len(name)
58+
if lName == 0 {
59+
return nil, status.Error(codes.InvalidArgument, "missing datastore name attribute")
60+
}
61+
if lName > math.MaxUint16 {
5662
return nil, status.Error(codes.InvalidArgument, "missing datastore name attribute")
5763
}
5864
switch {
@@ -66,6 +72,17 @@ func (s *Server) CreateDataStore(ctx context.Context, req *sdcpb.CreateDataStore
6672
}
6773
switch req.GetDatastore().GetType() {
6874
case sdcpb.Type_CANDIDATE:
75+
owner := req.GetDatastore().GetOwner()
76+
lOwner := len(owner)
77+
if lOwner == 0 {
78+
return nil, status.Error(codes.InvalidArgument, "missing owner name attribute")
79+
}
80+
if lOwner > math.MaxUint16 {
81+
return nil, status.Errorf(codes.InvalidArgument, "owner name too long(%d>%d)", lOwner, math.MaxUint16)
82+
}
83+
if strings.HasPrefix(owner, "__") {
84+
return nil, status.Error(codes.InvalidArgument, "owner name cannot start with `__`")
85+
}
6986
err := ds.CreateCandidate(ctx, req.GetDatastore())
7087
if err != nil {
7188
return nil, status.Errorf(codes.Internal, "%v", err)
@@ -310,13 +327,5 @@ func (s *Server) datastoreToRsp(ctx context.Context, ds *datastore.Datastore) (*
310327
Vendor: ds.Config().Schema.Vendor,
311328
Version: ds.Config().Schema.Version,
312329
}
313-
// for _, cand := range cands {
314-
// rsp.Datastore = append(rsp.Datastore,
315-
// &sdcpb.DataStore{
316-
// Type: *sdcpb.Type_CANDIDATE.Enum(),
317-
// Name: cand,
318-
// },
319-
// )
320-
// }
321330
return rsp, nil
322331
}

pkg/utils/value.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ func GetSchemaValue(updValue *sdcpb.TypedValue) (interface{}, error) {
7171
value = updValue.GetBytesVal()
7272
// case *sdcpb.TypedValue_DecimalVal:
7373
// value = updValue.GetDecimalVal()
74-
// case *sdcpb.TypedValue_FloatVal:
75-
// value = updValue.GetFloatVal()
74+
case *sdcpb.TypedValue_FloatVal:
75+
value = updValue.GetFloatVal()
7676
// case *sdcpb.TypedValue_DoubleVal:
7777
// value = updValue.GetDoubleVal()
7878
case *sdcpb.TypedValue_IntVal:

0 commit comments

Comments
 (0)