@@ -301,3 +301,99 @@ func CheckClusterDeploymentStatuses(ctx context.Context, url string, clusterRef
301301
302302 return & deploymentResult , nil
303303}
304+
305+ type EventPipelineStatus struct {
306+ // Stage 1: Detection
307+ ClusterReady bool `json:"clusterReady"`
308+ ClusterPaused bool `json:"clusterPaused"`
309+ ClusterMatched bool `json:"clusterMatched"`
310+ ClusterProvisioned bool `json:"clusterProvisioned"`
311+ EventSourceName string `json:"eventSourceName"`
312+ EventSourceFoundInControlCluster bool `json:"eventSourceFoundInControlCluster"`
313+ EventSourceFoundInManagedCluster bool `json:"eventSourceFoundInManagedCluster"`
314+ EventReportFoundInManagedCluster bool `json:"eventReportFoundInManagedCluster"`
315+ EventReportFoundInControlCluster bool `json:"eventReportFoundInControlCluster"`
316+ ResourcesDetected int `json:"resourcesDetected"`
317+ LastEventReportTime string `json:"lastEventReportTime,omitempty"`
318+
319+ // Stage 2: Result
320+ InstantiatedProfile string `json:"instantiatedProfile,omitempty"`
321+
322+ // Issue Reporting: contains all detected issues
323+ Issues []string `json:"issues,omitempty"`
324+ }
325+
326+ func AnalyzeEventPipeline (ctx context.Context , url string , clusterRef * corev1.ObjectReference ,
327+ eventTriggerName string , logger logr.Logger ) ([]string , error ) {
328+
329+ session , err := connect (ctx , url , logger )
330+ if err != nil {
331+ logger .V (logs .LogInfo ).Info (fmt .Sprintf ("failed to connect: %v" , err ))
332+ return nil , err
333+ }
334+ defer session .Close ()
335+
336+ input := map [string ]interface {}{
337+ "clusterRef" : map [string ]string {
338+ "namespace" : clusterRef .Namespace ,
339+ "name" : clusterRef .Name ,
340+ "apiVersion" : clusterRef .APIVersion ,
341+ "kind" : clusterRef .Kind ,
342+ },
343+ "eventTriggerName" : eventTriggerName ,
344+ }
345+
346+ result , err := session .CallTool (ctx , & mcp.CallToolParams {
347+ Name : "analyze_event_deployment_pipeline" ,
348+ Arguments : input ,
349+ })
350+
351+ if err != nil {
352+ logger .V (logs .LogInfo ).Info (fmt .Sprintf ("failed to invoked analyze_event_deployment_pipeline tool: %v" , err ))
353+ return nil , err
354+ }
355+
356+ if result .IsError {
357+ errorMsg := fmt .Sprintf ("MCP analyze_event_deployment_pipeline returned error: %v" , result .Content )
358+ logger .V (logs .LogInfo ).Info (errorMsg )
359+ return nil , errors .New (errorMsg )
360+ }
361+
362+ // Check for structured content. It should contain our result.
363+ if result .StructuredContent == nil {
364+ errorMsg := noStructureContentError
365+ logger .V (logs .LogInfo ).Info (errorMsg )
366+ return nil , errors .New (errorMsg )
367+ }
368+
369+ // Marshal the StructuredContent to JSON and then unmarshal it into our struct.
370+ // This is a common pattern for converting `any` to a specific type.
371+ data , err := json .Marshal (result .StructuredContent )
372+ if err != nil {
373+ errorMsg := fmt .Sprintf ("failed to marshal structured content: %v" , err )
374+ logger .V (logs .LogInfo ).Info (errorMsg )
375+ return nil , errors .New (errorMsg )
376+ }
377+
378+ // Unmarshal into the status struct
379+ var status EventPipelineStatus
380+ if err := json .Unmarshal (data , & status ); err != nil {
381+ errorMsg := fmt .Sprintf ("failed to unmarshal result into EventPipelineStatus: %v" , err )
382+ logger .V (logs .LogInfo ).Info (errorMsg )
383+ return nil , errors .New (errorMsg )
384+ }
385+
386+ logger .V (logs .LogInfo ).Info (fmt .Sprintf ("analyze_profile_deployment result: %v" , status ))
387+
388+ if len (status .Issues ) == 0 {
389+ logger .V (logs .LogInfo ).Info (fmt .Sprintf ("eventTrigger %s successfully deployed on cluster %s %s/%s" ,
390+ eventTriggerName , clusterRef .Kind , clusterRef .Namespace , clusterRef .Namespace ))
391+ return []string {}, nil
392+ }
393+
394+ for i := range status .Issues {
395+ logger .V (logs .LogInfo ).Info (fmt .Sprintf ("Issue: %s" , status .Issues [i ]))
396+ }
397+
398+ return status .Issues , nil
399+ }
0 commit comments