89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			89 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")
 | |
| 	defaultState = filepath.Join(os.Getenv("programfiles"), "containerd", "state-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
 | |
| }
 | 
