Skip to content

Commit bbd2a01

Browse files
authored
Merge pull request meshery#13162 from aabidsofi19/alias-policy-evaluation
Do complete evaluation ( including post processing ) for meshsync snapshot
2 parents aea13a9 + 0ea7d68 commit bbd2a01

File tree

2 files changed

+80
-74
lines changed

2 files changed

+80
-74
lines changed

server/handlers/meshsync_handler.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -344,14 +344,16 @@ func (h *Handler) GetMeshSyncResources(rw http.ResponseWriter, r *http.Request,
344344
if asDesign {
345345
rawDesign := ConvertToPatternFile(resources, true) // strip schema
346346
resources = []model.KubernetesResource{} // clear resources to save memory
347-
evalResponse, error := h.Rego.RegoPolicyHandler(rawDesign, RelationshipPolicyPackageName)
347+
// evalResponse, error := h.Rego.RegoPolicyHandler(rawDesign, RelationshipPolicyPackageName)
348+
evalResponse, error := h.EvaluateDesign(pattern.EvaluationRequest{
349+
Design: rawDesign,
350+
})
351+
348352
if error != nil {
349353
design = rawDesign
350354
h.log.Error(fmt.Errorf("Error evaluating design: %v", error))
351355
} else {
352-
// if there is error in evaluation, return the raw design (without any relationships)
353-
design = rawDesign
354-
design.Relationships = evalResponse.Design.Relationships // only add relationships
356+
design = evalResponse.Design // use the evaluated design
355357
}
356358

357359
}

server/handlers/policy_relationship_handler.go

+74-70
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/gofrs/uuid"
1313
"github.com/gorilla/mux"
1414
"github.com/layer5io/meshery/server/models"
15-
"github.com/layer5io/meshery/server/models/pattern/core"
1615
"github.com/layer5io/meshery/server/models/pattern/utils"
1716
"github.com/meshery/schemas/models/v1alpha3/relationship"
1817
"github.com/meshery/schemas/models/v1beta1/component"
@@ -30,49 +29,10 @@ const (
3029
suffix = "_relationship"
3130
)
3231

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) {
7636

7737
// evaluate specified relationship policies
7838
// 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(
8242
if err != nil {
8343
h.log.Debug(err)
8444
// log an event
85-
http.Error(rw, err.Error(), http.StatusInternalServerError)
86-
return
45+
return pattern.EvaluationResponse{}, err
8746
}
8847

8948
currentTime := time.Now()
9049
evaluationResponse.Timestamp = &currentTime
9150

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-
10051
// 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)
10653

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
11755
}
11856

11957
func processEvaluationResponse(registry *registry.RegistryManager, evalPayload pattern.EvaluationRequest, evalResponse *pattern.EvaluationResponse) []*component.ComponentDefinition {
@@ -218,14 +156,80 @@ func processEvaluationResponse(registry *registry.RegistryManager, evalPayload p
218156
}
219157
}
220158

221-
_c.Configuration = core.Format.Prettify(_c.Configuration, false)
222159
evalResponse.Design.Components = append(evalResponse.Design.Components, _c)
223160

224161
}
225162

226163
return unknownComponents
227164
}
228165

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+
229233
// Needs to be reinstiated inorder to load the policies based on the evaluation queries.
230234
// This should load policies identified by relationship declarations in the design file.
231235

0 commit comments

Comments
 (0)