mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-11-04 03:59:14 +00:00 
			
		
		
		
	Metadata: add support for loading from a file
This adds a new configuration provider that just reads a file. This is needed for Docker Desktop, where we will run a LinuxKit distro in an isolated namespace within WSL 2. In this scenario, the config will be accessible trough the WSL2 built-in 9p mount of the Windows filesystem. Signed-off-by: Simon Ferquel <simon.ferquel@docker.com>
This commit is contained in:
		@@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -44,29 +45,34 @@ var netProviders []Provider
 | 
			
		||||
// cdromProviders is a list of Providers offering metadata/userdata data via CDROM
 | 
			
		||||
var cdromProviders []Provider
 | 
			
		||||
 | 
			
		||||
// fileProviders is a list of Providers offering metadata/userdata in a file on the filesystem
 | 
			
		||||
var fileProviders []Provider
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	providers := []string{"aws", "gcp", "hetzner", "openstack", "scaleway", "vultr", "packet", "cdrom"}
 | 
			
		||||
	if len(os.Args) > 1 {
 | 
			
		||||
		providers = os.Args[1:]
 | 
			
		||||
	}
 | 
			
		||||
	for _, p := range providers {
 | 
			
		||||
		switch p {
 | 
			
		||||
		case "aws":
 | 
			
		||||
		switch {
 | 
			
		||||
		case p == "aws":
 | 
			
		||||
			netProviders = append(netProviders, NewAWS())
 | 
			
		||||
		case "gcp":
 | 
			
		||||
		case p == "gcp":
 | 
			
		||||
			netProviders = append(netProviders, NewGCP())
 | 
			
		||||
		case "hetzner":
 | 
			
		||||
		case p == "hetzner":
 | 
			
		||||
			netProviders = append(netProviders, NewHetzner())
 | 
			
		||||
		case "openstack":
 | 
			
		||||
		case p == "openstack":
 | 
			
		||||
			netProviders = append(netProviders, NewOpenstack())
 | 
			
		||||
		case "packet":
 | 
			
		||||
		case p == "packet":
 | 
			
		||||
			netProviders = append(netProviders, NewPacket())
 | 
			
		||||
		case "scaleway":
 | 
			
		||||
		case p == "scaleway":
 | 
			
		||||
			netProviders = append(netProviders, NewScaleway())
 | 
			
		||||
		case "vultr":
 | 
			
		||||
		case p == "vultr":
 | 
			
		||||
			netProviders = append(netProviders, NewVultr())
 | 
			
		||||
		case "cdrom":
 | 
			
		||||
		case p == "cdrom":
 | 
			
		||||
			cdromProviders = ListCDROMs()
 | 
			
		||||
		case strings.HasPrefix(p, "file="):
 | 
			
		||||
			fileProviders = append(fileProviders, fileProvider(p[5:]))
 | 
			
		||||
		default:
 | 
			
		||||
			log.Fatalf("Unrecognised metadata provider: %s", p)
 | 
			
		||||
		}
 | 
			
		||||
@@ -99,6 +105,17 @@ func main() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !found {
 | 
			
		||||
		for _, p = range fileProviders {
 | 
			
		||||
			log.Printf("Trying file %s", p.String())
 | 
			
		||||
			if p.Probe() {
 | 
			
		||||
				log.Printf("%s: Probe succeeded", p)
 | 
			
		||||
				userdata, err = p.Extract()
 | 
			
		||||
				found = true
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !found {
 | 
			
		||||
		log.Printf("No metadata/userdata found. Bye")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								pkg/metadata/provider_file.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								pkg/metadata/provider_file.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type fileProvider string
 | 
			
		||||
 | 
			
		||||
func (p fileProvider) String() string {
 | 
			
		||||
	return string(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p fileProvider) Probe() bool {
 | 
			
		||||
	_, err := os.Stat(string(p))
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p fileProvider) Extract() ([]byte, error) {
 | 
			
		||||
	return ioutil.ReadFile(string(p))
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user