github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/scripts/juju-inspect/rules/pubsub.go (about)

     1  // Copyright 2021 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package rules
     5  
     6  import (
     7  	"fmt"
     8  	"io"
     9  	"sort"
    10  )
    11  
    12  type PubsubRule struct {
    13  	found   map[string]bool
    14  	targets map[string][]string
    15  }
    16  
    17  func NewPubsubRule() *PubsubRule {
    18  	return &PubsubRule{
    19  		found:   make(map[string]bool),
    20  		targets: make(map[string][]string),
    21  	}
    22  }
    23  
    24  func (r *PubsubRule) Run(name string, report Report) error {
    25  	pubsub, ok := report.Manifolds["pubsub-forwarder"]
    26  	if !ok {
    27  		r.found[name] = false
    28  		return nil
    29  	}
    30  
    31  	r.found[name] = true
    32  
    33  	var out PubsubReport
    34  	if err := pubsub.UnmarshalReport(&out); err != nil {
    35  		return err
    36  	}
    37  
    38  	var targets []string
    39  	for name, target := range out.Targets {
    40  		if target.Status == "connected" {
    41  			targets = append(targets, name)
    42  		}
    43  	}
    44  	r.targets[name] = targets
    45  	return nil
    46  }
    47  
    48  func (r *PubsubRule) Write(w io.Writer) {
    49  	fmt.Fprintln(w, "Pubsub Forwarder:")
    50  	fmt.Fprintln(w, "")
    51  	for name, targets := range r.targets {
    52  		if !r.found[name] {
    53  			fmt.Fprintf(w, "\t%s pubsub-forwarder not found!\n", name)
    54  			continue
    55  		}
    56  		sort.Strings(targets)
    57  		fmt.Fprintf(w, "\t%s is connected to the following: %v\n", name, targets)
    58  	}
    59  	fmt.Fprintln(w, "")
    60  }
    61  
    62  type PubsubReport struct {
    63  	Targets map[string]PubsubTarget `yaml:"targets"`
    64  }
    65  
    66  type PubsubTarget struct {
    67  	Status string
    68  }