package snapshot
import (
"context"
"envoy-control-plane/internal/pkg/storage"
"fmt"
// Ensure all standard filters are imported for proto unmarshalling
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/jwt_authn/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/lua/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/oauth2/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/listener/tls_inspector/v3"
_ "github.com/envoyproxy/go-control-plane/envoy/service/runtime/v3"
"github.com/envoyproxy/go-control-plane/pkg/cache/types"
cachev3 "github.com/envoyproxy/go-control-plane/pkg/cache/v3"
resourcev3 "github.com/envoyproxy/go-control-plane/pkg/resource/v3"
)
// ResourceNamer is an interface implemented by all xDS resources with a GetName() method.
type ResourceNamer interface {
GetName() string
}
// SnapshotManager wraps a SnapshotCache and provides file loading/modifying
// and DB synchronization functionality for Envoy xDS resources.
type SnapshotManager struct {
Cache cachev3.SnapshotCache
NodeID string
DB *storage.Storage
}
// NewSnapshotManager creates a new instance of SnapshotManager.
func NewSnapshotManager(cache cachev3.SnapshotCache, nodeID string, db *storage.Storage) *SnapshotManager {
return &SnapshotManager{
Cache: cache,
NodeID: nodeID,
DB: db,
}
}
// SetSnapshot sets a full snapshot (utility method used by others).
func (sm *SnapshotManager) SetSnapshot(ctx context.Context, version string, resources map[resourcev3.Type][]types.Resource) error {
snap, err := cachev3.NewSnapshot(version, resources)
if err != nil {
return fmt.Errorf("failed to create snapshot: %w", err)
}
return sm.Cache.SetSnapshot(ctx, sm.NodeID, snap)
}