forked from danalex97/Speer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
simulation.go
102 lines (82 loc) · 2.16 KB
/
simulation.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
package config
import (
"github.com/srene/Speer/config/stub"
"github.com/srene/Speer/interfaces"
"github.com/srene/Speer/sdk/go"
"fmt"
"os"
"os/exec"
)
func NewSimulationFromTemplate(
config *Config,
template interfaces.Node,
) interfaces.ISimulation {
builder := sdk.NewSimulationBuilder(template)
if config.Network != nil {
network := config.Network
if network.TransitDomains == 0 || network.TransitDomainSize == 0 {
panic("Transit domain number or transit domain size not provided or zero.")
}
builder = builder.WithInternetworkUnderlay(
int(network.TransitDomains),
int(network.TransitDomainSize),
int(network.StubDomains),
int(network.StubDomainSize))
}
if config.Parallel {
builder = builder.WithParallelSimulation()
}
if config.Nodes == 0 {
panic("Number of nodes was not provided or is 0.")
}
if config.LogFile != "" {
builder = builder.WithLogs("log.json")
}
builder = builder.
WithFixedNodes(int(config.Nodes))
fmt.Printf("Capacity nodes %v \n",config.CapacityNodes)
if config.CapacityNodes != nil && config.TransferInterval == 0 {
panic("No transfer interval provided or transfer interval zero.")
} else if config.CapacityNodes != nil {
builder = builder.
WithCapacityScheduler(int(config.TransferInterval))
}
for _, tuple := range config.CapacityNodes {
builder = builder.WithCapacityNodes(
int(tuple.Number),
int(tuple.Upload),
int(tuple.Download))
}
return builder.Build()
}
func NewSimulation(config *Config) interfaces.ISimulation {
defer func() {
if err := recover(); err != nil {
RemoveTemplate()
panic(err)
}
}()
if !TemplateExists() {
CreateTemplate(config)
src := fmt.Sprintf("%s/speer.go", speer)
// run again main
args := []string{}
args = append(args, "run")
args = append(args, src)
for _, arg := range os.Args[1:] {
args = append(args, arg)
}
cmd := exec.Command("go", args...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Start(); err != nil {
panic(err)
}
cmd.Wait()
os.Exit(0)
}
fmt.Println("Template:", config.Entry)
defer RemoveTemplate()
return NewSimulationFromTemplate(config, stub.NewNode())
}