func deviceTotalMemory() (int64, error) { // Open /proc/meminfo f, err := os.Open("/proc/meminfo") if err != nil { return -1, err } defer f.Close() // Read it line by line scan := bufio.NewScanner(f) for scan.Scan() { line := scan.Text() // We only care about MemTotal if !strings.HasPrefix(line, "MemTotal:") { continue } // Extract the before last (value) and last (unit) fields fields := strings.Split(line, " ") value := fields[len(fields)-2] + fields[len(fields)-1] // Feed the result to shared.ParseByteSizeString to get an int value valueBytes, err := shared.ParseByteSizeString(value) if err != nil { return -1, err } return valueBytes, nil } return -1, fmt.Errorf("Couldn't find MemTotal") }
func newInstanceSummary(info *shared.ContainerInfo) InstanceSummary { archStr := arch.NormaliseArch(info.Architecture) var numCores uint = 0 // default to all if raw := info.Config["limits.cpu"]; raw != "" { fmt.Sscanf(raw, "%d", &numCores) } var mem uint = 0 // default to all if raw := info.Config["limits.memory"]; raw != "" { result, err := shared.ParseByteSizeString(raw) if err != nil { logger.Errorf("failed to parse %s into bytes, ignoring err: %s", raw, err) mem = 0 } else { // We're going to put it into MemoryMB, so adjust by a megabyte result = result / megabyte if result > math.MaxUint32 { logger.Errorf("byte string %s overflowed uint32", raw) mem = math.MaxUint32 } else { mem = uint(result) } } } // TODO(ericsnow) Factor this out into a function. statusStr := info.Status for status, code := range allStatuses { if info.StatusCode == code { statusStr = status break } } metadata := extractMetadata(info.Config) return InstanceSummary{ Name: info.Name, Status: statusStr, Metadata: metadata, Hardware: InstanceHardware{ Architecture: archStr, NumCores: numCores, MemoryMB: mem, }, } }
func containerConfigureInternal(c container) error { // Find the root device for _, m := range c.ExpandedDevices() { if m["type"] != "disk" || m["path"] != "/" || m["size"] == "" { continue } size, err := shared.ParseByteSizeString(m["size"]) if err != nil { return err } err = c.Storage().ContainerSetQuota(c, size) if err != nil { return err } break } return nil }
func deviceParseDiskLimit(readSpeed string, writeSpeed string) (int64, int64, int64, int64, error) { parseValue := func(value string) (int64, int64, error) { var err error bps := int64(0) iops := int64(0) if readSpeed == "" { return bps, iops, nil } if strings.HasSuffix(value, "iops") { iops, err = strconv.ParseInt(strings.TrimSuffix(value, "iops"), 10, 64) if err != nil { return -1, -1, err } } else { bps, err = shared.ParseByteSizeString(value) if err != nil { return -1, -1, err } } return bps, iops, nil } readBps, readIops, err := parseValue(readSpeed) if err != nil { return -1, -1, -1, -1, err } writeBps, writeIops, err := parseValue(writeSpeed) if err != nil { return -1, -1, -1, -1, err } return readBps, readIops, writeBps, writeIops, nil }
func dbUpdateFromV18(currentVersion int, version int, d *Daemon) error { var id int var value string // Update container config rows, err := dbQueryScan(d.db, "SELECT id, value FROM containers_config WHERE key='limits.memory'", nil, []interface{}{id, value}) if err != nil { return err } for _, row := range rows { id = row[0].(int) value = row[1].(string) // If already an integer, don't touch _, err := strconv.Atoi(value) if err == nil { continue } // Generate the new value value = strings.ToUpper(value) value += "B" // Deal with completely broken values _, err = shared.ParseByteSizeString(value) if err != nil { shared.LogDebugf("Invalid container memory limit, id=%d value=%s, removing.", id, value) _, err = d.db.Exec("DELETE FROM containers_config WHERE id=?;", id) if err != nil { return err } } // Set the new value _, err = d.db.Exec("UPDATE containers_config SET value=? WHERE id=?", value, id) if err != nil { return err } } // Update profiles config rows, err = dbQueryScan(d.db, "SELECT id, value FROM profiles_config WHERE key='limits.memory'", nil, []interface{}{id, value}) if err != nil { return err } for _, row := range rows { id = row[0].(int) value = row[1].(string) // If already an integer, don't touch _, err := strconv.Atoi(value) if err == nil { continue } // Generate the new value value = strings.ToUpper(value) value += "B" // Deal with completely broken values _, err = shared.ParseByteSizeString(value) if err != nil { shared.LogDebugf("Invalid profile memory limit, id=%d value=%s, removing.", id, value) _, err = d.db.Exec("DELETE FROM profiles_config WHERE id=?;", id) if err != nil { return err } } // Set the new value _, err = d.db.Exec("UPDATE profiles_config SET value=? WHERE id=?", value, id) if err != nil { return err } } return nil }