feat: Add Cloud Endpoint Sync Commands (#216)

* feat: Add cloud sync command

* feat: Add pmg cloud commands

* fix: Code review fixes

* fix: Code review fixes

* fix: Code review fixes

* fix: Code review fixes

* fix: Code review fixes

* fix: Code review fixes
This commit is contained in:
Abhisek Datta
2026-04-13 13:40:18 +05:30
committed by GitHub
parent e67735c1c3
commit 887984612c
14 changed files with 453 additions and 92 deletions
+8 -64
View File
@@ -6,79 +6,33 @@ import (
"fmt"
"github.com/google/uuid"
"github.com/safedep/dry/cloud"
"github.com/safedep/dry/cloud/endpointsync"
"github.com/safedep/dry/log"
"github.com/safedep/pmg/config"
appVersion "github.com/safedep/pmg/internal/version"
)
type cloudSink struct {
syncClient *endpointsync.SyncClient
cloudClient *cloud.Client
*SyncClientBundle
invocationID string
}
func newCloudSink(cfg *config.RuntimeConfig) (*cloudSink, error) {
resolver, err := cloud.NewEnvCredentialResolver()
bundle, err := NewSyncClientBundle(cfg)
if err != nil {
return nil, fmt.Errorf("failed to create credential resolver: %w", err)
}
creds, err := resolver.Resolve()
if err != nil {
return nil, fmt.Errorf("failed to resolve cloud credentials: %w", err)
}
cloudClient, err := cloud.NewDataPlaneClient("pmg", creds)
if err != nil {
return nil, fmt.Errorf("failed to create data plane client: %w", err)
}
transport := endpointsync.NewGrpcTransport(cloudClient.Connection())
sink, err := newCloudSinkWithTransport(transport, cfg.Config.Cloud.EndpointID, cfg.CloudSyncDBPath())
if err != nil {
if closeErr := cloudClient.Close(); closeErr != nil {
log.Warnf("failed to close cloud client after sink init failure: %v", closeErr)
}
return nil, err
}
sink.cloudClient = cloudClient
return sink, nil
}
func newCloudSinkWithTransport(transport endpointsync.EventTransport, endpointID, walPath string) (*cloudSink, error) {
var identityOpts []endpointsync.EndpointIdentityOption
if endpointID != "" {
identityOpts = append(identityOpts, endpointsync.WithEndpointID(endpointID))
}
identity := endpointsync.NewEndpointIdentityResolver(identityOpts...)
toolVersion := appVersion.Version
if toolVersion == "" {
toolVersion = "dev"
}
syncClient, err := endpointsync.NewSyncClient("pmg", toolVersion, transport, identity,
endpointsync.WithWALPath(walPath))
if err != nil {
return nil, fmt.Errorf("failed to create sync client: %w", err)
}
invocationID, err := uuid.NewRandom()
if err != nil {
if closeErr := syncClient.Close(); closeErr != nil {
log.Warnf("failed to close sync client after invocation ID generation failure: %v", closeErr)
if closeErr := bundle.Close(); closeErr != nil {
log.Warnf("failed to close sync client bundle after invocation ID failure: %v", closeErr)
}
return nil, fmt.Errorf("failed to generate invocation ID: %w", err)
}
return &cloudSink{
syncClient: syncClient,
invocationID: invocationID.String(),
SyncClientBundle: bundle,
invocationID: invocationID.String(),
}, nil
}
@@ -109,17 +63,7 @@ func (s *cloudSink) Handle(ctx context.Context, event AuditEvent) error {
return nil
}
// Close delegates to the embedded SyncClientBundle.Close().
func (s *cloudSink) Close() error {
var errs []error
if s.syncClient != nil {
if err := s.syncClient.Close(); err != nil {
errs = append(errs, err)
}
}
if s.cloudClient != nil {
if err := s.cloudClient.Close(); err != nil {
errs = append(errs, err)
}
}
return errors.Join(errs...)
return s.SyncClientBundle.Close()
}