leaderless gossip-based service discovery w/ consul compatibility
5

Configure Feed

Select the types of activity you want to include in your feed.

add cascade ls members

Jes Olson (Feb 21, 2023, 3:25 AM -0800) a560dfbf 8153ee25

+113 -1
+17
api/agent.go
··· 23 23 DelegateCur uint8 24 24 } 25 25 26 + func (am *AgentMember) StatusPretty() string { 27 + result := "unknown" 28 + switch am.Status { 29 + case 0: 30 + result = "none" 31 + case 1: 32 + result = "alive" 33 + case 2: 34 + result = "leaving" 35 + case 3: 36 + result = "left" 37 + case 4: 38 + result = "failed" 39 + } 40 + return result 41 + } 42 + 26 43 // XXX: this may be needed for consul compatability, but I'm leaving it 27 44 // out for now in case it isn't. 28 45 const AllSegments = "_all"
+24
command/list/list.go
··· 1 + package list 2 + 3 + import ( 4 + "fmt" 5 + "os" 6 + 7 + "git.j3s.sh/cascade/command/list/members" 8 + ) 9 + 10 + const usage = `cascade ls nodes 11 + cascade ls members 12 + cascade ls services 13 + ` 14 + 15 + func Run(args []string) { 16 + if len(args) == 0 { 17 + fmt.Printf(usage) 18 + os.Exit(1) 19 + } 20 + switch args[0] { 21 + case "members": 22 + members.Run(args[1:]) 23 + } 24 + }
+57
command/list/members/members.go
··· 1 + package members 2 + 3 + import ( 4 + "flag" 5 + "fmt" 6 + "os" 7 + 8 + "git.j3s.sh/cascade/api" 9 + ) 10 + 11 + const usage = `cascade ls members [options] 12 + 13 + this command lists the members of the cascade serf 14 + cluster. 15 + 16 + options: 17 + 18 + -api 19 + address of the api to target (default = 127.0.0.1:8500) 20 + 21 + -l | -details 22 + show more details (default = nil) 23 + ` 24 + 25 + type Flags struct { 26 + apiAddr string 27 + details bool 28 + } 29 + 30 + var membersFlags Flags 31 + 32 + func Run(args []string) { 33 + flags := flag.NewFlagSet("agent", flag.ContinueOnError) 34 + flags.Usage = func() { fmt.Printf(usage) } 35 + flags.StringVar(&membersFlags.apiAddr, "api", "", "") 36 + flags.BoolVar(&membersFlags.details, "l", false, "") 37 + flags.BoolVar(&membersFlags.details, "details", false, "") 38 + flags.Parse(args) 39 + 40 + cfg := api.DefaultNonPooledConfig() 41 + client, err := api.NewClient(cfg) 42 + if err != nil { 43 + fmt.Println(err) 44 + os.Exit(1) 45 + } 46 + members, err := client.Agent().Members() 47 + for _, m := range members { 48 + if membersFlags.details { 49 + fmt.Printf("%s ", m.Name) 50 + fmt.Printf("%s:%d ", m.Addr, m.Port) 51 + fmt.Printf("%s", m.StatusPretty()) 52 + fmt.Printf("\n") 53 + } else { 54 + fmt.Printf("%s\n", m.Name) 55 + } 56 + } 57 + }
command/list/nodes.go command/list/nodes/nodes.go
+14
command/list/services/services.go
··· 1 + package list 2 + 3 + import ( 4 + "fmt" 5 + ) 6 + 7 + const usage = `cascade list|ls nodes 8 + cascade list|ls members 9 + cascade list|ls services 10 + ` 11 + 12 + func Run(args []string) { 13 + fmt.Printf("%+v", usage) 14 + }
+1 -1
main.go
··· 9 9 ) 10 10 11 11 const usage = `cascade agent start a cascade agent 12 - cascade list|ls list nodes, services, or members 12 + cascade ls list nodes, services, or members 13 13 cascade rtt estimate latency between nodes 14 14 ` 15 15