diff --git a/README.md b/README.md index 31de014..ba6fd83 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ resource_types: type: docker-image source: repository: kudohn/concourse-k8s-resource - tag: + tag: 0.0.7 ``` ### `resources` diff --git a/cmd/out/main.go b/cmd/out/main.go index d05f9ed..2aa2da3 100644 --- a/cmd/out/main.go +++ b/cmd/out/main.go @@ -13,6 +13,7 @@ import ( "log" "os" "reflect" + "time" ) var streams = genericclioptions.IOStreams{ @@ -50,6 +51,7 @@ func main() { log.Fatalln("cannot run kubectl command", err) } if !request.Params.Delete { + time.Sleep(5 * time.Second) log.Println("check status for", request.Source.WatchResources) if ok := k8s.CheckResourceStatus(clientset, request.Source.Namespace, request.Source.WatchResources, request.Params.StatusCheckTimeout); !ok { log.Fatalln("resource is not running...") diff --git a/pkg/k8s/status_checker.go b/pkg/k8s/status_checker.go index ff534a7..b98bcc4 100644 --- a/pkg/k8s/status_checker.go +++ b/pkg/k8s/status_checker.go @@ -55,8 +55,6 @@ func CheckResourceStatus(clientset kubernetes.Interface, namespace string, resou if err != nil { log.Println("status check", "error!", "->", c.resource.Name, err) return false - } else { - log.Println("status check", "ok!", "->", c.resource.Name) } case <-c.timeout: log.Println("status check", "timeout!", "->", c.resource.Name) @@ -75,23 +73,27 @@ func (c *statusChecker) check() error { return fmt.Errorf("interrupted") default: } + var desired int32 + var current int32 switch { case IsDeployment(c.resource.Kind): d, err := c.clientset.AppsV1().Deployments(c.namespace).Get(c.resource.Name, metav1.GetOptions{}) if err != nil { return err } + desired = *d.Spec.Replicas _, _, newRS, err := deployment.GetAllReplicaSets(d, c.clientset.AppsV1()) if err != nil { return err } if newRS == nil { - log.Printf("[%s] No ReplicaSet found. skip check\n", c.resource.Name) - return nil + continue } - if newRS.Status.ReadyReplicas == *newRS.Spec.Replicas { + current = newRS.Status.ReadyReplicas + if desired == current { + log.Println("status check", "ok!", "->", c.resource.Name, "desired:", desired, "ready:", current) return nil } case IsStatefulSet(c.resource.Kind): @@ -99,15 +101,18 @@ func (c *statusChecker) check() error { if err != nil { return err } - if sts.Status.ReadyReplicas == *sts.Spec.Replicas { + desired = *sts.Spec.Replicas + current = sts.Status.ReadyReplicas + if desired == current { + log.Println("status check", "ok!", "->", c.resource.Name, "desired:", desired, "ready:", current) return nil } default: log.Fatalln("unsupported resource kind", c.resource.Kind) } if i%10 == 0 { - log.Println("waiting", c.resource.Name) + log.Println("waiting", c.resource.Name, "desired:", desired, "ready:", current) } - time.Sleep(1 * time.Second) + time.Sleep(3 * time.Second) } } diff --git a/pkg/k8s/status_checker_test.go b/pkg/k8s/status_checker_test.go index 43d76bf..e990b68 100644 --- a/pkg/k8s/status_checker_test.go +++ b/pkg/k8s/status_checker_test.go @@ -21,6 +21,7 @@ func TestCheckResourceStatus(t *testing.T) { UID: "uid", }, Spec: appv1.DeploymentSpec{ + Replicas: replicas(3), Template: v1.PodTemplateSpec{ Spec: v1.PodSpec{}, }, @@ -38,7 +39,6 @@ func TestCheckResourceStatus(t *testing.T) { }}, }, Spec: appv1.ReplicaSetSpec{ - Replicas: replicas(3), Template: v1.PodTemplateSpec{ Spec: v1.PodSpec{}, }, @@ -86,6 +86,7 @@ func TestTimeout(t *testing.T) { UID: "uid", }, Spec: appv1.DeploymentSpec{ + Replicas: replicas(3), Template: v1.PodTemplateSpec{ Spec: v1.PodSpec{}, }, @@ -103,7 +104,6 @@ func TestTimeout(t *testing.T) { }}, }, Spec: appv1.ReplicaSetSpec{ - Replicas: replicas(3), Template: v1.PodTemplateSpec{ Spec: v1.PodSpec{}, }, @@ -129,4 +129,4 @@ func replicas(num int) *int32 { func control(b bool) *bool { return &b -} \ No newline at end of file +}