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
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
}
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
"name": routeName,
"paths": []string{uri},
"methods": resource.Operations,
- "tags": []string{aefId},
+ "tags": tags,
"strip_path": true,
}
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
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)
"port": firstAEFProfilePort,
"protocol": kongControlPlaneURLParsed.Scheme,
"path": kongServiceUri,
- "tags": []string{aefId},
+ "tags": tags,
}
// Kong admin API endpoint for creating a service
} 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())
}
}
// 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}
}
}
-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) {
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
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())
}