| // +build windows |
| |
| package image |
| |
| import ( |
| "crypto/sha512" |
| "fmt" |
| |
| "github.com/docker/distribution/digest" |
| "github.com/docker/docker/layer" |
| ) |
| |
| // TypeLayersWithBase is used for RootFS.Type for Windows filesystems that have layers and a centrally-stored base layer. |
| const TypeLayersWithBase = "layers+base" |
| |
| // RootFS describes images root filesystem |
| // This is currently a placeholder that only supports layers. In the future |
| // this can be made into an interface that supports different implementations. |
| type RootFS struct { |
| Type string `json:"type"` |
| DiffIDs []layer.DiffID `json:"diff_ids,omitempty"` |
| BaseLayer string `json:"base_layer,omitempty"` |
| } |
| |
| // BaseLayerID returns the 64 byte hex ID for the baselayer name. |
| func (r *RootFS) BaseLayerID() string { |
| if r.Type != TypeLayersWithBase { |
| panic("tried to get base layer ID without a base layer") |
| } |
| baseID := sha512.Sum384([]byte(r.BaseLayer)) |
| return fmt.Sprintf("%x", baseID[:32]) |
| } |
| |
| // ChainID returns the ChainID for the top layer in RootFS. |
| func (r *RootFS) ChainID() layer.ChainID { |
| ids := r.DiffIDs |
| if r.Type == TypeLayersWithBase { |
| // Add an extra ID for the base. |
| baseDiffID := layer.DiffID(digest.FromBytes([]byte(r.BaseLayerID()))) |
| ids = append([]layer.DiffID{baseDiffID}, ids...) |
| } |
| return layer.CreateChainID(ids) |
| } |
| |
| // NewRootFSWithBaseLayer returns a RootFS struct with a base layer |
| func NewRootFSWithBaseLayer(baseLayer string) *RootFS { |
| return &RootFS{Type: TypeLayersWithBase, BaseLayer: baseLayer} |
| } |