@@ -12,7 +12,6 @@ import (
12
12
"github.com/gofrs/uuid"
13
13
"github.com/gorilla/mux"
14
14
"github.com/layer5io/meshery/server/models"
15
- "github.com/layer5io/meshery/server/models/pattern/core"
16
15
"github.com/layer5io/meshery/server/models/pattern/utils"
17
16
"github.com/meshery/schemas/models/v1alpha3/relationship"
18
17
"github.com/meshery/schemas/models/v1beta1/component"
@@ -30,49 +29,10 @@ const (
30
29
suffix = "_relationship"
31
30
)
32
31
33
- // swagger:route POST /api/meshmodels/relationships/evaluate EvaluateRelationshipPolicy relationshipPolicyEvalPayloadWrapper
34
- // Handle POST request for evaluating relationships in the provided design file by running a set of provided evaluation queries on the design file
35
- //
36
- // responses:
37
- // 200
38
- func (h * Handler ) EvaluateRelationshipPolicy (
39
- rw http.ResponseWriter ,
40
- r * http.Request ,
41
- _ * models.Preference ,
42
- user * models.User ,
43
- provider models.Provider ,
44
- ) {
45
- userUUID := uuid .FromStringOrNil (user .ID )
46
- defer func () {
47
- _ = r .Body .Close ()
48
- }()
49
-
50
- eventBuilder := events .NewEvent ().FromSystem (* h .SystemID ).FromUser (userUUID ).WithCategory ("relationship" ).WithAction ("evaluation" )
51
-
52
- body , err := io .ReadAll (r .Body )
53
- if err != nil {
54
- h .log .Error (ErrRequestBody (err ))
55
- http .Error (rw , ErrRequestBody (err ).Error (), http .StatusBadRequest )
56
- rw .WriteHeader ((http .StatusBadRequest ))
57
- return
58
- }
59
-
60
- relationshipPolicyEvalPayload := pattern.EvaluationRequest {}
61
- err = json .Unmarshal (body , & relationshipPolicyEvalPayload )
62
-
63
- if err != nil {
64
- http .Error (rw , ErrDecoding (err , "design file" ).Error (), http .StatusInternalServerError )
65
- return
66
- }
67
- // decode the pattern file
68
-
69
- patternUUID := relationshipPolicyEvalPayload .Design .Id
70
- eventBuilder .ActedUpon (patternUUID )
71
-
72
- // deprettify the configuration of the components
73
- for _ , component := range relationshipPolicyEvalPayload .Design .Components {
74
- component .Configuration = core .Format .DePrettify (component .Configuration , false )
75
- }
32
+ // Helper method to make design evaluation based on the relationship policies.
33
+ func (h * Handler ) EvaluateDesign (
34
+ relationshipPolicyEvalPayload pattern.EvaluationRequest ,
35
+ ) (pattern.EvaluationResponse , error ) {
76
36
77
37
// evaluate specified relationship policies
78
38
// on successful eval the event containing details like comps evaulated, relationships indeitified should be emitted and peristed.
@@ -82,38 +42,16 @@ func (h *Handler) EvaluateRelationshipPolicy(
82
42
if err != nil {
83
43
h .log .Debug (err )
84
44
// log an event
85
- http .Error (rw , err .Error (), http .StatusInternalServerError )
86
- return
45
+ return pattern.EvaluationResponse {}, err
87
46
}
88
47
89
48
currentTime := time .Now ()
90
49
evaluationResponse .Timestamp = & currentTime
91
50
92
- // include trace instead of design file in the event
93
- event := eventBuilder .WithDescription (fmt .Sprintf ("Relationship evaluation completed for design \" %s\" at version \" %s\" " , evaluationResponse .Design .Name , evaluationResponse .Design .Version )).
94
- WithMetadata (map [string ]interface {}{
95
- "trace" : evaluationResponse .Trace ,
96
- "evaluated_at" : * evaluationResponse .Timestamp ,
97
- }).WithSeverity (events .Informational ).Build ()
98
- _ = provider .PersistEvent (event )
99
-
100
51
// Create the event but do not notify the client immediately, as the evaluations are frequent and takes up the view area.
101
- unknownComponents := processEvaluationResponse (h .registryManager , relationshipPolicyEvalPayload , & evaluationResponse )
102
- if len (unknownComponents ) > 0 {
103
- event := events .NewEvent ().FromUser (userUUID ).FromSystem (* h .SystemID ).WithCategory ("relationship" ).WithAction ("evaluation" ).WithSeverity (events .Informational ).ActedUpon (patternUUID ).WithDescription (fmt .Sprintf ("Relationship evaluation for \" %s\" at version \" %s\" resulted in the addition of new components but they are not registered inside the registry." , evaluationResponse .Design .Name , evaluationResponse .Design .Version )).WithMetadata (map [string ]interface {}{
104
- "ComponentsToBeAdded" : unknownComponents ,
105
- }).Build ()
52
+ _ = processEvaluationResponse (h .registryManager , relationshipPolicyEvalPayload , & evaluationResponse )
106
53
107
- _ = provider .PersistEvent (event )
108
- }
109
- // write the response
110
- ec := json .NewEncoder (rw )
111
- err = ec .Encode (evaluationResponse )
112
- if err != nil {
113
- h .log .Error (models .ErrEncoding (err , "policy evaluation response" ))
114
- http .Error (rw , models .ErrEncoding (err , "failed to generate policy evaluation results" ).Error (), http .StatusInternalServerError )
115
- return
116
- }
54
+ return evaluationResponse , nil
117
55
}
118
56
119
57
func processEvaluationResponse (registry * registry.RegistryManager , evalPayload pattern.EvaluationRequest , evalResponse * pattern.EvaluationResponse ) []* component.ComponentDefinition {
@@ -218,14 +156,80 @@ func processEvaluationResponse(registry *registry.RegistryManager, evalPayload p
218
156
}
219
157
}
220
158
221
- _c .Configuration = core .Format .Prettify (_c .Configuration , false )
222
159
evalResponse .Design .Components = append (evalResponse .Design .Components , _c )
223
160
224
161
}
225
162
226
163
return unknownComponents
227
164
}
228
165
166
+ // swagger:route POST /api/meshmodels/relationships/evaluate EvaluateRelationshipPolicy relationshipPolicyEvalPayloadWrapper
167
+ // Handle POST request for evaluating relationships in the provided design file by running a set of provided evaluation queries on the design file
168
+ //
169
+ // responses:
170
+ // 200
171
+ func (h * Handler ) EvaluateRelationshipPolicy (
172
+ rw http.ResponseWriter ,
173
+ r * http.Request ,
174
+ _ * models.Preference ,
175
+ user * models.User ,
176
+ provider models.Provider ,
177
+ ) {
178
+ userUUID := uuid .FromStringOrNil (user .ID )
179
+ defer func () {
180
+ _ = r .Body .Close ()
181
+ }()
182
+
183
+ eventBuilder := events .NewEvent ().FromSystem (* h .SystemID ).FromUser (userUUID ).WithCategory ("relationship" ).WithAction ("evaluation" )
184
+
185
+ body , err := io .ReadAll (r .Body )
186
+ if err != nil {
187
+ h .log .Error (ErrRequestBody (err ))
188
+ http .Error (rw , ErrRequestBody (err ).Error (), http .StatusBadRequest )
189
+ rw .WriteHeader ((http .StatusBadRequest ))
190
+ return
191
+ }
192
+
193
+ relationshipPolicyEvalPayload := pattern.EvaluationRequest {}
194
+ err = json .Unmarshal (body , & relationshipPolicyEvalPayload )
195
+
196
+ if err != nil {
197
+ http .Error (rw , ErrDecoding (err , "design file" ).Error (), http .StatusInternalServerError )
198
+ return
199
+ }
200
+ // decode the pattern file
201
+ patternUUID := relationshipPolicyEvalPayload .Design .Id
202
+ eventBuilder .ActedUpon (patternUUID )
203
+
204
+ // evaluate specified relationship policies
205
+ // on successful eval the event containing details like comps evaulated, relationships indeitified should be emitted and peristed.
206
+ evaluationResponse , err := h .EvaluateDesign (relationshipPolicyEvalPayload )
207
+
208
+ if err != nil {
209
+ h .log .Debug (err )
210
+ // log an event
211
+ http .Error (rw , err .Error (), http .StatusInternalServerError )
212
+ return
213
+ }
214
+
215
+ // include trace instead of design file in the event
216
+ event := eventBuilder .WithDescription (fmt .Sprintf ("Relationship evaluation completed for design \" %s\" at version \" %s\" " , evaluationResponse .Design .Name , evaluationResponse .Design .Version )).
217
+ WithMetadata (map [string ]interface {}{
218
+ "trace" : evaluationResponse .Trace ,
219
+ "evaluated_at" : * evaluationResponse .Timestamp ,
220
+ }).WithSeverity (events .Informational ).Build ()
221
+ _ = provider .PersistEvent (event )
222
+
223
+ // write the response
224
+ ec := json .NewEncoder (rw )
225
+ err = ec .Encode (evaluationResponse )
226
+ if err != nil {
227
+ h .log .Error (models .ErrEncoding (err , "policy evaluation response" ))
228
+ http .Error (rw , models .ErrEncoding (err , "failed to generate policy evaluation results" ).Error (), http .StatusInternalServerError )
229
+ return
230
+ }
231
+ }
232
+
229
233
// Needs to be reinstiated inorder to load the policies based on the evaluation queries.
230
234
// This should load policies identified by relationship declarations in the design file.
231
235
0 commit comments