From 7d3ef0595a6a4008ed8a42bbdba87db7f9408d24 Mon Sep 17 00:00:00 2001 From: barnettZQG Date: Thu, 14 Apr 2022 17:43:54 +0800 Subject: [PATCH] Fix: duplicately list pods in velaQL (#3650) * Fix: duplicately list pods in velaQL Signed-off-by: barnettZQG * Fix: the create time of synced app is empty Signed-off-by: barnettZQG --- pkg/apiserver/sync/convert.go | 4 +- pkg/oam/auxiliary.go | 8 ++ pkg/stdlib/pkgs/query.cue | 4 + pkg/velaql/providers/query/collector.go | 93 +++++++++++++----------- pkg/velaql/providers/query/types/type.go | 4 + 5 files changed, 69 insertions(+), 44 deletions(-) diff --git a/pkg/apiserver/sync/convert.go b/pkg/apiserver/sync/convert.go index ade0ccd03..fd20caad6 100644 --- a/pkg/apiserver/sync/convert.go +++ b/pkg/apiserver/sync/convert.go @@ -20,6 +20,7 @@ import ( "context" "strconv" "strings" + "time" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" "github.com/oam-dev/kubevela/pkg/apiserver/model" @@ -49,7 +50,8 @@ func (c *CR2UX) ConvertApp2DatastoreApp(ctx context.Context, targetApp *v1beta1. model.LabelSourceOfTruth: model.FromCR, }, } - + appMeta.CreateTime = targetApp.CreationTimestamp.Time + appMeta.UpdateTime = time.Now() // 1. convert app meta and env dsApp := &model.DataStoreApp{ AppMeta: appMeta, diff --git a/pkg/oam/auxiliary.go b/pkg/oam/auxiliary.go index ad9ddfc89..750ee13cc 100644 --- a/pkg/oam/auxiliary.go +++ b/pkg/oam/auxiliary.go @@ -52,6 +52,14 @@ func GetPublishVersion(o client.Object) string { return "" } +// GetDeployVersion get DeployVersion from object +func GetDeployVersion(o client.Object) string { + if annotations := o.GetAnnotations(); annotations != nil { + return annotations[AnnotationDeployVersion] + } + return "" +} + // GetLastAppliedTime . func GetLastAppliedTime(o client.Object) time.Time { if annotations := o.GetAnnotations(); annotations != nil { diff --git a/pkg/stdlib/pkgs/query.cue b/pkg/stdlib/pkgs/query.cue index c4d806abf..df31631d2 100644 --- a/pkg/stdlib/pkgs/query.cue +++ b/pkg/stdlib/pkgs/query.cue @@ -41,6 +41,10 @@ uid?: string apiVersion?: string resourceVersion?: string + publishVersion?: string + deployVersion?: string + revision?: string + latest?: bool }] ... } diff --git a/pkg/velaql/providers/query/collector.go b/pkg/velaql/providers/query/collector.go index 6d76b757f..a78110c23 100644 --- a/pkg/velaql/providers/query/collector.go +++ b/pkg/velaql/providers/query/collector.go @@ -98,25 +98,32 @@ func (c *AppCollector) ListApplicationResources(app *v1beta1.Application) ([]typ } var managedResources []types.AppliedResource - existResources := make(map[common.ClusterObjectReference]bool, len(app.Spec.Components)) for _, rt := range append(historyRTs, rootRT, currentRT) { if rt != nil { - for i, managedResource := range rt.Spec.ManagedResources { + for _, managedResource := range rt.Spec.ManagedResources { if isResourceInTargetCluster(c.opt.Filter, managedResource.ClusterObjectReference) && isResourceInTargetComponent(c.opt.Filter, managedResource.Component) { - if _, ok := existResources[rt.Spec.ManagedResources[i].ClusterObjectReference]; !ok { - managedResources = append(managedResources, types.AppliedResource{ - Cluster: managedResource.Cluster, - Kind: managedResource.Kind, - Component: managedResource.Component, - Trait: managedResource.Trait, - Name: managedResource.Name, - Namespace: managedResource.Namespace, - APIVersion: managedResource.APIVersion, - ResourceVersion: managedResource.ResourceVersion, - UID: managedResource.UID, - }) - } + managedResources = append(managedResources, types.AppliedResource{ + Cluster: managedResource.Cluster, + Kind: managedResource.Kind, + Component: managedResource.Component, + Trait: managedResource.Trait, + Name: managedResource.Name, + Namespace: managedResource.Namespace, + APIVersion: managedResource.APIVersion, + ResourceVersion: managedResource.ResourceVersion, + UID: managedResource.UID, + PublishVersion: oam.GetPublishVersion(rt), + DeployVersion: func() string { + obj, _ := managedResource.ToUnstructuredWithData() + if obj != nil { + return oam.GetDeployVersion(obj) + } + return "" + }(), + Revision: rt.GetLabels()[oam.LabelAppRevision], + Latest: currentRT != nil && rt.Name == currentRT.Name, + }) } } } @@ -127,35 +134,35 @@ func (c *AppCollector) ListApplicationResources(app *v1beta1.Application) ([]typ // FindResourceFromResourceTrackerSpec find resources from ResourceTracker spec func (c *AppCollector) FindResourceFromResourceTrackerSpec(app *v1beta1.Application) ([]Resource, error) { ctx := context.Background() - managedResources, err := c.ListApplicationResources(app) + rootRT, currentRT, historyRTs, _, err := resourcetracker.ListApplicationResourceTrackers(ctx, c.k8sClient, app) if err != nil { return nil, err } - resources := make([]Resource, 0, len(managedResources)) - for _, objRef := range managedResources { - obj := new(unstructured.Unstructured) - obj.SetGroupVersionKind(objRef.GroupVersionKind()) - obj.SetNamespace(objRef.Namespace) - obj.SetName(objRef.Name) - if err = c.k8sClient.Get(multicluster.ContextWithClusterName(ctx, objRef.Cluster), - client.ObjectKeyFromObject(obj), obj); err != nil { - if kerrors.IsNotFound(err) { - continue + var resources = []Resource{} + existResources := make(map[common.ClusterObjectReference]bool, len(app.Spec.Components)) + for _, rt := range append([]*v1beta1.ResourceTracker{rootRT, currentRT}, historyRTs...) { + if rt != nil { + for _, managedResource := range rt.Spec.ManagedResources { + if isResourceInTargetCluster(c.opt.Filter, managedResource.ClusterObjectReference) && + isResourceInTargetComponent(c.opt.Filter, managedResource.Component) { + if _, exist := existResources[managedResource.ClusterObjectReference]; exist { + continue + } + existResources[managedResource.ClusterObjectReference] = true + obj, err := managedResource.ToUnstructuredWithData() + if err != nil { + klog.Errorf("get obj from resource tracker failure %s", err.Error()) + continue + } + resources = append(resources, Resource{ + Cluster: managedResource.Cluster, + Revision: oam.GetPublishVersion(rt), + Component: managedResource.Component, + Object: obj, + }) + } } - return nil, err } - if objRef.Cluster == "" { - objRef.Cluster = multicluster.ClusterLocalName - } - resources = append(resources, Resource{ - Cluster: objRef.Cluster, - Revision: obj.GetLabels()[oam.LabelAppRevision], - Component: obj.GetLabels()[oam.LabelAppComponent], - Object: obj, - }) - } - if len(resources) == 0 { - return nil, errors.Errorf("fail to find resources created by application: %v", c.opt.Name) } return resources, nil } @@ -163,11 +170,11 @@ func (c *AppCollector) FindResourceFromResourceTrackerSpec(app *v1beta1.Applicat // FindResourceFromAppliedResourcesField find resources from AppliedResources field func (c *AppCollector) FindResourceFromAppliedResourcesField(app *v1beta1.Application) ([]Resource, error) { resources := make([]Resource, 0, len(app.Spec.Components)) - for _, rsrcRef := range app.Status.AppliedResources { - if !isResourceInTargetCluster(c.opt.Filter, rsrcRef) { + for _, res := range app.Status.AppliedResources { + if !isResourceInTargetCluster(c.opt.Filter, res) { continue } - compName, obj, err := getObjectCreatedByComponent(c.k8sClient, rsrcRef.ObjectReference, rsrcRef.Cluster) + compName, obj, err := getObjectCreatedByComponent(c.k8sClient, res.ObjectReference, res.Cluster) if err != nil { return nil, err } @@ -175,7 +182,7 @@ func (c *AppCollector) FindResourceFromAppliedResourcesField(app *v1beta1.Applic resources = append(resources, Resource{ Component: compName, Revision: obj.GetLabels()[oam.LabelAppRevision], - Cluster: rsrcRef.Cluster, + Cluster: res.Cluster, Object: obj, }) } diff --git a/pkg/velaql/providers/query/types/type.go b/pkg/velaql/providers/query/types/type.go index 3936b3a9e..bf38108d8 100644 --- a/pkg/velaql/providers/query/types/type.go +++ b/pkg/velaql/providers/query/types/type.go @@ -96,6 +96,10 @@ type AppliedResource struct { UID types.UID `json:"uid,omitempty"` APIVersion string `json:"apiVersion,omitempty"` ResourceVersion string `json:"resourceVersion,omitempty"` + DeployVersion string `json:"deployVersion,omitempty"` + PublishVersion string `json:"publishVersion,omitempty"` + Revision string `json:"revision,omitempty"` + Latest bool `json:"latest"` } // GroupVersionKind returns the stored group, version, and kind of an object