leaderless gossip-based service discovery w/ consul compatibility
5

Configure Feed

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

sharpen some things up

Jes Olson (Mar 1, 2023, 7:34 PM -0800) 893b1356 a560dfbf

+22 -57
+1 -1
agent/agent.go
··· 169 169 } 170 170 171 171 func (a *Agent) serveAPI(handler http.Handler) { 172 - portStr := fmt.Sprintf(":%d", a.Config.HTTPBindAddr.Port) 172 + portStr := fmt.Sprintf("%s:%d", a.Config.HTTPBindAddr.IP.String(), a.Config.HTTPBindAddr.Port) 173 173 if err := http.ListenAndServe(portStr, handler); err != nil { 174 174 a.logger.Error("api error", err) 175 175 }
+9 -8
api/agent.go
··· 7 7 Port uint16 8 8 Tags map[string]string 9 9 // Status of the Member which corresponds to github.com/hashicorp/serf/serf.MemberStatus 10 - // Value is one of: 11 10 // 12 - // AgentMemberNone = 0 13 - // AgentMemberAlive = 1 14 - // AgentMemberLeaving = 2 15 - // AgentMemberLeft = 3 16 - // AgentMemberFailed = 4 11 + // AgentMemberNone = 0 12 + // AgentMemberAlive = 1 13 + // AgentMemberLeaving = 2 14 + // AgentMemberLeft = 3 15 + // AgentMemberFailed = 4 17 16 Status int 18 17 ProtocolMin uint8 19 18 ProtocolMax uint8 ··· 24 23 } 25 24 26 25 func (am *AgentMember) StatusPretty() string { 27 - result := "unknown" 26 + var result string 28 27 switch am.Status { 29 28 case 0: 30 29 result = "none" ··· 36 35 result = "left" 37 36 case 4: 38 37 result = "failed" 38 + default: 39 + result = "unknown" 39 40 } 40 41 return result 41 42 } 42 43 43 44 // XXX: this may be needed for consul compatability, but I'm leaving it 44 45 // out for now in case it isn't. 45 - const AllSegments = "_all" 46 + // const AllSegments = "_all" 46 47 47 48 // Agent can be used to query the Agent endpoints 48 49 type Agent struct {
+1 -34
api/api.go
··· 69 69 return config 70 70 } 71 71 72 - // Client provides a client to the Consul API 72 + // Client provides a client to the cascade API 73 73 type Client struct { 74 74 modifyLock sync.RWMutex 75 75 headers http.Header ··· 95 95 } 96 96 97 97 return ret 98 - } 99 - 100 - // AddHeader allows a single header key/value pair to be added 101 - // in a race-safe fashion. 102 - func (c *Client) AddHeader(key, value string) { 103 - c.modifyLock.Lock() 104 - defer c.modifyLock.Unlock() 105 - c.headers.Add(key, value) 106 - } 107 - 108 - // SetHeaders clears all previous headers and uses only the given 109 - // ones going forward. 110 - func (c *Client) SetHeaders(headers http.Header) { 111 - c.modifyLock.Lock() 112 - defer c.modifyLock.Unlock() 113 - c.headers = headers 114 98 } 115 99 116 100 // NewClient returns a new client ··· 434 418 closeResponseBody(resp) 435 419 return fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, buf.Bytes()) 436 420 } 437 - 438 - func requireNotFoundOrOK(d time.Duration, resp *http.Response, e error) (bool, time.Duration, *http.Response, error) { 439 - if e != nil { 440 - if resp != nil { 441 - closeResponseBody(resp) 442 - } 443 - return false, d, nil, e 444 - } 445 - switch resp.StatusCode { 446 - case 200: 447 - return true, d, resp, nil 448 - case 404: 449 - return false, d, resp, nil 450 - default: 451 - return false, d, nil, generateUnexpectedResponseCodeError(resp) 452 - } 453 - }
+4 -4
command/list/list.go command/ls/ls.go
··· 1 - package list 1 + package ls 2 2 3 3 import ( 4 4 "fmt" 5 5 "os" 6 6 7 - "git.j3s.sh/cascade/command/list/members" 7 + "git.j3s.sh/cascade/command/ls/members" 8 8 ) 9 9 10 - const usage = `cascade ls nodes 11 - cascade ls members 10 + const usage = `cascade ls members 11 + cascade ls nodes 12 12 cascade ls services 13 13 ` 14 14
+2 -5
command/list/members/members.go command/ls/members/members.go
··· 46 46 members, err := client.Agent().Members() 47 47 for _, m := range members { 48 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") 49 + fmt.Printf("%s %s:%d %s\n", m.Name, m.Addr, m.Port, m.StatusPretty()) 53 50 } else { 54 - fmt.Printf("%s\n", m.Name) 51 + fmt.Println(m.Name) 55 52 } 56 53 } 57 54 }
+1 -1
command/list/nodes/nodes.go command/ls/services/services.go
··· 1 - package list 1 + package services 2 2 3 3 import ( 4 4 "fmt"
+1 -1
command/list/services/services.go command/ls/nodes/nodes.go
··· 1 - package list 1 + package nodes 2 2 3 3 import ( 4 4 "fmt"
+3 -3
main.go
··· 5 5 "os" 6 6 7 7 "git.j3s.sh/cascade/command/agent" 8 - "git.j3s.sh/cascade/command/list" 8 + "git.j3s.sh/cascade/command/ls" 9 9 ) 10 10 11 11 const usage = `cascade agent start a cascade agent ··· 25 25 switch os.Args[1] { 26 26 case "agent": 27 27 agent.Run(args) 28 - case "list", "ls": 29 - list.Run(args) 28 + case "ls": 29 + ls.Run(args) 30 30 default: 31 31 fmt.Fprintf(os.Stderr, "'%s' is not a valid command\n\n%s", command, usage) 32 32 os.Exit(1)