gcp.go 1.4 KB

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