Skip to content
2 changes: 2 additions & 0 deletions pkg/apiclient/argo-kube-client.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@ func (a *argoKubeClient) startStores(ctx context.Context, restConfig *restclient
} else {
a.cwfTmplStore = clusterworkflowtmplserver.NewClusterWorkflowTemplateClientStore()
}
} else {
a.cwfTmplStore = clusterworkflowtmplserver.NewNullClusterWorkflowTemplate()
}

return nil
Expand Down
4 changes: 3 additions & 1 deletion server/apiserver/argoserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,12 +239,14 @@ func (as *argoServer) Run(ctx context.Context, port int, browserOpenFunc func(st
log.WithFatal().Error(ctx, err.Error())
}
kubeclientset := kubernetes.NewForConfigOrDie(as.restConfig)
var cwftmplInformer *clusterworkflowtemplate.Informer
var cwftmplInformer clusterworkflowtemplate.ClusterWorkflowTemplateInformer
if rbacutil.HasAccessToClusterWorkflowTemplates(ctx, kubeclientset, resourceCacheNamespace) {
cwftmplInformer, err = clusterworkflowtemplate.NewInformer(as.restConfig)
if err != nil {
log.WithFatal().Error(ctx, err.Error())
}
} else {
cwftmplInformer = clusterworkflowtemplate.NewNullClusterWorkflowTemplate()
}
eventRecorderManager := events.NewEventRecorderManager(as.clients.Kubernetes)
artifactRepositories := artifactrepositories.New(as.clients.Kubernetes, as.managedNamespace, &config.ArtifactRepository)
Expand Down
11 changes: 8 additions & 3 deletions server/clusterworkflowtemplate/informer.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ const (
workflowTemplateResyncPeriod = 20 * time.Minute
)

type ClusterWorkflowTemplateInformer interface {
Run(ctx context.Context, stopCh <-chan struct{})
Getter(ctx context.Context) templateresolution.ClusterWorkflowTemplateGetter
}

var _ types.ClusterWorkflowTemplateStore = &Informer{}

type Informer struct {
Expand Down Expand Up @@ -56,9 +61,9 @@ func (cwti *Informer) Run(ctx context.Context, stopCh <-chan struct{}) {

// if namespace contains empty string Lister will use the namespace provided during initialization
func (cwti *Informer) Getter(ctx context.Context) templateresolution.ClusterWorkflowTemplateGetter {
if cwti.informer == nil {
logging.RequireLoggerFromContext(ctx).WithFatal().Error(ctx, "Template informer not started")
os.Exit(1)
if cwti == nil || cwti.informer == nil {
logging.RequireLoggerFromContext(ctx).Error(ctx, "Template informer not started")
return nil
}
return templateresolution.WrapClusterWorkflowTemplateLister(cwti.informer.Lister())
}
21 changes: 21 additions & 0 deletions server/clusterworkflowtemplate/null_client_store.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package clusterworkflowtemplate

import (
"context"

"github.com/argoproj/argo-workflows/v3/workflow/templateresolution"
)

// NullClusterWorkflowTemplateStore is a no-op implementation of ClusterWorkflowTemplateStore
// implements both informer and store interfaces
type NullClusterWorkflowTemplateStore struct{}

func NewNullClusterWorkflowTemplate() *NullClusterWorkflowTemplateStore {
return &NullClusterWorkflowTemplateStore{}
}

func (NullClusterWorkflowTemplateStore) Getter(context.Context) templateresolution.ClusterWorkflowTemplateGetter {
return &templateresolution.NullClusterWorkflowTemplateGetter{}
}

func (NullClusterWorkflowTemplateStore) Run(ctx context.Context, stopCh <-chan struct{}) {}
Loading