forked from onsi/diego-sim
/
simulator.go
120 lines (101 loc) · 3.02 KB
/
simulator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"flag"
"fmt"
Bbs "github.com/cloudfoundry-incubator/runtime-schema/bbs"
"github.com/cloudfoundry-incubator/simulator/logger"
"github.com/cloudfoundry/gunk/timeprovider"
"github.com/cloudfoundry/storeadapter/etcdstoreadapter"
"github.com/cloudfoundry/storeadapter/storerunner/etcdstorerunner"
"github.com/cloudfoundry/storeadapter/workerpool"
"github.com/onsi/ginkgo/cleanup"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"time"
)
var etcdNodes int
var nExecutors int
var nRunOnces int
var executorMemory int
var runOnceMemory int
var outDir string
var verbose bool
var over time.Duration
func init() {
flag.IntVar(&etcdNodes, "etcd-nodes", 1, "# of etcd nodes")
flag.IntVar(&nExecutors, "executors", 1, "# of executors")
flag.IntVar(&nRunOnces, "run-onces", 1, "# of run onces")
flag.IntVar(&executorMemory, "executor-available-memory", 1000, "executor available memory")
flag.IntVar(&runOnceMemory, "run-once-memory", 100, "RunOnce required memory")
flag.StringVar(&outDir, "output-directory", "", "Output directory")
flag.BoolVar(&verbose, "v", false, "Verbose mode")
flag.DurationVar(&over, "over", 0, "Duration over which to emit the events")
}
var etcd *etcdstorerunner.ETCDClusterRunner
var etcdAdapter *etcdstoreadapter.ETCDStoreAdapter
var bbs *Bbs.BBS
func main() {
flag.Parse()
//make the out dir
logger.Component = "SIMULATOR"
if outDir == "" {
logger.Fatal("out.dir.unspecified")
}
err := os.MkdirAll(outDir, 0777)
if err != nil {
logger.Fatal("out.dir.creation.failed", err)
}
//set up logging
outputFile, err := os.Create(filepath.Join(outDir, "simulator.log"))
if err != nil {
logger.Fatal("failed.to.create.simulator.log", err)
}
logger.Writer = io.MultiWriter(os.Stdout, outputFile)
cleanup.Register(func() {
outputFile.Sync()
})
//compile the executor
logger.Info("compiling.executor")
output, err := exec.Command("go", "install", "github.com/cloudfoundry-incubator/simulator/game_executor").CombinedOutput()
if err != nil {
logger.Fatal("failed.to.compile.executor", string(output))
}
//write info to the output dir
writeInfo()
//start etcd
logger.Info("starting.etcd", etcdNodes)
etcd = etcdstorerunner.NewETCDClusterRunner(4001, etcdNodes)
etcd.Start()
//set up the bbs
pool := workerpool.NewWorkerPool(50)
etcdAdapter = etcdstoreadapter.NewETCDStoreAdapter(etcd.NodeURLS(), pool)
etcdAdapter.Connect()
bbs = Bbs.New(etcdAdapter, timeprovider.NewTimeProvider())
//monitor etcd
monitorETCD()
//start executors
startExecutors()
cleanup.Register(func() {
logger.Info("stopping.etcd", etcdNodes)
etcd.Stop()
})
//run the simulator
runSimulation()
cleanup.Exit(0)
}
func writeInfo() {
data := fmt.Sprintf(`{
etcd_nodes:%d,
executors:%d,
run_onces:%d,
executor_available_memory:%d,
run_once_memory:%d,
over:%.4f
}
`, etcdNodes, nExecutors, nRunOnces, executorMemory, runOnceMemory, float64(over)/float64(time.Second))
logger.Info("simulator.running", data)
ioutil.WriteFile(filepath.Join(outDir, "info.json"), []byte(data), 0777)
}