Fixed Query api filtering of resources for Instance 23/124823/1
authorLukasz Rajewski <lukasz.rajewski@orange.com>
Mon, 11 Oct 2021 22:16:51 +0000 (00:16 +0200)
committerLukasz Rajewski <lukasz.rajewski@orange.com>
Mon, 11 Oct 2021 22:20:56 +0000 (00:20 +0200)
Issue-ID: MULTICLOUD-1409
Signed-off-by: Lukasz Rajewski <lukasz.rajewski@orange.com>
Change-Id: Id91d121fab264ccbe0096c99bcc29c18e7ee3b2b

src/k8splugin/api/queryhandler.go
src/k8splugin/internal/app/client.go
src/k8splugin/internal/app/instance.go
src/k8splugin/internal/app/query.go
src/k8splugin/internal/rb/profile.go

index 9c11954..f5950cd 100644 (file)
@@ -52,7 +52,7 @@ func (i queryHandler) queryHandler(w http.ResponseWriter, r *http.Request) {
                return
        }
        // instance id is irrelevant here
-       resp, err := i.client.Query(namespace, cloudRegion, apiVersion, kind, name, labels, "query")
+       resp, err := i.client.Query(namespace, cloudRegion, apiVersion, kind, name, labels)
        if err != nil {
                log.Error("Error getting Query results", log.Fields{
                        "error":       err,
index f70dc0a..a2868cd 100644 (file)
@@ -256,6 +256,7 @@ func (k *KubernetesClient) queryResources(apiVersion, kind, labelSelector, names
                LabelSelector: labelSelector,
        }
        var unstrList *unstructured.UnstructuredList
+       dynClient.Resource(gvr).Namespace(namespace).List(context.TODO(), opts)
        switch mapping.Scope.Name() {
        case meta.RESTScopeNameNamespace:
                unstrList, err = dynClient.Resource(gvr).Namespace(namespace).List(context.TODO(), opts)
index c4cce5e..e50a59e 100644 (file)
@@ -34,6 +34,7 @@ import (
        "k8s.io/apimachinery/pkg/runtime/schema"
        "k8s.io/cli-runtime/pkg/resource"
 
+       "github.com/onap/multicloud-k8s/src/k8splugin/internal/config"
        "github.com/onap/multicloud-k8s/src/k8splugin/internal/db"
        "github.com/onap/multicloud-k8s/src/k8splugin/internal/helm"
        "github.com/onap/multicloud-k8s/src/k8splugin/internal/namegenerator"
@@ -461,7 +462,15 @@ func (v *InstanceClient) Query(id, apiVersion, kind, name, labels string) (Insta
                return InstanceStatus{}, pkgerrors.Wrap(err, "Unmarshaling Instance Value")
        }
 
-       resources, err := queryClient.Query(resResp.Namespace, resResp.Request.CloudRegion, apiVersion, kind, name, labels, id)
+       if labels == "" || strings.Contains(strings.ToLower(labels), config.GetConfiguration().KubernetesLabelName) == false {
+               labelValue := config.GetConfiguration().KubernetesLabelName + "=" + id
+               if labels != "" {
+                       labels = labels + ","
+               }
+               labels = labels + labelValue
+       }
+
+       resources, err := queryClient.Query(resResp.Namespace, resResp.Request.CloudRegion, apiVersion, kind, name, labels)
        if err != nil {
                return InstanceStatus{}, pkgerrors.Wrap(err, "Querying Resources")
        }
@@ -502,6 +511,11 @@ func (v *InstanceClient) Status(id string) (InstanceStatus, error) {
        if err != nil {
                return InstanceStatus{}, pkgerrors.Wrap(err, "Getting CloudRegion Information")
        }
+       req := resResp.Request
+       profile, err := rb.NewProfileClient().Get(req.RBName, req.RBVersion, req.ProfileName)
+       if err != nil {
+               return InstanceStatus{}, pkgerrors.New("Unable to find Profile instance status")
+       }
 
        cumulatedErrorMsg := make([]string, 0)
        podsStatus, err := k8sClient.getPodsByLabel(resResp.Namespace)
@@ -534,12 +548,36 @@ Main:
                        }
                }
        }
+       generalStatus = append(generalStatus, podsStatus...)
+
+       if profile.ExtraResourceTypes != nil && len(profile.ExtraResourceTypes) > 0 {
+               queryClient := NewQueryClient()
+               labelValue := config.GetConfiguration().KubernetesLabelName + "=" + id
+               for _, extraType := range profile.ExtraResourceTypes {
+                       queryStatus, err := queryClient.Query(resResp.Namespace, resResp.Request.CloudRegion, extraType.GroupVersion().Identifier(), extraType.Kind, "", labelValue)
+                       if err != nil {
+                               return InstanceStatus{}, pkgerrors.Wrap(err, "Querying Resources")
+                       }
+                       for _, rs := range queryStatus.ResourcesStatus {
+                               foundRes := false
+                               for _, res := range generalStatus {
+                                       if res.GVK == rs.GVK && res.Name == rs.Name {
+                                               foundRes = true
+                                               break
+                                       }
+                               }
+                               if !foundRes {
+                                       generalStatus = append(generalStatus, rs)
+                               }
+                       }
+               }
+       }
        //We still need to iterate through rss list even the status is not DONE, to gather status of rss + pod for the response
        resp := InstanceStatus{
                Request:         resResp.Request,
-               ResourceCount:   int32(len(generalStatus) + len(podsStatus)),
+               ResourceCount:   int32(len(generalStatus)),
                Ready:           isReady && resResp.Status == "DONE",
-               ResourcesStatus: append(generalStatus, podsStatus...),
+               ResourcesStatus: generalStatus,
        }
 
        if len(cumulatedErrorMsg) != 0 {
index cb645af..251b14e 100644 (file)
@@ -33,7 +33,7 @@ type QueryStatus struct {
 
 // QueryManager is an interface exposes the instantiation functionality
 type QueryManager interface {
-       Query(namespace, cloudRegion, apiVersion, kind, name, labels, id string) (QueryStatus, error)
+       Query(namespace, cloudRegion, apiVersion, kind, name, labels string) (QueryStatus, error)
 }
 
 // QueryClient implements the InstanceManager interface
@@ -53,12 +53,12 @@ func NewQueryClient() *QueryClient {
 }
 
 // Query returns state of instance's filtered resources
-func (v *QueryClient) Query(namespace, cloudRegion, apiVersion, kind, name, labels, id string) (QueryStatus, error) {
+func (v *QueryClient) Query(namespace, cloudRegion, apiVersion, kind, name, labels string) (QueryStatus, error) {
 
        //Read the status from the DD
 
        k8sClient := KubernetesClient{}
-       err := k8sClient.Init(cloudRegion, id)
+       err := k8sClient.Init(cloudRegion, "dummy") //we don't care about instance id in this request
        if err != nil {
                return QueryStatus{}, pkgerrors.Wrap(err, "Getting CloudRegion Information")
        }
index f9ac56b..78023e5 100644 (file)
@@ -26,6 +26,7 @@ import (
 
        "github.com/onap/multicloud-k8s/src/k8splugin/internal/db"
        "github.com/onap/multicloud-k8s/src/k8splugin/internal/helm"
+       "k8s.io/apimachinery/pkg/runtime/schema"
 
        pkgerrors "github.com/pkg/errors"
 )
@@ -33,13 +34,14 @@ import (
 // Profile contains the parameters needed for resource bundle (rb) profiles
 // It implements the interface for managing the profiles
 type Profile struct {
-       RBName            string            `json:"rb-name"`
-       RBVersion         string            `json:"rb-version"`
-       ProfileName       string            `json:"profile-name"`
-       ReleaseName       string            `json:"release-name"`
-       Namespace         string            `json:"namespace"`
-       KubernetesVersion string            `json:"kubernetes-version"`
-       Labels            map[string]string `json:"labels"`
+       RBName             string                    `json:"rb-name"`
+       RBVersion          string                    `json:"rb-version"`
+       ProfileName        string                    `json:"profile-name"`
+       ReleaseName        string                    `json:"release-name"`
+       Namespace          string                    `json:"namespace"`
+       KubernetesVersion  string                    `json:"kubernetes-version"`
+       Labels             map[string]string         `json:"labels"`
+       ExtraResourceTypes []schema.GroupVersionKind `json:"extra-resource-types"`
 }
 
 // ProfileManager is an interface exposes the resource bundle profile functionality