util.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package proxmox
  2. import (
  3. "regexp"
  4. "strconv"
  5. "strings"
  6. )
  7. func Itob(i int) bool {
  8. return i == 1
  9. }
  10. // ParseSubConf - Parse standard sub-conf strings `key=value`.
  11. func ParseSubConf(
  12. element string,
  13. separator string,
  14. ) (key string, value interface{}) {
  15. if strings.Contains(element, separator) {
  16. conf := strings.Split(element, separator)
  17. key, value := conf[0], conf[1]
  18. var interValue interface{}
  19. // Make sure to add value in right type,
  20. // because all subconfig are returned as strings from Proxmox API.
  21. if iValue, err := strconv.ParseInt(value, 10, 64); err == nil {
  22. interValue = int(iValue)
  23. } else if bValue, err := strconv.ParseBool(value); err == nil {
  24. interValue = bValue
  25. } else {
  26. interValue = value
  27. }
  28. return key, interValue
  29. }
  30. return
  31. }
  32. // ParseConf - Parse standard device conf string `key1=val1,key2=val2`.
  33. func ParseConf(
  34. kvString string,
  35. confSeparator string,
  36. subConfSeparator string,
  37. implicitFirstKey string,
  38. ) QemuDevice {
  39. var confMap = QemuDevice{}
  40. confList := strings.Split(kvString, confSeparator)
  41. if implicitFirstKey != "" {
  42. if !strings.Contains(confList[0], "=") {
  43. confMap[implicitFirstKey] = confList[0]
  44. confList = confList[1:]
  45. }
  46. }
  47. for _, item := range confList {
  48. key, value := ParseSubConf(item, subConfSeparator)
  49. confMap[key] = value
  50. }
  51. return confMap
  52. }
  53. func ParsePMConf(
  54. kvString string,
  55. implicitFirstKey string,
  56. ) QemuDevice {
  57. return ParseConf(kvString, ",", "=", implicitFirstKey)
  58. }
  59. // Convert a disk-size string to a GB float
  60. func DiskSizeGB(dcSize interface{}) float64 {
  61. var diskSize float64
  62. switch dcSize := dcSize.(type) {
  63. case string:
  64. diskString := strings.ToUpper(dcSize)
  65. re := regexp.MustCompile("([0-9]+)([A-Z]*)")
  66. diskArray := re.FindStringSubmatch(diskString)
  67. diskSize, _ = strconv.ParseFloat(diskArray[1], 64)
  68. if len(diskArray) >= 3 {
  69. switch diskArray[2] {
  70. case "T", "TB":
  71. diskSize *= 1024
  72. case "G", "GB":
  73. //Nothing to do
  74. case "M", "MB":
  75. diskSize /= 1024
  76. case "K", "KB":
  77. diskSize /= 1048576
  78. }
  79. }
  80. case float64:
  81. diskSize = dcSize
  82. }
  83. return diskSize
  84. }