Skip to content

Commit 5ecee69

Browse files
committed
Add conversion for remote tasks and pipelines to support v1
This commit adds conversion for remote tasks and pipelines after they are resolved by resolvers to support v1 types. Before this commit v1 tasks and pipelines are not supported in remote resolution since we use v1beta1 as the storage version and in reconciler we will convert v1 crd into v1beta. But this conversion is missing for remote resources. After we change the storage version to v1 we should update the code to support v1beta. Signed-off-by: Yongxuan Zhang [email protected]
1 parent c53681d commit 5ecee69

File tree

4 files changed

+121
-25
lines changed

4 files changed

+121
-25
lines changed

pkg/reconciler/pipelinerun/resources/pipelineref.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"github.com/google/go-containerregistry/pkg/authn/k8schain"
2525
"github.com/tektoncd/pipeline/pkg/apis/config"
26+
v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
2627
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
2728
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
2829
clientset "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
@@ -179,6 +180,17 @@ func readRuntimeObjectAsPipeline(ctx context.Context, obj runtime.Object) (v1bet
179180
if pipeline, ok := obj.(v1beta1.PipelineObject); ok {
180181
return pipeline, nil
181182
}
182-
183+
if pipeline, ok := obj.(*v1.Pipeline); ok {
184+
p := &v1beta1.Pipeline{
185+
TypeMeta: metav1.TypeMeta{
186+
Kind: "Pipeline",
187+
APIVersion: "tekton.dev/v1beta1",
188+
},
189+
}
190+
if err := p.ConvertFrom(ctx, pipeline); err != nil {
191+
return nil, err
192+
}
193+
return p, nil
194+
}
183195
return nil, errors.New("resource is not a pipeline")
184196
}

pkg/reconciler/pipelinerun/resources/pipelineref_test.go

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -292,33 +292,50 @@ func TestGetPipelineFunc_RemoteResolution(t *testing.T) {
292292
ctx = config.ToContext(ctx, cfg)
293293
pipeline := parse.MustParseV1beta1Pipeline(t, pipelineYAMLString)
294294
pipelineRef := &v1beta1.PipelineRef{ResolverRef: v1beta1.ResolverRef{Resolver: "git"}}
295-
pipelineYAML := strings.Join([]string{
296-
"kind: Pipeline",
297-
"apiVersion: tekton.dev/v1beta1",
298-
pipelineYAMLString,
299-
}, "\n")
300295

301-
resolved := test.NewResolvedResource([]byte(pipelineYAML), nil, sampleConfigSource.DeepCopy(), nil)
302-
requester := test.NewRequester(resolved, nil)
303-
fn := resources.GetPipelineFunc(ctx, nil, nil, requester, &v1beta1.PipelineRun{
304-
ObjectMeta: metav1.ObjectMeta{Namespace: "default"},
305-
Spec: v1beta1.PipelineRunSpec{
306-
PipelineRef: pipelineRef,
307-
ServiceAccountName: "default",
308-
},
309-
})
296+
testcases := []struct {
297+
name string
298+
pipelineYAML string
299+
}{{
300+
name: "v1beta1 pipeline",
301+
pipelineYAML: strings.Join([]string{
302+
"kind: Pipeline",
303+
"apiVersion: tekton.dev/v1beta1",
304+
pipelineYAMLString,
305+
}, "\n"),
306+
}, {
307+
name: "v1 pipeline",
308+
pipelineYAML: strings.Join([]string{
309+
"kind: Pipeline",
310+
"apiVersion: tekton.dev/v1",
311+
pipelineYAMLString,
312+
}, "\n"),
313+
}}
314+
for _, tc := range testcases {
315+
t.Run(tc.name, func(t *testing.T) {
316+
resolved := test.NewResolvedResource([]byte(tc.pipelineYAML), nil, sampleConfigSource.DeepCopy(), nil)
317+
requester := test.NewRequester(resolved, nil)
318+
fn := resources.GetPipelineFunc(ctx, nil, nil, requester, &v1beta1.PipelineRun{
319+
ObjectMeta: metav1.ObjectMeta{Namespace: "default"},
320+
Spec: v1beta1.PipelineRunSpec{
321+
PipelineRef: pipelineRef,
322+
ServiceAccountName: "default",
323+
},
324+
})
310325

311-
resolvedPipeline, resolvedConfigSource, err := fn(ctx, pipelineRef.Name)
312-
if err != nil {
313-
t.Fatalf("failed to call pipelinefn: %s", err.Error())
314-
}
326+
resolvedPipeline, resolvedConfigSource, err := fn(ctx, pipelineRef.Name)
327+
if err != nil {
328+
t.Fatalf("failed to call pipelinefn: %s", err.Error())
329+
}
315330

316-
if diff := cmp.Diff(pipeline, resolvedPipeline); diff != "" {
317-
t.Error(diff)
318-
}
331+
if diff := cmp.Diff(pipeline, resolvedPipeline); diff != "" {
332+
t.Error(diff)
333+
}
319334

320-
if d := cmp.Diff(sampleConfigSource, resolvedConfigSource); d != "" {
321-
t.Errorf("configsource did not match: %s", diff.PrintWantGot(d))
335+
if d := cmp.Diff(sampleConfigSource, resolvedConfigSource); d != "" {
336+
t.Errorf("configsource did not match: %s", diff.PrintWantGot(d))
337+
}
338+
})
322339
}
323340
}
324341

pkg/reconciler/taskrun/resources/taskref.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
"github.com/google/go-containerregistry/pkg/authn/k8schain"
2626
"github.com/tektoncd/pipeline/pkg/apis/config"
27+
v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
2728
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
2829
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
2930
clientset "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
@@ -197,6 +198,18 @@ func readRuntimeObjectAsTask(ctx context.Context, obj runtime.Object) (v1beta1.T
197198
if task, ok := obj.(v1beta1.TaskObject); ok {
198199
return task, nil
199200
}
201+
if task, ok := obj.(*v1.Task); ok {
202+
t := &v1beta1.Task{
203+
TypeMeta: metav1.TypeMeta{
204+
Kind: "Task",
205+
APIVersion: "tekton.dev/v1beta1",
206+
},
207+
}
208+
if err := t.ConvertFrom(ctx, task); err != nil {
209+
return nil, err
210+
}
211+
return t, nil
212+
}
200213
return nil, errors.New("resource is not a task")
201214
}
202215

pkg/reconciler/taskrun/resources/taskref_test.go

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,63 @@ func TestGetTaskFunc_RemoteResolution(t *testing.T) {
537537
ctx = config.ToContext(ctx, cfg)
538538
task := parse.MustParseV1beta1Task(t, taskYAMLString)
539539
taskRef := &v1beta1.TaskRef{ResolverRef: v1beta1.ResolverRef{Resolver: "git"}}
540+
541+
testcases := []struct {
542+
name string
543+
taskYAML string
544+
}{{
545+
name: "v1beta1 task",
546+
taskYAML: strings.Join([]string{
547+
"kind: Task",
548+
"apiVersion: tekton.dev/v1beta1",
549+
taskYAMLString,
550+
}, "\n"),
551+
}, {
552+
name: "v1 task",
553+
taskYAML: strings.Join([]string{
554+
"kind: Task",
555+
"apiVersion: tekton.dev/v1",
556+
taskYAMLString,
557+
}, "\n"),
558+
}}
559+
for _, tc := range testcases {
560+
t.Run(tc.name, func(t *testing.T) {
561+
resolved := test.NewResolvedResource([]byte(tc.taskYAML), nil, sampleConfigSource.DeepCopy(), nil)
562+
requester := test.NewRequester(resolved, nil)
563+
tr := &v1beta1.TaskRun{
564+
ObjectMeta: metav1.ObjectMeta{Namespace: "default"},
565+
Spec: v1beta1.TaskRunSpec{
566+
TaskRef: taskRef,
567+
ServiceAccountName: "default",
568+
},
569+
}
570+
fn := resources.GetTaskFunc(ctx, nil, nil, requester, tr, tr.Spec.TaskRef, "", "default", "default")
571+
572+
resolvedTask, resolvedConfigSource, err := fn(ctx, taskRef.Name)
573+
if err != nil {
574+
t.Fatalf("failed to call pipelinefn: %s", err.Error())
575+
}
576+
577+
if d := cmp.Diff(sampleConfigSource, resolvedConfigSource); d != "" {
578+
t.Errorf("configSources did not match: %s", diff.PrintWantGot(d))
579+
}
580+
581+
if d := cmp.Diff(task, resolvedTask); d != "" {
582+
t.Errorf("resolvedTask did not match: %s", diff.PrintWantGot(d))
583+
}
584+
})
585+
}
586+
}
587+
588+
func TestGetTaskFunc_RemoteResolutionV1Task(t *testing.T) {
589+
ctx := context.Background()
590+
cfg := config.FromContextOrDefaults(ctx)
591+
ctx = config.ToContext(ctx, cfg)
592+
task := parse.MustParseV1beta1Task(t, taskYAMLString)
593+
taskRef := &v1beta1.TaskRef{ResolverRef: v1beta1.ResolverRef{Resolver: "git"}}
540594
taskYAML := strings.Join([]string{
541595
"kind: Task",
542-
"apiVersion: tekton.dev/v1beta1",
596+
"apiVersion: tekton.dev/v1",
543597
taskYAMLString,
544598
}, "\n")
545599
resolved := test.NewResolvedResource([]byte(taskYAML), nil, sampleConfigSource.DeepCopy(), nil)

0 commit comments

Comments
 (0)