exportlayer.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package wclayer
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "github.com/Microsoft/go-winio"
  6. "github.com/Microsoft/hcsshim/internal/hcserror"
  7. "github.com/sirupsen/logrus"
  8. )
  9. // ExportLayer will create a folder at exportFolderPath and fill that folder with
  10. // the transport format version of the layer identified by layerId. This transport
  11. // format includes any metadata required for later importing the layer (using
  12. // ImportLayer), and requires the full list of parent layer paths in order to
  13. // perform the export.
  14. func ExportLayer(path string, exportFolderPath string, parentLayerPaths []string) error {
  15. title := "hcsshim::ExportLayer "
  16. logrus.Debugf(title+"path %s folder %s", path, exportFolderPath)
  17. // Generate layer descriptors
  18. layers, err := layerPathsToDescriptors(parentLayerPaths)
  19. if err != nil {
  20. return err
  21. }
  22. err = exportLayer(&stdDriverInfo, path, exportFolderPath, layers)
  23. if err != nil {
  24. err = hcserror.Errorf(err, title, "path=%s folder=%s", path, exportFolderPath)
  25. logrus.Error(err)
  26. return err
  27. }
  28. logrus.Debugf(title+"succeeded path=%s folder=%s", path, exportFolderPath)
  29. return nil
  30. }
  31. type LayerReader interface {
  32. Next() (string, int64, *winio.FileBasicInfo, error)
  33. Read(b []byte) (int, error)
  34. Close() error
  35. }
  36. // NewLayerReader returns a new layer reader for reading the contents of an on-disk layer.
  37. // The caller must have taken the SeBackupPrivilege privilege
  38. // to call this and any methods on the resulting LayerReader.
  39. func NewLayerReader(path string, parentLayerPaths []string) (LayerReader, error) {
  40. exportPath, err := ioutil.TempDir("", "hcs")
  41. if err != nil {
  42. return nil, err
  43. }
  44. err = ExportLayer(path, exportPath, parentLayerPaths)
  45. if err != nil {
  46. os.RemoveAll(exportPath)
  47. return nil, err
  48. }
  49. return &legacyLayerReaderWrapper{newLegacyLayerReader(exportPath)}, nil
  50. }
  51. type legacyLayerReaderWrapper struct {
  52. *legacyLayerReader
  53. }
  54. func (r *legacyLayerReaderWrapper) Close() error {
  55. err := r.legacyLayerReader.Close()
  56. os.RemoveAll(r.root)
  57. return err
  58. }