12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package aliyun
- import (
- "fmt"
- "log"
- "strings"
- "github.com/rancher/os/config/cloudinit/datasource"
- "github.com/rancher/os/config/cloudinit/datasource/metadata"
- "github.com/rancher/os/pkg/netconf"
- )
- const (
- DefaultAddress = "http://100.100.100.200/"
- apiVersion = "2016-01-01/"
- userdataPath = apiVersion + "user-data/"
- metadataPath = apiVersion + "meta-data/"
- )
- type MetadataService struct {
- metadata.Service
- }
- func NewDatasource(root string) *MetadataService {
- if root == "" {
- root = DefaultAddress
- }
- return &MetadataService{metadata.NewDatasource(root, apiVersion, userdataPath, metadataPath, nil)}
- }
- func (ms MetadataService) AvailabilityChanges() bool {
- // TODO: if it can't find the network, maybe we can start it?
- return false
- }
- func (ms MetadataService) FetchMetadata() (metadata datasource.Metadata, err error) {
- // see https://www.alibabacloud.com/help/faq-detail/49122.htm
- metadata.NetworkConfig = netconf.NetworkConfig{}
- enablePublicKey := false
- rootContents, err := ms.FetchAttributes("")
- if err != nil {
- return metadata, err
- }
- for _, c := range rootContents {
- if c == "public-keys/" {
- enablePublicKey = true
- break
- }
- }
- if !enablePublicKey {
- return metadata, fmt.Errorf("The public-keys should be enable in %s", ms.Type())
- }
- keynames, err := ms.FetchAttributes("public-keys/")
- if err != nil {
- return metadata, err
- }
- metadata.SSHPublicKeys = map[string]string{}
- for _, k := range keynames {
- k = strings.TrimRight(k, "/")
- sshkey, err := ms.FetchAttribute(fmt.Sprintf("public-keys/%s/openssh-key", k))
- if err != nil {
- return metadata, err
- }
- metadata.SSHPublicKeys[k] = sshkey
- log.Printf("Found SSH key for %q\n", k)
- }
- if hostname, err := ms.FetchAttribute("hostname"); err == nil {
- metadata.Hostname = hostname
- log.Printf("Found hostname %s\n", hostname)
- } else {
- return metadata, err
- }
- return metadata, nil
- }
- func (ms MetadataService) Type() string {
- return "aliyun-metadata-service"
- }
|