metadata.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package metadata
  2. import (
  3. "k8s.io/klog/v2"
  4. "os"
  5. "strings"
  6. "time"
  7. )
  8. const metadataServiceTimeout = 5 * time.Second
  9. type CloudProvider string
  10. const (
  11. CloudProviderAWS CloudProvider = "AWS"
  12. CloudProviderGCP CloudProvider = "GCP"
  13. CloudProviderAzure CloudProvider = "Azure"
  14. CloudProviderUnknown CloudProvider = ""
  15. )
  16. type CloudMetadata struct {
  17. Provider CloudProvider
  18. AccountId string
  19. InstanceId string
  20. InstanceType string
  21. LifeCycle string
  22. Region string
  23. AvailabilityZone string
  24. AvailabilityZoneId string
  25. LocalIPv4 string
  26. PublicIPv4 string
  27. }
  28. func getCloudProvider() CloudProvider {
  29. if d, err := os.ReadFile("/sys/hypervisor/uuid"); err == nil { // AWS Xen instances
  30. if strings.HasPrefix(strings.ToLower(string(d)), "ec2") {
  31. return CloudProviderAWS
  32. }
  33. }
  34. if vendor, err := os.ReadFile("/sys/class/dmi/id/board_vendor"); err == nil {
  35. switch strings.TrimSpace(string(vendor)) {
  36. case "Amazon EC2":
  37. return CloudProviderAWS
  38. case "Google":
  39. return CloudProviderGCP
  40. case "Microsoft Corporation":
  41. return CloudProviderAzure
  42. }
  43. }
  44. return CloudProviderUnknown
  45. }
  46. func GetInstanceMetadata() *CloudMetadata {
  47. provider := getCloudProvider()
  48. klog.Infoln("cloud provider:", provider)
  49. switch provider {
  50. case CloudProviderAWS:
  51. return getAwsMetadata()
  52. case CloudProviderGCP:
  53. return getGcpMetadata()
  54. case CloudProviderAzure:
  55. return getAzureMetadata()
  56. }
  57. return nil
  58. }