gcp.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package metadata
  2. import (
  3. "strings"
  4. gcp "cloud.google.com/go/compute/metadata"
  5. klog "github.com/sirupsen/logrus"
  6. )
  7. func getGcpMetadata() *CloudMetadata {
  8. c := gcp.NewClient(nil)
  9. md := &CloudMetadata{Provider: CloudProviderGCP}
  10. if md.AccountId = getGcpMetadataVariable(c, "project/project-id"); md.AccountId == "" {
  11. return md
  12. }
  13. md.InstanceId = getGcpMetadataVariable(c, "instance/id")
  14. md.LocalIPv4 = getGcpMetadataVariable(c, "instance/network-interfaces/0/ip")
  15. md.PublicIPv4 = getGcpMetadataVariable(c, "instance/network-interfaces/0/access-configs/0/external-ip")
  16. switch strings.ToLower(getGcpMetadataVariable(c, "instance/scheduling/preemptible")) {
  17. case "false":
  18. md.LifeCycle = "on-demand"
  19. case "true":
  20. md.LifeCycle = "preemptible"
  21. }
  22. // projects/PROJECT_NUM/machineTypes/MACHINE_TYPE
  23. if parts := strings.SplitN(getGcpMetadataVariable(c, "instance/machine-type"), "/", 4); len(parts) == 4 {
  24. md.InstanceType = parts[3]
  25. }
  26. // projects/PROJECT_NUM/zones/ZONE
  27. if parts := strings.SplitN(getGcpMetadataVariable(c, "instance/zone"), "/", 4); len(parts) == 4 {
  28. md.AvailabilityZone = parts[3]
  29. if idx := strings.LastIndex(md.AvailabilityZone, "-"); idx != -1 {
  30. md.Region = md.AvailabilityZone[:idx]
  31. }
  32. }
  33. return md
  34. }
  35. func getGcpMetadataVariable(client *gcp.Client, path string) string {
  36. s, err := client.Get(path)
  37. if err != nil {
  38. klog.Errorln(path, err)
  39. }
  40. return s
  41. }