Skip to content

Instantly share code, notes, and snippets.

@nota-ja
Last active December 30, 2015 23:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nota-ja/7901644 to your computer and use it in GitHub Desktop.
Save nota-ja/7901644 to your computer and use it in GitHub Desktop.
massregistrar: Cloud Foundry の Router にダミーの 'router.register' を送りつけるツール。ベースにしたgibsonの実装は https://github.com/cloudfoundry/gibson/tree/97491e15e747fbc21e5b515eab9311c731e41dd2
package main
import (
"flag"
"log"
"math/rand"
"strconv"
"strings"
"time"
"github.com/cloudfoundry/gibson"
"github.com/cloudfoundry/yagnats"
)
const (
INT24MAX = 16777216
INT16MAX = 65536
INT08MAX = 256
)
var numDea = flag.Int("numDea", 1, "Number of dummy DEAs to publish 'router.register'")
var insPerDea = flag.Int("insPerDea", 1, "Number of dummy app instances on a dummy DEA")
var natsAddresses = flag.String("natsAddresses", "", "comma-separated list of NATS cluster member IP:ports")
var natsUsername = flag.String("natsUsername", "", "authentication user for connecting to NATS")
var natsPassword = flag.String("natsPassword", "", "authentication password for connecting to NATS")
func main() {
flag.Parse()
if (*numDea <= 0) || (*numDea > (INT24MAX - 2)) {
log.Fatalln("Number of dummy DEAs must be between 1 .. 16777214")
}
if (*insPerDea <= 0) || (*insPerDea > 32) {
log.Fatalln("Number of dummy app instances per DEA must between 1 .. 32")
}
numUrl := *numDea/5 + 1
for index := 1; index <= *numDea; index++ {
go register(index, numUrl)
}
select {}
}
func intToIpv4Addr(val int) string {
leftOctet := strconv.Itoa(val / INT16MAX)
middleOctet := strconv.Itoa((val % INT16MAX) / INT08MAX)
rightOctet := strconv.Itoa((val % INT16MAX) % INT08MAX)
return strings.Join([]string{"127", leftOctet, middleOctet, rightOctet}, ".")
}
func register(index int, numUrl int) {
ip := intToIpv4Addr(index)
nats := yagnats.NewClient()
natsMembers := []yagnats.ConnectionProvider{}
if *natsAddresses == "" {
log.Fatalln("must specify at least one nats address (-natsAddresses=1.2.3.4:5678)")
}
for _, addr := range strings.Split(*natsAddresses, ",") {
log.Println("configuring nats server:", addr)
natsMembers = append(natsMembers, &yagnats.ConnectionInfo{
Addr: addr,
Username: *natsUsername,
Password: *natsPassword,
})
}
if len(natsMembers) == 0 {
log.Fatalln("must specify at least one nats address")
}
natsInfo := &yagnats.ConnectionCluster{natsMembers}
for {
err := nats.Connect(natsInfo)
if err == nil {
break
}
log.Println("failed to connect to NATS:", err)
time.Sleep(1 * time.Second)
}
client := gibson.NewCFRouterClient(ip, nats)
client.Greet()
for {
for ii := 0; ii < *insPerDea; ii++ {
port := 30000 + ii
url := "u" + strconv.Itoa(rand.Intn(numUrl)) + ".example.org"
client.Register(port, url)
}
time.Sleep(30 * time.Second)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment