// 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 }
// Create a tier and specify any dependencies, return the full name of the last node created func Create(servicename, packagename string, regions, count int, dependencies ...string) string { var name string arch := archaius.Conf.Arch rnames := archaius.Conf.RegionNames znames := archaius.Conf.ZoneNames if regions == 0 { // for dns that isn't in a region or zone //log.Printf("Create cross region: " + servicename) name = names.Make(arch, "*", "*", servicename, packagename, 0) StartNode(name, dependencies...) } for r := 0; r < regions; r++ { if count == 0 { // for AWS services that are cross zone like elb and S3 //log.Printf("Create cross zone: " + servicename) name = names.Make(arch, rnames[r], "*", servicename, packagename, 0) StartNode(name, dependencies...) } else { //log.Printf("Create service: " + servicename) cass := make(map[string]mapchan) // for token distribution for i := r * count; i < (r+1)*count; i++ { name = names.Make(arch, rnames[r], znames[i%len(archaius.Conf.ZoneNames)], servicename, packagename, i) //log.Println(dependencies) StartNode(name, dependencies...) if packagename == "priamCassandra" { rz := names.RegionZone(name) if cass[rz] == nil { cass[rz] = make(mapchan) } cass[rz][name] = noodles[name] // remember the nodes } } if packagename == "priamCassandra" { // split by zone for _, v := range cass { priamCassandra.Distribute(v) // returns a string if it needs logging } } } } return name }