Skip to content

Commit

Permalink
dr: Change response to list
Browse files Browse the repository at this point in the history
  • Loading branch information
Vlad Vitan committed Aug 7, 2024
1 parent 4c42a25 commit 1d59efb
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 11 deletions.
2 changes: 1 addition & 1 deletion pkg/devicerepository/grpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func (s *mockStore) GetTemplate(
return s.template, s.err
}

func (s *mockStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest) (*ttnpb.EndDeviceProvisioningInfo, error) {
func (s *mockStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest) (*store.ListProvisioningInfoResponse, error) {
panic("implement me")
return nil, nil
}
Expand Down
25 changes: 18 additions & 7 deletions pkg/devicerepository/store/bleve/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ func (s *bleveStore) GetTemplate(req *ttnpb.GetTemplateRequest, _ *store.EndDevi
}

// GetProvisioningInfo retrieves end device information by vendor ID and vendor profile ID.
func (s *bleveStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest) (*ttnpb.EndDeviceProvisioningInfo, error) {
func (s *bleveStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest) (*store.ListProvisioningInfoResponse, error) {
if req.VendorID == 0 || req.VendorProfileID == 0 {
return nil, errMissingIdentifiers
}
Expand Down Expand Up @@ -276,13 +276,24 @@ func (s *bleveStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest)
"vendor_profile_id", req.VendorProfileID)
}

model, err := s.retrieve(result.Hits[0], "ProvisioningInfoJSON", func() any { return &ttnpb.EndDeviceProvisioningInfo{} })
if err != nil {
return nil, err
models := make([]*ttnpb.EndDeviceProvisioningInfo, 0, len(result.Hits))
for _, hit := range result.Hits {
model, err := s.retrieve(hit, "ListProvisioningInfoResponse", func() any { return &ttnpb.EndDeviceProvisioningInfo{} })
if err != nil {
return nil, err
}
pb := &ttnpb.EndDeviceProvisioningInfo{}
if err := pb.SetFields(model.(*ttnpb.EndDeviceProvisioningInfo), req.Paths...); err != nil {
return nil, err
}
models = append(models, pb)
}
provisioningInfo := model.(*ttnpb.EndDeviceProvisioningInfo)

return provisioningInfo, nil
return &store.ListProvisioningInfoResponse{
Count: uint32(len(result.Hits)),
Total: uint32(result.Total),
Offset: uint32(searchRequest.From),
ProvisioningInfo: models,
}, nil
}

// GetUplinkDecoder retrieves the codec for decoding uplink messages.
Expand Down
9 changes: 8 additions & 1 deletion pkg/devicerepository/store/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,13 @@ type ListProvisioningInfoRequest struct {
Search string
}

type ListProvisioningInfoResponse struct {
Count,
Offset,
Total uint32
ProvisioningInfo []*ttnpb.EndDeviceProvisioningInfo
}

// Store contains end device definitions.
type Store interface {
// GetBrands lists available end device vendors.
Expand All @@ -102,7 +109,7 @@ type Store interface {
// GetTemplate retrieves an end device template for an end device definition.
GetTemplate(*ttnpb.GetTemplateRequest, *EndDeviceProfile) (*ttnpb.EndDeviceTemplate, error)
// GetProvisioningInfo retrieves end device information by vendor ID and vendor profile ID.
ListProvisioningInfo(ListProvisioningInfoRequest) (*ttnpb.EndDeviceProvisioningInfo, error)
ListProvisioningInfo(ListProvisioningInfoRequest) (*ListProvisioningInfoResponse, error)
// GetUplinkDecoder retrieves the codec for decoding uplink messages.
GetUplinkDecoder(GetCodecRequest) (*ttnpb.MessagePayloadDecoder, error)
// GetDownlinkDecoder retrieves the codec for decoding downlink messages.
Expand Down
43 changes: 41 additions & 2 deletions pkg/devicerepository/store/remote/remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -316,11 +316,50 @@ func (s *remoteStore) GetTemplate(req *ttnpb.GetTemplateRequest, profile *store.
}

// GetProvisioningInfo retrieves end device information by vendor ID and vendor profile ID.
func (s *remoteStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest) (*ttnpb.EndDeviceProvisioningInfo, error) {
panic("implement me")
func (s *remoteStore) ListProvisioningInfo(req store.ListProvisioningInfoRequest) (*store.ListProvisioningInfoResponse, error) {
return nil, nil
}

// listModelsByVendor gets available end device models by a single vendor ID.
func (s *remoteStore) listModelsByVendor(req store.GetModelsRequest) (*store.GetModelsResponse, error) {
b, err := s.fetcher.File("vendor", req.BrandID, "index.yaml")
if err != nil {
return nil, errBrandNotFound.WithAttributes("brand_id", req.BrandID)
}
index := VendorEndDevicesIndex{}
if err := yaml.Unmarshal(b, &index); err != nil {
return nil, err
}
start, end := paginate(len(index.EndDevices), req.Limit, req.Page)

models := make([]*ttnpb.EndDeviceModel, 0, end-start)
for idx := start; idx < end; idx++ {
modelID := index.EndDevices[idx]
if req.ModelID != "" && modelID != req.ModelID {
continue
}
b, err := s.fetcher.File("vendor", req.BrandID, modelID+".yaml")
if err != nil {
return nil, err
}
model := EndDeviceModel{}
if err := yaml.Unmarshal(b, &model); err != nil {
return nil, err
}
pb, err := model.ToPB(req.BrandID, modelID, req.Paths...)
if err != nil {
return nil, err
}
models = append(models, pb)
}
return &store.GetModelsResponse{
Count: end - start,
Offset: start,
Total: uint32(len(index.EndDevices)),
Models: models,
}, nil
}

var errNoCodec = errors.DefineNotFound("no_codec", "no codec defined for firmware version `{firmware_version}` and band `{band_id}`")

func (s *remoteStore) getCodecs(ids *ttnpb.EndDeviceVersionIdentifiers) (*EndDeviceCodecs, error) {
Expand Down
14 changes: 14 additions & 0 deletions pkg/devicerepository/store/remote/remote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,20 @@ func TestRemoteStore(t *testing.T) {
})
})

t.Run("TestListProvisioningInfo", func(t *testing.T) {
provisioningInfo, err := s.ListProvisioningInfo(
store.ListProvisioningInfoRequest{
VendorID: 42,
VendorProfileID: 3,
})
a.So(err, should.BeNil)

a.So(provisioningInfo, should.Resemble, &ttnpb.EndDeviceProvisioningInfo{
EndDeviceModel: &ttnpb.EndDeviceModel{},
EndDeviceTemplate: &ttnpb.EndDeviceTemplate{},
})
})

t.Run("TestGetCodecs", func(t *testing.T) {
t.Run("Missing", func(t *testing.T) {
a := assertions.New(t)
Expand Down

0 comments on commit 1d59efb

Please sign in to comment.