Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
371 changes: 371 additions & 0 deletions pkg/cmd/pipelinerun/describe_v1_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,134 @@ func TestPipelineRunDescribe_multiple_taskrun_ordering(t *testing.T) {

}

func TestPipelineRunDescribe_same_start_time(t *testing.T) {
clock := test.FakeClock()

trs := []*v1.TaskRun{
{
ObjectMeta: metav1.ObjectMeta{
Name: "tr-1",
Namespace: "ns",
},
Status: v1.TaskRunStatus{
TaskRunStatusFields: v1.TaskRunStatusFields{
StartTime: &metav1.Time{Time: clock.Now().Add(2 * time.Minute)},
CompletionTime: &metav1.Time{Time: clock.Now().Add(5 * time.Minute)},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "tr-2",
Namespace: "ns",
},
Status: v1.TaskRunStatus{
TaskRunStatusFields: v1.TaskRunStatusFields{
StartTime: &metav1.Time{Time: clock.Now().Add(2 * time.Minute)},
CompletionTime: &metav1.Time{Time: clock.Now().Add(9 * time.Minute)},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
},
}

pipelineRuns := []*v1.PipelineRun{
{
ObjectMeta: metav1.ObjectMeta{
Name: "pipeline-run",
Namespace: "ns",
CreationTimestamp: metav1.Time{Time: clock.Now()},
Labels: map[string]string{"tekton.dev/pipeline": "pipeline"},
},
Spec: v1.PipelineRunSpec{
PipelineRef: &v1.PipelineRef{
Name: "pipeline",
},
Timeouts: &v1.TimeoutFields{
Pipeline: &metav1.Duration{Duration: 1 * time.Hour},
},
},
Status: v1.PipelineRunStatus{
PipelineRunStatusFields: v1.PipelineRunStatusFields{
ChildReferences: []v1.ChildStatusReference{
{
Name: "tr-1",
PipelineTaskName: "t-1",
TypeMeta: runtime.TypeMeta{
Kind: "TaskRun",
},
},
{
Name: "tr-2",
PipelineTaskName: "t-2",
TypeMeta: runtime.TypeMeta{
Kind: "TaskRun",
},
},
},
StartTime: &metav1.Time{Time: clock.Now()},
CompletionTime: &metav1.Time{Time: clock.Now().Add(15 * time.Minute)},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Reason: v1.PipelineRunReasonSuccessful.String(),
},
},
},
},
},
}

namespaces := []*corev1.Namespace{
{
ObjectMeta: metav1.ObjectMeta{
Name: "ns",
},
},
}

version := "v1"
tdc := testDynamic.Options{}
dynamic, err := tdc.Client(
cb.UnstructuredPR(pipelineRuns[0], version),
cb.UnstructuredTR(trs[0], version),
cb.UnstructuredTR(trs[1], version),
)
if err != nil {
t.Errorf("unable to create dynamic client: %v", err)
}
cs, _ := test.SeedTestData(t, pipelinetest.Data{Namespaces: namespaces, PipelineRuns: pipelineRuns,
TaskRuns: trs,
})
cs.Pipeline.Resources = cb.APIResourceList(version, []string{"pipelinerun", "taskrun"})
p := &test.Params{Tekton: cs.Pipeline, Kube: cs.Kube, Dynamic: dynamic, Clock: clock}

pipelinerun := Command(p)
clock.Advance(10 * time.Minute)
actual, err := test.ExecuteCommand(pipelinerun, "desc", "pipeline-run", "-n", "ns")
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
golden.Assert(t, actual, fmt.Sprintf("%s.golden", t.Name()))
}

func TestPipelineRunDescribe_multiple_taskrun_without_status(t *testing.T) {
clock := test.FakeClock()

Expand Down Expand Up @@ -2743,3 +2871,246 @@ func TestPipelineRunDescribe_with_annotations(t *testing.T) {
}
golden.Assert(t, actual, fmt.Sprintf("%s.golden", t.Name()))
}

func TestPipelineRunDescribe_PinP(t *testing.T) {
clock := test.FakeClock()
greetTR := &v1.TaskRun{
ObjectMeta: metav1.ObjectMeta{
Name: "pinp-run-call-child-greet",
Namespace: "ns",
},
Status: v1.TaskRunStatus{
TaskRunStatusFields: v1.TaskRunStatusFields{
StartTime: &metav1.Time{Time: clock.Now().Add(2 * time.Minute)},
CompletionTime: &metav1.Time{Time: clock.Now().Add(5 * time.Minute)},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
}
childPR := &v1.PipelineRun{
ObjectMeta: metav1.ObjectMeta{
Name: "pinp-run-call-child",
Namespace: "ns",
},
Spec: v1.PipelineRunSpec{
PipelineSpec: &v1.PipelineSpec{
Tasks: []v1.PipelineTask{
{Name: "greet", TaskRef: &v1.TaskRef{Name: "greet"}},
},
},
},
Status: v1.PipelineRunStatus{
PipelineRunStatusFields: v1.PipelineRunStatusFields{
ChildReferences: []v1.ChildStatusReference{
{
Name: "pinp-run-call-child-greet",
PipelineTaskName: "greet",
TypeMeta: runtime.TypeMeta{
Kind: "TaskRun",
},
},
},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
}
parentPR := &v1.PipelineRun{
ObjectMeta: metav1.ObjectMeta{
Name: "pinp-pipeline-run",
Namespace: "ns",
CreationTimestamp: metav1.Time{Time: clock.Now()},
Labels: map[string]string{"tekton.dev/pipeline": "pipeline"},
},
Spec: v1.PipelineRunSpec{
PipelineRef: &v1.PipelineRef{
Name: "pipeline",
},
Timeouts: &v1.TimeoutFields{
Pipeline: &metav1.Duration{Duration: 1 * time.Hour},
},
},
Status: v1.PipelineRunStatus{
PipelineRunStatusFields: v1.PipelineRunStatusFields{
StartTime: &metav1.Time{Time: clock.Now()},
CompletionTime: &metav1.Time{Time: clock.Now().Add(5 * time.Minute)},
ChildReferences: []v1.ChildStatusReference{
{
Name: "pinp-run-call-child",
PipelineTaskName: "call-child",
TypeMeta: runtime.TypeMeta{
Kind: "PipelineRun",
},
},
},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
}
namespaces := []*corev1.Namespace{
{
ObjectMeta: metav1.ObjectMeta{
Name: "ns",
},
},
}
version := "v1"
tdc := testDynamic.Options{}
dynamic, err := tdc.Client(
cb.UnstructuredPR(parentPR, version),
cb.UnstructuredPR(childPR, version),
cb.UnstructuredTR(greetTR, version),
)
if err != nil {
t.Errorf("unable to create dynamic client: %v", err)
}
cs, _ := test.SeedTestData(t, pipelinetest.Data{
Namespaces: namespaces,
PipelineRuns: []*v1.PipelineRun{parentPR, childPR},
TaskRuns: []*v1.TaskRun{greetTR},
})
cs.Pipeline.Resources = cb.APIResourceList(version, []string{"pipelinerun", "taskrun"})
p := &test.Params{Tekton: cs.Pipeline, Kube: cs.Kube, Dynamic: dynamic, Clock: clock}
pipelinerun := Command(p)
clock.Advance(10 * time.Minute)
actual, err := test.ExecuteCommand(pipelinerun, "desc", "pinp-pipeline-run", "-n", "ns")
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
golden.Assert(t, actual, fmt.Sprintf("%s.golden", t.Name()))
}

func TestPipelineRunDescribe_PinP_NilStartTime(t *testing.T) {
clock := test.FakeClock()
greetTR := &v1.TaskRun{
ObjectMeta: metav1.ObjectMeta{
Name: "pinp-run-call-child-greet",
Namespace: "ns",
},
// No StartTime set - simulates a child TaskRun still starting
}
childPR := &v1.PipelineRun{
ObjectMeta: metav1.ObjectMeta{
Name: "pinp-run-call-child",
Namespace: "ns",
},
Spec: v1.PipelineRunSpec{
PipelineSpec: &v1.PipelineSpec{
Tasks: []v1.PipelineTask{
{Name: "greet", TaskRef: &v1.TaskRef{Name: "greet"}},
},
},
},
Status: v1.PipelineRunStatus{
PipelineRunStatusFields: v1.PipelineRunStatusFields{
ChildReferences: []v1.ChildStatusReference{
{
Name: "pinp-run-call-child-greet",
PipelineTaskName: "greet",
TypeMeta: runtime.TypeMeta{
Kind: "TaskRun",
},
},
},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
}
parentPR := &v1.PipelineRun{
ObjectMeta: metav1.ObjectMeta{
Name: "pinp-pipeline-run",
Namespace: "ns",
CreationTimestamp: metav1.Time{Time: clock.Now()},
Labels: map[string]string{"tekton.dev/pipeline": "pipeline"},
},
Spec: v1.PipelineRunSpec{
PipelineRef: &v1.PipelineRef{
Name: "pipeline",
},
Timeouts: &v1.TimeoutFields{
Pipeline: &metav1.Duration{Duration: 1 * time.Hour},
},
},
Status: v1.PipelineRunStatus{
PipelineRunStatusFields: v1.PipelineRunStatusFields{
StartTime: &metav1.Time{Time: clock.Now()},
CompletionTime: &metav1.Time{Time: clock.Now().Add(5 * time.Minute)},
ChildReferences: []v1.ChildStatusReference{
{
Name: "pinp-run-call-child",
PipelineTaskName: "call-child",
TypeMeta: runtime.TypeMeta{
Kind: "PipelineRun",
},
},
},
},
Status: duckv1.Status{
Conditions: duckv1.Conditions{
{
Status: corev1.ConditionTrue,
Type: apis.ConditionSucceeded,
},
},
},
},
}
namespaces := []*corev1.Namespace{
{
ObjectMeta: metav1.ObjectMeta{
Name: "ns",
},
},
}
version := "v1"
tdc := testDynamic.Options{}
dynamic, err := tdc.Client(
cb.UnstructuredPR(parentPR, version),
cb.UnstructuredPR(childPR, version),
cb.UnstructuredTR(greetTR, version),
)
if err != nil {
t.Errorf("unable to create dynamic client: %v", err)
}
cs, _ := test.SeedTestData(t, pipelinetest.Data{
Namespaces: namespaces,
PipelineRuns: []*v1.PipelineRun{parentPR, childPR},
TaskRuns: []*v1.TaskRun{greetTR},
})
cs.Pipeline.Resources = cb.APIResourceList(version, []string{"pipelinerun", "taskrun"})
p := &test.Params{Tekton: cs.Pipeline, Kube: cs.Kube, Dynamic: dynamic, Clock: clock}
pipelinerun := Command(p)
clock.Advance(10 * time.Minute)
actual, err := test.ExecuteCommand(pipelinerun, "desc", "pinp-pipeline-run", "-n", "ns")
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
golden.Assert(t, actual, fmt.Sprintf("%s.golden", t.Name()))
}
Loading