func autoscaleRack() { log := logger.New("ns=workers.autoscale at=autoscaleRack") capacity, err := provider.CapacityGet() if err != nil { log.Log("fn=models.GetSystemCapacity err=%q", err) return } log.Log("autoscale=%t", autoscale) if !autoscale { return } system, err := provider.SystemGet() if err != nil { log.Log("fn=models.GetSystem err=%q", err) return } // calaculate instance requirements based on total process memory needed divided by the memory // on an individual instance instances := int(math.Ceil(float64(capacity.ProcessMemory) / float64(capacity.InstanceMemory))) // instance count cant be less than 2 if instances < 2 { instances = 2 } // instance count must be at least maxconcurrency+1 if instances < (int(capacity.ProcessWidth) + 1) { instances = int(capacity.ProcessWidth) + 1 } log.Log("process.memory=%d instance.memory=%d instances=%d change=%d", capacity.ProcessMemory, capacity.InstanceMemory, instances, (instances - system.Count)) // if no change then exit if system.Count == instances { return } system.Count = instances err = provider.SystemSave(*system) if err != nil { log.Log("fn=system.Save err=%q", err) return } }
func SystemUpdate(rw http.ResponseWriter, r *http.Request) *httperr.Error { rack, err := provider.SystemGet() if err != nil { return httperr.Server(err) } notifyData := map[string]string{} if count := GetForm(r, "count"); count != "" { count, err := strconv.Atoi(count) if err != nil { return httperr.Server(err) } rack.Count = count notifyData["count"] = strconv.Itoa(count) } if t := GetForm(r, "type"); t != "" { rack.Type = t notifyData["type"] = t } if version := GetForm(r, "version"); version != "" { rack.Version = version notifyData["version"] = version } err = provider.SystemSave(*rack) if err != nil { return httperr.Server(err) } rack, err = provider.SystemGet() if err != nil { return httperr.Server(err) } models.NotifySuccess("rack:update", notifyData) return RenderJson(rw, rack) }