From f22ab29dff2b69aaadd748c34c259f25dacec52d Mon Sep 17 00:00:00 2001 From: Kiran Kamineni Date: Wed, 7 Aug 2019 15:45:54 -0700 Subject: Add query parameters support to instance API Add support for query parameters to find instances with rb-name, rb-version, profile-name as query parameters eg: curl IP:PORT/v1/instance?rb-name=test&rb-version=v1 Issue-ID: MULTICLOUD-662 Change-Id: If68c87885c8b8dd097cbb3860e8c7320310a6ef7 Signed-off-by: Kiran Kamineni --- src/k8splugin/internal/app/instance.go | 92 ++++++++++++++-------------------- 1 file changed, 37 insertions(+), 55 deletions(-) (limited to 'src/k8splugin/internal/app/instance.go') diff --git a/src/k8splugin/internal/app/instance.go b/src/k8splugin/internal/app/instance.go index 5cfdaea1..cf96d50c 100644 --- a/src/k8splugin/internal/app/instance.go +++ b/src/k8splugin/internal/app/instance.go @@ -60,8 +60,8 @@ type InstanceMiniResponse struct { type InstanceManager interface { Create(i InstanceRequest) (InstanceResponse, error) Get(id string) (InstanceResponse, error) - List() ([]InstanceMiniResponse, error) - Find(rbName string, ver string, profile string, labelKeys map[string]string) ([]InstanceResponse, 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 } @@ -184,7 +184,7 @@ func (v *InstanceClient) Get(id string) (InstanceResponse, error) { // List returns the instance for corresponding ID // Empty string returns all -func (v *InstanceClient) List() ([]InstanceMiniResponse, error) { +func (v *InstanceClient) List(rbname, rbversion, profilename string) ([]InstanceMiniResponse, error) { dbres, err := db.DBconn.ReadAll(v.storeName, v.tagInst) if err != nil || len(dbres) == 0 { @@ -192,6 +192,7 @@ func (v *InstanceClient) List() ([]InstanceMiniResponse, error) { } var results []InstanceMiniResponse + for key, value := range dbres { //value is a byte array if value != nil { @@ -206,6 +207,21 @@ func (v *InstanceClient) List() ([]InstanceMiniResponse, error) { Request: resp.Request, Namespace: resp.Namespace, } + + //Filter based on the accepted keys + if len(rbname) != 0 && + miniresp.Request.RBName != rbname { + continue + } + if len(rbversion) != 0 && + miniresp.Request.RBVersion != rbversion { + continue + } + if len(profilename) != 0 && + miniresp.Request.ProfileName != profilename { + continue + } + results = append(results, miniresp) } } @@ -218,70 +234,36 @@ func (v *InstanceClient) List() ([]InstanceMiniResponse, error) { // If profile is empty, it will return all instances for a given rbName+version // If labelKeys are provided, the results are filtered based on that. // It is an AND operation for labelkeys. -func (v *InstanceClient) Find(rbName string, version string, profile string, labelKeys map[string]string) ([]InstanceResponse, error) { +func (v *InstanceClient) Find(rbName string, version string, profile string, labelKeys map[string]string) ([]InstanceMiniResponse, error) { if rbName == "" && len(labelKeys) == 0 { - return []InstanceResponse{}, pkgerrors.New("rbName or labelkeys is required and cannot be empty") + return []InstanceMiniResponse{}, pkgerrors.New("rbName or labelkeys is required and cannot be empty") } - values, err := db.DBconn.ReadAll(v.storeName, v.tagInst) - if err != nil || len(values) == 0 { - return []InstanceResponse{}, pkgerrors.Wrap(err, "Find Instance") + responses, err := v.List(rbName, version, profile) + if err != nil { + return []InstanceMiniResponse{}, pkgerrors.Wrap(err, "Listing Instances") } - response := []InstanceResponse{} - //values is a map[string][]byte -InstanceResponseLoop: - for _, value := range values { - resp := InstanceResponse{} - db.DBconn.Unmarshal(value, &resp) - if err != nil { - return []InstanceResponse{}, pkgerrors.Wrap(err, "Unmarshaling Instance Value") - } + ret := []InstanceMiniResponse{} - // Filter by labels provided - if len(labelKeys) != 0 { - for lkey, lvalue := range labelKeys { - //Check if label key exists and get its value - if val, ok := resp.Request.Labels[lkey]; ok { - if lvalue != val { - continue InstanceResponseLoop - } - } else { - continue InstanceResponseLoop - } - } - } + //filter the list by labelKeys now + for _, resp := range responses { - if rbName != "" { - if resp.Request.RBName == rbName { - - //Check if a version is provided and if it matches - if version != "" { - if resp.Request.RBVersion == version { - //Check if a profilename matches or if it is not provided - if profile == "" || resp.Request.ProfileName == profile { - response = append(response, resp) - } - } - } else { - //Append all versions as version is not provided - response = append(response, resp) - } + add := true + for k, v := range labelKeys { + if resp.Request.Labels[k] != v { + add = false + break } - } else { - response = append(response, resp) } - } - - //filter the list by labelKeys now - for _, value := range response { - for _, label := range labelKeys { - if _, ok := value.Request.Labels[label]; ok { - } + // If label was not found in the response, don't add it + if add { + ret = append(ret, resp) } + } - return response, nil + return ret, nil } // Delete the Instance from database -- cgit 1.2.3-korg