Browse Source

added support for gathering metadata from DigitalOcean droplets

Nikolay Sivko 3 năm trước cách đây
mục cha
commit
ce52987aa3
2 tập tin đã thay đổi với 49 bổ sung5 xóa
  1. 39 0
      node/metadata/digital_ocean.go
  2. 10 5
      node/metadata/metadata.go

+ 39 - 0
node/metadata/digital_ocean.go

@@ -0,0 +1,39 @@
+package metadata
+
+import (
+	"io"
+	"k8s.io/klog/v2"
+	"net/http"
+)
+
+const doInstanceMetadataURL = "http://169.254.169.254/metadata/v1/"
+
+func getDigitalOceanMetadata() *CloudMetadata {
+	var lastErr error
+	getVar := func(path string) string {
+		r, _ := http.NewRequest(http.MethodGet, doInstanceMetadataURL+path, nil)
+		resp, err := httpGetWithTimeout(r)
+		if err != nil {
+			lastErr = err
+			return ""
+		}
+		defer resp.Body.Close()
+		data, err := io.ReadAll(resp.Body)
+		if err != nil {
+			lastErr = err
+			return ""
+		}
+		return string(data)
+	}
+	res := &CloudMetadata{
+		Provider:   CloudProviderDigitalOcean,
+		InstanceId: getVar("id"),
+		Region:     getVar("region"),
+	}
+	res.AvailabilityZone = res.Region
+	if lastErr != nil {
+		klog.Warningln(lastErr)
+		return nil
+	}
+	return res
+}

+ 10 - 5
node/metadata/metadata.go

@@ -14,11 +14,12 @@ const metadataServiceTimeout = 5 * time.Second
 type CloudProvider string
 
 const (
-	CloudProviderAWS     CloudProvider = "AWS"
-	CloudProviderGCP     CloudProvider = "GCP"
-	CloudProviderAzure   CloudProvider = "Azure"
-	CloudProviderHetzner CloudProvider = "Hetzner"
-	CloudProviderUnknown CloudProvider = ""
+	CloudProviderAWS          CloudProvider = "AWS"
+	CloudProviderGCP          CloudProvider = "GCP"
+	CloudProviderAzure        CloudProvider = "Azure"
+	CloudProviderHetzner      CloudProvider = "Hetzner"
+	CloudProviderDigitalOcean CloudProvider = "DigitalOcean"
+	CloudProviderUnknown      CloudProvider = ""
 )
 
 type CloudMetadata struct {
@@ -48,6 +49,8 @@ func getCloudProvider() CloudProvider {
 			return CloudProviderGCP
 		case "Microsoft Corporation":
 			return CloudProviderAzure
+		case "DigitalOcean":
+			return CloudProviderDigitalOcean
 		}
 	}
 	if vendor, err := os.ReadFile("/sys/class/dmi/id/sys_vendor"); err == nil {
@@ -70,6 +73,8 @@ func GetInstanceMetadata() *CloudMetadata {
 		return getAzureMetadata()
 	case CloudProviderHetzner:
 		return getHetznerMetadata()
+	case CloudProviderDigitalOcean:
+		return getDigitalOceanMetadata()
 	}
 	return nil
 }