support tfjob on exit handler

sometimes, we need tfjob exit handler to do something once the training completed(succeeded or failed). such as sending an email to users to notify them the training result. it can be done simply specify an exit handler like this:
apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
  name: "dist-mnist-with-exithandler-for-e2e-test"
spec:
  tfReplicaSpecs:
    PS:
      replicas: 2
      restartPolicy: Never
      template:
        spec:
          containers:
            - name: tensorflow
              image: kubeflow/tf-dist-mnist-test:1.0
    Worker:
      replicas: 4
      restartPolicy: Never
      template:
        spec:
          containers:
            - name: tensorflow
              image: kubeflow/tf-dist-mnist-test:1.0
  onExit:
    spec:
      containers:
        - name: exit-handler
          image: busybox:latest
          command: [sh, -c]
          # $TFJOB_RESULT: Succeeded or Failed
          args: ["echo $TFJOB_RESULT && echo $TFJOB_START_TIME && echo $TFJOB_COMPLETION_TIME && echo send a email & sleep 10"]

we can use following environent variables to get information about tfjob:

$TFJOB_RESULT: Succeeded or Failed
$TFJOB_START_TIME: tfjob start time
$TFJOB_COMPLETION_TIME: tfjob completion time

This change is

@googlebot I signed it!

Coverage remained the same at 96.512% when pulling 12589e1daa154edae1be0918db3b17015cf30cd7 on joyme123:master into 2228b72191d82c41d234f88973a9b687e4533f7b on kubeflow:master.

Travis tests have failed
Hey @joyme123,
Please read the following log in order to understand the failure reason.
It'll be awesome if you fix what's wrong and commit the changes.
1st Build
View build log

     hack/verify-codegen.sh

Generating deepcopy funcs
Generating clientset for tensorflow:v1 at github.com/kubeflow/tf-operator/pkg/client/clientset
Generating listers for tensorflow:v1 at github.com/kubeflow/tf-operator/pkg/client/listers
Generating informers for tensorflow:v1 at github.com/kubeflow/tf-operator/pkg/client/informers
Generating defaulters for tensorflow/v1
Generating OpenAPI specification for tensorflow/v1
diffing hack/../pkg against freshly generated codegen
diff -Naupr hack/../pkg/apis/tensorflow/v1/openapi_generated.go hack/../_tmp/pkg/apis/tensorflow/v1/openapi_generated.go
--- hack/../pkg/apis/tensorflow/v1/openapi_generated.go	2020-01-06 13:36:51.580488548 +0000
+++ hack/../_tmp/pkg/apis/tensorflow/v1/openapi_generated.go	2020-01-06 13:36:12.000000000 +0000
@@ -164,18 +164,12 @@ func GetOpenAPIDefinitions(ref common.Re
 								},
 							},
 						},
-						"onExit": {
-							SchemaProps: spec.SchemaProps{
-								Description: "at the end of the tensorflow training, OnExit always executes irrespective of success or failure",
-								Ref:         ref("k8s.io/api/core/v1.PodTemplateSpec"),
-							},
-						},
 					},
 					Required: []string{"tfReplicaSpecs"},
 				},
 			},
 			Dependencies: []string{
-				"github.com/kubeflow/common/job_controller/api/v1.ReplicaSpec", "k8s.io/api/core/v1.PodTemplateSpec"},
+				"github.com/kubeflow/common/job_controller/api/v1.ReplicaSpec"},
 		},
 		"k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource": {
 			Schema: spec.Schema{
diff -Naupr hack/../pkg/apis/tensorflow/v1/zz_generated.deepcopy.go hack/../_tmp/pkg/apis/tensorflow/v1/zz_generated.deepcopy.go
--- hack/../pkg/apis/tensorflow/v1/zz_generated.deepcopy.go	2020-01-06 13:36:39.372488548 +0000
+++ hack/../_tmp/pkg/apis/tensorflow/v1/zz_generated.deepcopy.go	2020-01-06 13:36:12.000000000 +0000
@@ -20,7 +20,6 @@ package v1

 import (
 	apiv1 "github.com/kubeflow/common/job_controller/api/v1"
-	corev1 "k8s.io/api/core/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )

@@ -123,11 +122,6 @@ func (in *TFJobSpec) DeepCopyInto(out *T
 			(*out)[key] = outVal
 		}
 	}
-	if in.OnExit != nil {
-		in, out := &in.OnExit, &out.OnExit
-		*out = new(corev1.PodTemplateSpec)
-		(*in).DeepCopyInto(*out)
-	}
 	return
 }

hack/../pkg is out of date. Please run hack/update-codegen.sh

     golangci-lint run ./...

pkg/controller.v1/tensorflow/controller.go:57:2: `tfOnExitLabel` is unused (varcheck)
	tfOnExitLabel       = "tf-onexit"
	^

     goveralls -service=travis-ci -v -package ./pkg/... -ignore "pkg/client/*/*.go,pkg/client/*/*/*.go,pkg/client/*/*/*/*.go,pkg/client/*/*/*/*/*.go,pkg/client/*/*/*/*/*/*.go,pkg/client/*/*/*/*/*/*/*.go,pkg/util/*.go,pkg/util/*/*.go,pkg/apis/tensorflow/*/zz_generated.*.go,pkg/apis/tensorflow/*/*_generated.go,pkg/apis/common/*/zz_generated.*.go,pkg/apis/common/*/*_generated.go"

=== RUN   TestSetTypeNames
--- PASS: TestSetTypeNames (0.00s)
=== RUN   TestSetDefaultTFJob
--- PASS: TestSetDefaultTFJob (0.00s)
=== RUN   TestIsChieforMaster
--- PASS: TestIsChieforMaster (0.00s)
PASS
coverage: 27.7% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1	0.032s	coverage: 27.7% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
=== RUN   TestValidateV1TFJobSpec
time="2020-01-06T13:38:27Z" level=error msg="TFJobSpec is not valid: Image is undefined in the container of Worker"
time="2020-01-06T13:38:27Z" level=error msg="TFJobSpec is not valid: There is no container named tensorflow in Worker"
--- PASS: TestValidateV1TFJobSpec (0.00s)
PASS
coverage: 20.1% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation	0.033s	coverage: 20.1% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1	[no test files]
=== RUN   TestGenGeneralName
--- PASS: TestGenGeneralName (0.00s)
PASS
coverage: 0.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/common/jobcontroller	0.032s	coverage: 0.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
?   	github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured	[no test files]
=== RUN   TestCreatePods
--- PASS: TestCreatePods (0.01s)
=== RUN   TestCreateService
time="2020-01-06T13:38:51Z" level=info msg="Controller test-tfjob created service empty_service"
--- PASS: TestCreateService (0.00s)
=== RUN   TestCreateServicesWithControllerRef
time="2020-01-06T13:38:51Z" level=info msg="Controller test-tfjob created service empty_service"
--- PASS: TestCreateServicesWithControllerRef (0.00s)
=== RUN   TestClaimServices
--- PASS: TestClaimServices (0.00s)
PASS
coverage: 24.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/control	0.045s	coverage: 24.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
=== RUN   TestNormalPath
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=1, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (229.407µs)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-1" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-1" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: ps-0" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: ps-0" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (1.093362ms)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (597.391µs)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (429.82µs)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/worker-2 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=3, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (656.207µs)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=4, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=2, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (339.473µs)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=1, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:38:56Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (506.187µs)" job=default.test-tfjob
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/worker-1 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/worker-2 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/worker-3 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/ps-0 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/ps-1 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="Ignoring inactive pod default/worker-0 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=0, running=0, failed=0" job=default.test-tfjob uid=
E0106 13:38:56.804808   10424 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc00059ab70), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"PS":(*v1.ReplicaSpec)(0xc00056c2c0), "Worker":(*v1.ReplicaSpec)(0xc00056c000)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc00030fbf0)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(0xc0006681a0), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'TFJobSucceeded' 'TFJob test-tfjob successfully completed.'
time="2020-01-06T13:38:56Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=0, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:38:56Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (996.678µs)" job=default.test-tfjob
--- PASS: TestNormalPath (0.01s)
=== RUN   TestRun
time="2020-01-06T13:38:56Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:56Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:38:56Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:38:56Z" level=info msg="Starting 1 workers"
time="2020-01-06T13:38:56Z" level=info msg="Started workers"
time="2020-01-06T13:38:57Z" level=info msg="Shutting down workers"
--- PASS: TestRun (0.50s)
=== RUN   TestAddTFJob
time="2020-01-06T13:38:57Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:38:57Z" level=info msg="Creating Job controller"
time="2020-01-06T13:38:57Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:38:57Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:38:57Z" level=info msg="TFJob test-tfjob is created."  Not counted in backoff limit." job=default.test-tfjob uid=
time="2020-01-06T13:39:01Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (287.293µs)" job=default.test-tfjob
--- PASS: TestBackoffForOnFailure (0.00s)
=== RUN   TestAddPod
time="2020-01-06T13:39:01Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Creating Job controller"
time="2020-01-06T13:39:01Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:39:01Z" level=info msg="Starting 1 workers"
time="2020-01-06T13:39:01Z" level=info msg="Started workers"
--- PASS: TestAddPod (0.10s)
=== RUN   TestClusterSpec
time="2020-01-06T13:39:01Z" level=info msg="Shutting down workers"
--- PASS: TestClusterSpec (0.00s)
=== RUN   TestIsDistributed
--- PASS: TestIsDistributed (0.00s)
=== RUN   TestRestartPolicy
--- PASS: TestRestartPolicy (0.00s)
=== RUN   TestExitCode
time="2020-01-06T13:39:01Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Creating Job controller"
time="2020-01-06T13:39:01Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:39:01Z" level=info msg="Ignoring inactive pod default/worker-0 in state Failed, deletion time <nil>"
time="2020-01-06T13:39:01Z" level=info msg="Pod: default.worker-0 exited with code 130" job=default.test-tfjob replica-type=worker uid=
E0106 13:39:01.526589   10424 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc00037e5d0), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"Worker":(*v1.ReplicaSpec)(0xc000235080)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc000325960)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(nil), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'ExitedWithCode' 'Pod: default.worker-0 exited with code 130'
time="2020-01-06T13:39:01Z" level=info msg="Need to restart the pod: default.worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:39:01Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=1, running=0, failed=1" job=default.test-tfjob uid=
E0106 13:39:01.526669   10424 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc00037e5d0), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"Worker":(*v1.ReplicaSpec)(0xc000235080)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc000325960)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(0xc0005d6780), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Warning' 'TFJobRestarting' 'TFJob test-tfjob is restarting because 1 Worker replica(s) failed.'
time="2020-01-06T13:39:01Z" level=info msg="need to create new service: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:39:01Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (368.981µs)" job=default.test-tfjob
--- PASS: TestExitCode (0.00s)
=== RUN   TestAddService
time="2020-01-06T13:39:01Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Creating Job controller"
time="2020-01-06T13:39:01Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:39:01Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:39:01Z" level=info msg="Starting 1 workers"
time="2020-01-06T13:39:01Z" level=info msg="Started workers"
time="2020-01-06T13:39:01Z" level=info msg="Shutting down workers"
time="2020-01-06T13:39:01Z" level=info msg="Starting 1 workers"
time="2020-01-06T13:39:01Z" level=info msg="Started workers"
--- PASS: TestAddService (0.10s)
=== RUN   TestFailed
time="2020-01-06T13:39:01Z" level=info msg="Shutting down workers"
time="2020-01-06T13:39:01Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:39:01Z" level=info msg="Creating Job controller"
time="2020-01-06T13:39:01Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=3, running=0, failed=1" job=default.test-tfjob uid=
E0106 13:39:01.628876   10424 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc00073bfb0), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"Worker":(*v1.ReplicaSpec)(0xc0003bc2c0)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc00036dac0)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(0xc0004508e0), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'TFJobFailed' 'TFJob test-tfjob has failed because 1 Worker replica(s) failed.'

It'll be awesome if you fix what's wrong and commit the changes.
1st Build
View build log

     hack/verify-codegen.sh

Generating deepcopy funcs
Generating clientset for tensorflow:v1 at github.com/kubeflow/tf-operator/pkg/client/clientset
Generating listers for tensorflow:v1 at github.com/kubeflow/tf-operator/pkg/client/listers
Generating informers for tensorflow:v1 at github.com/kubeflow/tf-operator/pkg/client/informers
Generating defaulters for tensorflow/v1
Generating OpenAPI specification for tensorflow/v1
diffing hack/../pkg against freshly generated codegen
diff -Naupr hack/../pkg/apis/tensorflow/v1/openapi_generated.go hack/../_tmp/pkg/apis/tensorflow/v1/openapi_generated.go
--- hack/../pkg/apis/tensorflow/v1/openapi_generated.go	2020-01-06 13:49:46.840409003 +0000
+++ hack/../_tmp/pkg/apis/tensorflow/v1/openapi_generated.go	2020-01-06 13:49:09.000000000 +0000
@@ -164,18 +164,12 @@ func GetOpenAPIDefinitions(ref common.Re
 								},
 							},
 						},
-						"onExit": {
-							SchemaProps: spec.SchemaProps{
-								Description: "at the end of the tensorflow training, OnExit always executes irrespective of success or failure",
-								Ref:         ref("k8s.io/api/core/v1.PodTemplateSpec"),
-							},
-						},
 					},
 					Required: []string{"tfReplicaSpecs"},
 				},
 			},
 			Dependencies: []string{
-				"github.com/kubeflow/common/job_controller/api/v1.ReplicaSpec", "k8s.io/api/core/v1.PodTemplateSpec"},
+				"github.com/kubeflow/common/job_controller/api/v1.ReplicaSpec"},
 		},
 		"k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource": {
 			Schema: spec.Schema{
diff -Naupr hack/../pkg/apis/tensorflow/v1/zz_generated.deepcopy.go hack/../_tmp/pkg/apis/tensorflow/v1/zz_generated.deepcopy.go
--- hack/../pkg/apis/tensorflow/v1/zz_generated.deepcopy.go	2020-01-06 13:49:35.034509003 +0000
+++ hack/../_tmp/pkg/apis/tensorflow/v1/zz_generated.deepcopy.go	2020-01-06 13:49:09.000000000 +0000
@@ -20,7 +20,6 @@ package v1

 import (
 	apiv1 "github.com/kubeflow/common/job_controller/api/v1"
-	corev1 "k8s.io/api/core/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )

@@ -123,11 +122,6 @@ func (in *TFJobSpec) DeepCopyInto(out *T
 			(*out)[key] = outVal
 		}
 	}
-	if in.OnExit != nil {
-		in, out := &in.OnExit, &out.OnExit
-		*out = new(corev1.PodTemplateSpec)
-		(*in).DeepCopyInto(*out)
-	}
 	return
 }

hack/../pkg is out of date. Please run hack/update-codegen.sh

     golangci-lint run ./...

pkg/controller.v1/tensorflow/controller.go:57:2: `tfOnExitLabel` is unused (varcheck)
	tfOnExitLabel       = "tf-onexit"
	^

     goveralls -service=travis-ci -v -package ./pkg/... -ignore "pkg/client/*/*.go,pkg/client/*/*/*.go,pkg/client/*/*/*/*.go,pkg/client/*/*/*/*/*.go,pkg/client/*/*/*/*/*/*.go,pkg/client/*/*/*/*/*/*/*.go,pkg/util/*.go,pkg/util/*/*.go,pkg/apis/tensorflow/*/zz_generated.*.go,pkg/apis/tensorflow/*/*_generated.go,pkg/apis/common/*/zz_generated.*.go,pkg/apis/common/*/*_generated.go"

=== RUN   TestSetTypeNames
--- PASS: TestSetTypeNames (0.00s)
=== RUN   TestSetDefaultTFJob
--- PASS: TestSetDefaultTFJob (0.00s)
=== RUN   TestIsChieforMaster
--- PASS: TestIsChieforMaster (0.00s)
PASS
coverage: 27.7% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1	0.032s	coverage: 27.7% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
=== RUN   TestValidateV1TFJobSpec
time="2020-01-06T13:51:21Z" level=error msg="TFJobSpec is not valid: Image is undefined in the container of Worker"
time="2020-01-06T13:51:21Z" level=error msg="TFJobSpec is not valid: There is no container named tensorflow in Worker"
--- PASS: TestValidateV1TFJobSpec (0.00s)
PASS
coverage: 20.1% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation	0.032s	coverage: 20.1% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1	[no test files]
=== RUN   TestGenGeneralName
--- PASS: TestGenGeneralName (0.00s)
PASS
coverage: 0.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/common/jobcontroller	0.032s	coverage: 0.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
?   	github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil	[no test files]
?   	github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured	[no test files]
=== RUN   TestCreatePods
--- PASS: TestCreatePods (0.01s)
=== RUN   TestCreateService
time="2020-01-06T13:51:44Z" level=info msg="Controller test-tfjob created service empty_service"
--- PASS: TestCreateService (0.00s)
=== RUN   TestCreateServicesWithControllerRef
time="2020-01-06T13:51:44Z" level=info msg="Controller test-tfjob created service empty_service"
--- PASS: TestCreateServicesWithControllerRef (0.00s)
=== RUN   TestClaimServices
--- PASS: TestClaimServices (0.00s)
PASS
coverage: 24.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
ok  	github.com/kubeflow/tf-operator/pkg/control	0.045s	coverage: 24.4% of statements in github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/apis/tensorflow/validation, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/fake, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/scheme, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/clientset/versioned/typed/tensorflow/v1/fake, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/internalinterfaces, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow, github.com/kubeflow/tf-operator/pkg/client/informers/externalversions/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/client/listers/tensorflow/v1, github.com/kubeflow/tf-operator/pkg/common/jobcontroller, github.com/kubeflow/tf-operator/pkg/common/util/v1/testutil, github.com/kubeflow/tf-operator/pkg/common/util/v1/unstructured, github.com/kubeflow/tf-operator/pkg/control, github.com/kubeflow/tf-operator/pkg/controller.v1/tensorflow, github.com/kubeflow/tf-operator/pkg/logger, github.com/kubeflow/tf-operator/pkg/util, github.com/kubeflow/tf-operator/pkg/util/k8sutil, github.com/kubeflow/tf-operator/pkg/util/signals, github.com/kubeflow/tf-operator/pkg/util/train, github.com/kubeflow/tf-operator/pkg/version
=== RUN   TestNormalPath
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (474.219µs)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/worker-2 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=3, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (728.075µs)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=4, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=2, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (469.106µs)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=1, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (564.145µs)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/ps-1 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/worker-0 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/worker-1 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/worker-2 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/worker-3 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="Ignoring inactive pod default/ps-0 in state Succeeded, deletion time <nil>"
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=0, running=0, failed=0" job=default.test-tfjob uid=
E0106 13:51:49.315182   10472 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc00030dbd0), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"PS":(*v1.ReplicaSpec)(0xc000202b00), "Worker":(*v1.ReplicaSpec)(0xc000202dc0)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc0003e4d10)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(0xc000371c20), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'TFJobSucceeded' 'TFJob test-tfjob successfully completed.'
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=0, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (1.123888ms)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=1, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (465.757µs)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-1" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-1" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-2" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: worker-3" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: ps-0" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="Need to create new pod: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: ps-0" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="need to create new service: ps-1" job=default.test-tfjob replica-type=ps uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (2.015732ms)" job=default.test-tfjob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=4, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="TFJob=test-tfjob, ReplicaType=PS expected=2, running=0, failed=0" job=default.test-tfjob uid=
time="2020-01-06T13:51:49Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (1.178828ms)" job=default.test-tfjob
--- PASS: TestNormalPath (0.02s)
=== RUN   TestRun
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:51:49Z" level=info msg="Starting 1 workers"
time="2020-01-06T13:51:49Z" level=info msg="Started workers"
time="2020-01-06T13:51:49Z" level=info msg="Shutting down workers"
--- PASS: TestRun (0.50s)
=== RUN   TestAddTFJob
time="2020-01-06T13:51:49Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:49Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:51:49Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:51:49Z" level=info msg="TFJob test-tfjob is created."  Not counted in backoff limit." job=default.test-tfjob uid=
time="2020-01-06T13:51:53Z" level=info msg="Finished syncing tfjob \"default/test-tfjob\" (775.407µs)" job=default.test-tfjob
--- PASS: TestBackoffForOnFailure (0.00s)
=== RUN   TestAddPod
time="2020-01-06T13:51:53Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:53Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:53Z" level=info msg="Starting TFJob controller"
time="2020-01-06T13:51:53Z" level=info msg="Waiting for informer caches to sync"
time="2020-01-06T13:51:54Z" level=info msg="Starting 1 workers"
time="2020-01-06T13:51:54Z" level=info msg="Started workers"
--- PASS: TestAddPod (0.10s)
=== RUN   TestClusterSpec
--- PASS: TestClusterSpec (0.00s)
=== RUN   TestIsDistributed
--- PASS: TestIsDistributed (0.00s)
=== RUN   TestRestartPolicy
--- PASS: TestRestartPolicy (0.00s)
=== RUN   TestExitCode
time="2020-01-06T13:51:54Z" level=info msg="Shutting down workers"
time="2020-01-06T13:51:54Z" level=info msg="Creating TFJob controller"
time="2020-01-06T13:51:54Z" level=info msg="Creating Job controller"
time="2020-01-06T13:51:54Z" level=info msg="Reconcile TFJobs test-tfjob" job=default.test-tfjob uid=
time="2020-01-06T13:51:54Z" level=info msg="Ignoring inactive pod default/worker-0 in state Failed, deletion time <nil>"
time="2020-01-06T13:51:54Z" level=info msg="Pod: default.worker-0 exited with code 130" job=default.test-tfjob replica-type=worker uid=
E0106 13:51:54.044934   10472 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc0003f4080), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"Worker":(*v1.ReplicaSpec)(0xc000320580)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc00001f370)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(nil), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'ExitedWithCode' 'Pod: default.worker-0 exited with code 130'
time="2020-01-06T13:51:54Z" level=info msg="Need to restart the pod: default.worker-0" job=default.test-tfjob replica-type=worker uid=
time="2020-01-06T13:51:54Z" level=info msg="TFJob=test-tfjob, ReplicaType=Worker expected=1, running=0, failed=1" job=default.test-tfjob uid=
E0106 13:51:54.045032   10472 event.go:259] Could not construct reference to: '&v1.TFJob{TypeMeta:v1.TypeMeta{Kind:"TFJob", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"test-tfjob", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Spec:v1.TFJobSpec{ActiveDeadlineSeconds:(*int64)(nil), BackoffLimit:(*int32)(nil), CleanPodPolicy:(*v1.CleanPodPolicy)(0xc0003f4080), TTLSecondsAfterFinished:(*int32)(nil), TFReplicaSpecs:map[v1.TFReplicaType]*v1.ReplicaSpec{"Worker":(*v1.ReplicaSpec)(0xc000320580)}, OnExit:(*v1.PodTemplateSpec)(nil)}, Status:v1.JobStatus{Conditions:[]v1.JobCondition(nil), ReplicaStatuses:map[v1.ReplicaType]*v1.ReplicaStatus{"Worker":(*v1.ReplicaStatus)(0xc00001f370)}, OnExitStatus:(*v1.OnExitStatus)(nil), StartTime:(*v1.Time)(0xc0004d7220), CompletionTime:(*v1.Time)(nil), LastReconcileTime:(*v1.Time)(nil)}}' due to: 'selfLink was empty, can't make reference'.  Will not report event: 'Normal' 'TFJobFailed' 'TFJob test-tfjob has failed because 1 Worker replica(s) failed.'


"Alt - F" shortcut not working because of "File" menu

Description
I try to use some custom shortcuts Emacs style and I need to be able to bind "Alt - F" to be work like "Ctrl + Left Arrow" (jump the word).
The problem is that when I press Alt + F my shortcut works, but the cursor becomes inactive and the focus moves on the File menu. I guess it's because in Windows the Alt key switches focus to the menu and it happens that F is the starting letter for the "File".
Same issue if I bind shortcuts that use the Alt key + letters like E (Edit menu), N (navigate menu).
Is there any way to go around this?
Steps to Reproduce

Bind Alt + F shortcut to do something
Try to use it (in Windows) ad observe the focus moves to the "File" menu

Expected behavior:
I expect the shortcut to work without losing the focus in favor of the File menu.
Actual behavior:
The shortcut is ran but the focus moves to the Brackets menu.
Versions
Please include the OS and what version of the OS you're running.
Windows 8.1
Please include the version of Brackets. You can find it under Help \ About Brackets
Release 1.7 build 1.7.0-16898 (release b0a363b71)
build timestamp: Wed Jun 08 2016 12:27:56 GMT+0100

I've reproduced this with brackets on windows but can't reproduce with brackets-electron so marking this as shell issue.

Looks like the issue is Really Simple:
Someone attached an Alt- command to both the "File" pull-down menu and the "Find" menu.  Both can't be there at the same time. They argue.

Quick fix:
Hack the brackets, edit the src/nls/root/strings.js like this:
From
"FILE_MENU": "File",
To
"FILE_MENU": "zFile",
Edit all the menu names, restart the brackets, and the alt-* won't trigger the menu any longer(except alt-z).


[dtd] It is difficult to develop features that use the getIDEWorkspaceRoots API

When developing tools that use DTD, it is useful to start a local instance of DTD to interact with. To do this, you can run dart tooling-daemon --unrestricted from the CLI. This command starts DTD and removes restrictions that make local development difficult:

checks for the file system APIs that ensure file read / writes are within a user's IDE workspace.
secret requirements to call the setIDEWorkspaceRoots

One API that is broken in unrestricted mode is getIDEWorkspaceRoots. The IDE that starts DTD usually sets these via setIDEWorkspaceRoots, but since in unrestricted mode, DTD is started from the CLI, these workspace roots will not be set.
This makes it difficult to develop features that use the getIDEWorkspaceRoots DTD API.
Proposal
Add a way to set workspace roots in unrestricted mode.

One way to do this would be to use an environment variable dtd_workspace_roots that takes a comma separated list of workspace roots. DTD could then read this environment variable when in unrestricted mode to see if workspace roots have been set.
dart tooling-daemon --unrestricted --dart-define=dtd_workspace_roots=/path/to/foo,/path/to/bar

Another option would be to add another flag to the tooling-daemon command. This flag should be a no-op when not in unrestricted mode.
dart tooling-daemon --unrestricted --workspaceRoots=/path/to/foo,/path/to/bar

A less than ideal solution would be that every DTD client can implement their own affordance to call setIDEWorkspaceRoots for local development. This isn't preferred because it requires implementing the same thing multiple times for several different clients (DevTools, DevTools Extensions, maybe Analysis Server, Flutter tools, etc. in the future)

CC @bkonyi @CoderDake for discussion.

the --workspaceRoots one feels the cleanest to me.
Unfortunately it is awkward that the dev even needs to be responsible for this.
Would it be possible for us to make some sort of seperate repo where we could host some "simulated env tools"
We could have a dart file that does execs for:

DTD then gets the uri
The simulated env startup, we could pass the url on the cmd line using dart-define

We could either pass the directories there or have the user set them in the UI.
I'm not sure if there is a better way to pass them that binary though, so I'm open to some smarter ideas :)

the --workspaceRoots one feels the cleanest to me.

Agreed this might be better.

Unfortunately it is awkward that the dev even needs to be responsible for this.

I'm not sure that we have a way around this. There is no way for DTD to know what the project directories are unless they are set somehow, and if the IDE isn't setting them, the user will have to manually specify these since there isn't a way to infer them.

We could either pass the directories there or have the user set them in the UI.

Even with a solution like this, the user is still having to set the directories manually. At least with a command line flag, the user could set an alias or use terminal history to run the right command. With requiring the user to set the directories manually in a GUI, we'd have to implement some sort of caching to make this a nice developer experience.

Another idea: if we make the DTD uri accessible from the IDE, a workflow could look like this:
I am a developer building a DevTools feature (either a first party devtools feature or a feature in a DevTools extension).

I open an IDE with my test app. I may or may not run my app depending on whether my feature requires a running app.
The IDE starts DTD and provides a way for me to access this URI. Example: a VS code action similar to what we provide for copying the VM service uri:

I copy this DTD uri and connect my debug client to it.

Pros:

The developer doesn't have to manually start DTD with special flags.
The developer is testing against a DTD instance that is started exactly how one will be started for an end-user using the tool under development

Cons:

Developers will be forced to open an IDE with a test project and app in order to develop a feature that uses DTD.

This would no longer be an issue once https://github.com/dart-lang/sdk/issues/54937 is resolved. If we move to a model that we always have a DTD instance when we have a running Dart or Flutter app (started from DevTools server in the CLI case and by the IDE in the IDE start case), then developers can use the production instance of DTD without having to start one for local development.

--workspaceRoots=/path/to/foo,/path/to/bar

Commas are valid in paths, so although unlikely, it's probably better to allow the flag multiple times? --workspaceRoots /path/to/foo --workspaceRoots /path/to/bar

The IDE starts DTD and provides a way for me to access this URI. Example: a VS code action similar to what we provide for copying the VM service uri:

This sounds handy to me. I considered this when adding DTD to the language status area, as we have a "Copy URI" option next to the number of debug sessions there too.
FWIW in the meantime for your own use, you could enable the DTD log in your VS Code settings:
"dart.toolingDaemonLogFile": "C:\\Dev\\Logs\\tooling_daemon.txt",

This will record both the traffic over stdin/stdout and over Dart-Code's connection to DTD:
Mon Feb 26 2024 [15:16:47 GMT+0000 (Greenwich Mean Time)] Log file started
[3:16:47 PM] [DartToolingDaemon] [Info] Spawning C:\Dev\Tools\Dart\Nightly\bin\dart.exe with args ["tooling-daemon","--machine"]
[3:16:47 PM] [DartToolingDaemon] [Info] ..  with {"toolEnv":{"FLUTTER_HOST":"VSCode","PUB_ENVIRONMENT":"vscode.dart-code"}}
[3:16:47 PM] [DartToolingDaemon] [Info]     PID: 4420
[3:16:47 PM] [DartToolingDaemon] [Info] <== {"tooling_daemon_details":{"uri":"ws://<IP_ADDRESS>:60401/","trusted_client_secret":"nnA0XC4MopzWyQEz"}}
[3:16:47 PM] [DartToolingDaemon] [Info] Connecting to DTD at ws://<IP_ADDRESS>:60401/...
[3:16:47 PM] [DartToolingDaemon] [Info] Connected to DTD
[3:16:47 PM] [DartToolingDaemon] [Info] ==> {"id":"1","jsonrpc":"2.0","method":"FileSystem.setIDEWorkspaceRoots","params":{"secret":"nnA0XC4MopzWyQEz","roots":["file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/analysis_server","file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/analyzer","file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/analyzer_plugin","file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/analysis_server_client","file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/analyzer_utilities","file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/dartdev","file:///c%3A/Dev/Test%20Projects/completion_counts","file:///c%3A/Dev/Google/dart-sdk/sdk/third_party/pkg/language_server_protocol","file:///c%3A/Dev/Google/dart-sdk/sdk/pkg/linter"]}}
[3:16:47 PM] [DartToolingDaemon] [Info] <== {"jsonrpc":"2.0","result":{"type":"Success"},"id":"1"}
Mon Feb 26 2024 [17:53:25 GMT+0000 (Greenwich Mean Time)] Log file ended

I really do like the idea of DTD just always being present when debugging an app. It feels a lot more intuitive to just have it available just the the vm_service uri is available.
@kenzieschmoll is there anything stopping us from quickly adding the code for DTD to spin up in the Devtools Server if one isn't provided?

A multi-option named --workspace-root sounds like a reasonable solution.
Another solution could be just to disable the workspace root checks when --unrestricted is provided so the developer would have full access to their machine's file system. Obviously this isn't a secure configuration and developers would need to eventually test with a DTD instance with the workspace roots set to ensure their code works properly, but it might be acceptable for a development workflow.

Another solution could be just to disable the workspace root checks when --unrestricted is provided so the developer would have full access to their machine's file system.

My understanding from the above was that this already happens, but the problem is that getIDEWorkspaceRoots() return nothing?
--workspace-root could also possibly default to . (the current directory) when run with --unrestricted? (this gives getIDEWorkspaceRoots a reasonable value to return, and might even be a way to keep the file system check rather than code a bypass?)

Another solution could be just to disable the workspace root checks when --unrestricted is provided so the developer would have full access to their machine's file system.

Ah, right, that makes sense since all these tools will be relying on paths relative to the workspace roots provided by that API... Defaulting to . would work, assuming we resolve the path before we actually give it to DTD as a root.


Add security BBEs for Email

Description:
Need to write security BBEs for Email.

Reduce the priority, as the security configuration is already specified under the section https://github.com/ballerina-platform/module-ballerina-email/blob/master/email-ballerina/Module.md#security-and-authentication .


Implement timeline-based metrics in safekeeper

Some of these metrics were implemented before, but now they are reimplemented with this new approach. I can't say new approach is better in every aspect, there are differences.
What's better:

It's easier to add metrics, no need to insert .set in every place near modification
Metrics now are a consistent snapshot, so should be no issues like https://github.com/neondatabase/neon/issues/1470
Old metrics for inactive timelines won't show up in /metrics response

What's worse:

We need to take mutex locks, that can affect metrics latency and timelines processing

Some places in timelines collector are not performance-optimized, let's not have premature optimizations until there'll be problems with it.

Performance stats: https://observer.zenith.tech/goto/l1z5xyr7z?orgId=1


AD003

Adds test - Some DCs aren't GCs for issue #140

This change is

Review status: 0 of 2 files reviewed at latest revision, 1 unresolved discussion.

Data/Tests.xml, line 143 [r1] (raw file):

		<IfPassedComments>All Active Directory Domain Controllers are Global Catalog Servers.</IfPassedComments>
		<IfWarningComments></IfWarningComments>
		<IfFailedComments>One or more Active Directory Domain Controllers are not Global Catalog Servers.</IfFailedComments>

This isn't necessarily a failure state. There are many good reasons why a customer might have this. This should be informational.

Comments from Reviewable

True enough.  I just changed the designation in the script.

Reviewed 1 of 2 files at r1, 1 of 1 files at r2.
Review status: all files reviewed at latest revision, 1 unresolved discussion.

Comments from Reviewable

Review status: all files reviewed at latest revision, 1 unresolved discussion.

Data/Tests.xml, line 143 [r1] (raw file):
Previously, bdesmond (Brian Desmond) wrote…
> This isn't necessarily a failure state. There are many good reasons why a customer might have this. This should be informational.

OK

Comments from Reviewable

Closing stale PRs. Resubmit after testing if still valid.


Struct

Applicable Issues
Fixes #29
Description of the Change
Recently, the representation of the schemas in github.com/eiffel-community/eiffel changed (see https://github.com/eiffel-community/eiffel/issues/282) so that schemas and documentation pages are generated from a single YAML source. More importantly, common substructures like meta and links that de facto have been identical between events from the same commit have been extracted to separate YAML files and referenced from multiple event files.
We hereby adapt the SDK to this new reality and mirror the schema structure in the type structure of the SDK, allowing us to scrap the event-specific structs for meta and friends and have single structs shared among all event types.
Note that the PR branch contains multiple commits intended to make it easier to review the changes. I've made each commit message as descriptive as possible. As is customary they will be squashed into a single commit upon merge.
Alternate Designs
None.
Benefits
Fewer types, types that can be shared between events, less need to introduce interfaces to be able to write code that can work on any event, easier to write code that acts on e.g. any meta field.
Possible Drawbacks
It's a backwards-incompatible change. Users of the package might not be affected, depending on whether they had references to specific
Sign-off

Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I    have the right to submit it under the open source license    indicated in the file; or
(b) The contribution is based upon previous work that, to the best    of my knowledge, is covered under an appropriate open source    license and I have the right under that license to submit that    work with modifications, whether created in whole or in part    by me, under the same open source license (unless I am    permitted to submit under a different license), as indicated    in the file; or
(c) The contribution was provided directly to me by some other    person who certified (a), (b) or (c) and I have not modified    it.
(d) I understand and agree that this project and the contribution    are public and that a record of the contribution (including all    personal information I submit with it, including my sign-off) is    maintained indefinitely and may be redistributed consistent with    this project or the open source license(s) involved.
Signed-off-by: Magnus Bäck<EMAIL_ADDRESS>

Yes. I'll send a follow-up PR for Arica (which also requires a small code change so we won't attempt to create constants med hyphens and slashes).

SPECIFIC WHAT! I need to know :)

Ha! I probably thought "this'll be a boring sentence to write, I'll circle back later" but never did. PR description updated.

Just resolved a trivial conflict in the last commit so I didn't wait for approvals.


onSlidePrevTransitionStart doesn't work as expected

Check that this is really a bug

[X] I confirm

Reproduction link
https://codesandbox.io/s/swiper-react-demo-forked-6q0y63?file=/src/App.js
Bug description
When using onSlidePrevTransitionStart the event is called only when the transition already happened and in that case onSlidePrevTransitionStart doesn't have any difference from onSlidePrevTransitionEnd.
Expected Behavior
onSlidePrevTransitionStart should be called when the transition started
Actual Behavior
onSlidePrevTransitionStart  called when the transition already happened (ended)
Swiper version
8.0.7
Platform/Target and Browser Versions
Chrome 102.0.5005.115
Validations

[X] Follow our Code of Conduct
[X] Read the docs.
[X] Check that there isn't already an issue that request the same feature to avoid creating a duplicate.
[X] Make sure this is a Swiper issue and not a framework-specific issue

Would you like to open a PR for this bug?

[x] I'm willing to open a PR

Issue is closed because of outdated/irrelevant/not actual/needed more information/inactivity.
If this issue is still actual and reproducible for latest version of Swiper, please create new issue and fill the issue template correctly:

Clearly describe the issue including steps to reproduce when it is a bug.
Make sure you fill in the earliest version that you know has the issue.
Provide live link or JSFiddle/Codepen or website with issue


Error when running npx create-react-wptheme themename

I'm running into a new error on a fresh installation. When I run
npx create-react-wptheme themename
It doesn't seem to complete the install. I get:
+<EMAIL_ADDRESS>added 1423 packages from 732 contributors and audited 892165 packages in 141.248s
found 0 vulnerabilities

internal/modules/cjs/loader.js:613
    throw err;
    ^

Error: Cannot find module 'C:\wamp\www\wordpress\wp-content\themes\newtheme\react-src\node_modules\package.json'

I try to run wpstart anyway - by going into react-src and doing a npm run wpstart, and I get
$ npm run wpstart
npm ERR! missing script: wpstart

The package.json contains very little stuff:
{
  "name": "react-src",
  "version": "0.1.0",
  "private": true,
  "devDependencies": {
    "@devloco/react-scripts-wptheme": "3.0.1-wptheme-3.0.0"
  }
}

Any ideas?

I'll take a look today. I'm hoping some other package broke and it'll just fix itself... I swear I tested it before publishing the latest update! :-(

I just tried and it worked. My installation showed:
added 1426 packages from 732 contributors
So I got 3 more packages than you did... so hopefully my earlier guess was right, and some other package got fixed.
Give it a try and let me know.
Thanks! I really do appreciate the feedback.

We're back in business! Thanks for the quick response.

@devloco  - btw, I have my tutorial up http://michaelsoriano.com/wordpress-theme-react-part-1-setup/

That's awesome! I'll update the README tonight.

Readme updated both here and on NPM.
Thanks again for doing that!


Add WASM plugin

closes #1

Current status: Fixed the original content-type error!
Now it's failing on not resolving the WASM file.
The error I see now:
main.ts:8     GET http://localhost:5173/node_modules/.vite/deps/bindings_wasm_bg.wasm net::ERR_ABORTED 404 (Not Found)

The URL looks totally bogus, as I don't believe Vite would not be serving up node_modules. How can we serve the .wasm file as an asset? Where does this file even come from?

You need a vite.config.ts with
import {defineConfig} from 'vite'

export default defineConfig({
  optimizeDeps: {
    exclude: ["@rollup/browser"]
  }
})

@sadn1ck thank you, you're a lifesaver!


id generation in multi threaded environment

since this implementation does not take into account for the thread id, isn't there a high possibility of collision if called at the same time by two different threads?

This implementation is thread-safe with mutex.


Change Eligibility Age Range

Patients between 15-24 years should be marked as eligible in the New Patient Screen.

Implemented 40339f0. Also added age in parentheses (311612d).


Query Regarding CORS Setup at API Gateway and Targeted Endpoint

I have encountered an issue regarding the Cross-Origin Resource Sharing (CORS) setup in an API Gateway. Although I have configured CORS in the API Gateway's Program.cs file, it appears that the CORS setup at the targeted endpoint is taking precedence, causing the API Gateway's CORS configuration to be ignored.
I would like to confirm whether this behavior is expected or if there might be an issue with my implementation. Ideally, I would expect the CORS setup at the API Gateway level to override any CORS configurations at the targeted endpoint, ensuring consistent CORS behavior across all requests.
Could you please provide clarification on whether the CORS setup in the targeted endpoint should supersede the CORS configuration at the API Gateway? If this is the intended behavior, I would appreciate any guidance on how to address this situation and ensure consistent CORS handling throughout the system.
Thank you for your assistance and insight. I look forward to your response.

Can you show us how you're setting up CORS in the gateway and the app?
Since CORS is mainly about setting response headers it's a question what happens when both try to set the same headers.

Gateway's Program.cs
var allowOrigins = "_allowOrigins";

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors(options => {
  options.AddPolicy(allowOrigins, policy => {
    policy
      .WithOrigins("https://*.example.com")
      .SetIsOriginAllowedToAllowWildcardSubdomains()
      .AllowAnyHeader()
      .WithMethods("GET", "POST")
      .AllowCredentials();
  });
});

builder.Services.AddReverseProxy()
    .LoadFromMemory(YarpConfig.GetRouteConfigs(), YarpConfig.GetClusterConfigs());

var app = builder.Build();

app.UseCors(allowOrigins);
app.MapReverseProxy();

app.Run();

Endpoint's Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

// Accidentally left the CORS setup enabled in the endpoint
app.UseCors(x => x
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowed(origin => true)
.AllowCredentials());

app.MapControllers();

app.Run();

To prioritize the CORS configuration of the gateway, we need to disable the CORS setup in the endpoint's Program.cs.

I think it makes sense that the CORS header set on the endpoint takes precedence on the one setup by the gateway, but I can see the arguments that it should be the other way around...
I guess you could remove the headers coming from the endpoint to use the one from the gateway?

After reviewing the yarp documentation on CORS, we discovered that we neglected to include the policy name in the 'CorsPolicy'. We apologize for this oversight and believe that adding the policy name will rectify the issue.


Arc HCI Box Stalls on Step 7/10

Is your issue related to a Jumpstart scenario, ArcBox, HCIBox, or Agora?

HCIBox using azd.
Describe the issue or the bug

Since early last week when deploying the solution, it gets stuck on the initial script inside the HCIBox-Client on step 7/10 when starting the vm-router. I've let it sit up to 6 hours and nothing happens. I've attached a screenshot below also showing that system utilization is essentially nothing.
I've been able to make it pass this step by opening AzSMGMT in hyper-v, then logging into the double nested vm-router, but then the script will get stuck on other power on operations and does not complete.
I've both azd down'd the environment and tried again (on different days), and fully deleted the git clone to wipe out the environment and redeployed (on multiple days) and it still gets stuck on the same step.
To Reproduce

Deploy Jumpstart HCI Box using azd, then connect to the VM and let the automated script run.
Expected behavior

Environment summary

Using Azure Cloud Shell, same steps have worked since the 23H2 release, but started having this issue last week.
Have you looked at the Troubleshooting and Logs section?

Screenshots

There was a regression last week with the underlying VM image used that seemed to be causing very slow network speeds on the nested VMs. This could be related to that. A fix was pushed late last week to pin the VM host image to a prior release and the slowness issue was resolved. See #2462

There was a regression last week with the underlying VM image used that seemed to be causing very slow network speeds on the nested VMs. This could be related to that. A fix was pushed late last week to pin the VM host image to a prior release and the slowness issue was resolved. See #2462

Hm, it looks like your fix was merged into main, but I did two separate deployments today and ran into the same issue both times.

The issue persists in my deployments with the code fix

Hi @matthansen0
I just did a new deploy to eastus from the main branch and do not experience this issue. Note that this step does normally take several minutes to complete and the script will seem like it is paused on "Starting the vm-router" step.
In the past, we have seen instances where users click on the PowerShell window during execution, which pauses the PowerShell script (this is indicated by a visible solid cursor in the PowerShell window). The script will remain paused until manually resumed by the user. Is it possible that is what is happening here?

Hi @matthansen0
I just did a new deploy to eastus from the main branch and do not experience this issue. Note that this step does normally take several minutes to complete and the script will seem like it is paused on "Starting the vm-router" step.
In the past, we have seen instances where users click on the PowerShell window during execution, which pauses the PowerShell script (this is indicated by a visible solid cursor in the PowerShell window). The script will remain paused until manually resumed by the user. Is it possible that is what is happening here?

I deployed yesterday and today and both times it continued to freeze at the same point, I left it for about 3 hours yesterday and about 45 minutes today, both times though once I opened the MzSMGMT VM in Hyper-V and then logged into the vm-router the script would automatically continue and then completed the rest of the steps successfully.


Verify compatibity with Pumkin's Avatar Tools

I was not able to find an incompatibility with Pumkin's Avatar Tools


Control + C inside prompt is not canceling the execution

If I presse control + c when I get a prompt, instead of canceling the command execution it continues with the default setting.

Does anyone have a workaround for this?
When doing Control + c, the prompt continues as if you've hit enter. Very dangerous depending on what the action is.

I added a pull request for this but it seems that it is still pending. You can use my branch directly in your project. this is what I've doing with the grommet-cli


[DOCUMENTATION][JUnit] Update UG, DG , create Tests and minor fixes

Created JUnit Tests for PrivacyLevelCommand
Updated UG and DG
Remove privacy from Avatar
Collated code

Coverage increased (+1.5%) to 77.996% when pulling b424a1c54e1c272de4ff9664130f40d4cfbcb2f4 on jeffreygohkw:master into d43bfdd28401334f17001cdc3b51986fc380b1b0 on CS2103AUG2017-W09-B2:master.

Coverage increased (+1.8%) to 78.293% when pulling e064b10d71eeaf54b31d23a432fdcf7fd3e937f0 on jeffreygohkw:master into d43bfdd28401334f17001cdc3b51986fc380b1b0 on CS2103AUG2017-W09-B2:master.

Coverage increased (+1.8%) to 77.53% when pulling 8b050db96e192a64af235012f4527b62137a068b on jeffreygohkw:master into f0548c60f3c50f5dc5ad39d41da65b4f358da985 on CS2103AUG2017-W09-B2:master.