// toDBMachine converts machines specified in the Stitch into db.Machines that can // be compared against what's already in the db. // Specifically, it sets the role of the db.Machine, the size (which may depend // on RAM and CPU constraints), and the provider. // Additionally, it skips machines with invalid roles, sizes or providers. func toDBMachine(machines []stitch.Machine, maxPrice float64) []db.Machine { var hasMaster, hasWorker bool var dbMachines []db.Machine for _, stitchm := range machines { var m db.Machine role, err := db.ParseRole(stitchm.Role) if err != nil { log.WithError(err).Error("Error parsing role.") continue } m.Role = role hasMaster = hasMaster || role == db.Master hasWorker = hasWorker || role == db.Worker p, err := db.ParseProvider(stitchm.Provider) if err != nil { log.WithError(err).Error("Error parsing provider.") continue } m.Provider = p m.Size = stitchm.Size if m.Size == "" { providerInst := provider.New(p) m.Size = providerInst.ChooseSize( stitchm.RAM, stitchm.CPU, maxPrice) if m.Size == "" { log.Errorf("No valid size for %v, skipping.", m) continue } } m.DiskSize = stitchm.DiskSize if m.DiskSize == 0 { m.DiskSize = defaultDiskSize } m.SSHKeys = stitchm.SSHKeys m.Region = stitchm.Region dbMachines = append(dbMachines, provider.DefaultRegion(m)) } if !hasMaster && hasWorker { log.Warning("A Master was specified but no workers.") return nil } else if hasMaster && !hasWorker { log.Warning("A Worker was specified but no masters.") return nil } return dbMachines }
func newCluster(conn db.Conn, namespace string) *cluster { clst := &cluster{ conn: conn, trigger: conn.TriggerTick(30, db.ClusterTable, db.MachineTable), fm: createForeman(conn), namespace: namespace, providers: make(map[db.Provider]provider.Provider), } for _, p := range allProviders { inst := provider.New(p) if err := inst.Connect(namespace); err == nil { clst.providers[p] = inst } else { log.Debugf("Failed to connect to provider %s: %s", p, err) } } return clst }