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 }