Skip to content

Commit 9136208

Browse files
committed
refactor: move udr client into consumer udr_service
1 parent 923d339 commit 9136208

File tree

6 files changed

+243
-78
lines changed

6 files changed

+243
-78
lines changed

internal/sbi/consumer/nrf_service.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,7 @@ func (s *nnrfService) SendRegisterNFInstance(ctx context.Context) (
246246
}
247247

248248
finish = true
249-
250249
}
251-
252250
}
253251
}
254252

internal/sbi/consumer/udr_service.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,183 @@ func (s *nudrService) getDataSubscription(uri string) *DataRepository.APIClient
4343
return client
4444
}
4545

46+
func (s *nudrService) GetSessionManagementPolicyData(uri string,
47+
ueId string, sliceInfo *models.Snssai, dnn string) (
48+
resp *DataRepository.ReadSessionManagementPolicyDataResponse,
49+
problemDetails *models.ProblemDetails, err error,
50+
) {
51+
if uri == "" {
52+
problemDetail := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
53+
"GetSessionManagementPolicyData Can't find UDR URI")
54+
return nil, &problemDetail, nil
55+
}
56+
57+
if ueId == "" {
58+
problemDetail := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
59+
"GetSessionManagementPolicyData Can't find UE ID")
60+
return nil, &problemDetail, nil
61+
}
62+
63+
if sliceInfo == nil {
64+
problemDetails := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
65+
"GetSessionManagementPolicyData Can't find Slice Info")
66+
return nil, &problemDetails, nil
67+
}
68+
69+
if dnn == "" {
70+
problemDetails := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
71+
"GetSessionManagementPolicyData Can't find DNN")
72+
return nil, &problemDetails, nil
73+
}
74+
75+
ctx, pd, err := s.consumer.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
76+
if err != nil {
77+
return nil, nil, err
78+
} else if pd != nil {
79+
return nil, pd, nil
80+
}
81+
82+
client := s.getDataSubscription(uri)
83+
param := DataRepository.ReadSessionManagementPolicyDataRequest{
84+
UeId: &ueId,
85+
Snssai: sliceInfo,
86+
Dnn: &dnn,
87+
}
88+
resp, err = client.SessionManagementPolicyDataDocumentApi.ReadSessionManagementPolicyData(ctx, &param)
89+
if err == nil {
90+
return resp, nil, nil
91+
}
92+
problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails)
93+
problemDetails = &problem
94+
return nil, problemDetails, nil
95+
}
96+
97+
func (s *nudrService) CreateBdtData(uri string, bdtData *models.BdtData) (
98+
problemDetails *models.ProblemDetails, err error,
99+
) {
100+
if uri == "" {
101+
problemDetail := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
102+
"CreateBdtData Can't find UDR URI")
103+
return &problemDetail, nil
104+
}
105+
106+
ctx, pd, err := s.consumer.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
107+
if err != nil {
108+
return nil, err
109+
} else if pd != nil {
110+
return pd, nil
111+
}
112+
113+
client := s.getDataSubscription(uri)
114+
param := DataRepository.CreateIndividualBdtDataRequest{
115+
BdtData: bdtData,
116+
}
117+
_, err = client.IndividualBdtDataDocumentApi.CreateIndividualBdtData(ctx, &param)
118+
if err == nil {
119+
return nil, nil
120+
}
121+
problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails)
122+
problemDetails = &problem
123+
return problemDetails, nil
124+
}
125+
126+
func (s *nudrService) CreateBdtPolicyContext(uri string, req *DataRepository.ReadBdtDataRequest) (
127+
resp *DataRepository.ReadBdtDataResponse, problemDetails *models.ProblemDetails, err error,
128+
) {
129+
if uri == "" {
130+
problemDetail := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
131+
"CreateBdtData Can't find UDR URI")
132+
return nil, &problemDetail, nil
133+
}
134+
ctx, pd, err := s.consumer.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
135+
if err != nil {
136+
return nil, nil, err
137+
} else if pd != nil {
138+
return nil, pd, nil
139+
}
140+
141+
client := s.getDataSubscription(uri)
142+
resp, err = client.BdtDataStoreApi.ReadBdtData(ctx, req)
143+
if err == nil {
144+
return resp, nil, nil
145+
}
146+
problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails)
147+
problemDetails = &problem
148+
return nil, problemDetails, nil
149+
}
150+
151+
func (s *nudrService) GetBdtData(uri string, bdtRefId string) (
152+
resp *DataRepository.ReadIndividualBdtDataResponse, problemDetails *models.ProblemDetails, err error,
153+
) {
154+
if uri == "" {
155+
problemDetail := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
156+
"GetBdtData Can't find UDR URI")
157+
return nil, &problemDetail, nil
158+
}
159+
160+
if bdtRefId == "" {
161+
problemDetail := util.GetProblemDetail("Can't find any UDR which supported to this PCF",
162+
"GetBdtData Can't find BdtRefId")
163+
return nil, &problemDetail, nil
164+
}
165+
166+
ctx, pd, err := s.consumer.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
167+
if err != nil {
168+
return nil, nil, err
169+
} else if pd != nil {
170+
return nil, pd, nil
171+
}
172+
173+
readBdtDataReq := DataRepository.ReadIndividualBdtDataRequest{
174+
BdtReferenceId: &bdtRefId,
175+
}
176+
177+
client := s.getDataSubscription(uri)
178+
resp, err = client.IndividualBdtDataDocumentApi.ReadIndividualBdtData(ctx, &readBdtDataReq)
179+
if err == nil {
180+
return resp, nil, nil
181+
}
182+
problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails)
183+
problemDetails = &problem
184+
return nil, problemDetails, nil
185+
}
186+
187+
func (s *nudrService) GetAccessAndMobilityPolicyData(ue *pcf_context.UeContext) (
188+
resp *DataRepository.ReadAccessAndMobilityPolicyDataResponse,
189+
problemDetails *models.ProblemDetails, err error,
190+
) {
191+
if ue.Supi == "" {
192+
problemDetail := util.GetProblemDetail("Can't find corresponding SUPI with UE", util.USER_UNKNOWN)
193+
logger.ConsumerLog.Warn("Can't find corresponding SUPI with UE")
194+
return nil, &problemDetail, nil
195+
}
196+
197+
if ue.UdrUri == "" {
198+
problemDetail := util.GetProblemDetail("Can't find corresponding UDR with UE", util.USER_UNKNOWN)
199+
logger.ConsumerLog.Warnf("Can't find corresponding UDR with UE[%s]", ue.Supi)
200+
return nil, &problemDetail, nil
201+
}
202+
203+
ctx, pd, err := s.consumer.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
204+
if err != nil {
205+
return nil, nil, err
206+
} else if pd != nil {
207+
return nil, pd, nil
208+
}
209+
210+
client := s.getDataSubscription(ue.UdrUri)
211+
param := DataRepository.ReadAccessAndMobilityPolicyDataRequest{
212+
UeId: &ue.Supi,
213+
}
214+
resp, err = client.AccessAndMobilityPolicyDataDocumentApi.ReadAccessAndMobilityPolicyData(ctx, &param)
215+
if err == nil {
216+
return resp, nil, nil
217+
}
218+
problem := err.(openapi.GenericOpenAPIError).Model().(models.ProblemDetails)
219+
problemDetails = &problem
220+
return nil, problemDetails, nil
221+
}
222+
46223
func (s *nudrService) CreateInfluenceDataSubscription(ue *pcf_context.UeContext, request models.SmPolicyContextData) (
47224
subscriptionID string, problemDetails *models.ProblemDetails, err error,
48225
) {

internal/sbi/processor/ampolicy.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/free5gc/openapi"
1212
"github.com/free5gc/openapi/models"
1313
"github.com/free5gc/openapi/pcf/AMPolicyControl"
14-
"github.com/free5gc/openapi/udr/DataRepository"
1514
pcf_context "github.com/free5gc/pcf/internal/context"
1615
"github.com/free5gc/pcf/internal/logger"
1716
"github.com/free5gc/pcf/internal/util"
@@ -219,22 +218,19 @@ func (p *Processor) PostPoliciesProcedure(polAssoId string,
219218
assolId := fmt.Sprintf("%s-%d", ue.Supi, ue.PolAssociationIDGenerator)
220219
amPolicy := ue.AMPolicyData[assolId]
221220

222-
ctx, pd, err := p.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
223-
if err != nil {
224-
return nil, "", pd
225-
}
226-
227221
if amPolicy == nil || amPolicy.AmPolicyData == nil {
228-
client := util.GetNudrClient(udrUri)
229-
request := DataRepository.ReadAccessAndMobilityPolicyDataRequest{
230-
UeId: &ue.Supi,
231-
}
232-
response, err := client.AccessAndMobilityPolicyDataDocumentApi.ReadAccessAndMobilityPolicyData(ctx, &request)
222+
response, problemDetail, err := p.Consumer().GetAccessAndMobilityPolicyData(ue)
223+
233224
if err != nil {
234-
problemDetail := util.GetProblemDetail("Can't find UE AM Policy Data in UDR", util.USER_UNKNOWN)
235-
logger.AmPolicyLog.Errorf("Can't find UE[%s] AM Policy Data in UDR", ue.Supi)
225+
logger.AmPolicyLog.Errorf("Get Access And Mobility Policy Data Error Problem[%+v]", err)
226+
problemDetail := util.GetProblemDetail("Get Access And Mobility Policy Data error[%+v]", err.Error())
227+
return nil, "", &problemDetail
228+
} else if problemDetail != nil {
229+
logger.AmPolicyLog.Errorf("Get Access And Mobility Policy Data Failed Problem[%+v]", problemDetail)
230+
problemDetail := util.GetProblemDetail("Get Access And Mobility Policy Data Failed[%+v]", problemDetail.Cause)
236231
return nil, "", &problemDetail
237232
}
233+
238234
if response == nil {
239235
amPolicy = ue.NewUeAMPolicyData(assolId, policyAssociationRequest)
240236
} else {

internal/sbi/processor/bdtpolicy.go

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (p *Processor) HandleUpdateBDTPolicyContextProcedure(
5454
pcfSelf := p.Context()
5555

5656
var bdtPolicy *models.BdtPolicy
57-
if value, ok := p.Context().BdtPolicyPool.Load(bdtPolicyID); ok {
57+
if value, ok := pcfSelf.BdtPolicyPool.Load(bdtPolicyID); ok {
5858
bdtPolicy = value.(*models.BdtPolicy)
5959
} else {
6060
// not found
@@ -77,18 +77,27 @@ func (p *Processor) HandleUpdateBDTPolicyContextProcedure(
7777
if polReq.NwAreaInfo != nil {
7878
bdtData.NwAreaInfo = polReq.NwAreaInfo
7979
}
80-
param := DataRepository.CreateIndividualBdtDataRequest{
81-
BdtData: &bdtData,
82-
}
83-
client := util.GetNudrClient(p.getDefaultUdrUri(pcfSelf))
84-
ctx, pd, err := p.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
85-
if err != nil {
80+
81+
udrUri := p.getDefaultUdrUri(pcfSelf)
82+
if udrUri == "" {
83+
// Can't find any UDR support this Ue
84+
pd := &models.ProblemDetails{
85+
Status: http.StatusServiceUnavailable,
86+
Detail: "Can't find any UDR which supported to this PCF",
87+
}
88+
logger.BdtPolicyLog.Warnf(pd.Detail)
8689
c.JSON(int(pd.Status), pd)
8790
return
8891
}
89-
_, err = client.IndividualBdtDataDocumentApi.CreateIndividualBdtData(ctx, &param)
92+
pd, err := p.Consumer().CreateBdtData(udrUri, &bdtData)
9093
if err != nil {
9194
logger.BdtPolicyLog.Warnf("UDR Put BdtDate error[%s]", err.Error())
95+
c.JSON(http.StatusInternalServerError, err.Error())
96+
return
97+
} else if pd != nil {
98+
logger.BdtPolicyLog.Warnf("UDR Put BdtDate fault[%s]", pd.Detail)
99+
c.JSON(int(pd.Status), pd)
100+
return
92101
}
93102

94103
logger.BdtPolicyLog.Tracef("bdtPolicyID[%s] has Updated with SelTransPolicyId[%d]",
@@ -111,7 +120,7 @@ func (p *Processor) HandleCreateBDTPolicyContextRequest(
111120
requestMsg models.BdtReqData,
112121
) {
113122
// step 1: log
114-
logger.BdtPolicyLog.Infof("Handle CreateBDTPolicyContext")
123+
logger.BdtPolicyLog.Infof("Handle CreateBdtPolicyContext")
115124

116125
var problemDetails *models.ProblemDetails
117126

@@ -141,20 +150,10 @@ func (p *Processor) HandleCreateBDTPolicyContextRequest(
141150
return
142151
}
143152
pcfSelf.DefaultUdrURI = udrUri
144-
pcfSelf.SetDefaultUdrURI(udrUri)
145153

146154
// Query BDT DATA array from UDR
147-
ctx, pd, err := p.Context().GetTokenCtx(models.ServiceName_NUDR_DR, models.NrfNfManagementNfType_UDR)
148-
if err != nil {
149-
c.JSON(int(pd.Status), pd)
150-
return
151-
}
152-
153-
client := util.GetNudrClient(udrUri)
154155
req := DataRepository.ReadBdtDataRequest{}
155-
resp, err := client.BdtDataStoreApi.ReadBdtData(ctx, &req)
156-
bdtDatas := resp.BdtData
157-
156+
resp, problemDetails, err := p.Consumer().CreateBdtPolicyContext(udrUri, &req)
158157
if err != nil {
159158
problemDetails = &models.ProblemDetails{
160159
Status: http.StatusServiceUnavailable,
@@ -163,7 +162,12 @@ func (p *Processor) HandleCreateBDTPolicyContextRequest(
163162
logger.BdtPolicyLog.Warnf("Query to UDR failed")
164163
c.JSON(int(problemDetails.Status), problemDetails)
165164
return
165+
} else if problemDetails != nil {
166+
c.JSON(int(problemDetails.Status), problemDetails)
167+
return
166168
}
169+
170+
bdtDatas := resp.BdtData
167171
// TODO: decide BDT Policy from other bdt policy data
168172
response.BdtReqData = deepcopy.Copy(requestMsg).(*models.BdtReqData)
169173
var bdtData *models.BdtData
@@ -210,22 +214,20 @@ func (p *Processor) HandleCreateBDTPolicyContextRequest(
210214
pcfSelf.BdtPolicyPool.Store(bdtPolicyID, response)
211215

212216
// Update UDR BDT Data(PUT)
213-
param := DataRepository.CreateIndividualBdtDataRequest{
214-
BdtData: bdtData,
215-
}
216-
217-
if _, rspErr := client.IndividualBdtDataDocumentApi.CreateIndividualBdtData(ctx,
218-
&param); rspErr != nil {
219-
logger.BdtPolicyLog.Warnf("UDR Put BdtDate error[%s]", rspErr.Error())
217+
problemDetails, err = p.Consumer().CreateBdtData(udrUri, bdtData)
218+
if err != nil {
219+
logger.BdtPolicyLog.Warnf("UDR Put BdtDate error[%s]", err.Error())
220+
c.JSON(http.StatusInternalServerError, err.Error())
221+
return
222+
} else if problemDetails != nil {
223+
logger.BdtPolicyLog.Warnf("UDR Put BdtDate fault[%s]", problemDetails.Detail)
224+
c.JSON(int(problemDetails.Status), problemDetails)
225+
return
220226
}
221227

222228
locationHeader := util.GetResourceUri(models.ServiceName_NPCF_BDTPOLICYCONTROL, bdtPolicyID)
223229
logger.BdtPolicyLog.Tracef("BDT Policy Id[%s] Create", bdtPolicyID)
224230

225-
if problemDetails != nil {
226-
c.JSON(int(problemDetails.Status), problemDetails)
227-
return
228-
}
229231
c.Header("Location", locationHeader)
230232
c.JSON(http.StatusCreated, response)
231233
}

0 commit comments

Comments
 (0)