Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable completion time-to-live to be set on all jobs #407

Merged
merged 4 commits into from
Jun 6, 2019
Merged
Changes from 1 commit
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
Next Next commit
Enable completion time-to-live to be set on all jobs
Signed-off-by: Gary Brown <[email protected]>
objectiser committed Jun 4, 2019
commit 3dbbf5b804a918d2541f2c224f5774aea124c0bb
18 changes: 11 additions & 7 deletions pkg/apis/jaegertracing/v1/jaeger_types.go
Original file line number Diff line number Diff line change
@@ -201,10 +201,11 @@ type ElasticsearchSpec struct {
// JaegerCassandraCreateSchemaSpec holds the options related to the create-schema batch job
// +k8s:openapi-gen=true
type JaegerCassandraCreateSchemaSpec struct {
Enabled *bool `json:"enabled"`
Image string `json:"image"`
Datacenter string `json:"datacenter"`
Mode string `json:"mode"`
Enabled *bool `json:"enabled"`
Image string `json:"image"`
Datacenter string `json:"datacenter"`
Mode string `json:"mode"`
CompletedTTL *int32 `json:"completedTTL"`
}

// JaegerDependenciesSpec defined options for running spark-dependencies.
@@ -218,6 +219,7 @@ type JaegerDependenciesSpec struct {
CassandraClientAuthEnabled bool `json:"cassandraClientAuthEnabled"`
ElasticsearchClientNodeOnly bool `json:"elasticsearchClientNodeOnly"`
ElasticsearchNodesWanOnly bool `json:"elasticsearchNodesWanOnly"`
CompletedTTL *int32 `json:"completedTTL"`
}

// JaegerEsIndexCleanerSpec holds the options related to es-index-cleaner
@@ -227,13 +229,15 @@ type JaegerEsIndexCleanerSpec struct {
NumberOfDays *int `json:"numberOfDays"`
Schedule string `json:"schedule"`
Image string `json:"image"`
CompletedTTL *int32 `json:"completedTTL"`
}

// JaegerEsRolloverSpec holds the options related to es-rollover
type JaegerEsRolloverSpec struct {
Image string `json:"image"`
Schedule string `json:"schedule"`
Conditions string `json:"conditions"`
Image string `json:"image"`
Schedule string `json:"schedule"`
Conditions string `json:"conditions"`
CompletedTTL *int32 `json:"completedTTL"`
// we parse it with time.ParseDuration
ReadTTL string `json:"readTTL"`
}
22 changes: 21 additions & 1 deletion pkg/apis/jaegertracing/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion pkg/cronjob/es_index_cleaner.go
Original file line number Diff line number Diff line change
@@ -59,7 +59,8 @@ func CreateEsIndexCleaner(jaeger *v1.Jaeger) *batchv1beta1.CronJob {
Schedule: jaeger.Spec.Storage.EsIndexCleaner.Schedule,
JobTemplate: batchv1beta1.JobTemplateSpec{
Spec: batchv1.JobSpec{
Parallelism: &one,
Parallelism: &one,
TTLSecondsAfterFinished: jaeger.Spec.Storage.EsIndexCleaner.CompletedTTL,
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
3 changes: 3 additions & 0 deletions pkg/cronjob/es_index_cleaner_test.go
Original file line number Diff line number Diff line change
@@ -13,7 +13,10 @@ func TestCreateEsIndexCleaner(t *testing.T) {
map[string]interface{}{"es.index-prefix": "tenant1", "es.server-urls": "http://nowhere:666,foo"})}}}
days := 0
jaeger.Spec.Storage.EsIndexCleaner.NumberOfDays = &days
completedTTL := int32(100)
jaeger.Spec.Storage.EsIndexCleaner.CompletedTTL = &completedTTL
cronJob := CreateEsIndexCleaner(jaeger)
assert.Equal(t, completedTTL, *cronJob.Spec.JobTemplate.Spec.TTLSecondsAfterFinished)
assert.Equal(t, 2, len(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Args))
// default number of days (7) is applied in normalize in controller
assert.Equal(t, []string{"0", "http://nowhere:666"}, cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Args)
6 changes: 2 additions & 4 deletions pkg/cronjob/es_rollover.go
Original file line number Diff line number Diff line change
@@ -35,7 +35,6 @@ func rollover(jaeger *v1.Jaeger) batchv1beta1.CronJob {
envs = append(envs, corev1.EnvVar{Name: "CONDITIONS", Value: jaeger.Spec.Storage.Rollover.Conditions})
}
one := int32(1)
ttlHourInSec := int32(60 * 60)
return batchv1beta1.CronJob{
ObjectMeta: metav1.ObjectMeta{
Name: name,
@@ -48,7 +47,7 @@ func rollover(jaeger *v1.Jaeger) batchv1beta1.CronJob {
Schedule: jaeger.Spec.Storage.Rollover.Schedule,
JobTemplate: batchv1beta1.JobTemplateSpec{
Spec: batchv1.JobSpec{
TTLSecondsAfterFinished: &ttlHourInSec,
TTLSecondsAfterFinished: jaeger.Spec.Storage.Rollover.CompletedTTL,
Parallelism: &one,
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
@@ -91,7 +90,6 @@ func lookback(jaeger *v1.Jaeger) batchv1beta1.CronJob {
Error("Failed to parse esRollover.readTTL to time.duration")
}
}
ttlHourInSec := int32(60 * 60)
return batchv1beta1.CronJob{
ObjectMeta: metav1.ObjectMeta{
Name: name,
@@ -104,7 +102,7 @@ func lookback(jaeger *v1.Jaeger) batchv1beta1.CronJob {
Schedule: jaeger.Spec.Storage.Rollover.Schedule,
JobTemplate: batchv1beta1.JobTemplateSpec{
Spec: batchv1.JobSpec{
TTLSecondsAfterFinished: &ttlHourInSec,
TTLSecondsAfterFinished: jaeger.Spec.Storage.Rollover.CompletedTTL,
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{
6 changes: 6 additions & 0 deletions pkg/cronjob/es_rollover_test.go
Original file line number Diff line number Diff line change
@@ -23,6 +23,8 @@ func TestRollover(t *testing.T) {
j.Spec.Storage.Rollover.Image = "wohooo"
j.Spec.Storage.Rollover.Conditions = "weheee"
j.Spec.Storage.Options = v1.NewOptions(map[string]interface{}{"es.server-urls": "foo,bar", "es.index-prefix": "shortone"})
completedTTL := int32(100)
j.Spec.Storage.Rollover.CompletedTTL = &completedTTL

cjob := rollover(j)
assert.Equal(t, j.Namespace, cjob.Namespace)
@@ -32,6 +34,7 @@ func TestRollover(t *testing.T) {
assert.Equal(t, j.Spec.Storage.Rollover.Image, cjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Image)
assert.Equal(t, []string{"rollover", "foo"}, cjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Args)
assert.Equal(t, []corev1.EnvVar{{Name: "INDEX_PREFIX", Value: "shortone"}, {Name: "CONDITIONS", Value: "weheee"}}, cjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Env)
assert.Equal(t, completedTTL, *cjob.Spec.JobTemplate.Spec.TTLSecondsAfterFinished)
}

func TestLookback(t *testing.T) {
@@ -40,6 +43,8 @@ func TestLookback(t *testing.T) {
j.Spec.Storage.Rollover.Image = "wohooo"
j.Spec.Storage.Rollover.ReadTTL = "2h"
j.Spec.Storage.Options = v1.NewOptions(map[string]interface{}{"es.server-urls": "foo,bar", "es.index-prefix": "shortone"})
completedTTL := int32(100)
j.Spec.Storage.Rollover.CompletedTTL = &completedTTL

cjob := lookback(j)
assert.Equal(t, j.Namespace, cjob.Namespace)
@@ -49,6 +54,7 @@ func TestLookback(t *testing.T) {
assert.Equal(t, j.Spec.Storage.Rollover.Image, cjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Image)
assert.Equal(t, []string{"lookback", "foo"}, cjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Args)
assert.Equal(t, []corev1.EnvVar{{Name: "INDEX_PREFIX", Value: "shortone"}, {Name: "UNIT", Value: "hours"}, {Name: "UNIT_COUNT", Value: "2"}}, cjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Env)
assert.Equal(t, completedTTL, *cjob.Spec.JobTemplate.Spec.TTLSecondsAfterFinished)
}

func TestEnvVars(t *testing.T) {
3 changes: 2 additions & 1 deletion pkg/cronjob/spark_dependencies.go
Original file line number Diff line number Diff line change
@@ -60,7 +60,8 @@ func CreateSparkDependencies(jaeger *v1.Jaeger) *batchv1beta1.CronJob {
Schedule: jaeger.Spec.Storage.SparkDependencies.Schedule,
JobTemplate: batchv1beta1.JobTemplateSpec{
Spec: batchv1.JobSpec{
Parallelism: &one,
Parallelism: &one,
TTLSecondsAfterFinished: jaeger.Spec.Storage.SparkDependencies.CompletedTTL,
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
10 changes: 10 additions & 0 deletions pkg/cronjob/spark_dependencies_test.go
Original file line number Diff line number Diff line change
@@ -76,3 +76,13 @@ func TestStorageEnvs(t *testing.T) {
func TestCreate(t *testing.T) {
assert.NotNil(t, CreateSparkDependencies(&v1.Jaeger{Spec: v1.JaegerSpec{Storage: v1.JaegerStorageSpec{Type: "elasticsearch"}}}))
}

func TestSparkDependencies(t *testing.T) {
j := &v1.Jaeger{Spec: v1.JaegerSpec{Storage: v1.JaegerStorageSpec{Type: "elasticsearch"}}}
completedTTL := int32(100)
j.Spec.Storage.SparkDependencies.CompletedTTL = &completedTTL

cjob := CreateSparkDependencies(j)
assert.Equal(t, j.Namespace, cjob.Namespace)
assert.Equal(t, completedTTL, *cjob.Spec.JobTemplate.Spec.TTLSecondsAfterFinished)
}
3 changes: 2 additions & 1 deletion pkg/storage/cassandra_dependencies.go
Original file line number Diff line number Diff line change
@@ -81,7 +81,8 @@ func cassandraDeps(jaeger *v1.Jaeger) []batchv1.Job {
},
},
Spec: batchv1.JobSpec{
ActiveDeadlineSeconds: &deadline,
ActiveDeadlineSeconds: &deadline,
TTLSecondsAfterFinished: jaeger.Spec.Storage.CassandraCreateSchema.CompletedTTL,
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Annotations: annotations,
11 changes: 11 additions & 0 deletions pkg/storage/cassandra_dependencies_test.go
Original file line number Diff line number Diff line change
@@ -32,3 +32,14 @@ func TestCassandraCreateSchemaEnabledNil(t *testing.T) {
assert.Nil(t, jaeger.Spec.Storage.CassandraCreateSchema.Enabled)
assert.Len(t, cassandraDeps(jaeger), 1)
}

func TestCassandraCreateSchemaCompletedTTL(t *testing.T) {
trueVar := true

jaeger := v1.NewJaeger("TestCassandraCreateSchemaCompletedTTL")
jaeger.Spec.Storage.CassandraCreateSchema.Enabled = &trueVar
completedTTL := int32(100)
jaeger.Spec.Storage.CassandraCreateSchema.CompletedTTL = &completedTTL
cjob := cassandraDeps(jaeger)
assert.Equal(t, completedTTL, *cjob[0].Spec.TTLSecondsAfterFinished)
}
21 changes: 21 additions & 0 deletions pkg/strategy/controller.go
Original file line number Diff line number Diff line change
@@ -18,6 +18,11 @@ const (
esCertGenerationScript = "./scripts/cert_generation.sh"
)

var (
// Default to 10 minutes
defCompletedTTL = int32(600)
)

// For returns the appropriate Strategy for the given Jaeger instance
func For(ctx context.Context, jaeger *v1.Jaeger, secrets []corev1.Secret) S {
if strings.EqualFold(jaeger.Spec.Strategy, "all-in-one") {
@@ -90,6 +95,7 @@ func normalize(jaeger *v1.Jaeger) {
normalizeIndexCleaner(&jaeger.Spec.Storage.EsIndexCleaner, jaeger.Spec.Storage.Type)
normalizeElasticsearch(&jaeger.Spec.Storage.Elasticsearch)
normalizeRollover(&jaeger.Spec.Storage.Rollover)
normalizeCassandraCreateSchema(&jaeger.Spec.Storage.CassandraCreateSchema)
normalizeUI(&jaeger.Spec)
}

@@ -107,6 +113,9 @@ func normalizeSparkDependencies(spec *v1.JaegerStorageSpec) {
if spec.SparkDependencies.Schedule == "" {
spec.SparkDependencies.Schedule = "55 23 * * *"
}
if spec.SparkDependencies.CompletedTTL == nil {
spec.SparkDependencies.CompletedTTL = &defCompletedTTL
}
}

func normalizeIndexCleaner(spec *v1.JaegerEsIndexCleanerSpec, storage string) {
@@ -125,6 +134,9 @@ func normalizeIndexCleaner(spec *v1.JaegerEsIndexCleanerSpec, storage string) {
defDays := 7
spec.NumberOfDays = &defDays
}
if spec.CompletedTTL == nil {
spec.CompletedTTL = &defCompletedTTL
}
}

func normalizeElasticsearch(spec *v1.ElasticsearchSpec) {
@@ -140,6 +152,15 @@ func normalizeRollover(spec *v1.JaegerEsRolloverSpec) {
if spec.Schedule == "" {
spec.Schedule = "*/30 * * * *"
}
if spec.CompletedTTL == nil {
spec.CompletedTTL = &defCompletedTTL
}
}

func normalizeCassandraCreateSchema(spec *v1.JaegerCassandraCreateSchemaSpec) {
if spec.CompletedTTL == nil {
spec.CompletedTTL = &defCompletedTTL
}
}

func normalizeUI(spec *v1.JaegerSpec) {
23 changes: 13 additions & 10 deletions pkg/strategy/controller_test.go
Original file line number Diff line number Diff line change
@@ -171,14 +171,15 @@ func TestNormalizeIndexCleaner(t *testing.T) {
falseVar := false
days7 := 7
days55 := 55
completedTTL100 := int32(100)
tests := []struct {
underTest v1.JaegerEsIndexCleanerSpec
expected v1.JaegerEsIndexCleanerSpec
}{
{underTest: v1.JaegerEsIndexCleanerSpec{},
expected: v1.JaegerEsIndexCleanerSpec{Image: "foo", Schedule: "55 23 * * *", NumberOfDays: &days7, Enabled: &trueVar}},
{underTest: v1.JaegerEsIndexCleanerSpec{Image: "bla", Schedule: "lol", NumberOfDays: &days55, Enabled: &falseVar},
expected: v1.JaegerEsIndexCleanerSpec{Image: "bla", Schedule: "lol", NumberOfDays: &days55, Enabled: &falseVar}},
expected: v1.JaegerEsIndexCleanerSpec{Image: "foo", Schedule: "55 23 * * *", NumberOfDays: &days7, Enabled: &trueVar, CompletedTTL: &defCompletedTTL}},
{underTest: v1.JaegerEsIndexCleanerSpec{Image: "bla", Schedule: "lol", NumberOfDays: &days55, Enabled: &falseVar, CompletedTTL: &completedTTL100},
expected: v1.JaegerEsIndexCleanerSpec{Image: "bla", Schedule: "lol", NumberOfDays: &days55, Enabled: &falseVar, CompletedTTL: &completedTTL100}},
}
for _, test := range tests {
normalizeIndexCleaner(&test.underTest, "elasticsearch")
@@ -189,14 +190,15 @@ func TestNormalizeIndexCleaner(t *testing.T) {
func TestNormalizeRollover(t *testing.T) {
viper.Set("jaeger-es-rollover-image", "hoo")
defer viper.Reset()
completedTTL100 := int32(100)
tests := []struct {
underTest v1.JaegerEsRolloverSpec
expected v1.JaegerEsRolloverSpec
}{
{underTest: v1.JaegerEsRolloverSpec{},
expected: v1.JaegerEsRolloverSpec{Image: "hoo", Schedule: "*/30 * * * *"}},
{underTest: v1.JaegerEsRolloverSpec{Image: "bla", Schedule: "lol"},
expected: v1.JaegerEsRolloverSpec{Image: "bla", Schedule: "lol"}},
expected: v1.JaegerEsRolloverSpec{Image: "hoo", Schedule: "*/30 * * * *", CompletedTTL: &defCompletedTTL}},
{underTest: v1.JaegerEsRolloverSpec{Image: "bla", Schedule: "lol", CompletedTTL: &completedTTL100},
expected: v1.JaegerEsRolloverSpec{Image: "bla", Schedule: "lol", CompletedTTL: &completedTTL100}},
}
for _, test := range tests {
normalizeRollover(&test.underTest)
@@ -209,22 +211,23 @@ func TestNormalizeSparkDependencies(t *testing.T) {
defer viper.Reset()
trueVar := true
falseVar := false
completedTTL100 := int32(100)
tests := []struct {
underTest v1.JaegerStorageSpec
expected v1.JaegerStorageSpec
}{
{
underTest: v1.JaegerStorageSpec{Type: "elasticsearch", Options: v1.NewOptions(map[string]interface{}{"es.server-urls": "foo"})},
expected: v1.JaegerStorageSpec{Type: "elasticsearch", Options: v1.NewOptions(map[string]interface{}{"es.server-urls": "foo"}),
SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "55 23 * * *", Image: "foo", Enabled: &trueVar}},
SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "55 23 * * *", Image: "foo", Enabled: &trueVar, CompletedTTL: &defCompletedTTL}},
},
{
underTest: v1.JaegerStorageSpec{Type: "elasticsearch"},
expected: v1.JaegerStorageSpec{Type: "elasticsearch", SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "55 23 * * *", Image: "foo"}},
expected: v1.JaegerStorageSpec{Type: "elasticsearch", SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "55 23 * * *", Image: "foo", CompletedTTL: &defCompletedTTL}},
},
{
underTest: v1.JaegerStorageSpec{Type: "elasticsearch", SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "foo", Image: "bla", Enabled: &falseVar}},
expected: v1.JaegerStorageSpec{Type: "elasticsearch", SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "foo", Image: "bla", Enabled: &falseVar}},
underTest: v1.JaegerStorageSpec{Type: "elasticsearch", SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "foo", Image: "bla", Enabled: &falseVar, CompletedTTL: &completedTTL100}},
expected: v1.JaegerStorageSpec{Type: "elasticsearch", SparkDependencies: v1.JaegerDependenciesSpec{Schedule: "foo", Image: "bla", Enabled: &falseVar, CompletedTTL: &completedTTL100}},
},
}
for _, test := range tests {