Skip to content

Commit

Permalink
fix(TKC-3368): use global template in new architecture when it's not …
Browse files Browse the repository at this point in the history
…inline too (#6229)
  • Loading branch information
rangoo94 authored Mar 7, 2025
1 parent 78e7e84 commit 1103bad
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 44 deletions.
21 changes: 13 additions & 8 deletions cmd/api-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,18 @@ func main() {
testworkflowconfig.FeatureFlagCloudStorage: fmt.Sprintf("%v", cfg.FeatureCloudStorage),
})

runnerOpts := runner2.Options{
ClusterID: clusterId,
DashboardURI: cfg.TestkubeDashboardURI,
DefaultNamespace: cfg.TestkubeNamespace,
ServiceAccountNames: serviceAccountNames,
StorageSkipVerify: cfg.StorageSkipVerify,
}
if cfg.GlobalWorkflowTemplateInline != "" {
runnerOpts.GlobalTemplate = runner2.GlobalTemplateInline(cfg.GlobalWorkflowTemplateInline)
} else if cfg.GlobalWorkflowTemplateName != "" && cfg.FeatureNewArchitecture && proContext.NewArchitecture {
runnerOpts.GlobalTemplate = runner2.GlobalTemplateSourced(testWorkflowTemplatesClient, cfg.GlobalWorkflowTemplateName)
}
runnerService := runner2.NewService(
log.DefaultLogger,
eventsEmitter,
Expand All @@ -245,14 +257,7 @@ func main() {
},
proContext,
executionWorker,
runner2.Options{
ClusterID: clusterId,
DashboardURI: cfg.TestkubeDashboardURI,
DefaultNamespace: cfg.TestkubeNamespace,
ServiceAccountNames: serviceAccountNames,
StorageSkipVerify: cfg.StorageSkipVerify,
GlobalTemplateInline: cfg.GlobalWorkflowTemplateInline,
},
runnerOpts,
)
if !cfg.DisableRunner {
g.Go(func() error {
Expand Down
40 changes: 40 additions & 0 deletions pkg/runner/globaltemplate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package runner

import (
"context"
"strings"

testworkflowsv1 "github.com/kubeshop/testkube-operator/api/testworkflows/v1"
"github.com/kubeshop/testkube/internal/crdcommon"
"github.com/kubeshop/testkube/pkg/log"
"github.com/kubeshop/testkube/pkg/mapper/testworkflows"
"github.com/kubeshop/testkube/pkg/newclients/testworkflowtemplateclient"
)

type GlobalTemplateFactory func(environmentId string) (*testworkflowsv1.TestWorkflowTemplate, error)

func GlobalTemplateInline(yaml string) GlobalTemplateFactory {
var globalTemplateInline *testworkflowsv1.TestWorkflowTemplate
if yaml != "" {
globalTemplateInline = new(testworkflowsv1.TestWorkflowTemplate)
err := crdcommon.DeserializeCRD(globalTemplateInline, []byte("spec:\n "+strings.ReplaceAll(yaml, "\n", "\n ")))
globalTemplateInline.Name = inlinedGlobalTemplateName
if err != nil {
log.DefaultLogger.Errorw("failed to unmarshal inlined global template", "error", err)
globalTemplateInline = nil
}
}
return func(_ string) (*testworkflowsv1.TestWorkflowTemplate, error) {
return globalTemplateInline, nil
}
}

func GlobalTemplateSourced(client testworkflowtemplateclient.TestWorkflowTemplateClient, name string) GlobalTemplateFactory {
return func(environmentId string) (*testworkflowsv1.TestWorkflowTemplate, error) {
tpl, err := client.Get(context.Background(), environmentId, name)
if err != nil {
return nil, err
}
return testworkflows.MapTemplateAPIToKube(tpl), nil
}
}
60 changes: 26 additions & 34 deletions pkg/runner/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package runner

import (
"context"
"strings"
"sync"
"time"

Expand All @@ -11,7 +10,6 @@ import (
testworkflowsv1 "github.com/kubeshop/testkube-operator/api/testworkflows/v1"
"github.com/kubeshop/testkube/internal/app/api/metrics"
"github.com/kubeshop/testkube/internal/config"
"github.com/kubeshop/testkube/internal/crdcommon"
"github.com/kubeshop/testkube/pkg/api/v1/testkube"
"github.com/kubeshop/testkube/pkg/controlplaneclient"
"github.com/kubeshop/testkube/pkg/event"
Expand Down Expand Up @@ -48,15 +46,15 @@ type Runner interface {
}

type runner struct {
worker executionworkertypes.Worker
client controlplaneclient.Client
configRepository configRepo.Repository
emitter event.Interface
metrics metrics.Metrics
proContext config.ProContext // TODO: Include Agent ID in pro context
dashboardURI string
storageSkipVerify bool
globalTemplateInline *testworkflowsv1.TestWorkflowTemplate
worker executionworkertypes.Worker
client controlplaneclient.Client
configRepository configRepo.Repository
emitter event.Interface
metrics metrics.Metrics
proContext config.ProContext // TODO: Include Agent ID in pro context
dashboardURI string
storageSkipVerify bool
getGlobalTemplate GlobalTemplateFactory

watching sync.Map
}
Expand All @@ -70,28 +68,18 @@ func New(
proContext config.ProContext,
dashboardURI string,
storageSkipVerify bool,
globalTemplateInlineYaml string,
getGlobalTemplate GlobalTemplateFactory,
) Runner {
var globalTemplateInline *testworkflowsv1.TestWorkflowTemplate
if globalTemplateInlineYaml != "" {
globalTemplateInline = new(testworkflowsv1.TestWorkflowTemplate)
err := crdcommon.DeserializeCRD(globalTemplateInline, []byte("spec:\n "+strings.ReplaceAll(globalTemplateInlineYaml, "\n", "\n ")))
globalTemplateInline.Name = inlinedGlobalTemplateName
if err != nil {
log.DefaultLogger.Errorw("failed to unmarshal inlined global template", "error", err)
globalTemplateInline = nil
}
}
return &runner{
worker: worker,
configRepository: configRepository,
client: client,
emitter: emitter,
metrics: metrics,
proContext: proContext,
dashboardURI: dashboardURI,
storageSkipVerify: storageSkipVerify,
globalTemplateInline: globalTemplateInline,
worker: worker,
configRepository: configRepository,
client: client,
emitter: emitter,
metrics: metrics,
proContext: proContext,
dashboardURI: dashboardURI,
storageSkipVerify: storageSkipVerify,
getGlobalTemplate: getGlobalTemplate,
}
}

Expand Down Expand Up @@ -253,12 +241,16 @@ func (r *runner) Notifications(ctx context.Context, id string) executionworkerty
}

func (r *runner) Execute(request executionworkertypes.ExecuteRequest) (*executionworkertypes.ExecuteResult, error) {
if r.globalTemplateInline != nil {
if r.getGlobalTemplate != nil {
globalTemplate, err := r.getGlobalTemplate(request.Execution.EnvironmentId)
if err != nil {
return nil, errors.Wrap(err, "failed to get global template")
}
testworkflowresolver.AddGlobalTemplateRef(&request.Workflow, testworkflowsv1.TemplateRef{
Name: testworkflowresolver.GetDisplayTemplateName(inlinedGlobalTemplateName),
})
err := testworkflowresolver.ApplyTemplates(&request.Workflow, map[string]*testworkflowsv1.TestWorkflowTemplate{
inlinedGlobalTemplateName: r.globalTemplateInline,
err = testworkflowresolver.ApplyTemplates(&request.Workflow, map[string]*testworkflowsv1.TestWorkflowTemplate{
inlinedGlobalTemplateName: globalTemplate,
}, func(key, value string) (expressions.Expression, error) {
return nil, errors.New("not supported")
})
Expand Down
4 changes: 2 additions & 2 deletions pkg/runner/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type Options struct {

StorageSkipVerify bool

GlobalTemplateInline string
GlobalTemplate GlobalTemplateFactory
}

type service struct {
Expand Down Expand Up @@ -71,7 +71,7 @@ func NewService(
proContext,
opts.DashboardURI,
opts.StorageSkipVerify,
opts.GlobalTemplateInline,
opts.GlobalTemplate,
),
}
}
Expand Down

0 comments on commit 1103bad

Please sign in to comment.