"encoding/json"
"fmt"
"net/http"
+ "net/url"
"strings"
resty "github.com/go-resty/resty/v2"
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
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)
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
}
}
// 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
}
}
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
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
}
}
// 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
}
}
}
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)
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)
return err
}
+ log.Infof("kong service %s deleted successfully", serviceID)
return nil
}
// ========================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.
log "github.com/sirupsen/logrus"
common29122 "oransc.org/nonrtric/servicemanager/internal/common29122"
+ "oransc.org/nonrtric/servicemanager/internal/kongclear"
)
func (sd *ServiceAPIDescription) PrepareNewService() {
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) {
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
}