small pixel drawing of a pufferfish cascade

main.go

// design touchstones
//   configured entirely via environment variables
//   minimal configurable options
//   a single global cluster
//   easy cluster formation
// todo
//   dns resolver for services

package main

import (
	"log"
	"os"
	"time"

	"github.com/hashicorp/memberlist"
	"github.com/hashicorp/serf/serf"
)

func main() {
	c := DefaultConfig()
	if os.Getenv("CASCADE_BIND") != "" {
		c.BindAddr = os.Getenv("CASCADE_BIND")
	}
	// agent does everything tbh
	agent := setupAgent(c)
	log.Println(agent)
	// agent.Run()
}

func setupAgent(config *Config) *Agent {
	bindIP, bindPort, err := config.AddrParts(config.BindAddr)
	if err != nil {
		log.Panic(err)
	}
	serfConfig := serf.DefaultConfig()
	serfConfig.MemberlistConfig.BindAddr = bindIP
	serfConfig.MemberlistConfig.BindPort = bindPort
	serfConfig.MemberlistConfig.AdvertiseAddr = ""
	serfConfig.MemberlistConfig.AdvertisePort = 0
	serfConfig.ProtocolVersion = uint8(serf.ProtocolVersionMax)
	serfConfig.CoalescePeriod = 3 * time.Second
	serfConfig.QuiescentPeriod = time.Second
	serfConfig.QueryResponseSizeLimit = 1024
	serfConfig.QuerySizeLimit = 1024
	serfConfig.UserEventSizeLimit = 512
	serfConfig.UserCoalescePeriod = 3 * time.Second
	serfConfig.UserQuiescentPeriod = time.Second
	// TODO: look at reconnect/tombstone settings w more scrutiny
	serfConfig.ReconnectInterval = 0
	serfConfig.ReconnectTimeout = 0
	serfConfig.TombstoneTimeout = 0
	serfConfig.BroadcastTimeout = 0
	// TODO: what are the implications of true here o_O
	serfConfig.EnableNameConflictResolution = true

	// hardcode DefaultWANConfig because cascade is designed to be
	// used as a single global system.
	serfConfig.MemberlistConfig = memberlist.DefaultWANConfig()
	serfConfig.MemberlistConfig.BindAddr = bindIP
	serfConfig.MemberlistConfig.BindPort = bindPort

	agent := Create(config, serfConfig)
	return agent
}