From 99af25653750b58c264f713774ffaec4884aec92 Mon Sep 17 00:00:00 2001 From: Mariem Baccari Date: Wed, 8 Jul 2026 15:31:45 +0200 Subject: [PATCH 1/4] [raft/store] Add IsReadOnly to handler --- pkg/store/store.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/store/store.go b/pkg/store/store.go index 6cb8448c1..86e8275f7 100644 --- a/pkg/store/store.go +++ b/pkg/store/store.go @@ -25,9 +25,10 @@ type OperationRequest interface { // OperationHandler holds the logic for the encoding and execution of a registered operation type OperationHandler[R any] struct { - Encode func(req OperationRequest) ([]byte, error) - Decode func(buf []byte) (OperationRequest, error) - Execute func(ctx context.Context, repo R, request OperationRequest) (any, error) + Encode func(req OperationRequest) ([]byte, error) + Decode func(buf []byte) (OperationRequest, error) + Execute func(ctx context.Context, repo R, request OperationRequest) (any, error) + IsReadOnly bool } // TransactWithResult wraps Store.Transact and casts the result to ResultType, avoiding a cast at every call site. From a81850af7342eb3262dda30ad7f2ed97ba5c9bd7 Mon Sep 17 00:00:00 2001 From: Mariem Baccari Date: Fri, 22 May 2026 09:23:39 +0200 Subject: [PATCH 2/4] [raft/store] Add generic store --- pkg/aux_/store/raftstore/store.go | 19 +++++- pkg/raftstore/consensus/consensus.go | 2 +- pkg/raftstore/consensus/proposal.go | 13 ++-- pkg/raftstore/store.go | 95 +++++++++++++++++++++++----- pkg/rid/store/raftstore/store.go | 19 +++++- pkg/scd/store/raftstore/store.go | 19 +++++- 6 files changed, 140 insertions(+), 27 deletions(-) diff --git a/pkg/aux_/store/raftstore/store.go b/pkg/aux_/store/raftstore/store.go index d09162d87..f74c1ccf0 100644 --- a/pkg/aux_/store/raftstore/store.go +++ b/pkg/aux_/store/raftstore/store.go @@ -3,9 +3,12 @@ package raftstore import ( "context" + "github.com/interuss/dss/pkg/aux_/actions" "github.com/interuss/dss/pkg/aux_/repos" auxraftparams "github.com/interuss/dss/pkg/aux_/store/raftstore/params" + dsserr "github.com/interuss/dss/pkg/errors" "github.com/interuss/dss/pkg/raftstore" + "github.com/interuss/dss/pkg/raftstore/consensus" "github.com/interuss/stacktrace" "go.uber.org/zap" ) @@ -18,5 +21,19 @@ func Init(ctx context.Context, logger *zap.Logger) (*raftstore.Store[repos.Repos if err != nil { return nil, stacktrace.Propagate(err, "failed to get aux raft parameters") } - return raftstore.Init(ctx, logger.With(zap.String("service", "aux_")), params, func() repos.Repository { return &repo{} }) + return raftstore.Init(ctx, logger.With(zap.String("service", "aux_")), params, &repo{}, actions.Registry) +} + +func (r *repo) GetRepo() repos.Repository { return r } + +func (r *repo) GetSnapshot() ([]byte, error) { + return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +} + +func (r *repo) RestoreFromSnapshot([]byte) error { + return stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +} + +func (r *repo) Apply(_ context.Context, _ consensus.Proposal) (any, error) { + return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") } diff --git a/pkg/raftstore/consensus/consensus.go b/pkg/raftstore/consensus/consensus.go index f41b36e14..99b8162bb 100644 --- a/pkg/raftstore/consensus/consensus.go +++ b/pkg/raftstore/consensus/consensus.go @@ -131,7 +131,7 @@ func (c *Consensus) Stop(ctx context.Context) { } // HandleClientRequest blocks until the proposal is committed and applied / dropped or until ctx is cancelled. -func (c *Consensus) HandleClientRequest(ctx context.Context, requestType string, value any, readOnly bool) (any, error) { +func (c *Consensus) HandleClientRequest(ctx context.Context, requestType string, value []byte, readOnly bool) (any, error) { proposal, err := c.newProposal(ctx, requestType, value, readOnly) if err != nil { return nil, stacktrace.Propagate(err, "failed to create proposal") diff --git a/pkg/raftstore/consensus/proposal.go b/pkg/raftstore/consensus/proposal.go index a5e837d82..2e550da71 100644 --- a/pkg/raftstore/consensus/proposal.go +++ b/pkg/raftstore/consensus/proposal.go @@ -2,11 +2,11 @@ package consensus import ( "context" - "encoding/json" "sync" "time" "github.com/google/uuid" + "github.com/interuss/dss/pkg/timestamp" "github.com/interuss/stacktrace" ) @@ -30,17 +30,16 @@ type Proposal struct { ReadOnly bool `json:"read_only"` } -func (c *Consensus) newProposal(ctx context.Context, requestType string, payload any, readOnly bool) (Proposal, error) { - // TODO - Fetch timestamp from context - value, err := json.Marshal(payload) - if err != nil { - return Proposal{}, stacktrace.Propagate(err, "failed to serialize proposal payload") +func (c *Consensus) newProposal(ctx context.Context, requestType string, value []byte, readOnly bool) (Proposal, error) { + timestamp, err := timestamp.RequestTimestampFromContext(ctx) + if err != nil || timestamp.IsZero() { + return Proposal{}, stacktrace.Propagate(err, "failed to get timestamp from context") } return Proposal{ ID: uuid.NewString(), NodeID: c.nodeID, - Timestamp: time.Now().UTC(), + Timestamp: timestamp, RequestType: requestType, Value: value, ReadOnly: readOnly, diff --git a/pkg/raftstore/store.go b/pkg/raftstore/store.go index 12bdb78bd..e14aaa668 100644 --- a/pkg/raftstore/store.go +++ b/pkg/raftstore/store.go @@ -2,46 +2,109 @@ package raftstore import ( "context" + "sync" + "github.com/interuss/dss/pkg/logging" "github.com/interuss/dss/pkg/raftstore/consensus" raftparams "github.com/interuss/dss/pkg/raftstore/params" "github.com/interuss/dss/pkg/store" + "github.com/interuss/dss/pkg/timestamp" "github.com/interuss/stacktrace" "go.uber.org/zap" ) +type RaftRepo[R any] interface { + GetRepo() R + // Apply is called on every committed entry. The proposal must be applied atomically. + Apply(ctx context.Context, proposal consensus.Proposal) (any, error) + GetSnapshot() ([]byte, error) + RestoreFromSnapshot(data []byte) error +} + type Store[R any] struct { - newRepo func() R - consensus *consensus.Consensus + logger *zap.Logger + + raftRepo RaftRepo[R] + cancel context.CancelFunc + registry map[string]store.OperationHandler[R] + + Consensus *consensus.Consensus + + wg sync.WaitGroup } -func Init[R any](ctx context.Context, logger *zap.Logger, params raftparams.ConnectParameters, newRepo func() R) (*Store[R], error) { +func Init[R any](ctx context.Context, logger *zap.Logger, params raftparams.ConnectParameters, r RaftRepo[R], registry map[string]store.OperationHandler[R]) (*Store[R], error) { + ctx, cancel := context.WithCancel(ctx) + + store := &Store[R]{ + raftRepo: r, + logger: logging.WithValuesFromContext(ctx, logger), + cancel: cancel, + registry: registry, + } commitC := make(chan consensus.EntryCommit) - consensusInstance, err := consensus.NewConsensus(ctx, logger, params, func() ([]byte, error) { return nil, nil }, commitC) + store.wg.Go(func() { store.processCommits(ctx, commitC) }) + + consensusInstance, err := consensus.NewConsensus(ctx, logger, params, r.GetSnapshot, commitC) if err != nil { return nil, stacktrace.Propagate(err, "failed to initialize consensus") } - // TODO: start consumer goroutine reading from commitC - return &Store[R]{ - newRepo: newRepo, - consensus: consensusInstance, - }, nil + store.Consensus = consensusInstance + + return store, nil } // Transact proposes the entry to Raft and blocks until it is committed and applied. -func (s *Store[R]) Transact(_ context.Context, _ store.OperationRequest) (any, error) { - // TODO: implement - return nil, nil +func (s *Store[R]) Transact(ctx context.Context, request store.OperationRequest) (any, error) { + handler, ok := s.registry[request.OperationID()] + if !ok { + return nil, stacktrace.NewError("no handler registered for operation %q", request.OperationID()) + } + payload, err := handler.Encode(request) + if err != nil { + return nil, stacktrace.Propagate(err, "failed to encode op %q", request.OperationID()) + } + return s.Consensus.HandleClientRequest(ctx, request.OperationID(), payload, handler.IsReadOnly) } -// Interact returns a repository that can be used to query the store without proposing a Raft entry. +// Interact returns the underlying Raft repo which, for every operation, will propose it to Raft and return the results. func (s *Store[R]) Interact(_ context.Context) (R, error) { - return s.newRepo(), nil + return s.raftRepo.GetRepo(), nil } -// Close shuts down the consensus instance. +// Close shuts down the consensus instance and processCommits loop. func (s *Store[R]) Close() error { - // TODO: implement + s.Consensus.Stop(context.Background()) + s.cancel() + s.logger.Info("waiting for commit processing goroutine to exit") + s.wg.Wait() return nil } + +// processCommits reads committed entries from the consensus layer and applies them via Apply. +func (s *Store[R]) processCommits(ctx context.Context, commitCh <-chan consensus.EntryCommit) { + for { + select { + case <-ctx.Done(): + s.logger.Info("stopping commit processing loop") + return + case commit, ok := <-commitCh: + if !ok { + s.logger.Info("commit channel closed, stopping commit processing loop") + return + } + + if commit.SnapshotData != nil { + if err := s.raftRepo.RestoreFromSnapshot(commit.SnapshotData); err != nil { + s.logger.Fatal("failed to restore from snapshot", zap.Error(err)) + } + continue + } + + proposalCtx := timestamp.WithRequestTimestamp(ctx, commit.Prop.Timestamp) + result, err := s.raftRepo.Apply(proposalCtx, commit.Prop) + commit.Done <- consensus.ProposalResult{Result: result, Error: err} + } + } +} diff --git a/pkg/rid/store/raftstore/store.go b/pkg/rid/store/raftstore/store.go index 578aabeac..bc55a3dca 100644 --- a/pkg/rid/store/raftstore/store.go +++ b/pkg/rid/store/raftstore/store.go @@ -3,7 +3,10 @@ package raftstore import ( "context" + dsserr "github.com/interuss/dss/pkg/errors" "github.com/interuss/dss/pkg/raftstore" + "github.com/interuss/dss/pkg/raftstore/consensus" + "github.com/interuss/dss/pkg/rid/actions" "github.com/interuss/dss/pkg/rid/repos" ridraftparams "github.com/interuss/dss/pkg/rid/store/raftstore/params" "github.com/interuss/stacktrace" @@ -18,5 +21,19 @@ func Init(ctx context.Context, logger *zap.Logger) (*raftstore.Store[repos.Repos if err != nil { return nil, stacktrace.Propagate(err, "failed to get rid raft parameters") } - return raftstore.Init(ctx, logger.With(zap.String("service", "rid")), params, func() repos.Repository { return &repo{} }) + return raftstore.Init(ctx, logger.With(zap.String("service", "rid")), params, &repo{}, actions.Registry) +} + +func (r *repo) GetRepo() repos.Repository { return r } + +func (r *repo) GetSnapshot() ([]byte, error) { + return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +} + +func (r *repo) RestoreFromSnapshot([]byte) error { + return stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +} + +func (r *repo) Apply(_ context.Context, _ consensus.Proposal) (any, error) { + return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") } diff --git a/pkg/scd/store/raftstore/store.go b/pkg/scd/store/raftstore/store.go index a7eeb663a..799d6f1dd 100644 --- a/pkg/scd/store/raftstore/store.go +++ b/pkg/scd/store/raftstore/store.go @@ -3,7 +3,10 @@ package raftstore import ( "context" + dsserr "github.com/interuss/dss/pkg/errors" "github.com/interuss/dss/pkg/raftstore" + "github.com/interuss/dss/pkg/raftstore/consensus" + "github.com/interuss/dss/pkg/scd/actions" "github.com/interuss/dss/pkg/scd/repos" scdraftparams "github.com/interuss/dss/pkg/scd/store/raftstore/params" "github.com/interuss/stacktrace" @@ -18,5 +21,19 @@ func Init(ctx context.Context, logger *zap.Logger) (*raftstore.Store[repos.Repos if err != nil { return nil, stacktrace.Propagate(err, "failed to get scd raft parameters") } - return raftstore.Init(ctx, logger.With(zap.String("service", "scd")), params, func() repos.Repository { return &repo{} }) + return raftstore.Init(ctx, logger.With(zap.String("service", "scd")), params, &repo{}, actions.Registry) +} + +func (r *repo) GetRepo() repos.Repository { return r } + +func (r *repo) GetSnapshot() ([]byte, error) { + return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +} + +func (r *repo) RestoreFromSnapshot([]byte) error { + return stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +} + +func (r *repo) Apply(_ context.Context, _ consensus.Proposal) (any, error) { + return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") } From 99b8abbd8ee3799f3d2248a67d662f460d35a3e3 Mon Sep 17 00:00:00 2001 From: Mariem Baccari Date: Tue, 30 Jun 2026 13:55:53 +0200 Subject: [PATCH 3/4] [raft/store] Generate OperationID() on API request types --- .../api/dummyoauth/interface.gen.go | 5 + .../example/api/rid/interface.gen.go | 62 ++++++++++ .../example/api/scd/interface.gen.go | 110 ++++++++++++++++++ interfaces/openapi-to-go-server/rendering.py | 13 +++ pkg/api/auxv1/interface.gen.go | 42 +++++++ pkg/api/ridv1/interface.gen.go | 62 ++++++++++ pkg/api/ridv2/interface.gen.go | 62 ++++++++++ pkg/api/scdv1/interface.gen.go | 110 ++++++++++++++++++ 8 files changed, 466 insertions(+) diff --git a/cmds/dummy-oauth/api/dummyoauth/interface.gen.go b/cmds/dummy-oauth/api/dummyoauth/interface.gen.go index 1439cfcca..5d5270df9 100644 --- a/cmds/dummy-oauth/api/dummyoauth/interface.gen.go +++ b/cmds/dummy-oauth/api/dummyoauth/interface.gen.go @@ -29,6 +29,11 @@ type GetTokenRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetTokenOperationID = "GetToken" + +func (request *GetTokenRequest) OperationID() string { return GetTokenOperationID } + type GetTokenResponseSet struct { // The requested token was generated successfully Response200 *TokenResponse diff --git a/interfaces/openapi-to-go-server/example/api/rid/interface.gen.go b/interfaces/openapi-to-go-server/example/api/rid/interface.gen.go index 25b39c03a..61d1564b0 100644 --- a/interfaces/openapi-to-go-server/example/api/rid/interface.gen.go +++ b/interfaces/openapi-to-go-server/example/api/rid/interface.gen.go @@ -77,6 +77,13 @@ type SearchIdentificationServiceAreasRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SearchIdentificationServiceAreasOperationID = "SearchIdentificationServiceAreas" + +func (request *SearchIdentificationServiceAreasRequest) OperationID() string { + return SearchIdentificationServiceAreasOperationID +} + type SearchIdentificationServiceAreasResponseSet struct { // Identification Service Areas were successfully retrieved. Response200 *SearchIdentificationServiceAreasResponse @@ -104,6 +111,13 @@ type GetIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetIdentificationServiceAreaOperationID = "GetIdentificationServiceArea" + +func (request *GetIdentificationServiceAreaRequest) OperationID() string { + return GetIdentificationServiceAreaOperationID +} + type GetIdentificationServiceAreaResponseSet struct { // Full information of the Identification Service Area was retrieved successfully. Response200 *GetIdentificationServiceAreaResponse @@ -137,6 +151,13 @@ type CreateIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateIdentificationServiceAreaOperationID = "CreateIdentificationServiceArea" + +func (request *CreateIdentificationServiceAreaRequest) OperationID() string { + return CreateIdentificationServiceAreaOperationID +} + type CreateIdentificationServiceAreaResponseSet struct { // An existing Identification Service Area was created successfully in the DSS. Response200 *PutIdentificationServiceAreaResponse @@ -178,6 +199,13 @@ type UpdateIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateIdentificationServiceAreaOperationID = "UpdateIdentificationServiceArea" + +func (request *UpdateIdentificationServiceAreaRequest) OperationID() string { + return UpdateIdentificationServiceAreaOperationID +} + type UpdateIdentificationServiceAreaResponseSet struct { // An existing Identification Service Area was updated successfully in the DSS. Response200 *PutIdentificationServiceAreaResponse @@ -213,6 +241,13 @@ type DeleteIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteIdentificationServiceAreaOperationID = "DeleteIdentificationServiceArea" + +func (request *DeleteIdentificationServiceAreaRequest) OperationID() string { + return DeleteIdentificationServiceAreaOperationID +} + type DeleteIdentificationServiceAreaResponseSet struct { // Identification Service Area was successfully deleted from DSS. Response200 *DeleteIdentificationServiceAreaResponse @@ -245,6 +280,13 @@ type SearchSubscriptionsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SearchSubscriptionsOperationID = "SearchSubscriptions" + +func (request *SearchSubscriptionsRequest) OperationID() string { + return SearchSubscriptionsOperationID +} + type SearchSubscriptionsResponseSet struct { // Subscriptions were retrieved successfully. Response200 *SearchSubscriptionsResponse @@ -272,6 +314,11 @@ type GetSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetSubscriptionOperationID = "GetSubscription" + +func (request *GetSubscriptionRequest) OperationID() string { return GetSubscriptionOperationID } + type GetSubscriptionResponseSet struct { // Subscription information was retrieved successfully. Response200 *GetSubscriptionResponse @@ -305,6 +352,11 @@ type CreateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateSubscriptionOperationID = "CreateSubscription" + +func (request *CreateSubscriptionRequest) OperationID() string { return CreateSubscriptionOperationID } + type CreateSubscriptionResponseSet struct { // A new Subscription was created successfully. Response200 *PutSubscriptionResponse @@ -347,6 +399,11 @@ type UpdateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateSubscriptionOperationID = "UpdateSubscription" + +func (request *UpdateSubscriptionRequest) OperationID() string { return UpdateSubscriptionOperationID } + type UpdateSubscriptionResponseSet struct { // An existing Subscription was updated successfully. Response200 *PutSubscriptionResponse @@ -383,6 +440,11 @@ type DeleteSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteSubscriptionOperationID = "DeleteSubscription" + +func (request *DeleteSubscriptionRequest) OperationID() string { return DeleteSubscriptionOperationID } + type DeleteSubscriptionResponseSet struct { // Subscription was deleted successfully. Response200 *DeleteSubscriptionResponse diff --git a/interfaces/openapi-to-go-server/example/api/scd/interface.gen.go b/interfaces/openapi-to-go-server/example/api/scd/interface.gen.go index 75cdce626..1d090d130 100644 --- a/interfaces/openapi-to-go-server/example/api/scd/interface.gen.go +++ b/interfaces/openapi-to-go-server/example/api/scd/interface.gen.go @@ -174,6 +174,13 @@ type QueryOperationalIntentReferencesRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const QueryOperationalIntentReferencesOperationID = "QueryOperationalIntentReferences" + +func (request *QueryOperationalIntentReferencesRequest) OperationID() string { + return QueryOperationalIntentReferencesOperationID +} + type QueryOperationalIntentReferencesResponseSet struct { // Operational intents were successfully retrieved. Response200 *QueryOperationalIntentReferenceResponse @@ -204,6 +211,13 @@ type GetOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetOperationalIntentReferenceOperationID = "GetOperationalIntentReference" + +func (request *GetOperationalIntentReferenceRequest) OperationID() string { + return GetOperationalIntentReferenceOperationID +} + type GetOperationalIntentReferenceResponseSet struct { // Operational intent reference was retrieved successfully. Response200 *GetOperationalIntentReferenceResponse @@ -240,6 +254,13 @@ type CreateOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateOperationalIntentReferenceOperationID = "CreateOperationalIntentReference" + +func (request *CreateOperationalIntentReferenceRequest) OperationID() string { + return CreateOperationalIntentReferenceOperationID +} + type CreateOperationalIntentReferenceResponseSet struct { // An operational intent reference was created successfully in the DSS. Response201 *ChangeOperationalIntentReferenceResponse @@ -287,6 +308,13 @@ type UpdateOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateOperationalIntentReferenceOperationID = "UpdateOperationalIntentReference" + +func (request *UpdateOperationalIntentReferenceRequest) OperationID() string { + return UpdateOperationalIntentReferenceOperationID +} + type UpdateOperationalIntentReferenceResponseSet struct { // An operational intent reference was updated successfully in the DSS. Response200 *ChangeOperationalIntentReferenceResponse @@ -329,6 +357,13 @@ type DeleteOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteOperationalIntentReferenceOperationID = "DeleteOperationalIntentReference" + +func (request *DeleteOperationalIntentReferenceRequest) OperationID() string { + return DeleteOperationalIntentReferenceOperationID +} + type DeleteOperationalIntentReferenceResponseSet struct { // The specified operational intent was successfully removed from the DSS. Response200 *ChangeOperationalIntentReferenceResponse @@ -370,6 +405,13 @@ type QueryConstraintReferencesRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const QueryConstraintReferencesOperationID = "QueryConstraintReferences" + +func (request *QueryConstraintReferencesRequest) OperationID() string { + return QueryConstraintReferencesOperationID +} + type QueryConstraintReferencesResponseSet struct { // Constraint references were successfully retrieved. Response200 *QueryConstraintReferencesResponse @@ -400,6 +442,13 @@ type GetConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetConstraintReferenceOperationID = "GetConstraintReference" + +func (request *GetConstraintReferenceRequest) OperationID() string { + return GetConstraintReferenceOperationID +} + type GetConstraintReferenceResponseSet struct { // Constraint reference was retrieved successfully. Response200 *GetConstraintReferenceResponse @@ -436,6 +485,13 @@ type CreateConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateConstraintReferenceOperationID = "CreateConstraintReference" + +func (request *CreateConstraintReferenceRequest) OperationID() string { + return CreateConstraintReferenceOperationID +} + type CreateConstraintReferenceResponseSet struct { // A constraint reference was created successfully in the DSS. Response201 *ChangeConstraintReferenceResponse @@ -480,6 +536,13 @@ type UpdateConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateConstraintReferenceOperationID = "UpdateConstraintReference" + +func (request *UpdateConstraintReferenceRequest) OperationID() string { + return UpdateConstraintReferenceOperationID +} + type UpdateConstraintReferenceResponseSet struct { // A constraint reference was updated successfully in the DSS. Response200 *ChangeConstraintReferenceResponse @@ -518,6 +581,13 @@ type DeleteConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteConstraintReferenceOperationID = "DeleteConstraintReference" + +func (request *DeleteConstraintReferenceRequest) OperationID() string { + return DeleteConstraintReferenceOperationID +} + type DeleteConstraintReferenceResponseSet struct { // The constraint was successfully removed from the DSS. Response200 *ChangeConstraintReferenceResponse @@ -556,6 +626,11 @@ type QuerySubscriptionsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const QuerySubscriptionsOperationID = "QuerySubscriptions" + +func (request *QuerySubscriptionsRequest) OperationID() string { return QuerySubscriptionsOperationID } + type QuerySubscriptionsResponseSet struct { // Subscriptions were retrieved successfully. Response200 *QuerySubscriptionsResponse @@ -586,6 +661,11 @@ type GetSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetSubscriptionOperationID = "GetSubscription" + +func (request *GetSubscriptionRequest) OperationID() string { return GetSubscriptionOperationID } + type GetSubscriptionResponseSet struct { // Subscription information was retrieved successfully. Response200 *GetSubscriptionResponse @@ -622,6 +702,11 @@ type CreateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateSubscriptionOperationID = "CreateSubscription" + +func (request *CreateSubscriptionRequest) OperationID() string { return CreateSubscriptionOperationID } + type CreateSubscriptionResponseSet struct { // A new subscription was created successfully. Response200 *PutSubscriptionResponse @@ -664,6 +749,11 @@ type UpdateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateSubscriptionOperationID = "UpdateSubscription" + +func (request *UpdateSubscriptionRequest) OperationID() string { return UpdateSubscriptionOperationID } + type UpdateSubscriptionResponseSet struct { // A subscription was updated successfully. Response200 *PutSubscriptionResponse @@ -701,6 +791,11 @@ type DeleteSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteSubscriptionOperationID = "DeleteSubscription" + +func (request *DeleteSubscriptionRequest) OperationID() string { return DeleteSubscriptionOperationID } + type DeleteSubscriptionResponseSet struct { // Subscription was successfully removed from DSS. Response200 *DeleteSubscriptionResponse @@ -739,6 +834,11 @@ type MakeDssReportRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const MakeDssReportOperationID = "MakeDssReport" + +func (request *MakeDssReportRequest) OperationID() string { return MakeDssReportOperationID } + type MakeDssReportResponseSet struct { // A new Report was created successfully (and archived). Response201 *ErrorReport @@ -767,6 +867,11 @@ type GetUssAvailabilityRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetUssAvailabilityOperationID = "GetUssAvailability" + +func (request *GetUssAvailabilityRequest) OperationID() string { return GetUssAvailabilityOperationID } + type GetUssAvailabilityResponseSet struct { // Availability status of specified USS was successfully retrieved. Response200 *UssAvailabilityStatusResponse @@ -800,6 +905,11 @@ type SetUssAvailabilityRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SetUssAvailabilityOperationID = "SetUssAvailability" + +func (request *SetUssAvailabilityRequest) OperationID() string { return SetUssAvailabilityOperationID } + type SetUssAvailabilityResponseSet struct { // Availability status of specified USS was successfully updated. Response200 *UssAvailabilityStatusResponse diff --git a/interfaces/openapi-to-go-server/rendering.py b/interfaces/openapi-to-go-server/rendering.py index 3d3b25cd0..33ade731d 100644 --- a/interfaces/openapi-to-go-server/rendering.py +++ b/interfaces/openapi-to-go-server/rendering.py @@ -202,6 +202,19 @@ def implementation_interface( lines.extend(indent(body, 1)) lines.append("}") + lines.append("") + + lines.append( + 'const {}OperationID = "{}"'.format( + operation.interface_name, operation.interface_name + ) + ) + lines.append("") + lines.append( + "func (request *{}) OperationID() string {{ return {}OperationID }}".format( + operation.request_type_name, operation.interface_name + ) + ) # Declare response type for operation lines.append("type {} struct {{".format(operation.response_type_name)) diff --git a/pkg/api/auxv1/interface.gen.go b/pkg/api/auxv1/interface.gen.go index a7a006c2b..4e696e92b 100644 --- a/pkg/api/auxv1/interface.gen.go +++ b/pkg/api/auxv1/interface.gen.go @@ -48,6 +48,11 @@ type GetVersionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetVersionOperationID = "GetVersion" + +func (request *GetVersionRequest) OperationID() string { return GetVersionOperationID } + type GetVersionResponseSet struct { // The version of the DSS is successfully returned. Response200 *VersionResponse @@ -63,6 +68,11 @@ type ValidateOauthRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const ValidateOauthOperationID = "ValidateOauth" + +func (request *ValidateOauthRequest) OperationID() string { return ValidateOauthOperationID } + type ValidateOauthResponseSet struct { // The provided token was validated. Response200 *api.EmptyResponseBody @@ -81,6 +91,11 @@ type GetPoolRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetPoolOperationID = "GetPool" + +func (request *GetPoolRequest) OperationID() string { return GetPoolOperationID } + type GetPoolResponseSet struct { // The information is successfully returned. Response200 *PoolResponse @@ -102,6 +117,11 @@ type GetDSSInstancesRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetDSSInstancesOperationID = "GetDSSInstances" + +func (request *GetDSSInstancesRequest) OperationID() string { return GetDSSInstancesOperationID } + type GetDSSInstancesResponseSet struct { // The known DSS instances participating in the pool are successfully returned. Response200 *DSSInstancesResponse @@ -132,6 +152,13 @@ type PutDSSInstancesHeartbeatRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const PutDSSInstancesHeartbeatOperationID = "PutDSSInstancesHeartbeat" + +func (request *PutDSSInstancesHeartbeatRequest) OperationID() string { + return PutDSSInstancesHeartbeatOperationID +} + type PutDSSInstancesHeartbeatResponseSet struct { // The heartbeat have been recorded. The known DSS instances participating in the pool are successfully returned. Response201 *DSSInstancesResponse @@ -156,6 +183,11 @@ type GetAcceptedCAsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetAcceptedCAsOperationID = "GetAcceptedCAs" + +func (request *GetAcceptedCAsRequest) OperationID() string { return GetAcceptedCAsOperationID } + type GetAcceptedCAsResponseSet struct { // The information is successfully returned. Response200 *CAsResponse @@ -171,6 +203,11 @@ type GetInstanceCAsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetInstanceCAsOperationID = "GetInstanceCAs" + +func (request *GetInstanceCAsRequest) OperationID() string { return GetInstanceCAsOperationID } + type GetInstanceCAsResponseSet struct { // The information is successfully returned. Response200 *CAsResponse @@ -186,6 +223,11 @@ type GetGlobalOptionsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetGlobalOptionsOperationID = "GetGlobalOptions" + +func (request *GetGlobalOptionsRequest) OperationID() string { return GetGlobalOptionsOperationID } + type GetGlobalOptionsResponseSet struct { // The information is successfully returned. Response200 *GlobalOptionsResponse diff --git a/pkg/api/ridv1/interface.gen.go b/pkg/api/ridv1/interface.gen.go index e0807ffb6..1916571f0 100644 --- a/pkg/api/ridv1/interface.gen.go +++ b/pkg/api/ridv1/interface.gen.go @@ -77,6 +77,13 @@ type SearchIdentificationServiceAreasRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SearchIdentificationServiceAreasOperationID = "SearchIdentificationServiceAreas" + +func (request *SearchIdentificationServiceAreasRequest) OperationID() string { + return SearchIdentificationServiceAreasOperationID +} + type SearchIdentificationServiceAreasResponseSet struct { // Identification Service Areas were successfully retrieved. Response200 *SearchIdentificationServiceAreasResponse @@ -104,6 +111,13 @@ type GetIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetIdentificationServiceAreaOperationID = "GetIdentificationServiceArea" + +func (request *GetIdentificationServiceAreaRequest) OperationID() string { + return GetIdentificationServiceAreaOperationID +} + type GetIdentificationServiceAreaResponseSet struct { // Full information of the Identification Service Area was retrieved successfully. Response200 *GetIdentificationServiceAreaResponse @@ -137,6 +151,13 @@ type CreateIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateIdentificationServiceAreaOperationID = "CreateIdentificationServiceArea" + +func (request *CreateIdentificationServiceAreaRequest) OperationID() string { + return CreateIdentificationServiceAreaOperationID +} + type CreateIdentificationServiceAreaResponseSet struct { // An existing Identification Service Area was created successfully in the DSS. Response200 *PutIdentificationServiceAreaResponse @@ -178,6 +199,13 @@ type UpdateIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateIdentificationServiceAreaOperationID = "UpdateIdentificationServiceArea" + +func (request *UpdateIdentificationServiceAreaRequest) OperationID() string { + return UpdateIdentificationServiceAreaOperationID +} + type UpdateIdentificationServiceAreaResponseSet struct { // An existing Identification Service Area was updated successfully in the DSS. Response200 *PutIdentificationServiceAreaResponse @@ -213,6 +241,13 @@ type DeleteIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteIdentificationServiceAreaOperationID = "DeleteIdentificationServiceArea" + +func (request *DeleteIdentificationServiceAreaRequest) OperationID() string { + return DeleteIdentificationServiceAreaOperationID +} + type DeleteIdentificationServiceAreaResponseSet struct { // Identification Service Area was successfully deleted from DSS. Response200 *DeleteIdentificationServiceAreaResponse @@ -245,6 +280,13 @@ type SearchSubscriptionsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SearchSubscriptionsOperationID = "SearchSubscriptions" + +func (request *SearchSubscriptionsRequest) OperationID() string { + return SearchSubscriptionsOperationID +} + type SearchSubscriptionsResponseSet struct { // Subscriptions were retrieved successfully. Response200 *SearchSubscriptionsResponse @@ -272,6 +314,11 @@ type GetSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetSubscriptionOperationID = "GetSubscription" + +func (request *GetSubscriptionRequest) OperationID() string { return GetSubscriptionOperationID } + type GetSubscriptionResponseSet struct { // Subscription information was retrieved successfully. Response200 *GetSubscriptionResponse @@ -305,6 +352,11 @@ type CreateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateSubscriptionOperationID = "CreateSubscription" + +func (request *CreateSubscriptionRequest) OperationID() string { return CreateSubscriptionOperationID } + type CreateSubscriptionResponseSet struct { // A new Subscription was created successfully. Response200 *PutSubscriptionResponse @@ -347,6 +399,11 @@ type UpdateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateSubscriptionOperationID = "UpdateSubscription" + +func (request *UpdateSubscriptionRequest) OperationID() string { return UpdateSubscriptionOperationID } + type UpdateSubscriptionResponseSet struct { // An existing Subscription was updated successfully. Response200 *PutSubscriptionResponse @@ -383,6 +440,11 @@ type DeleteSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteSubscriptionOperationID = "DeleteSubscription" + +func (request *DeleteSubscriptionRequest) OperationID() string { return DeleteSubscriptionOperationID } + type DeleteSubscriptionResponseSet struct { // Subscription was deleted successfully. Response200 *DeleteSubscriptionResponse diff --git a/pkg/api/ridv2/interface.gen.go b/pkg/api/ridv2/interface.gen.go index 406d8460f..4fcc903e6 100644 --- a/pkg/api/ridv2/interface.gen.go +++ b/pkg/api/ridv2/interface.gen.go @@ -80,6 +80,13 @@ type SearchIdentificationServiceAreasRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SearchIdentificationServiceAreasOperationID = "SearchIdentificationServiceAreas" + +func (request *SearchIdentificationServiceAreasRequest) OperationID() string { + return SearchIdentificationServiceAreasOperationID +} + type SearchIdentificationServiceAreasResponseSet struct { // Identification Service Areas were successfully retrieved. Response200 *SearchIdentificationServiceAreasResponse @@ -107,6 +114,13 @@ type GetIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetIdentificationServiceAreaOperationID = "GetIdentificationServiceArea" + +func (request *GetIdentificationServiceAreaRequest) OperationID() string { + return GetIdentificationServiceAreaOperationID +} + type GetIdentificationServiceAreaResponseSet struct { // Full information of the Identification Service Area was retrieved successfully. Response200 *GetIdentificationServiceAreaResponse @@ -140,6 +154,13 @@ type CreateIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateIdentificationServiceAreaOperationID = "CreateIdentificationServiceArea" + +func (request *CreateIdentificationServiceAreaRequest) OperationID() string { + return CreateIdentificationServiceAreaOperationID +} + type CreateIdentificationServiceAreaResponseSet struct { // An existing Identification Service Area was created successfully in the DSS. Response200 *PutIdentificationServiceAreaResponse @@ -181,6 +202,13 @@ type UpdateIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateIdentificationServiceAreaOperationID = "UpdateIdentificationServiceArea" + +func (request *UpdateIdentificationServiceAreaRequest) OperationID() string { + return UpdateIdentificationServiceAreaOperationID +} + type UpdateIdentificationServiceAreaResponseSet struct { // An existing Identification Service Area was updated successfully in the DSS. Response200 *PutIdentificationServiceAreaResponse @@ -216,6 +244,13 @@ type DeleteIdentificationServiceAreaRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteIdentificationServiceAreaOperationID = "DeleteIdentificationServiceArea" + +func (request *DeleteIdentificationServiceAreaRequest) OperationID() string { + return DeleteIdentificationServiceAreaOperationID +} + type DeleteIdentificationServiceAreaResponseSet struct { // Identification Service Area was successfully deleted from DSS. Response200 *DeleteIdentificationServiceAreaResponse @@ -248,6 +283,13 @@ type SearchSubscriptionsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SearchSubscriptionsOperationID = "SearchSubscriptions" + +func (request *SearchSubscriptionsRequest) OperationID() string { + return SearchSubscriptionsOperationID +} + type SearchSubscriptionsResponseSet struct { // Subscriptions were retrieved successfully. Response200 *SearchSubscriptionsResponse @@ -275,6 +317,11 @@ type GetSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetSubscriptionOperationID = "GetSubscription" + +func (request *GetSubscriptionRequest) OperationID() string { return GetSubscriptionOperationID } + type GetSubscriptionResponseSet struct { // Subscription information was retrieved successfully. Response200 *GetSubscriptionResponse @@ -308,6 +355,11 @@ type CreateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateSubscriptionOperationID = "CreateSubscription" + +func (request *CreateSubscriptionRequest) OperationID() string { return CreateSubscriptionOperationID } + type CreateSubscriptionResponseSet struct { // A new Subscription was created successfully. Response200 *PutSubscriptionResponse @@ -349,6 +401,11 @@ type UpdateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateSubscriptionOperationID = "UpdateSubscription" + +func (request *UpdateSubscriptionRequest) OperationID() string { return UpdateSubscriptionOperationID } + type UpdateSubscriptionResponseSet struct { // An existing Subscription was updated successfully. Response200 *PutSubscriptionResponse @@ -384,6 +441,11 @@ type DeleteSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteSubscriptionOperationID = "DeleteSubscription" + +func (request *DeleteSubscriptionRequest) OperationID() string { return DeleteSubscriptionOperationID } + type DeleteSubscriptionResponseSet struct { // Subscription was deleted successfully. Response200 *DeleteSubscriptionResponse diff --git a/pkg/api/scdv1/interface.gen.go b/pkg/api/scdv1/interface.gen.go index cff1dd64f..8f754648d 100644 --- a/pkg/api/scdv1/interface.gen.go +++ b/pkg/api/scdv1/interface.gen.go @@ -174,6 +174,13 @@ type QueryOperationalIntentReferencesRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const QueryOperationalIntentReferencesOperationID = "QueryOperationalIntentReferences" + +func (request *QueryOperationalIntentReferencesRequest) OperationID() string { + return QueryOperationalIntentReferencesOperationID +} + type QueryOperationalIntentReferencesResponseSet struct { // Operational intents were successfully retrieved. Response200 *QueryOperationalIntentReferenceResponse @@ -204,6 +211,13 @@ type GetOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetOperationalIntentReferenceOperationID = "GetOperationalIntentReference" + +func (request *GetOperationalIntentReferenceRequest) OperationID() string { + return GetOperationalIntentReferenceOperationID +} + type GetOperationalIntentReferenceResponseSet struct { // Operational intent reference was retrieved successfully. Response200 *GetOperationalIntentReferenceResponse @@ -240,6 +254,13 @@ type CreateOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateOperationalIntentReferenceOperationID = "CreateOperationalIntentReference" + +func (request *CreateOperationalIntentReferenceRequest) OperationID() string { + return CreateOperationalIntentReferenceOperationID +} + type CreateOperationalIntentReferenceResponseSet struct { // An operational intent reference was created successfully in the DSS. Response201 *ChangeOperationalIntentReferenceResponse @@ -287,6 +308,13 @@ type UpdateOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateOperationalIntentReferenceOperationID = "UpdateOperationalIntentReference" + +func (request *UpdateOperationalIntentReferenceRequest) OperationID() string { + return UpdateOperationalIntentReferenceOperationID +} + type UpdateOperationalIntentReferenceResponseSet struct { // An operational intent reference was updated successfully in the DSS. Response200 *ChangeOperationalIntentReferenceResponse @@ -329,6 +357,13 @@ type DeleteOperationalIntentReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteOperationalIntentReferenceOperationID = "DeleteOperationalIntentReference" + +func (request *DeleteOperationalIntentReferenceRequest) OperationID() string { + return DeleteOperationalIntentReferenceOperationID +} + type DeleteOperationalIntentReferenceResponseSet struct { // The specified operational intent was successfully removed from the DSS. Response200 *ChangeOperationalIntentReferenceResponse @@ -370,6 +405,13 @@ type QueryConstraintReferencesRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const QueryConstraintReferencesOperationID = "QueryConstraintReferences" + +func (request *QueryConstraintReferencesRequest) OperationID() string { + return QueryConstraintReferencesOperationID +} + type QueryConstraintReferencesResponseSet struct { // Constraint references were successfully retrieved. Response200 *QueryConstraintReferencesResponse @@ -400,6 +442,13 @@ type GetConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetConstraintReferenceOperationID = "GetConstraintReference" + +func (request *GetConstraintReferenceRequest) OperationID() string { + return GetConstraintReferenceOperationID +} + type GetConstraintReferenceResponseSet struct { // Constraint reference was retrieved successfully. Response200 *GetConstraintReferenceResponse @@ -436,6 +485,13 @@ type CreateConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateConstraintReferenceOperationID = "CreateConstraintReference" + +func (request *CreateConstraintReferenceRequest) OperationID() string { + return CreateConstraintReferenceOperationID +} + type CreateConstraintReferenceResponseSet struct { // A constraint reference was created successfully in the DSS. Response201 *ChangeConstraintReferenceResponse @@ -480,6 +536,13 @@ type UpdateConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateConstraintReferenceOperationID = "UpdateConstraintReference" + +func (request *UpdateConstraintReferenceRequest) OperationID() string { + return UpdateConstraintReferenceOperationID +} + type UpdateConstraintReferenceResponseSet struct { // A constraint reference was updated successfully in the DSS. Response200 *ChangeConstraintReferenceResponse @@ -518,6 +581,13 @@ type DeleteConstraintReferenceRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteConstraintReferenceOperationID = "DeleteConstraintReference" + +func (request *DeleteConstraintReferenceRequest) OperationID() string { + return DeleteConstraintReferenceOperationID +} + type DeleteConstraintReferenceResponseSet struct { // The constraint was successfully removed from the DSS. Response200 *ChangeConstraintReferenceResponse @@ -556,6 +626,11 @@ type QuerySubscriptionsRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const QuerySubscriptionsOperationID = "QuerySubscriptions" + +func (request *QuerySubscriptionsRequest) OperationID() string { return QuerySubscriptionsOperationID } + type QuerySubscriptionsResponseSet struct { // Subscriptions were retrieved successfully. Response200 *QuerySubscriptionsResponse @@ -586,6 +661,11 @@ type GetSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetSubscriptionOperationID = "GetSubscription" + +func (request *GetSubscriptionRequest) OperationID() string { return GetSubscriptionOperationID } + type GetSubscriptionResponseSet struct { // Subscription information was retrieved successfully. Response200 *GetSubscriptionResponse @@ -622,6 +702,11 @@ type CreateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const CreateSubscriptionOperationID = "CreateSubscription" + +func (request *CreateSubscriptionRequest) OperationID() string { return CreateSubscriptionOperationID } + type CreateSubscriptionResponseSet struct { // A new subscription was created successfully. Response200 *PutSubscriptionResponse @@ -664,6 +749,11 @@ type UpdateSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const UpdateSubscriptionOperationID = "UpdateSubscription" + +func (request *UpdateSubscriptionRequest) OperationID() string { return UpdateSubscriptionOperationID } + type UpdateSubscriptionResponseSet struct { // A subscription was updated successfully. Response200 *PutSubscriptionResponse @@ -701,6 +791,11 @@ type DeleteSubscriptionRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const DeleteSubscriptionOperationID = "DeleteSubscription" + +func (request *DeleteSubscriptionRequest) OperationID() string { return DeleteSubscriptionOperationID } + type DeleteSubscriptionResponseSet struct { // Subscription was successfully removed from DSS. Response200 *DeleteSubscriptionResponse @@ -739,6 +834,11 @@ type MakeDssReportRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const MakeDssReportOperationID = "MakeDssReport" + +func (request *MakeDssReportRequest) OperationID() string { return MakeDssReportOperationID } + type MakeDssReportResponseSet struct { // A new Report was created successfully (and archived). Response201 *ErrorReport @@ -767,6 +867,11 @@ type GetUssAvailabilityRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const GetUssAvailabilityOperationID = "GetUssAvailability" + +func (request *GetUssAvailabilityRequest) OperationID() string { return GetUssAvailabilityOperationID } + type GetUssAvailabilityResponseSet struct { // Availability status of specified USS was successfully retrieved. Response200 *UssAvailabilityStatusResponse @@ -800,6 +905,11 @@ type SetUssAvailabilityRequest struct { // The result of attempting to authorize this request Auth api.AuthorizationResult } + +const SetUssAvailabilityOperationID = "SetUssAvailability" + +func (request *SetUssAvailabilityRequest) OperationID() string { return SetUssAvailabilityOperationID } + type SetUssAvailabilityResponseSet struct { // Availability status of specified USS was successfully updated. Response200 *UssAvailabilityStatusResponse From 447bc05eaf8791e73cb9df75b501e75b8963fbda Mon Sep 17 00:00:00 2001 From: Mariem Baccari Date: Mon, 15 Jun 2026 14:17:00 +0200 Subject: [PATCH 4/4] [raft/aux] Add aux Raftstore --- pkg/aux_/actions/registry.go | 10 ---- pkg/aux_/store/raftstore/dss.go | 80 +++++++++++++++++++++++++++---- pkg/aux_/store/raftstore/store.go | 74 ++++++++++++++++++++++++---- pkg/aux_/store/sqlstore/store.go | 3 +- pkg/raftstore/params/params.go | 4 ++ 5 files changed, 142 insertions(+), 29 deletions(-) delete mode 100644 pkg/aux_/actions/registry.go diff --git a/pkg/aux_/actions/registry.go b/pkg/aux_/actions/registry.go deleted file mode 100644 index d16395b88..000000000 --- a/pkg/aux_/actions/registry.go +++ /dev/null @@ -1,10 +0,0 @@ -package actions - -import ( - "github.com/interuss/dss/pkg/aux_/repos" - dssstore "github.com/interuss/dss/pkg/store" -) - -// Registry maps operation IDs to their handlers. -// TODO: implement -var Registry = map[string]dssstore.OperationHandler[repos.Repository]{} diff --git a/pkg/aux_/store/raftstore/dss.go b/pkg/aux_/store/raftstore/dss.go index 871d06394..40cc6d95a 100644 --- a/pkg/aux_/store/raftstore/dss.go +++ b/pkg/aux_/store/raftstore/dss.go @@ -2,25 +2,89 @@ package raftstore import ( "context" + "encoding/json" + "strconv" auxmodels "github.com/interuss/dss/pkg/aux_/models" dsserr "github.com/interuss/dss/pkg/errors" + raftparams "github.com/interuss/dss/pkg/raftstore/params" + "github.com/interuss/dss/pkg/timestamp" "github.com/interuss/stacktrace" ) -// SaveOwnMetadata returns nil instead of dsserr.NotImplemented because it is needed to allow the server to startup. -func (r *repo) SaveOwnMetadata(_ context.Context, locality string, publicEndpoint string) error { - return nil +type saveOwnMetadataPayload struct { + Locality string + PublicEndpoint string } -func (r *repo) GetDSSMetadata(_ context.Context) ([]*auxmodels.DSSMetadata, error) { - return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "GetDSSMetadata not implemented for raftstore") +func (r *repo) SaveOwnMetadata(ctx context.Context, locality string, publicEndpoint string) error { + if locality == "" { + return stacktrace.NewErrorWithCode(dsserr.BadRequest, "Locality not set") + } + if publicEndpoint == "" { + return stacktrace.NewErrorWithCode(dsserr.BadRequest, "Public endpoint not set") + } + + payload := saveOwnMetadataPayload{ + Locality: locality, + PublicEndpoint: publicEndpoint, + } + + buf, err := json.Marshal(payload) + if err != nil { + return stacktrace.Propagate(err, "failed to marshal payload") + } + + _, err = r.consensus.HandleClientRequest(ctx, string(saveOwnMetadata), buf, false) + return err +} + +func (r *repo) GetDSSMetadata(ctx context.Context) ([]*auxmodels.DSSMetadata, error) { + result, err := r.consensus.HandleClientRequest(ctx, string(getDSSMetadata), nil, true) + if err != nil { + return nil, stacktrace.Propagate(err, "failed to propose %s", getDSSMetadata) + } + if result == nil { + return nil, nil + } + + if _, ok := result.([]*auxmodels.DSSMetadata); !ok { + return nil, stacktrace.NewError("unexpected result type: %T", result) + } + + return result.([]*auxmodels.DSSMetadata), nil } -func (r *repo) RecordHeartbeat(_ context.Context, heartbeat auxmodels.Heartbeat) error { - return stacktrace.NewErrorWithCode(dsserr.NotImplemented, "RecordHeartbeat not implemented for raftstore") +func (r *repo) RecordHeartbeat(ctx context.Context, heartbeat auxmodels.Heartbeat) error { + if heartbeat.Locality == "" { + return stacktrace.NewErrorWithCode(dsserr.BadRequest, "Locality not set") + } + if heartbeat.Source == "" { + return stacktrace.NewErrorWithCode(dsserr.BadRequest, "Source not set") + } + + if heartbeat.Timestamp == nil { + now, err := timestamp.RequestTimestampFromContext(ctx) + if err != nil { + return stacktrace.Propagate(err, "failed to get request timestamp") + } + + heartbeat.Timestamp = &now + } + + if heartbeat.NextHeartbeatExpectedBefore != nil && heartbeat.NextHeartbeatExpectedBefore.Before(*heartbeat.Timestamp) { + return stacktrace.NewErrorWithCode(dsserr.BadRequest, "Cannot expect the timestamp of the next heartbeat before the timestamp of the new heartbeat") + } + + buf, err := json.Marshal(heartbeat) + if err != nil { + return stacktrace.Propagate(err, "failed to marshal heartbeat") + } + + _, err = r.consensus.HandleClientRequest(ctx, string(recordHeartbeat), buf, false) + return err } func (r *repo) GetDSSAirspaceRepresentationID(_ context.Context) (string, error) { - return "", stacktrace.NewErrorWithCode(dsserr.NotImplemented, "GetDSSAirspaceRepresentationID not implemented for raftstore") + return strconv.Itoa(int(raftparams.GetClusterID())), nil } diff --git a/pkg/aux_/store/raftstore/store.go b/pkg/aux_/store/raftstore/store.go index f74c1ccf0..93ccd4486 100644 --- a/pkg/aux_/store/raftstore/store.go +++ b/pkg/aux_/store/raftstore/store.go @@ -2,38 +2,94 @@ package raftstore import ( "context" + "encoding/json" - "github.com/interuss/dss/pkg/aux_/actions" + auxmodels "github.com/interuss/dss/pkg/aux_/models" "github.com/interuss/dss/pkg/aux_/repos" + auxmemstore "github.com/interuss/dss/pkg/aux_/store/memstore" auxraftparams "github.com/interuss/dss/pkg/aux_/store/raftstore/params" - dsserr "github.com/interuss/dss/pkg/errors" + "github.com/interuss/dss/pkg/memstore" "github.com/interuss/dss/pkg/raftstore" "github.com/interuss/dss/pkg/raftstore/consensus" "github.com/interuss/stacktrace" "go.uber.org/zap" ) +type requestType string + +const ( + saveOwnMetadata requestType = "saveOwnMetadata" + getDSSMetadata requestType = "getDSSMetadata" + recordHeartbeat requestType = "recordHeartbeat" +) + // repo is a full implementation of aux_.repos.Repository for Raft-based storage. -type repo struct{} +type repo struct { + consensus *consensus.Consensus + memStore *memstore.Store[repos.Repository] +} func Init(ctx context.Context, logger *zap.Logger) (*raftstore.Store[repos.Repository], error) { params, err := auxraftparams.GetConnectParameters() if err != nil { return nil, stacktrace.Propagate(err, "failed to get aux raft parameters") } - return raftstore.Init(ctx, logger.With(zap.String("service", "aux_")), params, &repo{}, actions.Registry) + + memStore, err := auxmemstore.Init(ctx, logger) + if err != nil { + return nil, stacktrace.Propagate(err, "failed to initialize aux memstore") + } + + r := &repo{memStore: memStore} + store, err := raftstore.Init(ctx, logger.With(zap.String("service", "aux_")), params, r, nil) + if err != nil { + return nil, stacktrace.Propagate(err, "failed to initialize aux raftstore") + } + + r.consensus = store.Consensus + + return store, nil } func (r *repo) GetRepo() repos.Repository { return r } func (r *repo) GetSnapshot() ([]byte, error) { - return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") + //return r.memStore.GetSnapshot() + return nil, stacktrace.NewError("not implemented") } -func (r *repo) RestoreFromSnapshot([]byte) error { - return stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +func (r *repo) RestoreFromSnapshot(data []byte) error { + //return r.memStore.RestoreFromSnapshot(data) + return stacktrace.NewError("not implemented") } -func (r *repo) Apply(_ context.Context, _ consensus.Proposal) (any, error) { - return nil, stacktrace.NewErrorWithCode(dsserr.NotImplemented, "not implemented yet") +func (r *repo) Apply(ctx context.Context, proposal consensus.Proposal) (any, error) { + mem, err := r.memStore.Interact(ctx) + if err != nil { + return nil, stacktrace.Propagate(err, "failed to obtain aux memstore repository") + } + + switch requestType(proposal.RequestType) { + case saveOwnMetadata: + var payload saveOwnMetadataPayload + if err := json.Unmarshal(proposal.Value, &payload); err != nil { + return nil, stacktrace.Propagate(err, "failed to unmarshal %s payload", saveOwnMetadata) + } + + return nil, mem.SaveOwnMetadata(ctx, payload.Locality, payload.PublicEndpoint) + + case getDSSMetadata: + return mem.GetDSSMetadata(ctx) + + case recordHeartbeat: + var heartbeat auxmodels.Heartbeat + if err := json.Unmarshal(proposal.Value, &heartbeat); err != nil { + return nil, stacktrace.Propagate(err, "failed to unmarshal %s payload", recordHeartbeat) + } + + return nil, mem.RecordHeartbeat(ctx, heartbeat) + + default: + return nil, stacktrace.NewError("unknown request type: %q", proposal.RequestType) + } } diff --git a/pkg/aux_/store/sqlstore/store.go b/pkg/aux_/store/sqlstore/store.go index 772c3e4fd..6c8860a5a 100644 --- a/pkg/aux_/store/sqlstore/store.go +++ b/pkg/aux_/store/sqlstore/store.go @@ -3,7 +3,6 @@ package sqlstore import ( "context" - "github.com/interuss/dss/pkg/aux_/actions" "github.com/interuss/dss/pkg/aux_/repos" "github.com/interuss/dss/pkg/logging" dssql "github.com/interuss/dss/pkg/sql" @@ -40,6 +39,6 @@ func Init(ctx context.Context, logger *zap.Logger, withCheckCron bool) (*sqlstor version: version, } }, - Registry: actions.Registry, + Registry: nil, }, withCheckCron) } diff --git a/pkg/raftstore/params/params.go b/pkg/raftstore/params/params.go index c7acb6ef4..70b9feffa 100644 --- a/pkg/raftstore/params/params.go +++ b/pkg/raftstore/params/params.go @@ -150,3 +150,7 @@ func GetConnectParameters(subfolder string) (ConnectParameters, error) { p.DataDir = filepath.Join(connectParameters.DataDir, subfolder) return p, nil } + +func GetClusterID() uint64 { + return connectParameters.ClusterID +}