From: aravind.est Date: Fri, 30 May 2025 12:26:55 +0000 (+0100) Subject: Fix kong cleanup when serviceapi get deleted X-Git-Tag: 0.2.2^0 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F15%2F14515%2F1;p=nonrtric%2Fplt%2Fsme.git Fix kong cleanup when serviceapi get deleted 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 --- diff --git a/servicemanager/internal/kongclear/kongclear.go b/servicemanager/internal/kongclear/kongclear.go index 4257f29..8cd13d5 100644 --- a/servicemanager/internal/kongclear/kongclear.go +++ b/servicemanager/internal/kongclear/kongclear.go @@ -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 } diff --git a/servicemanager/internal/publishserviceapi/typeupdate.go b/servicemanager/internal/publishserviceapi/typeupdate.go index b514f03..9eda6f6 100644 --- a/servicemanager/internal/publishserviceapi/typeupdate.go +++ b/servicemanager/internal/publishserviceapi/typeupdate.go @@ -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 }