Fix: duplicately list pods in velaQL (#3650)

* Fix: duplicately list pods in velaQL

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>

* Fix: the create time of synced app is empty

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
This commit is contained in:
barnettZQG
2022-04-14 17:43:54 +08:00
committed by GitHub
parent af6dc4bda3
commit 7d3ef0595a
5 changed files with 69 additions and 44 deletions
+3 -1
View File
@@ -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,
+8
View File
@@ -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 {
+4
View File
@@ -41,6 +41,10 @@
uid?: string
apiVersion?: string
resourceVersion?: string
publishVersion?: string
deployVersion?: string
revision?: string
latest?: bool
}]
...
}
+50 -43
View File
@@ -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,
})
}
+4
View File
@@ -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