beef up job tests
parent
a71f23d3aa
commit
d1ec1d3ade
|
|
@ -153,6 +153,7 @@ func (r *Job) Fields(ns string) Row {
|
||||||
func (*Job) toContainers(p v1.PodSpec) (string, string) {
|
func (*Job) toContainers(p v1.PodSpec) (string, string) {
|
||||||
cc := make([]string, 0, len(p.InitContainers)+len(p.Containers))
|
cc := make([]string, 0, len(p.InitContainers)+len(p.Containers))
|
||||||
ii := make([]string, 0, len(cc))
|
ii := make([]string, 0, len(cc))
|
||||||
|
|
||||||
for _, c := range p.InitContainers {
|
for _, c := range p.InitContainers {
|
||||||
cc = append(cc, c.Name)
|
cc = append(cc, c.Name)
|
||||||
ii = append(ii, c.Image)
|
ii = append(ii, c.Image)
|
||||||
|
|
@ -162,12 +163,13 @@ func (*Job) toContainers(p v1.PodSpec) (string, string) {
|
||||||
ii = append(ii, c.Image)
|
ii = append(ii, c.Image)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const maxShow = 2
|
||||||
// Limit to 2 of each...
|
// Limit to 2 of each...
|
||||||
if len(cc) > 2 {
|
if len(cc) > maxShow {
|
||||||
cc = append(cc[:2], "...")
|
cc = append(cc[:2], fmt.Sprintf("(+%d)...", len(cc)-maxShow))
|
||||||
}
|
}
|
||||||
if len(ii) > 2 {
|
if len(ii) > maxShow {
|
||||||
ii = append(ii[:2], "...")
|
ii = append(ii[:2], fmt.Sprintf("(+%d)...", len(ii)-maxShow))
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(cc, ","), strings.Join(ii, ",")
|
return strings.Join(cc, ","), strings.Join(ii, ",")
|
||||||
|
|
@ -177,23 +179,31 @@ func (*Job) toCompletion(spec batchv1.JobSpec, status batchv1.JobStatus) (s stri
|
||||||
if spec.Completions != nil {
|
if spec.Completions != nil {
|
||||||
return fmt.Sprintf("%d/%d", status.Succeeded, *spec.Completions)
|
return fmt.Sprintf("%d/%d", status.Succeeded, *spec.Completions)
|
||||||
}
|
}
|
||||||
var parallelism int32
|
|
||||||
if spec.Parallelism != nil {
|
if spec.Parallelism == nil {
|
||||||
parallelism = *spec.Parallelism
|
return fmt.Sprintf("%d/1", status.Succeeded)
|
||||||
}
|
}
|
||||||
if parallelism > 1 {
|
|
||||||
return fmt.Sprintf("%d/1 of %d", status.Succeeded, parallelism)
|
p := *spec.Parallelism
|
||||||
|
if p > 1 {
|
||||||
|
return fmt.Sprintf("%d/1 of %d", status.Succeeded, p)
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Sprintf("%d/1", status.Succeeded)
|
return fmt.Sprintf("%d/1", status.Succeeded)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Job) toDuration(status batchv1.JobStatus) string {
|
func (*Job) toDuration(status batchv1.JobStatus) string {
|
||||||
switch {
|
if status.StartTime == nil {
|
||||||
case status.StartTime == nil:
|
return MissingValue
|
||||||
case status.CompletionTime == nil:
|
|
||||||
return duration.HumanDuration(time.Since(status.StartTime.Time))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return duration.HumanDuration(status.CompletionTime.Sub(status.StartTime.Time))
|
var d time.Duration
|
||||||
|
switch {
|
||||||
|
case status.CompletionTime == nil:
|
||||||
|
d = time.Since(status.StartTime.Time)
|
||||||
|
default:
|
||||||
|
d = status.CompletionTime.Sub(status.StartTime.Time)
|
||||||
|
}
|
||||||
|
|
||||||
|
return duration.HumanDuration(d)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
package resource
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
batchv1 "k8s.io/api/batch/v1"
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestJobToCompletion(t *testing.T) {
|
||||||
|
t0 := testTime()
|
||||||
|
t1, t2 := metav1.Time{t0}, metav1.Time{t0.Add(10 * time.Second)}
|
||||||
|
var c, p int32 = 10, 20
|
||||||
|
|
||||||
|
uu := []struct {
|
||||||
|
j batchv1.JobSpec
|
||||||
|
s batchv1.JobStatus
|
||||||
|
e string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
batchv1.JobSpec{
|
||||||
|
Completions: &c,
|
||||||
|
Parallelism: &p,
|
||||||
|
},
|
||||||
|
batchv1.JobStatus{
|
||||||
|
Succeeded: 1,
|
||||||
|
Active: 1,
|
||||||
|
Failed: 0,
|
||||||
|
StartTime: &t1,
|
||||||
|
CompletionTime: &t2,
|
||||||
|
},
|
||||||
|
"1/10",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
batchv1.JobSpec{
|
||||||
|
Parallelism: &p,
|
||||||
|
},
|
||||||
|
batchv1.JobStatus{
|
||||||
|
Succeeded: 1,
|
||||||
|
Active: 1,
|
||||||
|
Failed: 0,
|
||||||
|
StartTime: &t1,
|
||||||
|
CompletionTime: &t2,
|
||||||
|
},
|
||||||
|
"1/1 of 20",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
batchv1.JobSpec{
|
||||||
|
Completions: &c,
|
||||||
|
},
|
||||||
|
batchv1.JobStatus{
|
||||||
|
Succeeded: 1,
|
||||||
|
Active: 1,
|
||||||
|
Failed: 0,
|
||||||
|
StartTime: &t1,
|
||||||
|
CompletionTime: &t2,
|
||||||
|
},
|
||||||
|
"1/10",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
batchv1.JobSpec{},
|
||||||
|
batchv1.JobStatus{
|
||||||
|
Succeeded: 1,
|
||||||
|
Active: 1,
|
||||||
|
Failed: 0,
|
||||||
|
StartTime: &t1,
|
||||||
|
CompletionTime: &t2,
|
||||||
|
},
|
||||||
|
"1/1",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var j *Job
|
||||||
|
for _, u := range uu {
|
||||||
|
assert.Equal(t, u.e, j.toCompletion(u.j, u.s))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJobToDuration(t *testing.T) {
|
||||||
|
t0 := testTime()
|
||||||
|
t1, t2 := metav1.Time{t0}, metav1.Time{t0.Add(10 * time.Second)}
|
||||||
|
|
||||||
|
uu := []struct {
|
||||||
|
s batchv1.JobStatus
|
||||||
|
e string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
batchv1.JobStatus{
|
||||||
|
StartTime: &t1,
|
||||||
|
CompletionTime: &t2,
|
||||||
|
},
|
||||||
|
"10s",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
batchv1.JobStatus{
|
||||||
|
StartTime: &t1,
|
||||||
|
},
|
||||||
|
"101d",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
batchv1.JobStatus{
|
||||||
|
CompletionTime: &t2,
|
||||||
|
},
|
||||||
|
MissingValue,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var j *Job
|
||||||
|
for _, u := range uu {
|
||||||
|
assert.Equal(t, u.e, j.toDuration(u.s))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJobToContainers(t *testing.T) {
|
||||||
|
uu := []struct {
|
||||||
|
s v1.PodSpec
|
||||||
|
c, i string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
v1.PodSpec{
|
||||||
|
InitContainers: []v1.Container{
|
||||||
|
{Name: "i1", Image: "fred"},
|
||||||
|
},
|
||||||
|
Containers: []v1.Container{
|
||||||
|
{Name: "c1", Image: "blee"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"i1,c1", "fred,blee",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v1.PodSpec{
|
||||||
|
InitContainers: []v1.Container{
|
||||||
|
{Name: "i1", Image: "fred"},
|
||||||
|
},
|
||||||
|
Containers: []v1.Container{
|
||||||
|
{Name: "c1", Image: "blee"},
|
||||||
|
{Name: "c2", Image: "duh"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"i1,c1,(+1)...", "fred,blee,(+1)...",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var j *Job
|
||||||
|
for _, u := range uu {
|
||||||
|
c, i := j.toContainers(u.s)
|
||||||
|
assert.Equal(t, u.c, c)
|
||||||
|
assert.Equal(t, u.i, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue