2023-06-26 15:31:40 +02:00
|
|
|
package loaders
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/go-logr/logr"
|
|
|
|
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
|
|
|
|
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
|
|
|
"github.com/kyverno/kyverno/pkg/engine/apicall"
|
|
|
|
enginecontext "github.com/kyverno/kyverno/pkg/engine/context"
|
|
|
|
"github.com/kyverno/kyverno/pkg/engine/jmespath"
|
|
|
|
)
|
|
|
|
|
|
|
|
type apiLoader struct {
|
|
|
|
ctx context.Context //nolint:containedctx
|
|
|
|
logger logr.Logger
|
|
|
|
entry kyvernov1.ContextEntry
|
|
|
|
enginectx enginecontext.Interface
|
|
|
|
jp jmespath.Interface
|
|
|
|
client engineapi.RawClient
|
2023-11-21 15:31:51 +05:30
|
|
|
config apicall.APICallConfiguration
|
2023-06-26 15:31:40 +02:00
|
|
|
data []byte
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewAPILoader(
|
|
|
|
ctx context.Context,
|
|
|
|
logger logr.Logger,
|
|
|
|
entry kyvernov1.ContextEntry,
|
|
|
|
enginectx enginecontext.Interface,
|
|
|
|
jp jmespath.Interface,
|
|
|
|
client engineapi.RawClient,
|
2023-11-21 15:31:51 +05:30
|
|
|
apiCallConfig apicall.APICallConfiguration,
|
2023-06-26 15:31:40 +02:00
|
|
|
) enginecontext.Loader {
|
|
|
|
return &apiLoader{
|
|
|
|
ctx: ctx,
|
|
|
|
logger: logger,
|
|
|
|
entry: entry,
|
|
|
|
enginectx: enginectx,
|
|
|
|
jp: jp,
|
|
|
|
client: client,
|
2023-11-21 15:31:51 +05:30
|
|
|
config: apiCallConfig,
|
2023-06-26 15:31:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *apiLoader) HasLoaded() bool {
|
|
|
|
return a.data != nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *apiLoader) LoadData() error {
|
2023-11-21 15:31:51 +05:30
|
|
|
executor, err := apicall.New(a.logger, a.jp, a.entry, a.enginectx, a.client, a.config)
|
2023-06-26 15:31:40 +02:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("failed to initiaize APICal: %w", err)
|
|
|
|
}
|
|
|
|
if a.data == nil {
|
|
|
|
var err error
|
2024-09-05 11:27:44 +05:30
|
|
|
if a.data, err = executor.Fetch(a.ctx); err != nil && a.entry.APICall.Default == nil {
|
2023-06-26 15:31:40 +02:00
|
|
|
return fmt.Errorf("failed to fetch data for APICall: %w", err)
|
|
|
|
}
|
2024-09-05 11:27:44 +05:30
|
|
|
if err == nil {
|
|
|
|
a.entry.APICall.Default = nil
|
|
|
|
}
|
2023-06-26 15:31:40 +02:00
|
|
|
}
|
|
|
|
if _, err := executor.Store(a.data); err != nil {
|
|
|
|
return fmt.Errorf("failed to store data for APICall: %w", err)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|