// Reload the network from a file func Reload(arch string) { listener = make(chan gotocol.Message) // listener for fsm log.Println("fsm reloading from " + arch + ".json") g := graphjson.ReadArch(arch) pop := 0 // count how many nodes there are for _, element := range g.Graph { if element.Node != "" { pop++ } } archaius.Conf.Population = pop // create the map of channels noodles = make(map[string]chan gotocol.Message, archaius.Conf.Population) // Start all the services for _, element := range g.Graph { if element.Node != "" && element.Service != "" { name := element.Node noodles[name] = make(chan gotocol.Message) // start the service and tell it it's name switch element.Service { case "pirate": go pirate.Start(noodles[name]) noodles[name] <- gotocol.Message{gotocol.Hello, listener, time.Now(), gotocol.NilContext, name} if edda.Logchan != nil { // tell the pirate to report itself and new edges to the logger noodles[name] <- gotocol.Message{gotocol.Inform, edda.Logchan, time.Now(), gotocol.NilContext, ""} } default: log.Println("fsm: unknown service: " + element.Service) } } } // Make all the connections for _, element := range g.Graph { if element.Edge != "" && element.Source != "" && element.Target != "" { noodles[element.Source] <- gotocol.Message{gotocol.NameDrop, noodles[element.Target], time.Now(), gotocol.NewTrace(), element.Target} log.Println("Link " + element.Source + " > " + element.Target) } } // send money and start the pirates chatting for _, noodle := range noodles { // same as below for now, but will save and read back from file later // anonymously send this pirate a random amount of GoldCoin up to 100 gold := fmt.Sprintf("%d", rand.Intn(100)) noodle <- gotocol.Message{gotocol.GoldCoin, nil, time.Now(), gotocol.NewTrace(), gold} // tell this pirate to start chatting with friends every 0.1 to 10 secs delay := fmt.Sprintf("%dms", 100+rand.Intn(9900)) noodle <- gotocol.Message{gotocol.Chat, nil, time.Now(), gotocol.NilContext, delay} } shutdown() }
// Reload the network from a file func Reload(arch string) string { root := "" g := graphjson.ReadArch(arch) archaius.Conf.Population = 0 // just to make sure // count how many nodes there are for _, element := range g.Graph { if element.Node != "" { archaius.Conf.Population++ } } CreateChannels() CreateEureka() // eureka and edda aren't recorded in the json file to simplify the graph // Start all the services cass := make(map[string]chan gotocol.Message) // for token distribution for _, element := range g.Graph { if element.Node != "" { name := element.Node StartNode(name, "") if names.Package(name) == DenominatorPkg { root = name } if names.Package(name) == "priamCassandra" { cass[name] = noodles[name] // remember the nodes } } } if len(cass) > 0 { // currently doesn't handle multiple priamCassandra per arch priamCassandra.Distribute(cass) // returns a string if it needs logging } // Make all the connections for _, element := range g.Graph { if element.Edge != "" && element.Source != "" && element.Target != "" { Connect(element.Source, element.Target) } } // run for a while if root == "" { log.Fatal("No denominator root microservice specified") } return root }