88 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package containerd
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
 | 
						|
	"github.com/pkg/errors"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	defaultAddress = `\\.\pipe\containerd-containerd-test`
 | 
						|
	testImage      = "docker.io/library/go:nanoserver"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	dockerLayerFolders []string
 | 
						|
 | 
						|
	defaultRoot = filepath.Join(os.Getenv("programfiles"), "containerd", "root-test")
 | 
						|
)
 | 
						|
 | 
						|
func platformTestSetup(client *Client) error {
 | 
						|
	var (
 | 
						|
		roots       []string
 | 
						|
		layerChains = make(map[string]string)
 | 
						|
	)
 | 
						|
	// Since we can't pull images yet, we'll piggyback on the default
 | 
						|
	// docker's images
 | 
						|
	wfPath := `C:\ProgramData\docker\windowsfilter`
 | 
						|
	wf, err := os.Open(wfPath)
 | 
						|
	if err != nil {
 | 
						|
		return errors.Wrapf(err, "failed to access docker layers @ %s", wfPath)
 | 
						|
	}
 | 
						|
	defer wf.Close()
 | 
						|
	entries, err := wf.Readdirnames(0)
 | 
						|
	if err != nil {
 | 
						|
		return errors.Wrapf(err, "failed to read %s entries", wfPath)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, fn := range entries {
 | 
						|
		layerChainPath := filepath.Join(wfPath, fn, "layerchain.json")
 | 
						|
		lfi, err := os.Stat(layerChainPath)
 | 
						|
		switch {
 | 
						|
		case err == nil && lfi.Mode().IsRegular():
 | 
						|
			f, err := os.OpenFile(layerChainPath, os.O_RDONLY, 0660)
 | 
						|
			if err != nil {
 | 
						|
				fmt.Fprintln(os.Stderr,
 | 
						|
					errors.Wrapf(err, "failed to open %s", layerChainPath))
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			defer f.Close()
 | 
						|
			l := make([]string, 0)
 | 
						|
			if err := json.NewDecoder(f).Decode(&l); err != nil {
 | 
						|
				fmt.Fprintln(os.Stderr,
 | 
						|
					errors.Wrapf(err, "failed to decode %s", layerChainPath))
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			switch {
 | 
						|
			case len(l) == 1:
 | 
						|
				layerChains[l[0]] = filepath.Join(wfPath, fn)
 | 
						|
			case len(l) > 1:
 | 
						|
				fmt.Fprintf(os.Stderr, "Too many entries in %s: %d", layerChainPath, len(l))
 | 
						|
			case len(l) == 0:
 | 
						|
				roots = append(roots, filepath.Join(wfPath, fn))
 | 
						|
			}
 | 
						|
		case os.IsNotExist(err):
 | 
						|
			// keep on going
 | 
						|
		default:
 | 
						|
			return errors.Wrapf(err, "error trying to access %s", layerChainPath)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// They'll be 2 roots, just take the first one
 | 
						|
	l := roots[0]
 | 
						|
	dockerLayerFolders = append(dockerLayerFolders, l)
 | 
						|
	for {
 | 
						|
		l = layerChains[l]
 | 
						|
		if l == "" {
 | 
						|
			break
 | 
						|
		}
 | 
						|
 | 
						|
		dockerLayerFolders = append([]string{l}, dockerLayerFolders...)
 | 
						|
	}
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 |