The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/1647
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === For other golang clients who want to figure out the memory from a LXD limit in string format from the config, this is useful. Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
From 83af6cf8a98cff8750085a69951d125648684d36 Mon Sep 17 00:00:00 2001 From: Tycho Andersen <tycho.ander...@canonical.com> Date: Wed, 24 Feb 2016 11:45:21 -0700 Subject: [PATCH] shared: export limit parsing function For other golang clients who want to figure out the memory from a LXD limit in string format from the config, this is useful. Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com> --- lxd/container.go | 2 +- lxd/container_lxc.go | 6 +++--- lxd/db_update.go | 4 ++-- lxd/devices.go | 51 +++------------------------------------------------ shared/util.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 54 deletions(-) diff --git a/lxd/container.go b/lxd/container.go index 9dc714e..df99790 100644 --- a/lxd/container.go +++ b/lxd/container.go @@ -618,7 +618,7 @@ func containerConfigureInternal(c container) error { continue } - size, err := deviceParseBytes(m["size"]) + size, err := shared.ParseSizeString(m["size"]) if err != nil { return err } diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 9983067..241f5fc 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -470,7 +470,7 @@ func (c *containerLXC) initLXC() error { valueInt = int64((memoryTotal / 100) * percent) } else { - valueInt, err = deviceParseBytes(memory) + valueInt, err = shared.ParseSizeString(memory) if err != nil { return err } @@ -1883,7 +1883,7 @@ func (c *containerLXC) Update(args containerArgs, userRequested bool) error { } if m["size"] != oldRootfsSize { - size, err := deviceParseBytes(m["size"]) + size, err := shared.ParseSizeString(m["size"]) if err != nil { undoChanges() return err @@ -1986,7 +1986,7 @@ func (c *containerLXC) Update(args containerArgs, userRequested bool) error { memory = fmt.Sprintf("%d", int64((memoryTotal/100)*percent)) } else { - valueInt, err := deviceParseBytes(memory) + valueInt, err := shared.ParseSizeString(memory) if err != nil { undoChanges() return err diff --git a/lxd/db_update.go b/lxd/db_update.go index 579825c..c43ade8 100644 --- a/lxd/db_update.go +++ b/lxd/db_update.go @@ -84,7 +84,7 @@ func dbUpdateFromV18(db *sql.DB) error { value += "B" // Deal with completely broken values - _, err = deviceParseBytes(value) + _, err = shared.ParseSizeString(value) if err != nil { shared.Debugf("Invalid container memory limit, id=%d value=%s, removing.", id, value) _, err = db.Exec("DELETE FROM containers_config WHERE id=?;", id) @@ -121,7 +121,7 @@ func dbUpdateFromV18(db *sql.DB) error { value += "B" // Deal with completely broken values - _, err = deviceParseBytes(value) + _, err = shared.ParseSizeString(value) if err != nil { shared.Debugf("Invalid profile memory limit, id=%d value=%s, removing.", id, value) _, err = db.Exec("DELETE FROM profiles_config WHERE id=?;", id) diff --git a/lxd/devices.go b/lxd/devices.go index 9f54271..770a5dc 100644 --- a/lxd/devices.go +++ b/lxd/devices.go @@ -656,51 +656,6 @@ func deviceParseBits(input string) (int64, error) { return valueInt * multiplicator, nil } -func deviceParseBytes(input string) (int64, error) { - if input == "" { - return 0, nil - } - - if len(input) < 3 { - return -1, fmt.Errorf("Invalid value: %s", input) - } - - // Extract the suffix - suffix := input[len(input)-2:] - - // Extract the value - value := input[0 : len(input)-2] - valueInt, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return -1, fmt.Errorf("Invalid integer: %s", input) - } - - if valueInt < 0 { - return -1, fmt.Errorf("Invalid value: %d", valueInt) - } - - // Figure out the multiplicator - multiplicator := int64(0) - switch suffix { - case "kB": - multiplicator = 1024 - case "MB": - multiplicator = 1024 * 1024 - case "GB": - multiplicator = 1024 * 1024 * 1024 - case "TB": - multiplicator = 1024 * 1024 * 1024 * 1024 - case "PB": - multiplicator = 1024 * 1024 * 1024 * 1024 * 1024 - case "EB": - multiplicator = 1024 * 1024 * 1024 * 1024 * 1024 * 1024 - default: - return -1, fmt.Errorf("Unsupported suffix: %s", suffix) - } - - return valueInt * multiplicator, nil -} - func deviceTotalMemory() (int64, error) { // Open /proc/meminfo f, err := os.Open("/proc/meminfo") @@ -723,8 +678,8 @@ func deviceTotalMemory() (int64, error) { fields := strings.Split(line, " ") value := fields[len(fields)-2] + fields[len(fields)-1] - // Feed the result to deviceParseBytes to get an int value - valueBytes, err := deviceParseBytes(value) + // Feed the result to shared.ParseSizeString to get an int value + valueBytes, err := shared.ParseSizeString(value) if err != nil { return -1, err } @@ -892,7 +847,7 @@ func deviceParseDiskLimit(readSpeed string, writeSpeed string) (int64, int64, in return -1, -1, err } } else { - bps, err = deviceParseBytes(value) + bps, err = shared.ParseSizeString(value) if err != nil { return -1, -1, err } diff --git a/shared/util.go b/shared/util.go index a583af4..8940a6d 100644 --- a/shared/util.go +++ b/shared/util.go @@ -562,3 +562,50 @@ func ParseMetadata(metadata interface{}) (map[string]interface{}, error) { return newMetadata, nil } + +// Parse a size (e.g. 200kB or 5GB) into the number of bytes it represents. +// Supports suffixes up to EB. "" == 0. +func ParseSizeString(input string) (int64, error) { + if input == "" { + return 0, nil + } + + if len(input) < 3 { + return -1, fmt.Errorf("Invalid value: %s", input) + } + + // Extract the suffix + suffix := input[len(input)-2:] + + // Extract the value + value := input[0 : len(input)-2] + valueInt, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return -1, fmt.Errorf("Invalid integer: %s", input) + } + + if valueInt < 0 { + return -1, fmt.Errorf("Invalid value: %d", valueInt) + } + + // Figure out the multiplicator + multiplicator := int64(0) + switch suffix { + case "kB": + multiplicator = 1024 + case "MB": + multiplicator = 1024 * 1024 + case "GB": + multiplicator = 1024 * 1024 * 1024 + case "TB": + multiplicator = 1024 * 1024 * 1024 * 1024 + case "PB": + multiplicator = 1024 * 1024 * 1024 * 1024 * 1024 + case "EB": + multiplicator = 1024 * 1024 * 1024 * 1024 * 1024 * 1024 + default: + return -1, fmt.Errorf("Unsupported suffix: %s", suffix) + } + + return valueInt * multiplicator, nil +}
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel