diff --git a/go.mod b/go.mod index 735cbfc..6490099 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/google/uuid v1.3.0 github.com/mitchellh/mapstructure v1.4.3 github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.8.1 + github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/urfave/cli v1.22.5 go.mongodb.org/mongo-driver v1.8.4 @@ -20,13 +20,15 @@ require ( ) require ( - github.com/antihax/optional v1.0.0 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect @@ -35,7 +37,6 @@ require ( github.com/golang-jwt/jwt v3.2.1+incompatible // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.1 // indirect - github.com/google/go-cmp v0.5.6 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.13.6 // indirect @@ -54,6 +55,11 @@ require ( github.com/xdg-go/scram v1.0.2 // indirect github.com/xdg-go/stringprep v1.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/net v0.23.0 // indirect @@ -66,3 +72,5 @@ require ( gopkg.in/h2non/gock.v1 v1.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/free5gc/openapi => github.com/free5gc/openapi v1.0.9-0.20240730084256-f724fd925c33 diff --git a/go.sum b/go.sum index c9d0310..4e448fa 100644 --- a/go.sum +++ b/go.sum @@ -33,8 +33,6 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -61,8 +59,10 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/free5gc/openapi v1.0.8 h1:QjfQdB6VVA1GRnzOJ7nILzrI7gMiY0lH64JHVW7vF34= -github.com/free5gc/openapi v1.0.8/go.mod h1:w6y9P/uySczc1d9OJZAEuB2FImR/z60Wg2BekPAVt3M= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/free5gc/openapi v1.0.9-0.20240730084256-f724fd925c33 h1:U/hJW8h7iNLlk5J+jucr/rc5gdwRRkgnEam8Kav42cY= +github.com/free5gc/openapi v1.0.9-0.20240730084256-f724fd925c33/go.mod h1:oy68rqnHakRLUCuEOXcis7/PWGBuil+UaXMeTBeYY8Y= github.com/free5gc/util v1.0.6 h1:dBt9drcXtYKE/cY5XuQcuffgsYclPIpIArhSeS6M+DQ= github.com/free5gc/util v1.0.6/go.mod h1:eSGN7POUM8LNTvg/E591XR6447a6/w1jFWGKNZPHcXw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= @@ -74,6 +74,11 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -129,8 +134,8 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -193,12 +198,11 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -238,6 +242,16 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 h1:RtcvQ4iw3w9NBB5yRwgA4sSa82rfId7n4atVpvKx3bY= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0/go.mod h1:f/PbKbRd4cdUICWell6DmzvVJ7QrmBgFrRHjXmAXbK4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -351,6 +365,7 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -410,7 +425,6 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= diff --git a/internal/context/context.go b/internal/context/context.go index adcfe01..0c8d615 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -53,7 +53,7 @@ type UDRContext struct { UriScheme models.UriScheme BindingIPv4 string SBIPort int - NfService map[models.ServiceName]models.NfService + NfService map[models.ServiceName]models.NrfNfManagementNfService RegisterIPv4 string // IP register to NRF HttpIPv6Address string NfId string @@ -160,15 +160,15 @@ func initUdrContext() { } func initNfService(serviceName []models.ServiceName, version string) ( - nfService map[models.ServiceName]models.NfService, + nfService map[models.ServiceName]models.NrfNfManagementNfService, ) { versionUri := "v" + strings.Split(version, ".")[0] - nfService = make(map[models.ServiceName]models.NfService) + nfService = make(map[models.ServiceName]models.NrfNfManagementNfService) for idx, name := range serviceName { - nfService[name] = models.NfService{ + nfService[name] = models.NrfNfManagementNfService{ ServiceInstanceId: strconv.Itoa(idx), ServiceName: name, - Versions: &[]models.NfServiceVersion{ + Versions: []models.NfServiceVersion{ { ApiFullVersion: version, ApiVersionInUri: versionUri, @@ -177,10 +177,10 @@ func initNfService(serviceName []models.ServiceName, version string) ( Scheme: udrContext.UriScheme, NfServiceStatus: models.NfServiceStatus_REGISTERED, ApiPrefix: GetIPv4Uri(), - IpEndPoints: &[]models.IpEndPoint{ + IpEndPoints: []models.IpEndPoint{ { Ipv4Address: udrContext.RegisterIPv4, - Transport: models.TransportProtocol_TCP, + Transport: models.NrfNfManagementTransportProtocol_TCP, Port: int32(udrContext.SBIPort), }, }, @@ -226,13 +226,13 @@ func NewInfluenceDataSubscriptionId() string { return fmt.Sprintf("%08x", GetSelf().InfluenceDataSubscriptionIDGenerator.Uint32()) } -func (c *UDRContext) GetTokenCtx(serviceName models.ServiceName, targetNF models.NfType) ( +func (c *UDRContext) GetTokenCtx(serviceName models.ServiceName, targetNF models.NrfNfManagementNfType) ( context.Context, *models.ProblemDetails, error, ) { if !c.OAuth2Required { return context.TODO(), nil, nil } - return oauth.GetTokenCtx(models.NfType_UDR, targetNF, + return oauth.GetTokenCtx(models.NrfNfManagementNfType_UDR, targetNF, c.NfId, c.NrfUri, string(serviceName)) } diff --git a/internal/sbi/api_sanity_test.go b/internal/sbi/api_sanity_test.go index a670538..6c0556f 100644 --- a/internal/sbi/api_sanity_test.go +++ b/internal/sbi/api_sanity_test.go @@ -89,7 +89,7 @@ func getInfluData(supi string) *models.TrafficInfluData { FlowId: 1, FlowDescriptions: []string{"permit out ip from 60.60.0.1 8080 to any"}, }}, - TrafficRoutes: []models.RouteToLocation{{ + TrafficRoutes: []*models.RouteToLocation{{ Dnai: "edge1", RouteProfId: "1", }, { Dnai: "edge2", RouteProfId: "2", diff --git a/internal/sbi/consumer/consumer.go b/internal/sbi/consumer/consumer.go index f520663..4087ab5 100644 --- a/internal/sbi/consumer/consumer.go +++ b/internal/sbi/consumer/consumer.go @@ -1,7 +1,7 @@ package consumer import ( - "github.com/free5gc/openapi/Nnrf_NFManagement" + "github.com/free5gc/openapi/nrf/NFManagement" "github.com/free5gc/udr/pkg/app" ) @@ -12,10 +12,10 @@ type Consumer struct { } func NewConsumer(udr app.App) *Consumer { - configuration := Nnrf_NFManagement.NewConfiguration() + configuration := NFManagement.NewConfiguration() configuration.SetBasePath(udr.Context().NrfUri) nrfService := &NrfService{ - nfMngmntClients: make(map[string]*Nnrf_NFManagement.APIClient), + nfMngmntClients: make(map[string]*NFManagement.APIClient), } return &Consumer{ diff --git a/internal/sbi/consumer/nrf_service.go b/internal/sbi/consumer/nrf_service.go index 29e5d66..273b664 100644 --- a/internal/sbi/consumer/nrf_service.go +++ b/internal/sbi/consumer/nrf_service.go @@ -3,15 +3,14 @@ package consumer import ( "context" "fmt" - "net/http" "strings" "sync" "time" "github.com/free5gc/openapi" - "github.com/free5gc/openapi/Nnrf_NFDiscovery" - "github.com/free5gc/openapi/Nnrf_NFManagement" "github.com/free5gc/openapi/models" + "github.com/free5gc/openapi/nrf/NFDiscovery" + "github.com/free5gc/openapi/nrf/NFManagement" udr_context "github.com/free5gc/udr/internal/context" "github.com/free5gc/udr/internal/logger" ) @@ -19,10 +18,10 @@ import ( type NrfService struct { nfMngmntMu sync.RWMutex - nfMngmntClients map[string]*Nnrf_NFManagement.APIClient + nfMngmntClients map[string]*NFManagement.APIClient } -func (ns *NrfService) getNFManagementClient(uri string) *Nnrf_NFManagement.APIClient { +func (ns *NrfService) getNFManagementClient(uri string) *NFManagement.APIClient { if uri == "" { return nil } @@ -33,9 +32,9 @@ func (ns *NrfService) getNFManagementClient(uri string) *Nnrf_NFManagement.APICl return client } - configuration := Nnrf_NFManagement.NewConfiguration() + configuration := NFManagement.NewConfiguration() configuration.SetBasePath(uri) - client = Nnrf_NFManagement.NewAPIClient(configuration) + client = NFManagement.NewAPIClient(configuration) ns.nfMngmntMu.RUnlock() ns.nfMngmntMu.Lock() @@ -44,13 +43,13 @@ func (ns *NrfService) getNFManagementClient(uri string) *Nnrf_NFManagement.APICl return client } -func (ns *NrfService) buildNFProfile(context *udr_context.UDRContext) (models.NfProfile, error) { +func (ns *NrfService) buildNFProfile(context *udr_context.UDRContext) (models.NrfNfManagementNfProfile, error) { // config := factory.UdrConfig - profile := models.NfProfile{ + profile := models.NrfNfManagementNfProfile{ NfInstanceId: context.NfId, - NfType: models.NfType_UDR, - NfStatus: models.NfStatus_REGISTERED, + NfType: models.NrfNfManagementNfType_UDR, + NfStatus: models.NrfNfManagementNfStatus_REGISTERED, Ipv4Addresses: []string{context.RegisterIPv4}, UdrInfo: &models.UdrInfo{ SupportedDataSets: []models.DataSetId{ @@ -62,29 +61,29 @@ func (ns *NrfService) buildNFProfile(context *udr_context.UDRContext) (models.Nf }, } - var services []models.NfService + var services []models.NrfNfManagementNfService for _, nfService := range context.NfService { services = append(services, nfService) } if len(services) > 0 { - profile.NfServices = &services + profile.NfServices = services } return profile, nil } -func (ns *NrfService) SendRegisterNFInstance(ctx context.Context, nrfUri string) (string, string, error) { +func (ns *NrfService) SendRegisterNFInstance(ctx context.Context, nrfUri string) ( + resourceNrfUri string, retrieveNfInstanceId string, err error, +) { // Set client and set url profile, err := ns.buildNFProfile(udr_context.GetSelf()) if err != nil { return "", "", fmt.Errorf("failed to build nrf profile %s", err.Error()) } - configuration := Nnrf_NFManagement.NewConfiguration() + configuration := NFManagement.NewConfiguration() configuration.SetBasePath(nrfUri) client := ns.getNFManagementClient(nrfUri) - var resouceNrfUri string - var retrieveNfInstanceId string finish := false @@ -93,110 +92,83 @@ func (ns *NrfService) SendRegisterNFInstance(ctx context.Context, nrfUri string) case <-ctx.Done(): return "", "", fmt.Errorf("context done") default: - nf, res, registerErr := client.NFInstanceIDDocumentApi.RegisterNFInstance(ctx, profile.NfInstanceId, profile) - if registerErr != nil || res == nil { + registerReq := &NFManagement.RegisterNFInstanceRequest{ + NfInstanceID: &profile.NfInstanceId, + NrfNfManagementNfProfile: &profile, + } + rsp, registerErr := client.NFInstanceIDDocumentApi.RegisterNFInstance(ctx, registerReq) + if registerErr != nil || rsp == nil { // TODO : add log logger.ConsumerLog.Errorf("UDR register to NRF Error[%s]", registerErr.Error()) time.Sleep(2 * time.Second) continue } - defer func() { - if rspCloseErr := res.Body.Close(); rspCloseErr != nil { - logger.ConsumerLog.Errorf("RegisterNFInstance response body cannot close: %+v", rspCloseErr) - } - }() - - status := res.StatusCode - if status == http.StatusOK { - // NFUpdate - finish = true - } else if status == http.StatusCreated { - // NFRegister - resourceUri := res.Header.Get("Location") - resouceNrfUri = resourceUri[:strings.Index(resourceUri, "/nnrf-nfm/")] - retrieveNfInstanceId = resourceUri[strings.LastIndex(resourceUri, "/")+1:] - - oauth2 := false - if nf.CustomInfo != nil { - v, ok := nf.CustomInfo["oauth2"].(bool) - if ok { - oauth2 = v - logger.MainLog.Infoln("OAuth2 setting receive from NRF:", oauth2) - } - } - udr_context.GetSelf().OAuth2Required = oauth2 - if oauth2 && udr_context.GetSelf().NrfCertPem == "" { - logger.CfgLog.Error("OAuth2 enable but no nrfCertPem provided in config.") + + resourceUri := rsp.Location + resourceNrfUri, _, _ = strings.Cut(resourceUri, "/nnrf-nfm/") + retrieveNfInstanceId = resourceUri[strings.LastIndex(resourceUri, "/")+1:] + + oauth2 := false + + if rsp.NrfNfManagementNfProfile.CustomInfo != nil { + v, ok := rsp.NrfNfManagementNfProfile.CustomInfo["oauth2"].(bool) + if ok { + oauth2 = v + logger.MainLog.Infoln("OAuth2 setting receive from NRF:", oauth2) } - finish = true - } else { - logger.ConsumerLog.Errorf("NRF returned wrong status code: %d", status) } + udr_context.GetSelf().OAuth2Required = oauth2 + if oauth2 && udr_context.GetSelf().NrfCertPem == "" { + logger.CfgLog.Error("OAuth2 enable but no nrfCertPem provided in config.") + } + finish = true } } - return resouceNrfUri, retrieveNfInstanceId, nil + return resourceNrfUri, retrieveNfInstanceId, nil } func (ns *NrfService) SendDeregisterNFInstance() (problemDetails *models.ProblemDetails, err error) { logger.ConsumerLog.Infof("Send Deregister NFInstance") - ctx, pd, err := udr_context.GetSelf().GetTokenCtx(models.ServiceName_NNRF_NFM, models.NfType_NRF) + ctx, pd, err := udr_context.GetSelf().GetTokenCtx(models.ServiceName_NNRF_NFM, models.NrfNfManagementNfType_NRF) if err != nil { return pd, err } udrSelf := udr_context.GetSelf() // Set client and set url - configuration := Nnrf_NFManagement.NewConfiguration() + configuration := NFManagement.NewConfiguration() configuration.SetBasePath(udrSelf.NrfUri) client := ns.getNFManagementClient(udrSelf.NrfUri) - var res *http.Response - - res, err = client.NFInstanceIDDocumentApi.DeregisterNFInstance(ctx, udrSelf.NfId) - if err == nil { - return nil, err - } else if res != nil { - defer func() { - if rspCloseErr := res.Body.Close(); rspCloseErr != nil { - logger.ConsumerLog.Errorf("DeregisterNFInstance response body cannot close: %+v", rspCloseErr) - } - }() - - if res.Status != err.Error() { - return nil, err + deregisterReq := &NFManagement.DeregisterNFInstanceRequest{ + NfInstanceID: &udrSelf.NfId, + } + _, deregisterErr := client.NFInstanceIDDocumentApi.DeregisterNFInstance(ctx, deregisterReq) + if deregisterErr != nil { + if apiErr, ok := err.(openapi.GenericOpenAPIError); ok { + pd = apiErr.Model().(*models.ProblemDetails) + return pd, err } - problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails) - problemDetails = &problem - } else { - err = openapi.ReportError("server no response") + return nil, err } return problemDetails, err } -func (ns *NrfService) SendSearchNFInstances(nrfUri string, targetNfType, requestNfType models.NfType, - param Nnrf_NFDiscovery.SearchNFInstancesParamOpts, -) (*models.SearchResult, error) { +func (ns *NrfService) SendSearchNFInstances(nrfUri string, + param NFDiscovery.SearchNFInstancesRequest, +) (*NFDiscovery.SearchNFInstancesResponse, error) { // Set client and set url - configuration := Nnrf_NFDiscovery.NewConfiguration() + configuration := NFDiscovery.NewConfiguration() configuration.SetBasePath(nrfUri) - client := Nnrf_NFDiscovery.NewAPIClient(configuration) + client := NFDiscovery.NewAPIClient(configuration) - ctx, _, err := udr_context.GetSelf().GetTokenCtx(models.ServiceName_NNRF_DISC, models.NfType_NRF) + ctx, _, err := udr_context.GetSelf().GetTokenCtx(models.ServiceName_NNRF_DISC, models.NrfNfManagementNfType_NRF) if err != nil { return nil, err } - var res *http.Response - result, res, err := client.NFInstancesStoreApi.SearchNFInstances(ctx, targetNfType, requestNfType, ¶m) - if res != nil && res.StatusCode == http.StatusTemporaryRedirect { - err = fmt.Errorf("temporary redirect for non NRF consumer") - } - defer func() { - if rspCloseErr := res.Body.Close(); rspCloseErr != nil { - logger.ConsumerLog.Errorf("SearchNFInstances response body cannot close: %+v", rspCloseErr) - } - }() + result, err := client.NFInstancesStoreApi.SearchNFInstances(ctx, ¶m) - return &result, err + return result, err } diff --git a/internal/sbi/processor/callback.go b/internal/sbi/processor/callback.go index 5c03629..9971b82 100644 --- a/internal/sbi/processor/callback.go +++ b/internal/sbi/processor/callback.go @@ -5,8 +5,8 @@ import ( "fmt" "runtime/debug" - "github.com/free5gc/openapi/Nudr_DataRepository" "github.com/free5gc/openapi/models" + "github.com/free5gc/openapi/udr/DataRepository" udr_context "github.com/free5gc/udr/internal/context" "github.com/free5gc/udr/internal/logger" "github.com/free5gc/udr/internal/util" @@ -15,7 +15,7 @@ import ( var CurrentResourceUri string func PreHandleOnDataChangeNotify(ueId string, resourceId string, patchItems []models.PatchItem, - origValue interface{}, newValue interface{}, + origValue map[string]interface{}, newValue map[string]interface{}, ) { notifyItems := []models.NotifyItem{} changes := []models.ChangeItem{} @@ -87,32 +87,27 @@ func SendOnDataChangeNotify(ueId string, notifyItems []models.NotifyItem) { }() udrSelf := udr_context.GetSelf() - configuration := Nudr_DataRepository.NewConfiguration() - client := Nudr_DataRepository.NewAPIClient(configuration) + configuration := DataRepository.NewConfiguration() + client := DataRepository.NewAPIClient(configuration) for _, subscriptionDataSubscription := range udrSelf.SubscriptionDataSubscriptions { if ueId == subscriptionDataSubscription.UeId { onDataChangeNotifyUrl := subscriptionDataSubscription.CallbackReference - dataChangeNotify := models.DataChangeNotify{} - dataChangeNotify.UeId = ueId - dataChangeNotify.OriginalCallbackReference = []string{subscriptionDataSubscription.OriginalCallbackReference} - dataChangeNotify.NotifyItems = notifyItems - httpResponse, err := client.DataChangeNotifyCallbackDocumentApi.OnDataChangeNotify( - context.TODO(), onDataChangeNotifyUrl, dataChangeNotify) - if err != nil { - logger.HttpLog.Errorln(err.Error()) - } else if httpResponse == nil { - logger.HttpLog.Errorln("Empty HTTP response") + dataChangeReq := DataRepository.SubscriptionDataSubscriptionsOnDataChangePostRequest{} + dataChangeReq.DataChangeNotify.UeId = ueId + dataChangeReq.DataChangeNotify.OriginalCallbackReference = []string{ + subscriptionDataSubscription.OriginalCallbackReference, } + dataChangeReq.DataChangeNotify.NotifyItems = notifyItems + rsp, err := client.SubsToNotifyCollectionApi.SubscriptionDataSubscriptionsOnDataChangePost( + context.TODO(), onDataChangeNotifyUrl, &dataChangeReq) - defer func() { - if httpResponse.Body != nil { - if err := httpResponse.Body.Close(); err != nil { - logger.HttpLog.Errorln("Failed to close response body:", err) - } - } - }() + if err != nil { + logger.SBILog.Errorln(err.Error()) + } else if rsp == nil { + logger.SBILog.Errorln("Empty SubscriptionDataSubscriptionsOnDataChangePost response") + } } } } @@ -130,31 +125,32 @@ func SendPolicyDataChangeNotification(policyDataChangeNotification models.Policy for _, policyDataSubscription := range udrSelf.PolicyDataSubscriptions { policyDataChangeNotificationUrl := policyDataSubscription.NotificationUri - configuration := Nudr_DataRepository.NewConfiguration() - client := Nudr_DataRepository.NewAPIClient(configuration) - httpResponse, err := client.PolicyDataChangeNotifyCallbackDocumentApi.PolicyDataChangeNotify( - context.TODO(), policyDataChangeNotificationUrl, policyDataChangeNotification) - if err != nil { - logger.HttpLog.Errorln(err.Error()) - } else if httpResponse == nil { - logger.HttpLog.Errorln("Empty HTTP response") + configuration := DataRepository.NewConfiguration() + client := DataRepository.NewAPIClient(configuration) + + req := DataRepository.CreateIndividualPolicyDataSubscriptionPolicyDataChangeNotificationPostRequest{ + PolicyDataChangeNotification: []models.PolicyDataChangeNotification{ + policyDataChangeNotification, + }, } - defer func() { - if httpResponse.Body != nil { - if err := httpResponse.Body.Close(); err != nil { - logger.HttpLog.Errorln("Failed to close response body:", err) - } - } - }() + rsp, err := client.PolicyDataSubscriptionsCollectionApi. + CreateIndividualPolicyDataSubscriptionPolicyDataChangeNotificationPost(context.TODO(), + policyDataChangeNotificationUrl, &req) + + if err != nil { + logger.SBILog.Errorln(err.Error()) + } else if rsp == nil { + logger.SBILog.Errorln("Empty CreateIndividualPolicyDataSubscriptionPolicyDataChangeNotificationPost response") + } } } func SendInfluenceDataUpdateNotification(resUri string, original, modified *models.TrafficInfluData) { udrSelf := udr_context.GetSelf() - configuration := Nudr_DataRepository.NewConfiguration() - client := Nudr_DataRepository.NewAPIClient(configuration) + configuration := DataRepository.NewConfiguration() + client := DataRepository.NewAPIClient(configuration) var trafficInfluDataNotif models.TrafficInfluDataNotif trafficInfluDataNotif.ResUri = resUri @@ -171,40 +167,39 @@ func SendInfluenceDataUpdateNotification(resUri string, original, modified *mode if checkInfluenceDataSubscription(modified, influenceDataSubscription) { logger.HttpLog.Tracef("Send notification about update of influence data") trafficInfluDataNotif.TrafficInfluData = modified - httpResponse, err := client.InfluenceDataUpdateNotifyCallbackDocumentApi.InfluenceDataChangeNotify(context.TODO(), - influenceDataChangeNotificationUrl, []models.TrafficInfluDataNotif{trafficInfluDataNotif}) + + req := DataRepository.CreateIndividualInfluenceDataSubscriptionTrafficInfluenceDataChangeNotificationPostRequest{ + RequestBody: []interface{}{trafficInfluDataNotif}, + } + + rsp, err := client.InfluenceDataSubscriptionsCollectionApi. + CreateIndividualInfluenceDataSubscriptionTrafficInfluenceDataChangeNotificationPost( + context.TODO(), influenceDataChangeNotificationUrl, &req) + if err != nil { - logger.HttpLog.Errorln(err.Error()) - } else if httpResponse == nil { - logger.HttpLog.Errorln("Empty HTTP response") - } else { - defer func() { - if httpResponse.Body != nil { - if err := httpResponse.Body.Close(); err != nil { - logger.HttpLog.Errorln("Failed to close response body:", err) - } - } - }() + logger.SBILog.Errorln(err.Error()) + } else if rsp == nil { + logger.SBILog.Errorln( + "Empty CreateIndividualInfluenceDataSubscriptionTrafficInfluenceDataChangeNotificationPost response") } } else if checkInfluenceDataSubscription(original, influenceDataSubscription) { // If the modified data is not subscribed or nil, check if the original data is subscribed // If positive, send notification about the removal logger.HttpLog.Tracef("Send notification about removal of influence data") trafficInfluDataNotif.TrafficInfluData = nil - httpResponse, err := client.InfluenceDataUpdateNotifyCallbackDocumentApi.InfluenceDataChangeNotify(context.TODO(), - influenceDataChangeNotificationUrl, []models.TrafficInfluDataNotif{trafficInfluDataNotif}) + req := DataRepository.CreateIndividualInfluenceDataSubscriptionTrafficInfluenceDataChangeNotificationPostRequest{ + RequestBody: []interface{}{trafficInfluDataNotif}, + } + + rsp, err := client.InfluenceDataSubscriptionsCollectionApi. + CreateIndividualInfluenceDataSubscriptionTrafficInfluenceDataChangeNotificationPost( + context.TODO(), influenceDataChangeNotificationUrl, &req) + if err != nil { - logger.HttpLog.Errorln(err.Error()) - } else if httpResponse == nil { - logger.HttpLog.Errorln("Empty HTTP response") - } else { - defer func() { - if httpResponse.Body != nil { - if err := httpResponse.Body.Close(); err != nil { - logger.HttpLog.Errorln("Failed to close response body:", err) - } - } - }() + logger.SBILog.Errorln(err.Error()) + } else if rsp == nil { + logger.SBILog.Errorln( + "Empty CreateIndividualInfluenceDataSubscriptionTrafficInfluenceDataChangeNotificationPost response") } } return true diff --git a/internal/sbi/processor/provisioned_data_document.go b/internal/sbi/processor/provisioned_data_document.go index 0b3c2bb..f2cda9d 100644 --- a/internal/sbi/processor/provisioned_data_document.go +++ b/internal/sbi/processor/provisioned_data_document.go @@ -113,7 +113,7 @@ func (p *Processor) QueryProvisionedDataProcedure(c *gin.Context, ueId string, s } smData.DnnConfigurations = tmpDnnConfigurations } - provisionedDataSets.SmData = tmp + provisionedDataSets.SmData.IndividualSmSubsData = tmp } collName = "subscriptionData.provisionedData.traceData"