X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=servicemanager%2Finternal%2Fpublishserviceapi%2Ftypeupdate.go;h=d7246bde5d1433fc63d47e3133034c5f567cd187;hb=fdb05902d0e3234446ac0cfd8ffed0743cfd20e5;hp=fe681f9c29ca0910acb7280b9b11c0987facc709;hpb=ff5fb255f6c98317ffb69f40fc1f77e98bb650a6;p=nonrtric%2Fplt%2Fsme.git diff --git a/servicemanager/internal/publishserviceapi/typeupdate.go b/servicemanager/internal/publishserviceapi/typeupdate.go index fe681f9..d7246bd 100644 --- a/servicemanager/internal/publishserviceapi/typeupdate.go +++ b/servicemanager/internal/publishserviceapi/typeupdate.go @@ -38,26 +38,36 @@ func (sd *ServiceAPIDescription) PrepareNewService() { sd.ApiId = &apiName } -func (sd *ServiceAPIDescription) RegisterKong(kongDomain string, kongProtocol string, kongIPv4 common29122.Ipv4Addr, kongDataPlanePort common29122.Port, kongControlPlanePort common29122.Port) (int, error) { +func (sd *ServiceAPIDescription) RegisterKong( + kongDomain string, + kongProtocol string, + kongControlPlaneIPv4 common29122.Ipv4Addr, + kongControlPlanePort common29122.Port, + kongDataPlaneIPv4 common29122.Ipv4Addr, + kongDataPlanePort common29122.Port, + apfId string) (int, error) { + log.Trace("entering RegisterKong") + log.Debugf("RegisterKong kongDataPlaneIPv4 %s", kongDataPlaneIPv4) + var ( statusCode int err error ) - kongControlPlaneURL := fmt.Sprintf("%s://%s:%d", kongProtocol, kongIPv4, kongControlPlanePort) + kongControlPlaneURL := fmt.Sprintf("%s://%s:%d", kongProtocol, kongControlPlaneIPv4, kongControlPlanePort) - statusCode, err = sd.createKongRoutes(kongControlPlaneURL) + statusCode, err = sd.createKongRoutes(kongControlPlaneURL, apfId) if (err != nil) || (statusCode != http.StatusCreated) { return statusCode, err } - sd.updateInterfaceDescription(kongIPv4, kongDataPlanePort, kongDomain) + sd.updateInterfaceDescription(kongDataPlaneIPv4, kongDataPlanePort, kongDomain) log.Trace("exiting from RegisterKong") return statusCode, nil } -func (sd *ServiceAPIDescription) createKongRoutes(kongControlPlaneURL string) (int, error) { +func (sd *ServiceAPIDescription) createKongRoutes(kongControlPlaneURL string, apfId string) (int, error) { log.Trace("entering createKongRoutes") var ( statusCode int @@ -72,7 +82,7 @@ func (sd *ServiceAPIDescription) createKongRoutes(kongControlPlaneURL string) (i for _, version := range profile.Versions { log.Debugf("createKongRoutes, apiVersion \"%s\"", version.ApiVersion) for _, resource := range *version.Resources { - statusCode, err = sd.createKongRoute(kongControlPlaneURL, client, resource, profile.AefId, version.ApiVersion) + statusCode, err = sd.createKongRoute(kongControlPlaneURL, client, resource, apfId, profile.AefId, version.ApiVersion) if (err != nil) || (statusCode != http.StatusCreated) { return statusCode, err } @@ -82,32 +92,36 @@ func (sd *ServiceAPIDescription) createKongRoutes(kongControlPlaneURL string) (i return statusCode, nil } -func (sd *ServiceAPIDescription) createKongRoute(kongControlPlaneURL string, client *resty.Client, resource Resource, aefId string, apiVersion string) (int, error) { +func (sd *ServiceAPIDescription) createKongRoute( + kongControlPlaneURL string, + client *resty.Client, + resource Resource, + apfId string, + aefId string, + apiVersion string ) (int, error) { log.Trace("entering createKongRoute") - uri := resource.Uri - if apiVersion != "" { - if apiVersion[0] != '/' { - apiVersion = "/" + apiVersion - } - if apiVersion[len(apiVersion)-1] != '/' && resource.Uri[0] != '/' { - apiVersion = apiVersion + "/" - } - uri = apiVersion + resource.Uri - } + resourceName := resource.ResourceName + apiId := *sd.ApiId - log.Debugf("createKongRoute, uri %s", uri) + tags := buildTags(apfId, aefId, apiId, apiVersion, resourceName) + log.Debugf("createKongRoute, tags %s", tags) + + serviceName := apiId + "_" + resourceName + routeName := serviceName - serviceName := *sd.ApiId + "_" + resource.ResourceName log.Debugf("createKongRoute, serviceName %s", serviceName) + log.Debugf("createKongRoute, routeName %s", routeName) log.Debugf("createKongRoute, aefId %s", aefId) - statusCode, err := sd.createKongService(kongControlPlaneURL, serviceName, uri, aefId) + uri := buildUriWithVersion(apiVersion, resource.Uri) + log.Debugf("createKongRoute, uri %s", uri) + + statusCode, err := sd.createKongService(kongControlPlaneURL, serviceName, uri, tags) if (err != nil) || (statusCode != http.StatusCreated) { return statusCode, err } - routeName := serviceName kongRoutesURL := kongControlPlaneURL + "/services/" + serviceName + "/routes" // Define the route information for Kong @@ -115,7 +129,7 @@ func (sd *ServiceAPIDescription) createKongRoute(kongControlPlaneURL string, cli "name": routeName, "paths": []string{uri}, "methods": resource.Operations, - "tags": []string{aefId}, + "tags": tags, "strip_path": true, } @@ -135,7 +149,8 @@ func (sd *ServiceAPIDescription) createKongRoute(kongControlPlaneURL string, cli if resp.StatusCode() == http.StatusCreated { log.Infof("kong route %s created successfully", routeName) } else { - err = fmt.Errorf("the Kong service already exists. Status code: %d", resp.StatusCode()) + log.Debugf("kongRoutesURL %s", kongRoutesURL) + err = fmt.Errorf("error creating Kong route. Status code: %d", resp.StatusCode()) log.Error(err.Error()) log.Errorf("response body: %s", resp.Body()) return resp.StatusCode(), err @@ -144,7 +159,39 @@ func (sd *ServiceAPIDescription) createKongRoute(kongControlPlaneURL string, cli return resp.StatusCode(), nil } -func (sd *ServiceAPIDescription) createKongService(kongControlPlaneURL string, kongServiceName string, kongServiceUri string, aefId string) (int, error) { +func buildUriWithVersion(apiVersion string, uri string) string { + if apiVersion != "" { + if apiVersion[0] != '/' { + apiVersion = "/" + apiVersion + } + if apiVersion[len(apiVersion)-1] != '/' && uri[0] != '/' { + apiVersion = apiVersion + "/" + } + uri = apiVersion + uri + } + return uri +} + +func buildTags(apfId string, aefId string, apiId string, apiVersion string, resourceName string) []string { + tagsMap := map[string]string{ + "apfId": apfId, + "aefId": aefId, + "apiId": apiId, + "apiVersion": apiVersion, + "resourceName": resourceName, + } + + // Convert the map to a slice of strings + var tagsSlice []string + for key, value := range tagsMap { + str := fmt.Sprintf("%s: %s", key, value) + tagsSlice = append(tagsSlice, str) + } + + return tagsSlice +} + +func (sd *ServiceAPIDescription) createKongService(kongControlPlaneURL string, kongServiceName string, kongServiceUri string, tags []string) (int, error) { log.Tracef("entering createKongService") log.Tracef("createKongService, kongServiceName %s", kongServiceName) @@ -167,7 +214,7 @@ func (sd *ServiceAPIDescription) createKongService(kongControlPlaneURL string, k "port": firstAEFProfilePort, "protocol": kongControlPlaneURLParsed.Scheme, "path": kongServiceUri, - "tags": []string{aefId}, + "tags": tags, } // Kong admin API endpoint for creating a service @@ -195,7 +242,7 @@ func (sd *ServiceAPIDescription) createKongService(kongControlPlaneURL string, k } else if resp.StatusCode() == http.StatusConflict { log.Errorf("kong service already exists. Status code: %d", resp.StatusCode()) err = fmt.Errorf("service with identical apiName is already published") // for compatibilty with Capif error message on a duplicate service - statusCode = http.StatusForbidden // for compatibilty with the spec, TS29222_CAPIF_Publish_Service_API + statusCode = http.StatusForbidden // for compatibilty with the spec, TS29222_CAPIF_Publish_Service_API } else { err = fmt.Errorf("error creating Kong service. Status code: %d", resp.StatusCode()) } @@ -229,10 +276,12 @@ func (sd *ServiceAPIDescription) findFirstAEFProfile() (common29122.Ipv4Addr, co } // Update our exposures to point to Kong by replacing in incoming interface description with Kong interface descriptions. -func (sd *ServiceAPIDescription) updateInterfaceDescription(kongIPv4 common29122.Ipv4Addr, kongDataPlanePort common29122.Port, kongDomain string) { +func (sd *ServiceAPIDescription) updateInterfaceDescription(kongDataPlaneIPv4 common29122.Ipv4Addr, kongDataPlanePort common29122.Port, kongDomain string) { log.Trace("updating InterfaceDescriptions") + log.Debugf("InterfaceDescriptions kongDataPlaneIPv4 %s", kongDataPlaneIPv4) + interfaceDesc := InterfaceDescription{ - Ipv4Addr: &kongIPv4, + Ipv4Addr: &kongDataPlaneIPv4, Port: &kongDataPlanePort, } interfaceDescs := []InterfaceDescription{interfaceDesc} @@ -245,14 +294,14 @@ func (sd *ServiceAPIDescription) updateInterfaceDescription(kongIPv4 common29122 } } -func (sd *ServiceAPIDescription) UnregisterKong(kongDomain string, kongProtocol string, kongIPv4 common29122.Ipv4Addr, kongDataPlanePort common29122.Port, kongControlPlanePort common29122.Port) (int, error) { +func (sd *ServiceAPIDescription) UnregisterKong(kongDomain string, kongProtocol string, kongControlPlaneIPv4 common29122.Ipv4Addr, kongControlPlanePort common29122.Port) (int, error) { log.Trace("entering UnregisterKong") var ( statusCode int err error ) - kongControlPlaneURL := fmt.Sprintf("%s://%s:%d", kongProtocol, kongIPv4, kongControlPlanePort) + kongControlPlaneURL := fmt.Sprintf("%s://%s:%d", kongProtocol, kongControlPlaneIPv4, kongControlPlanePort) statusCode, err = sd.deleteKongRoutes(kongControlPlaneURL) if (err != nil) || (statusCode != http.StatusNoContent) { @@ -308,6 +357,7 @@ func (sd *ServiceAPIDescription) deleteKongRoute(kongControlPlaneURL string, cli 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 @@ -344,6 +394,7 @@ func (sd *ServiceAPIDescription) deleteKongService(kongControlPlaneURL string, s 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()) }