From 7344d4df21864ad9930c5cea4a3c3c7e35c9db7c Mon Sep 17 00:00:00 2001 From: Arthur Coelho Date: Tue, 25 May 2021 16:02:28 -0300 Subject: [PATCH] feat: added deployment and replicaset log output during app deploy --- etc/tsuru-local.conf | 2 +- provision/kubernetes/deploy.go | 87 +++++++++++++++++++++++++++++++--- 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/etc/tsuru-local.conf b/etc/tsuru-local.conf index ff15bf40b0..c2afe64f54 100644 --- a/etc/tsuru-local.conf +++ b/etc/tsuru-local.conf @@ -1,5 +1,5 @@ listen: "0.0.0.0:8080" -host: :8080 +host: http://192.168.1.104:8080 use-tls: false database: url: 127.0.0.1:27017 diff --git a/provision/kubernetes/deploy.go b/provision/kubernetes/deploy.go index a1632534f6..9fd11bc102 100644 --- a/provision/kubernetes/deploy.go +++ b/provision/kubernetes/deploy.go @@ -954,6 +954,38 @@ func listOptsForPodEvent(podName string) metav1.ListOptions { } } +func listOptsForResourceEvent(resourceType, resourceName string) metav1.ListOptions { + selector := map[string]string{ + "involvedObject.kind": resourceType, + } + if resourceName != "" { + selector["involvedObject.name"] = resourceName + } + return metav1.ListOptions{ + FieldSelector: labels.SelectorFromSet(labels.Set(selector)).String(), + } +} + +func filteredResourceEvents(ctx context.Context, client *ClusterClient, evtResourceVersion, resourceType, resourceName, namespace string) (watch.Interface, error) { + var err error + client, err = NewClusterClient(client.Cluster) + if err != nil { + return nil, err + } + err = client.SetTimeout(time.Hour) + if err != nil { + return nil, err + } + opts := listOptsForResourceEvent(resourceType, resourceName) + opts.Watch = true + opts.ResourceVersion = evtResourceVersion + evtWatch, err := client.CoreV1().Events(namespace).Watch(ctx, opts) + if err != nil { + return nil, errors.WithStack(err) + } + return evtWatch, nil +} + func isDeploymentEvent(msg watch.Event, dep *appsv1.Deployment) bool { evt, ok := msg.Object.(*apiv1.Event) return ok && strings.HasPrefix(evt.Name, dep.Name) @@ -986,18 +1018,43 @@ func monitorDeployment(ctx context.Context, client *ClusterClient, dep *appsv1.D if err != nil { return revision, err } - watch, err := filteredPodEvents(ctx, client, evtResourceVersion, "", ns) + watchPods, err := filteredPodEvents(ctx, client, evtResourceVersion, "", ns) if err != nil { return revision, err } - watchCh := watch.ResultChan() + watchPodCh := watchPods.ResultChan() defer func() { - watch.Stop() - if watchCh != nil { + watchPods.Stop() + if watchPodCh != nil { // Drain watch channel to avoid goroutine leaks. - <-watchCh + <-watchPodCh } }() + watchDep, err := filteredResourceEvents(ctx, client, evtResourceVersion, "Deployment", dep.Name, ns) + if err != nil { + return revision, err + } + watchDepCh := watchDep.ResultChan() + defer func() { + watchDep.Stop() + if watchDepCh != nil { + // Drain watch channel to avoid goroutine leaks. + <-watchDepCh + } + }() + watchReplicaSet, err := filteredResourceEvents(ctx, client, evtResourceVersion, "ReplicaSet", "", ns) + if err != nil { + return revision, err + } + watchRepCh := watchReplicaSet.ResultChan() + defer func() { + watchReplicaSet.Stop() + if watchRepCh != nil { + // Drain watch channel to avoid goroutine leaks. + <-watchRepCh + } + }() + fmt.Fprintf(w, "\n---- Updating units [%s] [version %d] ----\n", processName, version.Version()) kubeConf := getKubeConfig() timer := time.NewTimer(kubeConf.DeploymentProgressTimeout) @@ -1073,9 +1130,25 @@ func monitorDeployment(ctx context.Context, client *ClusterClient, dep *appsv1.D } select { case <-time.After(100 * time.Millisecond): - case msg, isOpen := <-watchCh: + case msg, isOpen := <-watchPodCh: + if !isOpen { + watchPodCh = nil + break + } + if isDeploymentEvent(msg, dep) { + fmt.Fprintf(w, " ---> %s\n", formatEvtMessage(msg, false)) + } + case msg, isOpen := <-watchDepCh: + if !isOpen { + watchDepCh = nil + break + } + if isDeploymentEvent(msg, dep) { + fmt.Fprintf(w, " ---> %s\n", formatEvtMessage(msg, false)) + } + case msg, isOpen := <-watchRepCh: if !isOpen { - watchCh = nil + watchRepCh = nil break } if isDeploymentEvent(msg, dep) {