Skip to content

Commit

Permalink
Refactor AppliedConfiguration to remove runtime locking
Browse files Browse the repository at this point in the history
  • Loading branch information
Danielius1922 committed Jul 1, 2024
1 parent 7f806c3 commit 95b14d1
Show file tree
Hide file tree
Showing 22 changed files with 174 additions and 150 deletions.
6 changes: 3 additions & 3 deletions snippet-service/pb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,16 @@
<a name="snippetservice-pb-AppliedConfiguration"></a>

### AppliedConfiguration
TODO naming



| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [string](#string) | | @gotags: bson:&#34;_id&#34; |
| id | [string](#string) | | |
| device_id | [string](#string) | | @gotags: bson:&#34;deviceId&#34; |
| configuration_id | [AppliedConfiguration.RelationTo](#snippetservice-pb-AppliedConfiguration-RelationTo) | | @gotags: bson:&#34;configurationId&#34; |
| on_demand | [bool](#bool) | | |
| condition_id | [AppliedConfiguration.RelationTo](#snippetservice-pb-AppliedConfiguration-RelationTo) | | @gotags: bson:&#34;conditionId&#34; //TODO Naming |
| condition_id | [AppliedConfiguration.RelationTo](#snippetservice-pb-AppliedConfiguration-RelationTo) | | @gotags: bson:&#34;conditionId&#34; |
| resources | [AppliedConfiguration.Resource](#snippetservice-pb-AppliedConfiguration-Resource) | repeated | TODO naming |
| owner | [string](#string) | | |
| timestamp | [int64](#int64) | | Unix timestamp in ns when the applied device configuration has been created/updated |
Expand Down
30 changes: 11 additions & 19 deletions snippet-service/pb/appliedConfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,52 +99,44 @@ func (r *AppliedConfiguration_Resource) MarshalBSON() ([]byte, error) {
return pkgMongo.MarshalProtoBSON(r, nil)
}

func (c *AppliedConfiguration) Clone() *AppliedConfiguration {
func (c *AppliedConfiguration) CloneExecutedBy() isAppliedConfiguration_ExecutedBy {
var executedBy isAppliedConfiguration_ExecutedBy
if c.GetOnDemand() {
executedBy = MakeExecutedByOnDemand()
} else if rt := c.GetConditionId(); rt != nil {
executedBy = MakeExecutedByConditionId(rt.GetId(), rt.GetVersion())
}
return executedBy
}

func (c *AppliedConfiguration) CloneAppliedConfiguration_Resources() []*AppliedConfiguration_Resource {
var resources []*AppliedConfiguration_Resource
if len(c.GetResources()) > 0 {
resources = make([]*AppliedConfiguration_Resource, 0, len(c.GetResources()))
for _, r := range c.GetResources() {
resources = append(resources, r.Clone())
}
}
return resources
}

func (c *AppliedConfiguration) Clone() *AppliedConfiguration {
return &AppliedConfiguration{
Id: c.GetId(),
DeviceId: c.GetDeviceId(),
ConfigurationId: c.GetConfigurationId().Clone(),
ExecutedBy: executedBy,
Resources: resources,
ExecutedBy: c.CloneExecutedBy(),
Resources: c.CloneAppliedConfiguration_Resources(),
Owner: c.GetOwner(),
Timestamp: c.GetTimestamp(),
}
}

func renameKey(json map[string]interface{}, oldKey, newKey string) {
if v, ok := json[oldKey]; ok {
json[newKey] = v
delete(json, oldKey)
}
}

func (c *AppliedConfiguration) jsonToBSONTag(json map[string]interface{}) {
renameKey(json, "id", "_id")
pkgMongo.ConvertStringValueToInt(json, "configurationId.version")
pkgMongo.ConvertStringValueToInt(json, "conditionId.version")
}

func (c *AppliedConfiguration) bsonToJSONTag(json map[string]interface{}) {
renameKey(json, "_id", "id")
}

func (c *AppliedConfiguration) UnmarshalBSON(data []byte) error {
return pkgMongo.UnmarshalProtoBSON(data, c, c.bsonToJSONTag)
}

func (c *AppliedConfiguration) MarshalBSON() ([]byte, error) {
return pkgMongo.MarshalProtoBSON(c, c.jsonToBSONTag)
}
6 changes: 3 additions & 3 deletions snippet-service/pb/doc.html
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ <h2 id="snippet-service/pb/service.proto">snippet-service/pb/service.proto</h2><


<h3 id="snippetservice.pb.AppliedConfiguration">AppliedConfiguration</h3>
<p>TODO naming</p>
<p></p>


<table class="field-table">
Expand All @@ -290,7 +290,7 @@ <h3 id="snippetservice.pb.AppliedConfiguration">AppliedConfiguration</h3>
<td>id</td>
<td><a href="#string">string</a></td>
<td></td>
<td><p>@gotags: bson:&#34;_id&#34; </p></td>
<td><p> </p></td>
</tr>

<tr>
Expand Down Expand Up @@ -318,7 +318,7 @@ <h3 id="snippetservice.pb.AppliedConfiguration">AppliedConfiguration</h3>
<td>condition_id</td>
<td><a href="#snippetservice.pb.AppliedConfiguration.RelationTo">AppliedConfiguration.RelationTo</a></td>
<td></td>
<td><p>@gotags: bson:&#34;conditionId&#34; //TODO Naming </p></td>
<td><p>@gotags: bson:&#34;conditionId&#34; </p></td>
</tr>

<tr>
Expand Down
2 changes: 1 addition & 1 deletion snippet-service/pb/service.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions snippet-service/pb/service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ message DeleteConfigurationsRequest {
}
message DeleteConfigurationsResponse { int64 count = 1; }

message AppliedConfiguration { //TODO naming
message AppliedConfiguration {
message Resource {
string href = 1;
// Reused from invoke command or generated. Can be used to retrieve corresponding pending command.
Expand All @@ -140,7 +140,7 @@ message AppliedConfiguration { //TODO naming
// Unix nanoseconds timestamp for resource in PENDING status, until which the pending update is valid
int64 valid_until = 5; // @gotags: bson:"validUntil,omitempty"
}
string id = 1; // @gotags: bson:"_id"
string id = 1;
string device_id = 2; // @gotags: bson:"deviceId"
message RelationTo { //TODO naming
string id = 1;
Expand All @@ -149,7 +149,7 @@ message AppliedConfiguration { //TODO naming
RelationTo configuration_id = 3; // @gotags: bson:"configurationId"
oneof executed_by {
bool on_demand = 4;
RelationTo condition_id = 5; // @gotags: bson:"conditionId" //TODO Naming
RelationTo condition_id = 5; // @gotags: bson:"conditionId"
}
repeated Resource resources = 6; //TODO naming
string owner = 7;
Expand Down
8 changes: 3 additions & 5 deletions snippet-service/pb/service.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -639,8 +639,7 @@
"type": "object",
"properties": {
"id": {
"type": "string",
"title": "@gotags: bson:\"_id\""
"type": "string"
},
"deviceId": {
"type": "string",
Expand All @@ -655,7 +654,7 @@
},
"conditionId": {
"$ref": "#/definitions/AppliedConfigurationRelationTo",
"title": "@gotags: bson:\"conditionId\" //TODO Naming"
"title": "@gotags: bson:\"conditionId\""
},
"resources": {
"type": "array",
Expand All @@ -673,8 +672,7 @@
"format": "int64",
"title": "Unix timestamp in ns when the applied device configuration has been created/updated"
}
},
"title": "TODO naming"
}
},
"pbAppliedConfigurationResource": {
"type": "object",
Expand Down
4 changes: 2 additions & 2 deletions snippet-service/service/grpc/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -327,8 +327,8 @@ func (s *SnippetServiceServer) GetAppliedConfigurations(req *pb.GetAppliedConfig
req.ConditionIdFilter = append(req.GetConditionIdFilter(), req.ConvertHTTPConditionIdFilter()...)
req.ConfigurationIdFilter = append(req.GetConfigurationIdFilter(), req.ConvertHTTPConfigurationIdFilter()...)

err = s.store.GetAppliedConfigurations(srv.Context(), owner, req, func(c *pb.AppliedConfiguration) error {
return srv.Send(c)
err = s.store.GetAppliedConfigurations(srv.Context(), owner, req, func(c *store.AppliedConfiguration) error {
return srv.Send(c.GetAppliedConfiguration())
})
if err != nil {
return s.logger.LogAndReturnError(status.Errorf(codes.Internal, "%v", errCannotGetAppliedConfigurations(err)))
Expand Down
4 changes: 2 additions & 2 deletions snippet-service/service/http/getAppliedConfigurations_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,8 @@ func TestRequestHandlerGetAppliedConfigurations(t *testing.T) {

stored := make(map[string]*pb.AppliedConfiguration)
for _, ac := range appliedConfs {
if tt.want(ac) {
stored[ac.GetId()] = ac
if tt.want(ac.GetAppliedConfiguration()) {
stored[ac.GetId()] = ac.GetAppliedConfiguration().Clone()
}
}
require.Len(t, receivedConfs, len(stored))
Expand Down
1 change: 1 addition & 0 deletions snippet-service/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func newStore(ctx context.Context, config StorageConfig, fileWatcher *fsnotify.W
return nil, nil, fmt.Errorf("cannot create cron job: %w", err)
}
_, err = s.NewJob(gocron.CronJob(config.CleanUpRecords, config.ExtendCronParserBySeconds), gocron.NewTask(func() {
// db.CancelExpiredPendingCommands(ctx, time.Now())
/*
_, errDel := db.DeleteNonDeviceExpiredRecords(ctx, time.Now())
if errDel != nil && !errors.Is(errDel, store.ErrNotSupported) {
Expand Down
5 changes: 3 additions & 2 deletions snippet-service/service/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
natsClient "github.com/plgd-dev/hub/v2/resource-aggregate/cqrs/eventbus/nats/client"
"github.com/plgd-dev/hub/v2/snippet-service/pb"
"github.com/plgd-dev/hub/v2/snippet-service/service"
"github.com/plgd-dev/hub/v2/snippet-service/store"
storeConfig "github.com/plgd-dev/hub/v2/snippet-service/store/config"
storeCqlDB "github.com/plgd-dev/hub/v2/snippet-service/store/cqldb"
storeMongo "github.com/plgd-dev/hub/v2/snippet-service/store/mongodb"
Expand Down Expand Up @@ -600,8 +601,8 @@ func TestServiceCleanUp(t *testing.T) {
appliedConfs := make(map[string]*pb.AppliedConfiguration)
err = s.GetAppliedConfigurations(ctx, oauthService.DeviceUserID, &pb.GetAppliedConfigurationsRequest{
IdFilter: []string{resp.GetAppliedConfigurationId()},
}, func(appliedConf *pb.AppliedConfiguration) error {
appliedConfs[appliedConf.GetId()] = appliedConf
}, func(appliedConf *store.AppliedConfiguration) error {
appliedConfs[appliedConf.GetId()] = appliedConf.GetAppliedConfiguration().Clone()
return nil
})
require.NoError(t, err)
Expand Down
39 changes: 39 additions & 0 deletions snippet-service/store/appliedConfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import (
"fmt"

"github.com/google/uuid"
pkgMongo "github.com/plgd-dev/hub/v2/pkg/mongodb"
"github.com/plgd-dev/hub/v2/snippet-service/pb"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func ValidateAppliedConfiguration(c *pb.AppliedConfiguration, isUpdate bool) error {
Expand All @@ -15,6 +17,43 @@ func ValidateAppliedConfiguration(c *pb.AppliedConfiguration, isUpdate bool) err
return nil
}

type AppliedConfiguration struct {
RecordID string `bson:"_id"`
pb.AppliedConfiguration
}

func MakeAppliedConfiguration(c *pb.AppliedConfiguration) AppliedConfiguration {
return AppliedConfiguration{
AppliedConfiguration: pb.AppliedConfiguration{
Id: c.GetId(),
DeviceId: c.GetDeviceId(),
ConfigurationId: c.GetConfigurationId().Clone(),
ExecutedBy: c.CloneExecutedBy(),
Resources: c.CloneAppliedConfiguration_Resources(),
Owner: c.GetOwner(),
Timestamp: c.GetTimestamp(),
},
}
}

func (c *AppliedConfiguration) GetAppliedConfiguration() *pb.AppliedConfiguration {
if c == nil {
return nil
}
return &c.AppliedConfiguration
}

func (c *AppliedConfiguration) UnmarshalBSON(data []byte) error {
update := func(json map[string]interface{}) {
recordID, ok := json[RecordIDKey]
if ok {
c.RecordID = recordID.(primitive.ObjectID).Hex()
}
delete(json, RecordIDKey)
}
return pkgMongo.UnmarshalProtoBSON(data, &c.AppliedConfiguration, update)
}

type UpdateAppliedConfigurationResourceRequest struct {
AppliedConfigurationID string
AppliedCondition *pb.AppliedConfiguration_RelationTo
Expand Down
4 changes: 2 additions & 2 deletions snippet-service/store/cqldb/appliedConfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/plgd-dev/hub/v2/snippet-service/store"
)

func (s *Store) GetAppliedConfigurations(context.Context, string, *pb.GetAppliedConfigurationsRequest, store.ProccessAppliedDeviceConfigurations) error {
func (s *Store) GetAppliedConfigurations(context.Context, string, *pb.GetAppliedConfigurationsRequest, store.ProccessAppliedConfigurations) error {
return store.ErrNotSupported
}

Expand All @@ -19,7 +19,7 @@ func (s *Store) CreateAppliedConfiguration(context.Context, *pb.AppliedConfigura
return nil, nil, store.ErrNotSupported
}

func (s *Store) InsertAppliedConfigurations(context.Context, ...*pb.AppliedConfiguration) error {
func (s *Store) InsertAppliedConfigurations(context.Context, ...*store.AppliedConfiguration) error {
return store.ErrNotSupported
}

Expand Down
Loading

0 comments on commit 95b14d1

Please sign in to comment.