Fix kong cleanup when serviceapi get deleted 15/14515/1 0.2.2
authoraravind.est <aravindhan.a@est.tech>
Fri, 30 May 2025 12:26:55 +0000 (13:26 +0100)
committeraravind.est <aravindhan.a@est.tech>
Fri, 30 May 2025 12:26:55 +0000 (13:26 +0100)
Kong cleanup missed the resources from serviceapi during delete.

This fixes by search the kong routes based on the tags

Issue-ID: NONRTRIC-1020
Change-Id: Ie5ad6c6f2d74714b539c0bd0a06b0d932d9a94cc
Signed-off-by: aravind.est <aravindhan.a@est.tech>
servicemanager/internal/kongclear/kongclear.go
servicemanager/internal/publishserviceapi/typeupdate.go

index 4257f29..8cd13d5 100644 (file)
@@ -24,6 +24,7 @@ import (
        "encoding/json"
        "fmt"
        "net/http"
+       "net/url"
        "strings"
 
        resty "github.com/go-resty/resty/v2"
@@ -70,13 +71,13 @@ func KongClear(myEnv map[string]string, myPorts map[string]int) error {
 
        kongAdminApiUrl := fmt.Sprintf("%s://%s:%d/", myEnv["KONG_PROTOCOL"], myEnv["KONG_CONTROL_PLANE_IPV4"], myPorts["KONG_CONTROL_PLANE_PORT"])
 
-       err := deleteRoutes(kongAdminApiUrl, "")
+       err := DeleteRoutes(kongAdminApiUrl, "", "")
        if err != nil {
                log.Fatalf("error deleting routes %v", err)
                return err
        }
 
-       err = deleteServices(kongAdminApiUrl, "")
+       err = DeleteServices(kongAdminApiUrl, "", "")
        if err != nil {
                log.Fatalf("error deleting services %v", err)
                return err
@@ -86,11 +87,22 @@ func KongClear(myEnv map[string]string, myPorts map[string]int) error {
        return err
 }
 
-func deleteRoutes(kongAdminApiUrl string, offset string) error {
+func DeleteRoutes(kongAdminApiUrl string, offset string, tags string) error {
        kongRoutesApiUrl := kongAdminApiUrl + "routes"
+
+       params := url.Values{}
        if offset != "" {
-               log.Tracef("using offset %s for kong routes", offset)
-               kongRoutesApiUrl += "?offset=" + offset
+               log.Tracef("Using offset %s for kong routes", offset)
+               params.Add("offset", offset)
+       }
+       if tags != "" {
+               log.Tracef("Using tags %s for kong routes", tags)
+               params.Add("tags", tags)
+       }
+
+       if len(params) > 0 {
+               log.Debugf("Using params %s for kong routes", params.Encode())
+               kongRoutesApiUrl += "?" + params.Encode()
        }
 
        routes, nextOffset, err := listRoutes(kongRoutesApiUrl)
@@ -101,7 +113,7 @@ func deleteRoutes(kongAdminApiUrl string, offset string) error {
 
        for _, route := range routes {
                if areServiceManagerTags(route.Tags) {
-                       if err := deleteRoute(kongAdminApiUrl, route.ID); err != nil {
+                       if err := deleteRoute(kongAdminApiUrl, route.Name); err != nil {
                                return err
                        }
                }
@@ -110,7 +122,7 @@ func deleteRoutes(kongAdminApiUrl string, offset string) error {
        // If the offset is not empty, it means there are more routes to process
        if nextOffset != "" {
                log.Tracef("More routes to process, offset is %s", nextOffset)
-               if err := deleteRoutes(kongAdminApiUrl, nextOffset); err != nil {
+               if err := DeleteRoutes(kongAdminApiUrl, nextOffset, tags); err != nil {
                        return err
                }
        }
@@ -118,12 +130,24 @@ func deleteRoutes(kongAdminApiUrl string, offset string) error {
        return nil
 }
 
-func deleteServices(kongAdminApiUrl string, offset string) error {
+func DeleteServices(kongAdminApiUrl string, offset string, tags string) error {
        kongServiceApiUrl := kongAdminApiUrl + "services"
+
+       params := url.Values{}
        if offset != "" {
                log.Tracef("Using offset %s for kong services", offset)
-               kongServiceApiUrl += "?offset=" + offset
+               params.Add("offset", offset)
        }
+       if tags != "" {
+               log.Tracef("Using tags %s for kong services", tags)
+               params.Add("tags", tags)
+       }
+
+       if len(params) > 0 {
+               log.Debugf("Using params %s for kong services", params.Encode())
+               kongServiceApiUrl += "?" + params.Encode()
+       }
+
        services, nextOffset, err := listServices(kongServiceApiUrl)
        if err != nil {
                return err
@@ -133,7 +157,7 @@ func deleteServices(kongAdminApiUrl string, offset string) error {
 
        for _, service := range services {
                if areServiceManagerTags(service.Tags) {
-                       if err := deleteService(kongAdminApiUrl, service.ID); err != nil {
+                       if err := deleteService(kongAdminApiUrl, service.Name); err != nil {
                                return err
                        }
                }
@@ -142,7 +166,7 @@ func deleteServices(kongAdminApiUrl string, offset string) error {
        // If the offset is not empty, it means there are more services to process
        if nextOffset != "" {
                log.Tracef("More services to process, offset is %s", nextOffset)
-               if err := deleteServices(kongAdminApiUrl, nextOffset); err != nil {
+               if err := DeleteServices(kongAdminApiUrl, nextOffset, tags); err != nil {
                        return err
                }
        }
@@ -237,7 +261,7 @@ func areServiceManagerTags(tags []string) bool {
 }
 
 func deleteRoute(kongAdminApiUrl string, routeID string) error {
-       log.Infof("delete kong route id %s", routeID)
+       log.Debugf("delete kong route %s", routeID)
        client := resty.New()
        resp, err := client.R().Delete(kongAdminApiUrl + "routes/" + routeID)
 
@@ -250,11 +274,12 @@ func deleteRoute(kongAdminApiUrl string, routeID string) error {
                return err
        }
 
+       log.Infof("kong route %s deleted successfully", routeID)
        return nil
 }
 
 func deleteService(kongAdminApiUrl string, serviceID string) error {
-       log.Infof("delete kong service id %s", serviceID)
+       log.Debugf("delete kong service %s", serviceID)
        client := resty.New()
        resp, err := client.R().Delete(kongAdminApiUrl + "services/" + serviceID)
 
@@ -267,5 +292,6 @@ func deleteService(kongAdminApiUrl string, serviceID string) error {
                return err
        }
 
+       log.Infof("kong service %s deleted successfully", serviceID)
        return nil
 }
index b514f03..9eda6f6 100644 (file)
@@ -2,7 +2,7 @@
 //   ========================LICENSE_START=================================
 //   O-RAN-SC
 //   %%
-//   Copyright (C) 2023-2024: OpenInfra Foundation Europe
+//   Copyright (C) 2023-2025: OpenInfra Foundation Europe
 //   %%
 //   Licensed under the Apache License, Version 2.0 (the "License");
 //   you may not use this file except in compliance with the License.
@@ -34,6 +34,7 @@ import (
        log "github.com/sirupsen/logrus"
 
        common29122 "oransc.org/nonrtric/servicemanager/internal/common29122"
+       "oransc.org/nonrtric/servicemanager/internal/kongclear"
 )
 
 func (sd *ServiceAPIDescription) PrepareNewService() {
@@ -669,7 +670,7 @@ func (sd *ServiceAPIDescription) UnregisterKong(kongDomain string, kongProtocol
                statusCode int
                err        error
        )
-       kongControlPlaneURL := fmt.Sprintf("%s://%s:%d", kongProtocol, kongControlPlaneIPv4, kongControlPlanePort)
+       kongControlPlaneURL := fmt.Sprintf("%s://%s:%d/", kongProtocol, kongControlPlaneIPv4, kongControlPlanePort)
 
        statusCode, err = sd.deleteKongRoutes(kongControlPlaneURL)
        if (err != nil) || (statusCode != http.StatusNoContent) {
@@ -683,88 +684,22 @@ func (sd *ServiceAPIDescription) UnregisterKong(kongDomain string, kongProtocol
 func (sd *ServiceAPIDescription) deleteKongRoutes(kongControlPlaneURL string) (int, error) {
        log.Trace("entering deleteKongRoutes")
 
-       var (
-               statusCode int
-               err        error
-       )
-
-       client := resty.New()
-
        profiles := *sd.AefProfiles
        for _, profile := range profiles {
-               log.Debugf("deleteKongRoutes, AefId %s", profile.AefId)
-               for _, version := range profile.Versions {
-                       log.Debugf("deleteKongRoutes, apiVersion \"%s\"", version.ApiVersion)
-                       for _, resource := range *version.Resources {
-                               statusCode, err = sd.deleteKongRoute(kongControlPlaneURL, client, resource, profile.AefId, version.ApiVersion)
-                               if (err != nil) || (statusCode != http.StatusNoContent) {
-                                       return statusCode, err
-                               }
-                       }
-               }
-       }
-       return statusCode, nil
-}
-
-func (sd *ServiceAPIDescription) deleteKongRoute(kongControlPlaneURL string, client *resty.Client, resource Resource, aefId string, apiVersion string) (int, error) {
-       log.Trace("entering deleteKongRoute")
-       routeName := *sd.ApiId + "_" + resource.ResourceName
-       kongRoutesURL := kongControlPlaneURL + "/routes/" + routeName + "?tags=" + aefId
-       log.Debugf("deleteKongRoute, routeName %s, tag %s", routeName, aefId)
-
-       // Make the DELETE request to delete the Kong route
-       resp, err := client.R().Delete(kongRoutesURL)
-
-       // Check for errors in the request
-       if err != nil {
-               log.Errorf("error on Kong route delete: %v", err)
-               return resp.StatusCode(), err
-       }
-
-       // Check the response status code
-       if resp.StatusCode() == http.StatusNoContent {
-               log.Infof("kong route %s deleted successfully", routeName)
-       } else {
-               log.Debugf("kongRoutesURL: %s", kongRoutesURL)
-               log.Errorf("error deleting Kong route. Status code: %d", resp.StatusCode())
-               log.Errorf("response body: %s", resp.Body())
-               return resp.StatusCode(), err
-       }
-
-       statusCode, err := sd.deleteKongService(kongControlPlaneURL, routeName, aefId)
-       if (err != nil) || (statusCode != http.StatusNoContent) {
-               return statusCode, err
-       }
-       return statusCode, err
-}
-
-func (sd *ServiceAPIDescription) deleteKongService(kongControlPlaneURL string, serviceName string, aefId string) (int, error) {
-       log.Trace("entering deleteKongService")
-       // Define the service information for Kong
-       // Kong admin API endpoint for deleting a service
-       kongServicesURL := kongControlPlaneURL + "/services/" + serviceName + "?tags=" + aefId
-
-       // Create a new Resty client
-       client := resty.New()
+               log.Debugf("deleteKongRoutes, AefId %s, ApiId %s", profile.AefId, *sd.ApiId)
+               tagToSearch := "aefId: " + profile.AefId + "," + "apiId: " + *sd.ApiId
 
-       // Make the DELETE request to delete the Kong service
-       resp, err := client.R().
-               SetHeader("Content-Type", "application/json").
-               Delete(kongServicesURL)
-
-       // Check for errors in the request
-       if err != nil {
-               log.Errorf("delete kong service request: %v", err)
-               return http.StatusInternalServerError, err
-       }
+               err := kongclear.DeleteRoutes(kongControlPlaneURL, "", tagToSearch)
+               if err != nil {
+                       log.Errorf("error deleting Kong routes for AefId %s, ApiId %s: %v", profile.AefId, *sd.ApiId, err)
+                       return http.StatusInternalServerError, err
+               }
 
-       // Check the response status code
-       if resp.StatusCode() == http.StatusNoContent {
-               log.Infof("kong service %s deleted successfully", serviceName)
-       } else {
-               log.Debugf("kongServicesURL: %s", kongServicesURL)
-               log.Errorf("deleting Kong service, status code: %d", resp.StatusCode())
-               log.Errorf("response body: %s", resp.Body())
+               err = kongclear.DeleteServices(kongControlPlaneURL, "", tagToSearch)
+               if err != nil {
+                       log.Errorf("error deleting Kong services for AefId %s, ApiId %s: %v", profile.AefId, *sd.ApiId, err)
+                       return http.StatusInternalServerError, err
+               }
        }
-       return resp.StatusCode(), nil
+       return http.StatusNoContent, nil
 }