diff options
author | Konrad Bańka <k.banka@samsung.com> | 2021-02-24 18:28:56 +0100 |
---|---|---|
committer | Konrad Bańka <k.banka@samsung.com> | 2021-02-24 21:43:07 +0100 |
commit | 74dfd71d3628c52e63f66c079244638c675b2b9c (patch) | |
tree | 1162640670a7bf6b3f8f3ab29b58da8bd064cff1 /src/k8splugin/internal/app/instance.go | |
parent | 69f17bdaf539b3ad89f0c3770ea624b512b80fbd (diff) |
Provide Query API for CNF Instances
Query API doesn't directly use Status API code, in order to allow for
querying derived resources that might not be typically returned by
Status API like replicasets for deployment.
Issue-ID: MULTICLOUD-1305
Signed-off-by: Konrad Bańka <k.banka@samsung.com>
Change-Id: If15adce23845880f3e6771cc8eab78a78ab13517
Diffstat (limited to 'src/k8splugin/internal/app/instance.go')
-rw-r--r-- | src/k8splugin/internal/app/instance.go | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/src/k8splugin/internal/app/instance.go b/src/k8splugin/internal/app/instance.go index a6e213c1..e789664e 100644 --- a/src/k8splugin/internal/app/instance.go +++ b/src/k8splugin/internal/app/instance.go @@ -1,6 +1,6 @@ /* * Copyright 2018 Intel Corporation, Inc - * Copyright © 2020 Samsung Electronics + * Copyright © 2021 Samsung Electronics * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,6 +74,7 @@ type InstanceManager interface { Create(i InstanceRequest) (InstanceResponse, error) Get(id string) (InstanceResponse, error) Status(id string) (InstanceStatus, error) + Query(id, apiVersion, kind, name, labels string) (InstanceStatus, error) List(rbname, rbversion, profilename string) ([]InstanceMiniResponse, error) Find(rbName string, ver string, profile string, labelKeys map[string]string) ([]InstanceMiniResponse, error) Delete(id string) error @@ -198,6 +199,68 @@ func (v *InstanceClient) Get(id string) (InstanceResponse, error) { return InstanceResponse{}, pkgerrors.New("Error getting Instance") } +// Query returns state of instance's filtered resources +func (v *InstanceClient) Query(id, apiVersion, kind, name, labels string) (InstanceStatus, error) { + + //Read the status from the DB + key := InstanceKey{ + ID: id, + } + value, err := db.DBconn.Read(v.storeName, key, v.tagInst) + if err != nil { + return InstanceStatus{}, pkgerrors.Wrap(err, "Get Instance") + } + if value == nil { //value is a byte array + return InstanceStatus{}, pkgerrors.New("Status is not available") + } + resResp := InstanceResponse{} + err = db.DBconn.Unmarshal(value, &resResp) + if err != nil { + return InstanceStatus{}, pkgerrors.Wrap(err, "Unmarshaling Instance Value") + } + + k8sClient := KubernetesClient{} + err = k8sClient.init(resResp.Request.CloudRegion, id) + if err != nil { + return InstanceStatus{}, pkgerrors.Wrap(err, "Getting CloudRegion Information") + } + + var resourcesStatus []ResourceStatus + if labels != "" { + resList, err := k8sClient.queryResources(apiVersion, kind, labels, resResp.Namespace) + if err != nil { + return InstanceStatus{}, pkgerrors.Wrap(err, "Querying Resources") + } + // If user specifies both label and name, we want to pick up only single resource from these matching label + if name != "" { + //Assigning 0-length, because we may actually not find matching name + resourcesStatus = make([]ResourceStatus, 0) + for _, res := range resList { + if res.Name == name { + resourcesStatus = append(resourcesStatus, res) + break + } + } + } else { + resourcesStatus = resList + } + } else if name != "" { + resIdentifier := helm.KubernetesResource{} + res, err := k8sClient.getResourceStatus(resIdentifier, resResp.Namespace) + if err != nil { + return InstanceStatus{}, pkgerrors.Wrap(err, "Querying Resource") + } + resourcesStatus = []ResourceStatus{res} + } + + resp := InstanceStatus{ + Request: resResp.Request, + ResourceCount: int32(len(resourcesStatus)), + ResourcesStatus: resourcesStatus, + } + return resp, nil +} + // Status returns the status for the instance func (v *InstanceClient) Status(id string) (InstanceStatus, error) { |