зеркало из https://github.com/microsoft/docker.git
builder: vendor buildkit to 39404586a50d1b9d0fb1c578cf0f4de7bdb7afe5
Signed-off-by: Tibor Vass <tibor@docker.com>
This commit is contained in:
Родитель
b1116479b2
Коммит
d0f00bc1fb
|
@ -22,7 +22,7 @@ import (
|
||||||
"github.com/moby/buildkit/frontend/gateway"
|
"github.com/moby/buildkit/frontend/gateway"
|
||||||
"github.com/moby/buildkit/frontend/gateway/forwarder"
|
"github.com/moby/buildkit/frontend/gateway/forwarder"
|
||||||
"github.com/moby/buildkit/snapshot/blobmapping"
|
"github.com/moby/buildkit/snapshot/blobmapping"
|
||||||
"github.com/moby/buildkit/solver/boltdbcachestorage"
|
"github.com/moby/buildkit/solver/bboltcachestorage"
|
||||||
"github.com/moby/buildkit/worker"
|
"github.com/moby/buildkit/worker"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
@ -122,7 +122,7 @@ func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
cacheStorage, err := boltdbcachestorage.NewStore(filepath.Join(opt.Root, "cache.db"))
|
cacheStorage, err := bboltcachestorage.NewStore(filepath.Join(opt.Root, "cache.db"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,8 +137,12 @@ func (w *Worker) GCPolicy() []client.PruneInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadRef loads a reference by ID
|
// LoadRef loads a reference by ID
|
||||||
func (w *Worker) LoadRef(id string) (cache.ImmutableRef, error) {
|
func (w *Worker) LoadRef(id string, hidden bool) (cache.ImmutableRef, error) {
|
||||||
return w.CacheManager.Get(context.TODO(), id)
|
var opts []cache.RefOption
|
||||||
|
if hidden {
|
||||||
|
opts = append(opts, cache.NoUpdateLastUsed)
|
||||||
|
}
|
||||||
|
return w.CacheManager.Get(context.TODO(), id, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResolveOp converts a LLB vertex into a LLB operation
|
// ResolveOp converts a LLB vertex into a LLB operation
|
||||||
|
|
|
@ -26,7 +26,7 @@ github.com/imdario/mergo v0.3.6
|
||||||
golang.org/x/sync 1d60e4601c6fd243af51cc01ddf169918a5407ca
|
golang.org/x/sync 1d60e4601c6fd243af51cc01ddf169918a5407ca
|
||||||
|
|
||||||
# buildkit
|
# buildkit
|
||||||
github.com/moby/buildkit d88354f7856a1fafef6f23bc9c5a538c246f4023
|
github.com/moby/buildkit 39404586a50d1b9d0fb1c578cf0f4de7bdb7afe5
|
||||||
github.com/tonistiigi/fsutil b19464cd1b6a00773b4f2eb7acf9c30426f9df42
|
github.com/tonistiigi/fsutil b19464cd1b6a00773b4f2eb7acf9c30426f9df42
|
||||||
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
||||||
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7
|
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
package cache
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GCPolicy defines policy for garbage collection
|
|
||||||
type GCPolicy struct {
|
|
||||||
MaxSize uint64
|
|
||||||
MaxKeepDuration time.Duration
|
|
||||||
}
|
|
||||||
|
|
||||||
// // CachePolicy defines policy for keeping a resource in cache
|
|
||||||
// type CachePolicy struct {
|
|
||||||
// Priority int
|
|
||||||
// LastUsed time.Time
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func defaultCachePolicy() CachePolicy {
|
|
||||||
// return CachePolicy{Priority: 10, LastUsed: time.Now()}
|
|
||||||
// }
|
|
||||||
|
|
||||||
func (cm *cacheManager) GC(ctx context.Context) error {
|
|
||||||
return errors.New("GC not implemented")
|
|
||||||
}
|
|
|
@ -25,7 +25,6 @@ var (
|
||||||
|
|
||||||
type ManagerOpt struct {
|
type ManagerOpt struct {
|
||||||
Snapshotter snapshot.SnapshotterBase
|
Snapshotter snapshot.SnapshotterBase
|
||||||
GCPolicy GCPolicy
|
|
||||||
MetadataStore *metadata.Store
|
MetadataStore *metadata.Store
|
||||||
PruneRefChecker ExternalRefCheckerFunc
|
PruneRefChecker ExternalRefCheckerFunc
|
||||||
}
|
}
|
||||||
|
@ -40,7 +39,6 @@ type Accessor interface {
|
||||||
type Controller interface {
|
type Controller interface {
|
||||||
DiskUsage(ctx context.Context, info client.DiskUsageInfo) ([]*client.UsageInfo, error)
|
DiskUsage(ctx context.Context, info client.DiskUsageInfo) ([]*client.UsageInfo, error)
|
||||||
Prune(ctx context.Context, ch chan client.UsageInfo, info ...client.PruneInfo) error
|
Prune(ctx context.Context, ch chan client.UsageInfo, info ...client.PruneInfo) error
|
||||||
GC(ctx context.Context) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Manager interface {
|
type Manager interface {
|
||||||
|
@ -128,17 +126,24 @@ func (cm *cacheManager) get(ctx context.Context, id string, fromSnapshotter bool
|
||||||
rec.mu.Lock()
|
rec.mu.Lock()
|
||||||
defer rec.mu.Unlock()
|
defer rec.mu.Unlock()
|
||||||
|
|
||||||
|
triggerUpdate := true
|
||||||
|
for _, o := range opts {
|
||||||
|
if o == NoUpdateLastUsed {
|
||||||
|
triggerUpdate = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if rec.mutable {
|
if rec.mutable {
|
||||||
if len(rec.refs) != 0 {
|
if len(rec.refs) != 0 {
|
||||||
return nil, errors.Wrapf(ErrLocked, "%s is locked", id)
|
return nil, errors.Wrapf(ErrLocked, "%s is locked", id)
|
||||||
}
|
}
|
||||||
if rec.equalImmutable != nil {
|
if rec.equalImmutable != nil {
|
||||||
return rec.equalImmutable.ref(), nil
|
return rec.equalImmutable.ref(triggerUpdate), nil
|
||||||
}
|
}
|
||||||
return rec.mref().commit(ctx)
|
return rec.mref(triggerUpdate).commit(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
return rec.ref(), nil
|
return rec.ref(triggerUpdate), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getRecord returns record for id. Requires manager lock.
|
// getRecord returns record for id. Requires manager lock.
|
||||||
|
@ -166,8 +171,8 @@ func (cm *cacheManager) getRecord(ctx context.Context, id string, fromSnapshotte
|
||||||
rec := &cacheRecord{
|
rec := &cacheRecord{
|
||||||
mu: &sync.Mutex{},
|
mu: &sync.Mutex{},
|
||||||
cm: cm,
|
cm: cm,
|
||||||
refs: make(map[Mountable]struct{}),
|
refs: make(map[ref]struct{}),
|
||||||
parent: mutable.Parent(),
|
parent: mutable.parentRef(false),
|
||||||
md: md,
|
md: md,
|
||||||
equalMutable: &mutableRef{cacheRecord: mutable},
|
equalMutable: &mutableRef{cacheRecord: mutable},
|
||||||
}
|
}
|
||||||
|
@ -183,7 +188,7 @@ func (cm *cacheManager) getRecord(ctx context.Context, id string, fromSnapshotte
|
||||||
|
|
||||||
var parent ImmutableRef
|
var parent ImmutableRef
|
||||||
if info.Parent != "" {
|
if info.Parent != "" {
|
||||||
parent, err = cm.get(ctx, info.Parent, fromSnapshotter, opts...)
|
parent, err = cm.get(ctx, info.Parent, fromSnapshotter, append(opts, NoUpdateLastUsed)...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -198,7 +203,7 @@ func (cm *cacheManager) getRecord(ctx context.Context, id string, fromSnapshotte
|
||||||
mu: &sync.Mutex{},
|
mu: &sync.Mutex{},
|
||||||
mutable: info.Kind != snapshots.KindCommitted,
|
mutable: info.Kind != snapshots.KindCommitted,
|
||||||
cm: cm,
|
cm: cm,
|
||||||
refs: make(map[Mountable]struct{}),
|
refs: make(map[ref]struct{}),
|
||||||
parent: parent,
|
parent: parent,
|
||||||
md: md,
|
md: md,
|
||||||
}
|
}
|
||||||
|
@ -229,7 +234,7 @@ func (cm *cacheManager) New(ctx context.Context, s ImmutableRef, opts ...RefOpti
|
||||||
var parentID string
|
var parentID string
|
||||||
if s != nil {
|
if s != nil {
|
||||||
var err error
|
var err error
|
||||||
parent, err = cm.Get(ctx, s.ID())
|
parent, err = cm.Get(ctx, s.ID(), NoUpdateLastUsed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -252,7 +257,7 @@ func (cm *cacheManager) New(ctx context.Context, s ImmutableRef, opts ...RefOpti
|
||||||
mu: &sync.Mutex{},
|
mu: &sync.Mutex{},
|
||||||
mutable: true,
|
mutable: true,
|
||||||
cm: cm,
|
cm: cm,
|
||||||
refs: make(map[Mountable]struct{}),
|
refs: make(map[ref]struct{}),
|
||||||
parent: parent,
|
parent: parent,
|
||||||
md: md,
|
md: md,
|
||||||
}
|
}
|
||||||
|
@ -269,7 +274,7 @@ func (cm *cacheManager) New(ctx context.Context, s ImmutableRef, opts ...RefOpti
|
||||||
|
|
||||||
cm.records[id] = rec // TODO: save to db
|
cm.records[id] = rec // TODO: save to db
|
||||||
|
|
||||||
return rec.mref(), nil
|
return rec.mref(true), nil
|
||||||
}
|
}
|
||||||
func (cm *cacheManager) GetMutable(ctx context.Context, id string) (MutableRef, error) {
|
func (cm *cacheManager) GetMutable(ctx context.Context, id string) (MutableRef, error) {
|
||||||
cm.mu.Lock()
|
cm.mu.Lock()
|
||||||
|
@ -301,7 +306,7 @@ func (cm *cacheManager) GetMutable(ctx context.Context, id string) (MutableRef,
|
||||||
rec.equalImmutable = nil
|
rec.equalImmutable = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return rec.mref(), nil
|
return rec.mref(true), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cm *cacheManager) Prune(ctx context.Context, ch chan client.UsageInfo, opts ...client.PruneInfo) error {
|
func (cm *cacheManager) Prune(ctx context.Context, ch chan client.UsageInfo, opts ...client.PruneInfo) error {
|
||||||
|
@ -669,7 +674,7 @@ func (cm *cacheManager) DiskUsage(ctx context.Context, opt client.DiskUsageInfo)
|
||||||
if d.Size == sizeUnknown {
|
if d.Size == sizeUnknown {
|
||||||
func(d *client.UsageInfo) {
|
func(d *client.UsageInfo) {
|
||||||
eg.Go(func() error {
|
eg.Go(func() error {
|
||||||
ref, err := cm.Get(ctx, d.ID)
|
ref, err := cm.Get(ctx, d.ID, NoUpdateLastUsed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
d.Size = 0
|
d.Size = 0
|
||||||
return nil
|
return nil
|
||||||
|
@ -700,7 +705,7 @@ func IsNotFound(err error) bool {
|
||||||
return errors.Cause(err) == errNotFound
|
return errors.Cause(err) == errNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
type RefOption func(withMetadata) error
|
type RefOption interface{}
|
||||||
|
|
||||||
type cachePolicy int
|
type cachePolicy int
|
||||||
|
|
||||||
|
@ -713,6 +718,10 @@ type withMetadata interface {
|
||||||
Metadata() *metadata.StorageItem
|
Metadata() *metadata.StorageItem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type noUpdateLastUsed struct{}
|
||||||
|
|
||||||
|
var NoUpdateLastUsed noUpdateLastUsed
|
||||||
|
|
||||||
func HasCachePolicyRetain(m withMetadata) bool {
|
func HasCachePolicyRetain(m withMetadata) bool {
|
||||||
return getCachePolicy(m.Metadata()) == cachePolicyRetain
|
return getCachePolicy(m.Metadata()) == cachePolicyRetain
|
||||||
}
|
}
|
||||||
|
@ -750,10 +759,12 @@ func initializeMetadata(m withMetadata, opts ...RefOption) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
if err := opt(m); err != nil {
|
if fn, ok := opt.(func(withMetadata) error); ok {
|
||||||
|
if err := fn(m); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return md.Commit()
|
return md.Commit()
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,10 @@ package cache
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/moby/buildkit/cache/metadata"
|
"github.com/moby/buildkit/cache/metadata"
|
||||||
"github.com/moby/buildkit/client"
|
"github.com/moby/buildkit/client"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
const sizeUnknown int64 = -1
|
const sizeUnknown int64 = -1
|
||||||
|
|
|
@ -6,9 +6,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -38,12 +38,16 @@ type Mountable interface {
|
||||||
Mount(ctx context.Context, readonly bool) (snapshot.Mountable, error)
|
Mount(ctx context.Context, readonly bool) (snapshot.Mountable, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ref interface {
|
||||||
|
updateLastUsed() bool
|
||||||
|
}
|
||||||
|
|
||||||
type cacheRecord struct {
|
type cacheRecord struct {
|
||||||
cm *cacheManager
|
cm *cacheManager
|
||||||
mu *sync.Mutex // the mutex is shared by records sharing data
|
mu *sync.Mutex // the mutex is shared by records sharing data
|
||||||
|
|
||||||
mutable bool
|
mutable bool
|
||||||
refs map[Mountable]struct{}
|
refs map[ref]struct{}
|
||||||
parent ImmutableRef
|
parent ImmutableRef
|
||||||
md *metadata.StorageItem
|
md *metadata.StorageItem
|
||||||
|
|
||||||
|
@ -61,15 +65,15 @@ type cacheRecord struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// hold ref lock before calling
|
// hold ref lock before calling
|
||||||
func (cr *cacheRecord) ref() *immutableRef {
|
func (cr *cacheRecord) ref(triggerLastUsed bool) *immutableRef {
|
||||||
ref := &immutableRef{cacheRecord: cr}
|
ref := &immutableRef{cacheRecord: cr, triggerLastUsed: triggerLastUsed}
|
||||||
cr.refs[ref] = struct{}{}
|
cr.refs[ref] = struct{}{}
|
||||||
return ref
|
return ref
|
||||||
}
|
}
|
||||||
|
|
||||||
// hold ref lock before calling
|
// hold ref lock before calling
|
||||||
func (cr *cacheRecord) mref() *mutableRef {
|
func (cr *cacheRecord) mref(triggerLastUsed bool) *mutableRef {
|
||||||
ref := &mutableRef{cacheRecord: cr}
|
ref := &mutableRef{cacheRecord: cr, triggerLastUsed: triggerLastUsed}
|
||||||
cr.refs[ref] = struct{}{}
|
cr.refs[ref] = struct{}{}
|
||||||
return ref
|
return ref
|
||||||
}
|
}
|
||||||
|
@ -116,13 +120,17 @@ func (cr *cacheRecord) Size(ctx context.Context) (int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cr *cacheRecord) Parent() ImmutableRef {
|
func (cr *cacheRecord) Parent() ImmutableRef {
|
||||||
|
return cr.parentRef(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cr *cacheRecord) parentRef(hidden bool) ImmutableRef {
|
||||||
if cr.parent == nil {
|
if cr.parent == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
p := cr.parent.(*immutableRef)
|
p := cr.parent.(*immutableRef)
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
defer p.mu.Unlock()
|
defer p.mu.Unlock()
|
||||||
return p.ref()
|
return p.ref(hidden)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cr *cacheRecord) Mount(ctx context.Context, readonly bool) (snapshot.Mountable, error) {
|
func (cr *cacheRecord) Mount(ctx context.Context, readonly bool) (snapshot.Mountable, error) {
|
||||||
|
@ -188,15 +196,17 @@ func (cr *cacheRecord) ID() string {
|
||||||
|
|
||||||
type immutableRef struct {
|
type immutableRef struct {
|
||||||
*cacheRecord
|
*cacheRecord
|
||||||
|
triggerLastUsed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type mutableRef struct {
|
type mutableRef struct {
|
||||||
*cacheRecord
|
*cacheRecord
|
||||||
|
triggerLastUsed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *immutableRef) Clone() ImmutableRef {
|
func (sr *immutableRef) Clone() ImmutableRef {
|
||||||
sr.mu.Lock()
|
sr.mu.Lock()
|
||||||
ref := sr.ref()
|
ref := sr.ref(false)
|
||||||
sr.mu.Unlock()
|
sr.mu.Unlock()
|
||||||
return ref
|
return ref
|
||||||
}
|
}
|
||||||
|
@ -211,11 +221,33 @@ func (sr *immutableRef) Release(ctx context.Context) error {
|
||||||
return sr.release(ctx)
|
return sr.release(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *immutableRef) updateLastUsed() bool {
|
||||||
|
return sr.triggerLastUsed
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sr *immutableRef) updateLastUsedNow() bool {
|
||||||
|
if !sr.triggerLastUsed {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for r := range sr.refs {
|
||||||
|
if r.updateLastUsed() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *immutableRef) release(ctx context.Context) error {
|
func (sr *immutableRef) release(ctx context.Context) error {
|
||||||
delete(sr.refs, sr)
|
delete(sr.refs, sr)
|
||||||
|
|
||||||
if len(sr.refs) == 0 {
|
if sr.updateLastUsedNow() {
|
||||||
updateLastUsed(sr.md)
|
updateLastUsed(sr.md)
|
||||||
|
if sr.equalMutable != nil {
|
||||||
|
sr.equalMutable.triggerLastUsed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sr.refs) == 0 {
|
||||||
if sr.viewMount != nil { // TODO: release viewMount earlier if possible
|
if sr.viewMount != nil { // TODO: release viewMount earlier if possible
|
||||||
if err := sr.cm.Snapshotter.Remove(ctx, sr.view); err != nil {
|
if err := sr.cm.Snapshotter.Remove(ctx, sr.view); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -273,6 +305,10 @@ func (cr *cacheRecord) finalize(ctx context.Context, commit bool) error {
|
||||||
return cr.md.Commit()
|
return cr.md.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *mutableRef) updateLastUsed() bool {
|
||||||
|
return sr.triggerLastUsed
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *mutableRef) commit(ctx context.Context) (ImmutableRef, error) {
|
func (sr *mutableRef) commit(ctx context.Context) (ImmutableRef, error) {
|
||||||
if !sr.mutable || len(sr.refs) == 0 {
|
if !sr.mutable || len(sr.refs) == 0 {
|
||||||
return nil, errors.Wrapf(errInvalid, "invalid mutable ref")
|
return nil, errors.Wrapf(errInvalid, "invalid mutable ref")
|
||||||
|
@ -280,13 +316,12 @@ func (sr *mutableRef) commit(ctx context.Context) (ImmutableRef, error) {
|
||||||
|
|
||||||
id := identity.NewID()
|
id := identity.NewID()
|
||||||
md, _ := sr.cm.md.Get(id)
|
md, _ := sr.cm.md.Get(id)
|
||||||
|
|
||||||
rec := &cacheRecord{
|
rec := &cacheRecord{
|
||||||
mu: sr.mu,
|
mu: sr.mu,
|
||||||
cm: sr.cm,
|
cm: sr.cm,
|
||||||
parent: sr.Parent(),
|
parent: sr.parentRef(false),
|
||||||
equalMutable: sr,
|
equalMutable: sr,
|
||||||
refs: make(map[Mountable]struct{}),
|
refs: make(map[ref]struct{}),
|
||||||
md: md,
|
md: md,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,11 +347,15 @@ func (sr *mutableRef) commit(ctx context.Context) (ImmutableRef, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ref := rec.ref()
|
ref := rec.ref(true)
|
||||||
sr.equalImmutable = ref
|
sr.equalImmutable = ref
|
||||||
return ref, nil
|
return ref, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *mutableRef) updatesLastUsed() bool {
|
||||||
|
return sr.triggerLastUsed
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *mutableRef) Commit(ctx context.Context) (ImmutableRef, error) {
|
func (sr *mutableRef) Commit(ctx context.Context) (ImmutableRef, error) {
|
||||||
sr.cm.mu.Lock()
|
sr.cm.mu.Lock()
|
||||||
defer sr.cm.mu.Unlock()
|
defer sr.cm.mu.Unlock()
|
||||||
|
@ -342,6 +381,10 @@ func (sr *mutableRef) release(ctx context.Context) error {
|
||||||
if getCachePolicy(sr.md) != cachePolicyRetain {
|
if getCachePolicy(sr.md) != cachePolicyRetain {
|
||||||
if sr.equalImmutable != nil {
|
if sr.equalImmutable != nil {
|
||||||
if getCachePolicy(sr.equalImmutable.md) == cachePolicyRetain {
|
if getCachePolicy(sr.equalImmutable.md) == cachePolicyRetain {
|
||||||
|
if sr.updateLastUsed() {
|
||||||
|
updateLastUsed(sr.md)
|
||||||
|
sr.triggerLastUsed = false
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := sr.equalImmutable.remove(ctx, false); err != nil {
|
if err := sr.equalImmutable.remove(ctx, false); err != nil {
|
||||||
|
@ -355,7 +398,10 @@ func (sr *mutableRef) release(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
return sr.remove(ctx, true)
|
return sr.remove(ctx, true)
|
||||||
} else {
|
} else {
|
||||||
|
if sr.updateLastUsed() {
|
||||||
updateLastUsed(sr.md)
|
updateLastUsed(sr.md)
|
||||||
|
sr.triggerLastUsed = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,12 +25,11 @@ type ClientOpt interface{}
|
||||||
func New(ctx context.Context, address string, opts ...ClientOpt) (*Client, error) {
|
func New(ctx context.Context, address string, opts ...ClientOpt) (*Client, error) {
|
||||||
gopts := []grpc.DialOption{
|
gopts := []grpc.DialOption{
|
||||||
grpc.WithDialer(dialer),
|
grpc.WithDialer(dialer),
|
||||||
grpc.FailOnNonTempDialError(true),
|
|
||||||
}
|
}
|
||||||
needWithInsecure := true
|
needWithInsecure := true
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
if _, ok := o.(*withBlockOpt); ok {
|
if _, ok := o.(*withFailFast); ok {
|
||||||
gopts = append(gopts, grpc.WithBlock(), grpc.FailOnNonTempDialError(true))
|
gopts = append(gopts, grpc.FailOnNonTempDialError(true))
|
||||||
}
|
}
|
||||||
if credInfo, ok := o.(*withCredentials); ok {
|
if credInfo, ok := o.(*withCredentials); ok {
|
||||||
opt, err := loadCredentials(credInfo)
|
opt, err := loadCredentials(credInfo)
|
||||||
|
@ -52,7 +51,6 @@ func New(ctx context.Context, address string, opts ...ClientOpt) (*Client, error
|
||||||
if address == "" {
|
if address == "" {
|
||||||
address = appdefaults.Address
|
address = appdefaults.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, err := grpc.DialContext(ctx, address, gopts...)
|
conn, err := grpc.DialContext(ctx, address, gopts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to dial %q . make sure buildkitd is running", address)
|
return nil, errors.Wrapf(err, "failed to dial %q . make sure buildkitd is running", address)
|
||||||
|
@ -71,10 +69,10 @@ func (c *Client) Close() error {
|
||||||
return c.conn.Close()
|
return c.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
type withBlockOpt struct{}
|
type withFailFast struct{}
|
||||||
|
|
||||||
func WithBlock() ClientOpt {
|
func WithFailFast() ClientOpt {
|
||||||
return &withBlockOpt{}
|
return &withFailFast{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type withCredentials struct {
|
type withCredentials struct {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package llb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "crypto/sha256"
|
_ "crypto/sha256"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
|
@ -61,6 +62,7 @@ type ExecOp struct {
|
||||||
constraints Constraints
|
constraints Constraints
|
||||||
isValidated bool
|
isValidated bool
|
||||||
secrets []SecretInfo
|
secrets []SecretInfo
|
||||||
|
ssh []SSHInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *ExecOp) AddMount(target string, source Output, opt ...MountOption) Output {
|
func (e *ExecOp) AddMount(target string, source Output, opt ...MountOption) Output {
|
||||||
|
@ -130,6 +132,17 @@ func (e *ExecOp) Marshal(c *Constraints) (digest.Digest, []byte, *pb.OpMetadata,
|
||||||
return e.mounts[i].target < e.mounts[j].target
|
return e.mounts[i].target < e.mounts[j].target
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if len(e.ssh) > 0 {
|
||||||
|
for i, s := range e.ssh {
|
||||||
|
if s.Target == "" {
|
||||||
|
e.ssh[i].Target = fmt.Sprintf("/run/buildkit/ssh_agent.%d", i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, ok := e.meta.Env.Get("SSH_AUTH_SOCK"); !ok {
|
||||||
|
e.meta.Env = e.meta.Env.AddOrReplace("SSH_AUTH_SOCK", e.ssh[0].Target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
meta := &pb.Meta{
|
meta := &pb.Meta{
|
||||||
Args: e.meta.Args,
|
Args: e.meta.Args,
|
||||||
Env: e.meta.Env.ToArray(),
|
Env: e.meta.Env.ToArray(),
|
||||||
|
@ -264,6 +277,21 @@ func (e *ExecOp) Marshal(c *Constraints) (digest.Digest, []byte, *pb.OpMetadata,
|
||||||
peo.Mounts = append(peo.Mounts, pm)
|
peo.Mounts = append(peo.Mounts, pm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, s := range e.ssh {
|
||||||
|
pm := &pb.Mount{
|
||||||
|
Dest: s.Target,
|
||||||
|
MountType: pb.MountType_SSH,
|
||||||
|
SSHOpt: &pb.SSHOpt{
|
||||||
|
ID: s.ID,
|
||||||
|
Uid: uint32(s.UID),
|
||||||
|
Gid: uint32(s.GID),
|
||||||
|
Mode: uint32(s.Mode),
|
||||||
|
Optional: s.Optional,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
peo.Mounts = append(peo.Mounts, pm)
|
||||||
|
}
|
||||||
|
|
||||||
dt, err := pop.Marshal()
|
dt, err := pop.Marshal()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, nil, err
|
return "", nil, nil, err
|
||||||
|
@ -432,6 +460,56 @@ func AddMount(dest string, mountState State, opts ...MountOption) RunOption {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AddSSHSocket(opts ...SSHOption) RunOption {
|
||||||
|
return runOptionFunc(func(ei *ExecInfo) {
|
||||||
|
s := &SSHInfo{
|
||||||
|
Mode: 0600,
|
||||||
|
}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt.SetSSHOption(s)
|
||||||
|
}
|
||||||
|
ei.SSH = append(ei.SSH, *s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type SSHOption interface {
|
||||||
|
SetSSHOption(*SSHInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sshOptionFunc func(*SSHInfo)
|
||||||
|
|
||||||
|
func (fn sshOptionFunc) SetSSHOption(si *SSHInfo) {
|
||||||
|
fn(si)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SSHID(id string) SSHOption {
|
||||||
|
return sshOptionFunc(func(si *SSHInfo) {
|
||||||
|
si.ID = id
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func SSHSocketOpt(target string, uid, gid, mode int) SSHOption {
|
||||||
|
return sshOptionFunc(func(si *SSHInfo) {
|
||||||
|
si.Target = target
|
||||||
|
si.UID = uid
|
||||||
|
si.GID = gid
|
||||||
|
si.Mode = mode
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var SSHOptional = sshOptionFunc(func(si *SSHInfo) {
|
||||||
|
si.Optional = true
|
||||||
|
})
|
||||||
|
|
||||||
|
type SSHInfo struct {
|
||||||
|
ID string
|
||||||
|
Target string
|
||||||
|
Mode int
|
||||||
|
UID int
|
||||||
|
GID int
|
||||||
|
Optional bool
|
||||||
|
}
|
||||||
|
|
||||||
func AddSecret(dest string, opts ...SecretOption) RunOption {
|
func AddSecret(dest string, opts ...SecretOption) RunOption {
|
||||||
return runOptionFunc(func(ei *ExecInfo) {
|
return runOptionFunc(func(ei *ExecInfo) {
|
||||||
s := &SecretInfo{ID: dest, Target: dest, Mode: 0400}
|
s := &SecretInfo{ID: dest, Target: dest, Mode: 0400}
|
||||||
|
@ -498,6 +576,7 @@ type ExecInfo struct {
|
||||||
ReadonlyRootFS bool
|
ReadonlyRootFS bool
|
||||||
ProxyEnv *ProxyEnv
|
ProxyEnv *ProxyEnv
|
||||||
Secrets []SecretInfo
|
Secrets []SecretInfo
|
||||||
|
SSH []SSHInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type MountInfo struct {
|
type MountInfo struct {
|
||||||
|
|
|
@ -7,12 +7,14 @@ import (
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// WithMetaResolver adds a metadata resolver to an image
|
||||||
func WithMetaResolver(mr ImageMetaResolver) ImageOption {
|
func WithMetaResolver(mr ImageMetaResolver) ImageOption {
|
||||||
return imageOptionFunc(func(ii *ImageInfo) {
|
return imageOptionFunc(func(ii *ImageInfo) {
|
||||||
ii.metaResolver = mr
|
ii.metaResolver = mr
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ImageMetaResolver can resolve image config metadata from a reference
|
||||||
type ImageMetaResolver interface {
|
type ImageMetaResolver interface {
|
||||||
ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error)
|
ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error)
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,6 +196,7 @@ func (s State) Run(ro ...RunOption) ExecState {
|
||||||
exec.AddMount(m.Target, m.Source, m.Opts...)
|
exec.AddMount(m.Target, m.Source, m.Opts...)
|
||||||
}
|
}
|
||||||
exec.secrets = ei.Secrets
|
exec.secrets = ei.Secrets
|
||||||
|
exec.ssh = ei.SSH
|
||||||
|
|
||||||
return ExecState{
|
return ExecState{
|
||||||
State: s.WithOutput(exec.Output()),
|
State: s.WithOutput(exec.Output()),
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// WorkerInfo contains information about a worker
|
||||||
type WorkerInfo struct {
|
type WorkerInfo struct {
|
||||||
ID string
|
ID string
|
||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
|
@ -18,6 +19,7 @@ type WorkerInfo struct {
|
||||||
GCPolicy []PruneInfo
|
GCPolicy []PruneInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListWorkers lists all active workers
|
||||||
func (c *Client) ListWorkers(ctx context.Context, opts ...ListWorkersOption) ([]*WorkerInfo, error) {
|
func (c *Client) ListWorkers(ctx context.Context, opts ...ListWorkersOption) ([]*WorkerInfo, error) {
|
||||||
info := &ListWorkersInfo{}
|
info := &ListWorkersInfo{}
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
|
@ -44,10 +46,12 @@ func (c *Client) ListWorkers(ctx context.Context, opts ...ListWorkersOption) ([]
|
||||||
return wi, nil
|
return wi, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListWorkersOption is an option for a worker list query
|
||||||
type ListWorkersOption interface {
|
type ListWorkersOption interface {
|
||||||
SetListWorkersOption(*ListWorkersInfo)
|
SetListWorkersOption(*ListWorkersInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListWorkersInfo is a payload for worker list query
|
||||||
type ListWorkersInfo struct {
|
type ListWorkersInfo struct {
|
||||||
Filter []string
|
Filter []string
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,7 +127,7 @@ func (c *Controller) Prune(req *controlapi.PruneRequest, stream controlapi.Contr
|
||||||
ReleaseUnreferenced() error
|
ReleaseUnreferenced() error
|
||||||
}); ok {
|
}); ok {
|
||||||
if err := c.ReleaseUnreferenced(); err != nil {
|
if err := c.ReleaseUnreferenced(); err != nil {
|
||||||
logrus.Errorf("failed to release cache metadata: %+v")
|
logrus.Errorf("failed to release cache metadata: %+v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/containerd/containerd/contrib/seccomp"
|
"github.com/containerd/containerd/contrib/seccomp"
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
|
@ -88,7 +89,7 @@ func New(opt Opt, networkProviders map[pb.NetMode]network.Provider) (executor.Ex
|
||||||
Command: cmd,
|
Command: cmd,
|
||||||
Log: filepath.Join(root, "runc-log.json"),
|
Log: filepath.Join(root, "runc-log.json"),
|
||||||
LogFormat: runc.JSON,
|
LogFormat: runc.JSON,
|
||||||
PdeathSignal: syscall.SIGKILL,
|
PdeathSignal: syscall.SIGKILL, // this can still leak the process
|
||||||
Setpgid: true,
|
Setpgid: true,
|
||||||
// we don't execute runc with --rootless=(true|false) explicitly,
|
// we don't execute runc with --rootless=(true|false) explicitly,
|
||||||
// so as to support non-runc runtimes
|
// so as to support non-runc runtimes
|
||||||
|
@ -220,16 +221,43 @@ func (w *runcExecutor) Exec(ctx context.Context, meta executor.Meta, root cache.
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
forwardIO, err := newForwardIO(stdin, stdout, stderr)
|
// runCtx/killCtx is used for extra check in case the kill command blocks
|
||||||
if err != nil {
|
runCtx, cancelRun := context.WithCancel(context.Background())
|
||||||
return errors.Wrap(err, "creating new forwarding IO")
|
defer cancelRun()
|
||||||
|
|
||||||
|
done := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
killCtx, timeout := context.WithTimeout(context.Background(), 7*time.Second)
|
||||||
|
if err := w.runc.Kill(killCtx, id, int(syscall.SIGKILL), nil); err != nil {
|
||||||
|
logrus.Errorf("failed to kill runc %s: %+v", id, err)
|
||||||
|
select {
|
||||||
|
case <-killCtx.Done():
|
||||||
|
timeout()
|
||||||
|
cancelRun()
|
||||||
|
return
|
||||||
|
default:
|
||||||
}
|
}
|
||||||
defer forwardIO.Close()
|
}
|
||||||
|
timeout()
|
||||||
|
select {
|
||||||
|
case <-time.After(50 * time.Millisecond):
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
logrus.Debugf("> creating %s %v", id, meta.Args)
|
logrus.Debugf("> creating %s %v", id, meta.Args)
|
||||||
status, err := w.runc.Run(ctx, id, bundle, &runc.CreateOpts{
|
status, err := w.runc.Run(runCtx, id, bundle, &runc.CreateOpts{
|
||||||
IO: forwardIO,
|
IO: &forwardIO{stdin: stdin, stdout: stdout, stderr: stderr},
|
||||||
})
|
})
|
||||||
|
close(done)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -242,57 +270,11 @@ func (w *runcExecutor) Exec(ctx context.Context, meta executor.Meta, root cache.
|
||||||
}
|
}
|
||||||
|
|
||||||
type forwardIO struct {
|
type forwardIO struct {
|
||||||
stdin, stdout, stderr *os.File
|
stdin io.ReadCloser
|
||||||
toRelease []io.Closer
|
stdout, stderr io.WriteCloser
|
||||||
toClose []io.Closer
|
|
||||||
}
|
|
||||||
|
|
||||||
func newForwardIO(stdin io.ReadCloser, stdout, stderr io.WriteCloser) (f *forwardIO, err error) {
|
|
||||||
fio := &forwardIO{}
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
fio.Close()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if stdin != nil {
|
|
||||||
fio.stdin, err = fio.readCloserToFile(stdin)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if stdout != nil {
|
|
||||||
fio.stdout, err = fio.writeCloserToFile(stdout)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if stderr != nil {
|
|
||||||
fio.stderr, err = fio.writeCloserToFile(stderr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return fio, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *forwardIO) Close() error {
|
func (s *forwardIO) Close() error {
|
||||||
s.CloseAfterStart()
|
|
||||||
var err error
|
|
||||||
for _, cl := range s.toClose {
|
|
||||||
if err1 := cl.Close(); err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.toClose = nil
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// release releases active FDs if the process doesn't need them any more
|
|
||||||
func (s *forwardIO) CloseAfterStart() error {
|
|
||||||
for _, cl := range s.toRelease {
|
|
||||||
cl.Close()
|
|
||||||
}
|
|
||||||
s.toRelease = nil
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,46 +284,6 @@ func (s *forwardIO) Set(cmd *exec.Cmd) {
|
||||||
cmd.Stderr = s.stderr
|
cmd.Stderr = s.stderr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *forwardIO) readCloserToFile(rc io.ReadCloser) (*os.File, error) {
|
|
||||||
if f, ok := rc.(*os.File); ok {
|
|
||||||
return f, nil
|
|
||||||
}
|
|
||||||
pr, pw, err := os.Pipe()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
s.toClose = append(s.toClose, pw)
|
|
||||||
s.toRelease = append(s.toRelease, pr)
|
|
||||||
go func() {
|
|
||||||
_, err := io.Copy(pw, rc)
|
|
||||||
if err1 := pw.Close(); err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
|
||||||
_ = err
|
|
||||||
}()
|
|
||||||
return pr, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *forwardIO) writeCloserToFile(wc io.WriteCloser) (*os.File, error) {
|
|
||||||
if f, ok := wc.(*os.File); ok {
|
|
||||||
return f, nil
|
|
||||||
}
|
|
||||||
pr, pw, err := os.Pipe()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
s.toClose = append(s.toClose, pr)
|
|
||||||
s.toRelease = append(s.toRelease, pw)
|
|
||||||
go func() {
|
|
||||||
_, err := io.Copy(wc, pr)
|
|
||||||
if err1 := pw.Close(); err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
|
||||||
_ = err
|
|
||||||
}()
|
|
||||||
return pw, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *forwardIO) Stdin() io.WriteCloser {
|
func (s *forwardIO) Stdin() io.WriteCloser {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
40
vendor/github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb/convert.go
сгенерированный
поставляемый
40
vendor/github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb/convert.go
сгенерированный
поставляемый
|
@ -23,6 +23,7 @@ import (
|
||||||
"github.com/moby/buildkit/frontend/dockerfile/shell"
|
"github.com/moby/buildkit/frontend/dockerfile/shell"
|
||||||
gw "github.com/moby/buildkit/frontend/gateway/client"
|
gw "github.com/moby/buildkit/frontend/gateway/client"
|
||||||
"github.com/moby/buildkit/solver/pb"
|
"github.com/moby/buildkit/solver/pb"
|
||||||
|
"github.com/moby/buildkit/util/system"
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
|
@ -133,8 +134,12 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
||||||
}
|
}
|
||||||
ds.platform = &p
|
ds.platform = &p
|
||||||
}
|
}
|
||||||
|
allDispatchStates.addState(ds)
|
||||||
|
|
||||||
total := 1
|
total := 0
|
||||||
|
if ds.stage.BaseName != emptyImageName && ds.base == nil {
|
||||||
|
total = 1
|
||||||
|
}
|
||||||
for _, cmd := range ds.stage.Commands {
|
for _, cmd := range ds.stage.Commands {
|
||||||
switch cmd.(type) {
|
switch cmd.(type) {
|
||||||
case *instructions.AddCommand, *instructions.CopyCommand, *instructions.RunCommand:
|
case *instructions.AddCommand, *instructions.CopyCommand, *instructions.RunCommand:
|
||||||
|
@ -143,7 +148,6 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
||||||
}
|
}
|
||||||
ds.cmdTotal = total
|
ds.cmdTotal = total
|
||||||
|
|
||||||
allDispatchStates.addState(ds)
|
|
||||||
if opt.IgnoreCache != nil {
|
if opt.IgnoreCache != nil {
|
||||||
if len(opt.IgnoreCache) == 0 {
|
if len(opt.IgnoreCache) == 0 {
|
||||||
ds.ignoreCache = true
|
ds.ignoreCache = true
|
||||||
|
@ -215,10 +219,15 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
||||||
d.stage.BaseName = reference.TagNameOnly(ref).String()
|
d.stage.BaseName = reference.TagNameOnly(ref).String()
|
||||||
var isScratch bool
|
var isScratch bool
|
||||||
if metaResolver != nil && reachable && !d.unregistered {
|
if metaResolver != nil && reachable && !d.unregistered {
|
||||||
|
prefix := "["
|
||||||
|
if opt.PrefixPlatform && platform != nil {
|
||||||
|
prefix += platforms.Format(*platform) + " "
|
||||||
|
}
|
||||||
|
prefix += "internal]"
|
||||||
dgst, dt, err := metaResolver.ResolveImageConfig(ctx, d.stage.BaseName, gw.ResolveImageConfigOpt{
|
dgst, dt, err := metaResolver.ResolveImageConfig(ctx, d.stage.BaseName, gw.ResolveImageConfigOpt{
|
||||||
Platform: platform,
|
Platform: platform,
|
||||||
ResolveMode: opt.ImageResolveMode.String(),
|
ResolveMode: opt.ImageResolveMode.String(),
|
||||||
LogName: fmt.Sprintf("[internal] load metadata for %s", d.stage.BaseName),
|
LogName: fmt.Sprintf("%s load metadata for %s", prefix, d.stage.BaseName),
|
||||||
})
|
})
|
||||||
if err == nil { // handle the error while builder is actually running
|
if err == nil { // handle the error while builder is actually running
|
||||||
var img Image
|
var img Image
|
||||||
|
@ -242,6 +251,13 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
||||||
_ = ref
|
_ = ref
|
||||||
if len(img.RootFS.DiffIDs) == 0 {
|
if len(img.RootFS.DiffIDs) == 0 {
|
||||||
isScratch = true
|
isScratch = true
|
||||||
|
// schema1 images can't return diffIDs so double check :(
|
||||||
|
for _, h := range img.History {
|
||||||
|
if !h.EmptyLayer {
|
||||||
|
isScratch = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,6 +290,11 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
||||||
d.image = clone(d.base.image)
|
d.image = clone(d.base.image)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure that PATH is always set
|
||||||
|
if _, ok := shell.BuildEnvs(d.image.Config.Env)["PATH"]; !ok {
|
||||||
|
d.image.Config.Env = append(d.image.Config.Env, "PATH="+system.DefaultPathEnv)
|
||||||
|
}
|
||||||
|
|
||||||
// initialize base metadata from image conf
|
// initialize base metadata from image conf
|
||||||
for _, env := range d.image.Config.Env {
|
for _, env := range d.image.Config.Env {
|
||||||
k, v := parseKeyValue(env)
|
k, v := parseKeyValue(env)
|
||||||
|
@ -689,16 +710,17 @@ func dispatchCopy(d *dispatchState, c instructions.SourcesAndDest, sourceState l
|
||||||
args = append(args[:1], append([]string{"--unpack"}, args[1:]...)...)
|
args = append(args[:1], append([]string{"--unpack"}, args[1:]...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
runOpt := []llb.RunOption{llb.Args(args), llb.Dir("/dest"), llb.ReadonlyRootFS(), dfCmd(cmdToPrint), llb.WithCustomName(prefixCommand(d, uppercaseCmd(processCmdEnv(opt.shlex, cmdToPrint.String(), d.state.Env())), d.prefixPlatform, d.state.GetPlatform()))}
|
platform := opt.targetPlatform
|
||||||
|
if d.platform != nil {
|
||||||
|
platform = *d.platform
|
||||||
|
}
|
||||||
|
|
||||||
|
runOpt := []llb.RunOption{llb.Args(args), llb.Dir("/dest"), llb.ReadonlyRootFS(), dfCmd(cmdToPrint), llb.WithCustomName(prefixCommand(d, uppercaseCmd(processCmdEnv(opt.shlex, cmdToPrint.String(), d.state.Env())), d.prefixPlatform, &platform))}
|
||||||
if d.ignoreCache {
|
if d.ignoreCache {
|
||||||
runOpt = append(runOpt, llb.IgnoreCache)
|
runOpt = append(runOpt, llb.IgnoreCache)
|
||||||
}
|
}
|
||||||
run := img.Run(append(runOpt, mounts...)...)
|
run := img.Run(append(runOpt, mounts...)...)
|
||||||
d.state = run.AddMount("/dest", d.state).Platform(opt.targetPlatform)
|
d.state = run.AddMount("/dest", d.state).Platform(platform)
|
||||||
|
|
||||||
if d.platform != nil {
|
|
||||||
d.state = d.state.Platform(*d.platform)
|
|
||||||
}
|
|
||||||
|
|
||||||
return commitToHistory(&d.image, commitMessage.String(), true, &d.state)
|
return commitToHistory(&d.image, commitMessage.String(), true, &d.state)
|
||||||
}
|
}
|
||||||
|
|
7
vendor/github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb/convert_runmount.go
сгенерированный
поставляемый
7
vendor/github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb/convert_runmount.go
сгенерированный
поставляемый
|
@ -78,9 +78,12 @@ func dispatchRunMounts(d *dispatchState, c *instructions.RunCommand, sources []*
|
||||||
}
|
}
|
||||||
mountOpts = append(mountOpts, llb.AsPersistentCacheDir(opt.cacheIDNamespace+"/"+mount.CacheID, sharing))
|
mountOpts = append(mountOpts, llb.AsPersistentCacheDir(opt.cacheIDNamespace+"/"+mount.CacheID, sharing))
|
||||||
}
|
}
|
||||||
target := path.Join("/", mount.Target)
|
target := mount.Target
|
||||||
|
if !filepath.IsAbs(filepath.Clean(mount.Target)) {
|
||||||
|
target = filepath.Join("/", d.state.GetDir(), mount.Target)
|
||||||
|
}
|
||||||
if target == "/" {
|
if target == "/" {
|
||||||
return nil, errors.Errorf("invalid mount target %q", mount.Target)
|
return nil, errors.Errorf("invalid mount target %q", target)
|
||||||
}
|
}
|
||||||
if src := path.Join("/", mount.Source); src != "/" {
|
if src := path.Join("/", mount.Source); src != "/" {
|
||||||
mountOpts = append(mountOpts, llb.SourcePath(src))
|
mountOpts = append(mountOpts, llb.SourcePath(src))
|
||||||
|
|
1
vendor/github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb/image.go
сгенерированный
поставляемый
1
vendor/github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb/image.go
сгенерированный
поставляемый
|
@ -29,6 +29,7 @@ type HealthConfig struct {
|
||||||
Retries int `json:",omitempty"`
|
Retries int `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ImageConfig is a docker compatible config for an image
|
||||||
type ImageConfig struct {
|
type ImageConfig struct {
|
||||||
specs.ImageConfig
|
specs.ImageConfig
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Hijack hijacks session to a connection.
|
||||||
func Hijack(stream controlapi.Control_SessionServer) (net.Conn, <-chan struct{}, map[string][]string) {
|
func Hijack(stream controlapi.Control_SessionServer) (net.Conn, <-chan struct{}, map[string][]string) {
|
||||||
md, _ := metadata.FromIncomingContext(stream.Context())
|
md, _ := metadata.FromIncomingContext(stream.Context())
|
||||||
c, closeCh := streamToConn(stream)
|
c, closeCh := streamToConn(stream)
|
||||||
|
|
61
vendor/github.com/moby/buildkit/session/sshforward/copy.go
сгенерированный
поставляемый
Normal file
61
vendor/github.com/moby/buildkit/session/sshforward/copy.go
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
package sshforward
|
||||||
|
|
||||||
|
import (
|
||||||
|
io "io"
|
||||||
|
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Copy(ctx context.Context, conn io.ReadWriteCloser, stream grpc.Stream) error {
|
||||||
|
g, ctx := errgroup.WithContext(ctx)
|
||||||
|
|
||||||
|
g.Go(func() (retErr error) {
|
||||||
|
p := &BytesMessage{}
|
||||||
|
for {
|
||||||
|
if err := stream.RecvMsg(p); err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
conn.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
conn.Close()
|
||||||
|
return ctx.Err()
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
if _, err := conn.Write(p.Data); err != nil {
|
||||||
|
conn.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
p.Data = p.Data[:0]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
g.Go(func() (retErr error) {
|
||||||
|
for {
|
||||||
|
buf := make([]byte, 32*1024)
|
||||||
|
n, err := conn.Read(buf)
|
||||||
|
switch {
|
||||||
|
case err == io.EOF:
|
||||||
|
return nil
|
||||||
|
case err != nil:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
p := &BytesMessage{Data: buf[:n]}
|
||||||
|
if err := stream.SendMsg(p); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return g.Wait()
|
||||||
|
}
|
3
vendor/github.com/moby/buildkit/session/sshforward/generate.go
сгенерированный
поставляемый
Normal file
3
vendor/github.com/moby/buildkit/session/sshforward/generate.go
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package sshforward
|
||||||
|
|
||||||
|
//go:generate protoc --gogoslick_out=plugins=grpc:. ssh.proto
|
113
vendor/github.com/moby/buildkit/session/sshforward/ssh.go
сгенерированный
поставляемый
Normal file
113
vendor/github.com/moby/buildkit/session/sshforward/ssh.go
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
package sshforward
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/moby/buildkit/session"
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultID is the default ssh ID
|
||||||
|
const DefaultID = "default"
|
||||||
|
|
||||||
|
const KeySSHID = "buildkit.ssh.id"
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
caller session.Caller
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) run(ctx context.Context, l net.Listener, id string) error {
|
||||||
|
eg, ctx := errgroup.WithContext(ctx)
|
||||||
|
|
||||||
|
eg.Go(func() error {
|
||||||
|
<-ctx.Done()
|
||||||
|
return ctx.Err()
|
||||||
|
})
|
||||||
|
|
||||||
|
eg.Go(func() error {
|
||||||
|
for {
|
||||||
|
conn, err := l.Accept()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
client := NewSSHClient(s.caller.Conn())
|
||||||
|
|
||||||
|
opts := make(map[string][]string)
|
||||||
|
opts[KeySSHID] = []string{id}
|
||||||
|
ctx = metadata.NewOutgoingContext(ctx, opts)
|
||||||
|
|
||||||
|
stream, err := client.ForwardAgent(ctx)
|
||||||
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
go Copy(ctx, conn, stream)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return eg.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
type SocketOpt struct {
|
||||||
|
ID string
|
||||||
|
UID int
|
||||||
|
GID int
|
||||||
|
Mode int
|
||||||
|
}
|
||||||
|
|
||||||
|
func MountSSHSocket(ctx context.Context, c session.Caller, opt SocketOpt) (sockPath string, closer func() error, err error) {
|
||||||
|
dir, err := ioutil.TempDir("", ".buildkit-ssh-sock")
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
os.RemoveAll(dir)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
sockPath = filepath.Join(dir, "ssh_auth_sock")
|
||||||
|
|
||||||
|
l, err := net.Listen("unix", sockPath)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Chown(sockPath, opt.UID, opt.GID); err != nil {
|
||||||
|
l.Close()
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
if err := os.Chmod(sockPath, os.FileMode(opt.Mode)); err != nil {
|
||||||
|
l.Close()
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
s := &server{caller: c}
|
||||||
|
|
||||||
|
id := opt.ID
|
||||||
|
if id == "" {
|
||||||
|
id = DefaultID
|
||||||
|
}
|
||||||
|
|
||||||
|
go s.run(ctx, l, id) // erroring per connection allowed
|
||||||
|
|
||||||
|
return sockPath, func() error {
|
||||||
|
err := l.Close()
|
||||||
|
os.RemoveAll(sockPath)
|
||||||
|
return err
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckSSHID(ctx context.Context, c session.Caller, id string) error {
|
||||||
|
client := NewSSHClient(c.Conn())
|
||||||
|
_, err := client.CheckAgent(ctx, &CheckAgentRequest{ID: id})
|
||||||
|
return err
|
||||||
|
}
|
816
vendor/github.com/moby/buildkit/session/sshforward/ssh.pb.go
сгенерированный
поставляемый
Normal file
816
vendor/github.com/moby/buildkit/session/sshforward/ssh.pb.go
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,816 @@
|
||||||
|
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||||
|
// source: ssh.proto
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package sshforward is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
ssh.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
BytesMessage
|
||||||
|
CheckAgentRequest
|
||||||
|
CheckAgentResponse
|
||||||
|
*/
|
||||||
|
package sshforward
|
||||||
|
|
||||||
|
import proto "github.com/gogo/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
import bytes "bytes"
|
||||||
|
|
||||||
|
import strings "strings"
|
||||||
|
import reflect "reflect"
|
||||||
|
|
||||||
|
import context "golang.org/x/net/context"
|
||||||
|
import grpc "google.golang.org/grpc"
|
||||||
|
|
||||||
|
import io "io"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
// BytesMessage contains a chunk of byte data
|
||||||
|
type BytesMessage struct {
|
||||||
|
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *BytesMessage) Reset() { *m = BytesMessage{} }
|
||||||
|
func (*BytesMessage) ProtoMessage() {}
|
||||||
|
func (*BytesMessage) Descriptor() ([]byte, []int) { return fileDescriptorSsh, []int{0} }
|
||||||
|
|
||||||
|
func (m *BytesMessage) GetData() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Data
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type CheckAgentRequest struct {
|
||||||
|
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentRequest) Reset() { *m = CheckAgentRequest{} }
|
||||||
|
func (*CheckAgentRequest) ProtoMessage() {}
|
||||||
|
func (*CheckAgentRequest) Descriptor() ([]byte, []int) { return fileDescriptorSsh, []int{1} }
|
||||||
|
|
||||||
|
func (m *CheckAgentRequest) GetID() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ID
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type CheckAgentResponse struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentResponse) Reset() { *m = CheckAgentResponse{} }
|
||||||
|
func (*CheckAgentResponse) ProtoMessage() {}
|
||||||
|
func (*CheckAgentResponse) Descriptor() ([]byte, []int) { return fileDescriptorSsh, []int{2} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*BytesMessage)(nil), "moby.sshforward.v1.BytesMessage")
|
||||||
|
proto.RegisterType((*CheckAgentRequest)(nil), "moby.sshforward.v1.CheckAgentRequest")
|
||||||
|
proto.RegisterType((*CheckAgentResponse)(nil), "moby.sshforward.v1.CheckAgentResponse")
|
||||||
|
}
|
||||||
|
func (this *BytesMessage) Equal(that interface{}) bool {
|
||||||
|
if that == nil {
|
||||||
|
return this == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*BytesMessage)
|
||||||
|
if !ok {
|
||||||
|
that2, ok := that.(BytesMessage)
|
||||||
|
if ok {
|
||||||
|
that1 = &that2
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
return this == nil
|
||||||
|
} else if this == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !bytes.Equal(this.Data, that1.Data) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (this *CheckAgentRequest) Equal(that interface{}) bool {
|
||||||
|
if that == nil {
|
||||||
|
return this == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*CheckAgentRequest)
|
||||||
|
if !ok {
|
||||||
|
that2, ok := that.(CheckAgentRequest)
|
||||||
|
if ok {
|
||||||
|
that1 = &that2
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
return this == nil
|
||||||
|
} else if this == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if this.ID != that1.ID {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (this *CheckAgentResponse) Equal(that interface{}) bool {
|
||||||
|
if that == nil {
|
||||||
|
return this == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
that1, ok := that.(*CheckAgentResponse)
|
||||||
|
if !ok {
|
||||||
|
that2, ok := that.(CheckAgentResponse)
|
||||||
|
if ok {
|
||||||
|
that1 = &that2
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if that1 == nil {
|
||||||
|
return this == nil
|
||||||
|
} else if this == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (this *BytesMessage) GoString() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := make([]string, 0, 5)
|
||||||
|
s = append(s, "&sshforward.BytesMessage{")
|
||||||
|
s = append(s, "Data: "+fmt.Sprintf("%#v", this.Data)+",\n")
|
||||||
|
s = append(s, "}")
|
||||||
|
return strings.Join(s, "")
|
||||||
|
}
|
||||||
|
func (this *CheckAgentRequest) GoString() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := make([]string, 0, 5)
|
||||||
|
s = append(s, "&sshforward.CheckAgentRequest{")
|
||||||
|
s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n")
|
||||||
|
s = append(s, "}")
|
||||||
|
return strings.Join(s, "")
|
||||||
|
}
|
||||||
|
func (this *CheckAgentResponse) GoString() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := make([]string, 0, 4)
|
||||||
|
s = append(s, "&sshforward.CheckAgentResponse{")
|
||||||
|
s = append(s, "}")
|
||||||
|
return strings.Join(s, "")
|
||||||
|
}
|
||||||
|
func valueToGoStringSsh(v interface{}, typ string) string {
|
||||||
|
rv := reflect.ValueOf(v)
|
||||||
|
if rv.IsNil() {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
pv := reflect.Indirect(rv).Interface()
|
||||||
|
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ context.Context
|
||||||
|
var _ grpc.ClientConn
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the grpc package it is being compiled against.
|
||||||
|
const _ = grpc.SupportPackageIsVersion4
|
||||||
|
|
||||||
|
// Client API for SSH service
|
||||||
|
|
||||||
|
type SSHClient interface {
|
||||||
|
CheckAgent(ctx context.Context, in *CheckAgentRequest, opts ...grpc.CallOption) (*CheckAgentResponse, error)
|
||||||
|
ForwardAgent(ctx context.Context, opts ...grpc.CallOption) (SSH_ForwardAgentClient, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sSHClient struct {
|
||||||
|
cc *grpc.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSSHClient(cc *grpc.ClientConn) SSHClient {
|
||||||
|
return &sSHClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *sSHClient) CheckAgent(ctx context.Context, in *CheckAgentRequest, opts ...grpc.CallOption) (*CheckAgentResponse, error) {
|
||||||
|
out := new(CheckAgentResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/moby.sshforward.v1.SSH/CheckAgent", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *sSHClient) ForwardAgent(ctx context.Context, opts ...grpc.CallOption) (SSH_ForwardAgentClient, error) {
|
||||||
|
stream, err := grpc.NewClientStream(ctx, &_SSH_serviceDesc.Streams[0], c.cc, "/moby.sshforward.v1.SSH/ForwardAgent", opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
x := &sSHForwardAgentClient{stream}
|
||||||
|
return x, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type SSH_ForwardAgentClient interface {
|
||||||
|
Send(*BytesMessage) error
|
||||||
|
Recv() (*BytesMessage, error)
|
||||||
|
grpc.ClientStream
|
||||||
|
}
|
||||||
|
|
||||||
|
type sSHForwardAgentClient struct {
|
||||||
|
grpc.ClientStream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *sSHForwardAgentClient) Send(m *BytesMessage) error {
|
||||||
|
return x.ClientStream.SendMsg(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *sSHForwardAgentClient) Recv() (*BytesMessage, error) {
|
||||||
|
m := new(BytesMessage)
|
||||||
|
if err := x.ClientStream.RecvMsg(m); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for SSH service
|
||||||
|
|
||||||
|
type SSHServer interface {
|
||||||
|
CheckAgent(context.Context, *CheckAgentRequest) (*CheckAgentResponse, error)
|
||||||
|
ForwardAgent(SSH_ForwardAgentServer) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterSSHServer(s *grpc.Server, srv SSHServer) {
|
||||||
|
s.RegisterService(&_SSH_serviceDesc, srv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SSH_CheckAgent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(CheckAgentRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SSHServer).CheckAgent(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/moby.sshforward.v1.SSH/CheckAgent",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SSHServer).CheckAgent(ctx, req.(*CheckAgentRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SSH_ForwardAgent_Handler(srv interface{}, stream grpc.ServerStream) error {
|
||||||
|
return srv.(SSHServer).ForwardAgent(&sSHForwardAgentServer{stream})
|
||||||
|
}
|
||||||
|
|
||||||
|
type SSH_ForwardAgentServer interface {
|
||||||
|
Send(*BytesMessage) error
|
||||||
|
Recv() (*BytesMessage, error)
|
||||||
|
grpc.ServerStream
|
||||||
|
}
|
||||||
|
|
||||||
|
type sSHForwardAgentServer struct {
|
||||||
|
grpc.ServerStream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *sSHForwardAgentServer) Send(m *BytesMessage) error {
|
||||||
|
return x.ServerStream.SendMsg(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *sSHForwardAgentServer) Recv() (*BytesMessage, error) {
|
||||||
|
m := new(BytesMessage)
|
||||||
|
if err := x.ServerStream.RecvMsg(m); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var _SSH_serviceDesc = grpc.ServiceDesc{
|
||||||
|
ServiceName: "moby.sshforward.v1.SSH",
|
||||||
|
HandlerType: (*SSHServer)(nil),
|
||||||
|
Methods: []grpc.MethodDesc{
|
||||||
|
{
|
||||||
|
MethodName: "CheckAgent",
|
||||||
|
Handler: _SSH_CheckAgent_Handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Streams: []grpc.StreamDesc{
|
||||||
|
{
|
||||||
|
StreamName: "ForwardAgent",
|
||||||
|
Handler: _SSH_ForwardAgent_Handler,
|
||||||
|
ServerStreams: true,
|
||||||
|
ClientStreams: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Metadata: "ssh.proto",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *BytesMessage) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalTo(dAtA)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *BytesMessage) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Data) > 0 {
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
i++
|
||||||
|
i = encodeVarintSsh(dAtA, i, uint64(len(m.Data)))
|
||||||
|
i += copy(dAtA[i:], m.Data)
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentRequest) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalTo(dAtA)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentRequest) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.ID) > 0 {
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
i++
|
||||||
|
i = encodeVarintSsh(dAtA, i, uint64(len(m.ID)))
|
||||||
|
i += copy(dAtA[i:], m.ID)
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentResponse) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalTo(dAtA)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentResponse) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeVarintSsh(dAtA []byte, offset int, v uint64) int {
|
||||||
|
for v >= 1<<7 {
|
||||||
|
dAtA[offset] = uint8(v&0x7f | 0x80)
|
||||||
|
v >>= 7
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
dAtA[offset] = uint8(v)
|
||||||
|
return offset + 1
|
||||||
|
}
|
||||||
|
func (m *BytesMessage) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.Data)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovSsh(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentRequest) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.ID)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovSsh(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CheckAgentResponse) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovSsh(x uint64) (n int) {
|
||||||
|
for {
|
||||||
|
n++
|
||||||
|
x >>= 7
|
||||||
|
if x == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
func sozSsh(x uint64) (n int) {
|
||||||
|
return sovSsh(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func (this *BytesMessage) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&BytesMessage{`,
|
||||||
|
`Data:` + fmt.Sprintf("%v", this.Data) + `,`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func (this *CheckAgentRequest) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&CheckAgentRequest{`,
|
||||||
|
`ID:` + fmt.Sprintf("%v", this.ID) + `,`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func (this *CheckAgentResponse) String() string {
|
||||||
|
if this == nil {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
s := strings.Join([]string{`&CheckAgentResponse{`,
|
||||||
|
`}`,
|
||||||
|
}, "")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func valueToStringSsh(v interface{}) string {
|
||||||
|
rv := reflect.ValueOf(v)
|
||||||
|
if rv.IsNil() {
|
||||||
|
return "nil"
|
||||||
|
}
|
||||||
|
pv := reflect.Indirect(rv).Interface()
|
||||||
|
return fmt.Sprintf("*%v", pv)
|
||||||
|
}
|
||||||
|
func (m *BytesMessage) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: BytesMessage: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: BytesMessage: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthSsh
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.Data == nil {
|
||||||
|
m.Data = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipSsh(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthSsh
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *CheckAgentRequest) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: CheckAgentRequest: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: CheckAgentRequest: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
stringLen |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
intStringLen := int(stringLen)
|
||||||
|
if intStringLen < 0 {
|
||||||
|
return ErrInvalidLengthSsh
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.ID = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipSsh(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthSsh
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *CheckAgentResponse) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: CheckAgentResponse: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: CheckAgentResponse: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipSsh(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthSsh
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func skipSsh(dAtA []byte) (n int, err error) {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
switch wireType {
|
||||||
|
case 0:
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx++
|
||||||
|
if dAtA[iNdEx-1] < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return iNdEx, nil
|
||||||
|
case 1:
|
||||||
|
iNdEx += 8
|
||||||
|
return iNdEx, nil
|
||||||
|
case 2:
|
||||||
|
var length int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
length |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iNdEx += length
|
||||||
|
if length < 0 {
|
||||||
|
return 0, ErrInvalidLengthSsh
|
||||||
|
}
|
||||||
|
return iNdEx, nil
|
||||||
|
case 3:
|
||||||
|
for {
|
||||||
|
var innerWire uint64
|
||||||
|
var start int = iNdEx
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowSsh
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
innerWire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
innerWireType := int(innerWire & 0x7)
|
||||||
|
if innerWireType == 4 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
next, err := skipSsh(dAtA[start:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
iNdEx = start + next
|
||||||
|
}
|
||||||
|
return iNdEx, nil
|
||||||
|
case 4:
|
||||||
|
return iNdEx, nil
|
||||||
|
case 5:
|
||||||
|
iNdEx += 4
|
||||||
|
return iNdEx, nil
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic("unreachable")
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidLengthSsh = fmt.Errorf("proto: negative length found during unmarshaling")
|
||||||
|
ErrIntOverflowSsh = fmt.Errorf("proto: integer overflow")
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("ssh.proto", fileDescriptorSsh) }
|
||||||
|
|
||||||
|
var fileDescriptorSsh = []byte{
|
||||||
|
// 243 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2c, 0x2e, 0xce, 0xd0,
|
||||||
|
0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0xca, 0xcd, 0x4f, 0xaa, 0xd4, 0x2b, 0x2e, 0xce, 0x48,
|
||||||
|
0xcb, 0x2f, 0x2a, 0x4f, 0x2c, 0x4a, 0xd1, 0x2b, 0x33, 0x54, 0x52, 0xe2, 0xe2, 0x71, 0xaa, 0x2c,
|
||||||
|
0x49, 0x2d, 0xf6, 0x4d, 0x2d, 0x2e, 0x4e, 0x4c, 0x4f, 0x15, 0x12, 0xe2, 0x62, 0x49, 0x49, 0x2c,
|
||||||
|
0x49, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x09, 0x02, 0xb3, 0x95, 0x94, 0xb9, 0x04, 0x9d, 0x33,
|
||||||
|
0x52, 0x93, 0xb3, 0x1d, 0xd3, 0x53, 0xf3, 0x4a, 0x82, 0x52, 0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x84,
|
||||||
|
0xf8, 0xb8, 0x98, 0x3c, 0x5d, 0xc0, 0xca, 0x38, 0x83, 0x98, 0x3c, 0x5d, 0x94, 0x44, 0xb8, 0x84,
|
||||||
|
0x90, 0x15, 0x15, 0x17, 0xe4, 0xe7, 0x15, 0xa7, 0x1a, 0xed, 0x62, 0xe4, 0x62, 0x0e, 0x0e, 0xf6,
|
||||||
|
0x10, 0x8a, 0xe6, 0xe2, 0x42, 0xc8, 0x0a, 0xa9, 0xea, 0x61, 0xba, 0x44, 0x0f, 0xc3, 0x0a, 0x29,
|
||||||
|
0x35, 0x42, 0xca, 0x20, 0x96, 0x08, 0x85, 0x71, 0xf1, 0xb8, 0x41, 0x14, 0x40, 0x8c, 0x57, 0xc0,
|
||||||
|
0xa6, 0x0f, 0xd9, 0x97, 0x52, 0x04, 0x55, 0x68, 0x30, 0x1a, 0x30, 0x3a, 0x59, 0x5c, 0x78, 0x28,
|
||||||
|
0xc7, 0x70, 0xe3, 0xa1, 0x1c, 0xc3, 0x87, 0x87, 0x72, 0x8c, 0x0d, 0x8f, 0xe4, 0x18, 0x57, 0x3c,
|
||||||
|
0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x5f,
|
||||||
|
0x3c, 0x92, 0x63, 0xf8, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x28, 0x2e, 0x84, 0x69,
|
||||||
|
0x49, 0x6c, 0xe0, 0x00, 0x37, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x31, 0x3e, 0x40, 0xab, 0x7d,
|
||||||
|
0x01, 0x00, 0x00,
|
||||||
|
}
|
22
vendor/github.com/moby/buildkit/session/sshforward/ssh.proto
сгенерированный
поставляемый
Normal file
22
vendor/github.com/moby/buildkit/session/sshforward/ssh.proto
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package moby.sshforward.v1;
|
||||||
|
|
||||||
|
option go_package = "sshforward";
|
||||||
|
|
||||||
|
service SSH {
|
||||||
|
rpc CheckAgent(CheckAgentRequest) returns (CheckAgentResponse);
|
||||||
|
rpc ForwardAgent(stream BytesMessage) returns (stream BytesMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesMessage contains a chunk of byte data
|
||||||
|
message BytesMessage{
|
||||||
|
bytes data = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CheckAgentRequest {
|
||||||
|
string ID = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CheckAgentResponse {
|
||||||
|
}
|
|
@ -3,13 +3,13 @@ package blobmapping
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/containerd/containerd/content"
|
"github.com/containerd/containerd/content"
|
||||||
"github.com/containerd/containerd/snapshots"
|
"github.com/containerd/containerd/snapshots"
|
||||||
"github.com/moby/buildkit/cache/metadata"
|
"github.com/moby/buildkit/cache/metadata"
|
||||||
"github.com/moby/buildkit/snapshot"
|
"github.com/moby/buildkit/snapshot"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
const blobKey = "blobmapping.blob"
|
const blobKey = "blobmapping.blob"
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
package boltdbcachestorage
|
package bboltcachestorage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/moby/buildkit/solver"
|
"github.com/moby/buildkit/solver"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
|
@ -10,12 +10,12 @@ import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CacheID string
|
// NewInMemoryCacheManager creates a new in-memory cache manager
|
||||||
|
|
||||||
func NewInMemoryCacheManager() CacheManager {
|
func NewInMemoryCacheManager() CacheManager {
|
||||||
return NewCacheManager(identity.NewID(), NewInMemoryCacheStorage(), NewInMemoryResultStorage())
|
return NewCacheManager(identity.NewID(), NewInMemoryCacheStorage(), NewInMemoryResultStorage())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewCacheManager creates a new cache manager with specific storage backend
|
||||||
func NewCacheManager(id string, storage CacheKeyStorage, results CacheResultStorage) CacheManager {
|
func NewCacheManager(id string, storage CacheKeyStorage, results CacheResultStorage) CacheManager {
|
||||||
cm := &cacheManager{
|
cm := &cacheManager{
|
||||||
id: id,
|
id: id,
|
||||||
|
|
|
@ -26,7 +26,7 @@ type Builder interface {
|
||||||
|
|
||||||
// Solver provides a shared graph of all the vertexes currently being
|
// Solver provides a shared graph of all the vertexes currently being
|
||||||
// processed. Every vertex that is being solved needs to be loaded into job
|
// processed. Every vertex that is being solved needs to be loaded into job
|
||||||
// first. Vertex operations are invoked and progress tracking happends through
|
// first. Vertex operations are invoked and progress tracking happens through
|
||||||
// jobs.
|
// jobs.
|
||||||
type Solver struct {
|
type Solver struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/platforms"
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/moby/buildkit/cache"
|
"github.com/moby/buildkit/cache"
|
||||||
"github.com/moby/buildkit/cache/remotecache"
|
"github.com/moby/buildkit/cache/remotecache"
|
||||||
|
@ -49,7 +50,7 @@ func (b *llbBridge) Solve(ctx context.Context, req frontend.SolveRequest) (res *
|
||||||
func(ref string) {
|
func(ref string) {
|
||||||
cm = newLazyCacheManager(ref, func() (solver.CacheManager, error) {
|
cm = newLazyCacheManager(ref, func() (solver.CacheManager, error) {
|
||||||
var cmNew solver.CacheManager
|
var cmNew solver.CacheManager
|
||||||
if err := inVertexContext(b.builder.Context(ctx), "importing cache manifest from "+ref, func(ctx context.Context) error {
|
if err := inVertexContext(b.builder.Context(ctx), "importing cache manifest from "+ref, "", func(ctx context.Context) error {
|
||||||
if b.resolveCacheImporter == nil {
|
if b.resolveCacheImporter == nil {
|
||||||
return errors.New("no cache importer is available")
|
return errors.New("no cache importer is available")
|
||||||
}
|
}
|
||||||
|
@ -143,7 +144,13 @@ func (s *llbBridge) ResolveImageConfig(ctx context.Context, ref string, opt gw.R
|
||||||
if opt.LogName == "" {
|
if opt.LogName == "" {
|
||||||
opt.LogName = fmt.Sprintf("resolve image config for %s", ref)
|
opt.LogName = fmt.Sprintf("resolve image config for %s", ref)
|
||||||
}
|
}
|
||||||
err = inVertexContext(s.builder.Context(ctx), opt.LogName, func(ctx context.Context) error {
|
id := ref // make a deterministic ID for avoiding duplicates
|
||||||
|
if platform := opt.Platform; platform == nil {
|
||||||
|
id += platforms.Format(platforms.DefaultSpec())
|
||||||
|
} else {
|
||||||
|
id += platforms.Format(*platform)
|
||||||
|
}
|
||||||
|
err = inVertexContext(s.builder.Context(ctx), opt.LogName, id, func(ctx context.Context) error {
|
||||||
dgst, config, err = w.ResolveImageConfig(ctx, ref, opt)
|
dgst, config, err = w.ResolveImageConfig(ctx, ref, opt)
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,7 +16,6 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/containerd/containerd/mount"
|
"github.com/containerd/containerd/mount"
|
||||||
"github.com/docker/docker/pkg/locker"
|
"github.com/docker/docker/pkg/locker"
|
||||||
"github.com/moby/buildkit/cache"
|
"github.com/moby/buildkit/cache"
|
||||||
|
@ -26,6 +25,7 @@ import (
|
||||||
"github.com/moby/buildkit/identity"
|
"github.com/moby/buildkit/identity"
|
||||||
"github.com/moby/buildkit/session"
|
"github.com/moby/buildkit/session"
|
||||||
"github.com/moby/buildkit/session/secrets"
|
"github.com/moby/buildkit/session/secrets"
|
||||||
|
"github.com/moby/buildkit/session/sshforward"
|
||||||
"github.com/moby/buildkit/snapshot"
|
"github.com/moby/buildkit/snapshot"
|
||||||
"github.com/moby/buildkit/solver"
|
"github.com/moby/buildkit/solver"
|
||||||
"github.com/moby/buildkit/solver/llbsolver"
|
"github.com/moby/buildkit/solver/llbsolver"
|
||||||
|
@ -36,6 +36,9 @@ import (
|
||||||
"github.com/opencontainers/runc/libcontainer/system"
|
"github.com/opencontainers/runc/libcontainer/system"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
const execCacheType = "buildkit.exec.v0"
|
const execCacheType = "buildkit.exec.v0"
|
||||||
|
@ -279,6 +282,85 @@ func (e *execOp) getRefCacheDirNoCache(ctx context.Context, key string, ref cach
|
||||||
return mRef, nil
|
return mRef, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *execOp) getSSHMountable(ctx context.Context, m *pb.Mount) (cache.Mountable, error) {
|
||||||
|
sessionID := session.FromContext(ctx)
|
||||||
|
if sessionID == "" {
|
||||||
|
return nil, errors.New("could not access local files without session")
|
||||||
|
}
|
||||||
|
|
||||||
|
timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
caller, err := e.sm.Get(timeoutCtx, sessionID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sshforward.CheckSSHID(ctx, caller, m.SSHOpt.ID); err != nil {
|
||||||
|
if m.SSHOpt.Optional {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if st, ok := status.FromError(err); ok && st.Code() == codes.Unimplemented {
|
||||||
|
return nil, errors.Errorf("no ssh forwarded from the client")
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &sshMount{mount: m, caller: caller}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type sshMount struct {
|
||||||
|
mount *pb.Mount
|
||||||
|
caller session.Caller
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *sshMount) Mount(ctx context.Context, readonly bool) (snapshot.Mountable, error) {
|
||||||
|
return &sshMountInstance{sm: sm}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type sshMountInstance struct {
|
||||||
|
sm *sshMount
|
||||||
|
cleanup func() error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *sshMountInstance) Mount() ([]mount.Mount, error) {
|
||||||
|
ctx, cancel := context.WithCancel(context.TODO())
|
||||||
|
|
||||||
|
sock, cleanup, err := sshforward.MountSSHSocket(ctx, sm.sm.caller, sshforward.SocketOpt{
|
||||||
|
ID: sm.sm.mount.SSHOpt.ID,
|
||||||
|
UID: int(sm.sm.mount.SSHOpt.Uid),
|
||||||
|
GID: int(sm.sm.mount.SSHOpt.Gid),
|
||||||
|
Mode: int(sm.sm.mount.SSHOpt.Mode),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
cancel()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
sm.cleanup = func() error {
|
||||||
|
var err error
|
||||||
|
if cleanup != nil {
|
||||||
|
err = cleanup()
|
||||||
|
}
|
||||||
|
cancel()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return []mount.Mount{{
|
||||||
|
Type: "bind",
|
||||||
|
Source: sock,
|
||||||
|
Options: []string{"rbind"},
|
||||||
|
}}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *sshMountInstance) Release() error {
|
||||||
|
if sm.cleanup != nil {
|
||||||
|
if err := sm.cleanup(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (e *execOp) getSecretMountable(ctx context.Context, m *pb.Mount) (cache.Mountable, error) {
|
func (e *execOp) getSecretMountable(ctx context.Context, m *pb.Mount) (cache.Mountable, error) {
|
||||||
if m.SecretOpt == nil {
|
if m.SecretOpt == nil {
|
||||||
return nil, errors.Errorf("invalid sercet mount options")
|
return nil, errors.Errorf("invalid sercet mount options")
|
||||||
|
@ -482,6 +564,17 @@ func (e *execOp) Exec(ctx context.Context, inputs []solver.Result) ([]solver.Res
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
mountable = secretMount
|
mountable = secretMount
|
||||||
|
|
||||||
|
case pb.MountType_SSH:
|
||||||
|
sshMount, err := e.getSSHMountable(ctx, m)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if sshMount == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
mountable = sshMount
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("mount type %s not implemented", m.MountType)
|
return nil, errors.Errorf("mount type %s not implemented", m.MountType)
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,7 @@ func (s *Solver) Solve(ctx context.Context, id string, req frontend.SolveRequest
|
||||||
inp.Refs = m
|
inp.Refs = m
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := inVertexContext(j.Context(ctx), exp.Name(), func(ctx context.Context) error {
|
if err := inVertexContext(j.Context(ctx), exp.Name(), "", func(ctx context.Context) error {
|
||||||
exporterResponse, err = exp.Export(ctx, inp)
|
exporterResponse, err = exp.Export(ctx, inp)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
|
@ -177,7 +177,7 @@ func (s *Solver) Solve(ctx context.Context, id string, req frontend.SolveRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
if e := exp.CacheExporter; e != nil {
|
if e := exp.CacheExporter; e != nil {
|
||||||
if err := inVertexContext(j.Context(ctx), "exporting cache", func(ctx context.Context) error {
|
if err := inVertexContext(j.Context(ctx), "exporting cache", "", func(ctx context.Context) error {
|
||||||
prepareDone := oneOffProgress(ctx, "preparing build cache for export")
|
prepareDone := oneOffProgress(ctx, "preparing build cache for export")
|
||||||
if err := res.EachRef(func(res solver.CachedResult) error {
|
if err := res.EachRef(func(res solver.CachedResult) error {
|
||||||
// all keys have same export chain so exporting others is not needed
|
// all keys have same export chain so exporting others is not needed
|
||||||
|
@ -243,9 +243,12 @@ func oneOffProgress(ctx context.Context, id string) func(err error) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func inVertexContext(ctx context.Context, name string, f func(ctx context.Context) error) error {
|
func inVertexContext(ctx context.Context, name, id string, f func(ctx context.Context) error) error {
|
||||||
|
if id == "" {
|
||||||
|
id = identity.NewID()
|
||||||
|
}
|
||||||
v := client.Vertex{
|
v := client.Vertex{
|
||||||
Digest: digest.FromBytes([]byte(identity.NewID())),
|
Digest: digest.FromBytes([]byte(id)),
|
||||||
Name: name,
|
Name: name,
|
||||||
}
|
}
|
||||||
pw, _, ctx := progress.FromContext(ctx, progress.WithMetadata("vertex", v.Digest))
|
pw, _, ctx := progress.FromContext(ctx, progress.WithMetadata("vertex", v.Digest))
|
||||||
|
|
|
@ -1,12 +1,25 @@
|
||||||
package pb
|
package pb
|
||||||
|
|
||||||
|
// InputIndex is incrementing index to the input vertex
|
||||||
type InputIndex int64
|
type InputIndex int64
|
||||||
|
|
||||||
|
// OutputIndex is incrementing index that another vertex can depend on
|
||||||
type OutputIndex int64
|
type OutputIndex int64
|
||||||
|
|
||||||
|
// RootMount is a base mountpoint
|
||||||
const RootMount = "/"
|
const RootMount = "/"
|
||||||
|
|
||||||
|
// SkipOutput marks a disabled output index
|
||||||
const SkipOutput OutputIndex = -1
|
const SkipOutput OutputIndex = -1
|
||||||
|
|
||||||
|
// Empty marks an input with no content
|
||||||
const Empty InputIndex = -1
|
const Empty InputIndex = -1
|
||||||
|
|
||||||
|
// LLBBuilder is a special builder for BuildOp that directly builds LLB
|
||||||
const LLBBuilder InputIndex = -1
|
const LLBBuilder InputIndex = -1
|
||||||
|
|
||||||
|
// LLBDefinitionInput marks an input that contains LLB definition for BuildOp
|
||||||
const LLBDefinitionInput = "buildkit.llb.definition"
|
const LLBDefinitionInput = "buildkit.llb.definition"
|
||||||
|
|
||||||
|
// LLBDefaultDefinitionFile is a filename containing the definition in LLBBuilder
|
||||||
const LLBDefaultDefinitionFile = LLBDefinitionInput
|
const LLBDefaultDefinitionFile = LLBDefinitionInput
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
Mount
|
Mount
|
||||||
CacheOpt
|
CacheOpt
|
||||||
SecretOpt
|
SecretOpt
|
||||||
|
SSHOpt
|
||||||
CopyOp
|
CopyOp
|
||||||
CopySource
|
CopySource
|
||||||
SourceOp
|
SourceOp
|
||||||
|
@ -41,6 +42,8 @@ import _ "github.com/gogo/protobuf/gogoproto"
|
||||||
import github_com_opencontainers_go_digest "github.com/opencontainers/go-digest"
|
import github_com_opencontainers_go_digest "github.com/opencontainers/go-digest"
|
||||||
import github_com_moby_buildkit_util_apicaps "github.com/moby/buildkit/util/apicaps"
|
import github_com_moby_buildkit_util_apicaps "github.com/moby/buildkit/util/apicaps"
|
||||||
|
|
||||||
|
import sortkeys "github.com/gogo/protobuf/sortkeys"
|
||||||
|
|
||||||
import io "io"
|
import io "io"
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
@ -512,6 +515,7 @@ type Mount struct {
|
||||||
MountType MountType `protobuf:"varint,6,opt,name=mountType,proto3,enum=pb.MountType" json:"mountType,omitempty"`
|
MountType MountType `protobuf:"varint,6,opt,name=mountType,proto3,enum=pb.MountType" json:"mountType,omitempty"`
|
||||||
CacheOpt *CacheOpt `protobuf:"bytes,20,opt,name=cacheOpt" json:"cacheOpt,omitempty"`
|
CacheOpt *CacheOpt `protobuf:"bytes,20,opt,name=cacheOpt" json:"cacheOpt,omitempty"`
|
||||||
SecretOpt *SecretOpt `protobuf:"bytes,21,opt,name=secretOpt" json:"secretOpt,omitempty"`
|
SecretOpt *SecretOpt `protobuf:"bytes,21,opt,name=secretOpt" json:"secretOpt,omitempty"`
|
||||||
|
SSHOpt *SSHOpt `protobuf:"bytes,22,opt,name=SSHOpt" json:"SSHOpt,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Mount) Reset() { *m = Mount{} }
|
func (m *Mount) Reset() { *m = Mount{} }
|
||||||
|
@ -561,6 +565,13 @@ func (m *Mount) GetSecretOpt() *SecretOpt {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Mount) GetSSHOpt() *SSHOpt {
|
||||||
|
if m != nil {
|
||||||
|
return m.SSHOpt
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// CacheOpt defines options specific to cache mounts
|
// CacheOpt defines options specific to cache mounts
|
||||||
type CacheOpt struct {
|
type CacheOpt struct {
|
||||||
// ID is an optional namespace for the mount
|
// ID is an optional namespace for the mount
|
||||||
|
@ -643,6 +654,61 @@ func (m *SecretOpt) GetOptional() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SSHOpt defines options describing secret mounts
|
||||||
|
type SSHOpt struct {
|
||||||
|
// ID of exposed ssh rule. Used for quering the value.
|
||||||
|
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
|
||||||
|
// UID of agent socket
|
||||||
|
Uid uint32 `protobuf:"varint,2,opt,name=uid,proto3" json:"uid,omitempty"`
|
||||||
|
// GID of agent socket
|
||||||
|
Gid uint32 `protobuf:"varint,3,opt,name=gid,proto3" json:"gid,omitempty"`
|
||||||
|
// Mode is the filesystem mode of agent socket
|
||||||
|
Mode uint32 `protobuf:"varint,4,opt,name=mode,proto3" json:"mode,omitempty"`
|
||||||
|
// Optional defines if ssh socket is required. Error is produced
|
||||||
|
// if client does not expose ssh.
|
||||||
|
Optional bool `protobuf:"varint,5,opt,name=optional,proto3" json:"optional,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) Reset() { *m = SSHOpt{} }
|
||||||
|
func (m *SSHOpt) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*SSHOpt) ProtoMessage() {}
|
||||||
|
func (*SSHOpt) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{8} }
|
||||||
|
|
||||||
|
func (m *SSHOpt) GetID() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ID
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) GetUid() uint32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.Uid
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) GetGid() uint32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.Gid
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) GetMode() uint32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.Mode
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) GetOptional() bool {
|
||||||
|
if m != nil {
|
||||||
|
return m.Optional
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// CopyOp copies files across Ops.
|
// CopyOp copies files across Ops.
|
||||||
type CopyOp struct {
|
type CopyOp struct {
|
||||||
Src []*CopySource `protobuf:"bytes,1,rep,name=src" json:"src,omitempty"`
|
Src []*CopySource `protobuf:"bytes,1,rep,name=src" json:"src,omitempty"`
|
||||||
|
@ -652,7 +718,7 @@ type CopyOp struct {
|
||||||
func (m *CopyOp) Reset() { *m = CopyOp{} }
|
func (m *CopyOp) Reset() { *m = CopyOp{} }
|
||||||
func (m *CopyOp) String() string { return proto.CompactTextString(m) }
|
func (m *CopyOp) String() string { return proto.CompactTextString(m) }
|
||||||
func (*CopyOp) ProtoMessage() {}
|
func (*CopyOp) ProtoMessage() {}
|
||||||
func (*CopyOp) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{8} }
|
func (*CopyOp) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{9} }
|
||||||
|
|
||||||
func (m *CopyOp) GetSrc() []*CopySource {
|
func (m *CopyOp) GetSrc() []*CopySource {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -677,7 +743,7 @@ type CopySource struct {
|
||||||
func (m *CopySource) Reset() { *m = CopySource{} }
|
func (m *CopySource) Reset() { *m = CopySource{} }
|
||||||
func (m *CopySource) String() string { return proto.CompactTextString(m) }
|
func (m *CopySource) String() string { return proto.CompactTextString(m) }
|
||||||
func (*CopySource) ProtoMessage() {}
|
func (*CopySource) ProtoMessage() {}
|
||||||
func (*CopySource) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{9} }
|
func (*CopySource) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{10} }
|
||||||
|
|
||||||
func (m *CopySource) GetSelector() string {
|
func (m *CopySource) GetSelector() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -698,7 +764,7 @@ type SourceOp struct {
|
||||||
func (m *SourceOp) Reset() { *m = SourceOp{} }
|
func (m *SourceOp) Reset() { *m = SourceOp{} }
|
||||||
func (m *SourceOp) String() string { return proto.CompactTextString(m) }
|
func (m *SourceOp) String() string { return proto.CompactTextString(m) }
|
||||||
func (*SourceOp) ProtoMessage() {}
|
func (*SourceOp) ProtoMessage() {}
|
||||||
func (*SourceOp) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{10} }
|
func (*SourceOp) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{11} }
|
||||||
|
|
||||||
func (m *SourceOp) GetIdentifier() string {
|
func (m *SourceOp) GetIdentifier() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -726,7 +792,7 @@ type BuildOp struct {
|
||||||
func (m *BuildOp) Reset() { *m = BuildOp{} }
|
func (m *BuildOp) Reset() { *m = BuildOp{} }
|
||||||
func (m *BuildOp) String() string { return proto.CompactTextString(m) }
|
func (m *BuildOp) String() string { return proto.CompactTextString(m) }
|
||||||
func (*BuildOp) ProtoMessage() {}
|
func (*BuildOp) ProtoMessage() {}
|
||||||
func (*BuildOp) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{11} }
|
func (*BuildOp) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{12} }
|
||||||
|
|
||||||
func (m *BuildOp) GetInputs() map[string]*BuildInput {
|
func (m *BuildOp) GetInputs() map[string]*BuildInput {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -757,7 +823,7 @@ type BuildInput struct {
|
||||||
func (m *BuildInput) Reset() { *m = BuildInput{} }
|
func (m *BuildInput) Reset() { *m = BuildInput{} }
|
||||||
func (m *BuildInput) String() string { return proto.CompactTextString(m) }
|
func (m *BuildInput) String() string { return proto.CompactTextString(m) }
|
||||||
func (*BuildInput) ProtoMessage() {}
|
func (*BuildInput) ProtoMessage() {}
|
||||||
func (*BuildInput) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{12} }
|
func (*BuildInput) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{13} }
|
||||||
|
|
||||||
// OpMetadata is a per-vertex metadata entry, which can be defined for arbitrary Op vertex and overridable on the run time.
|
// OpMetadata is a per-vertex metadata entry, which can be defined for arbitrary Op vertex and overridable on the run time.
|
||||||
type OpMetadata struct {
|
type OpMetadata struct {
|
||||||
|
@ -774,7 +840,7 @@ type OpMetadata struct {
|
||||||
func (m *OpMetadata) Reset() { *m = OpMetadata{} }
|
func (m *OpMetadata) Reset() { *m = OpMetadata{} }
|
||||||
func (m *OpMetadata) String() string { return proto.CompactTextString(m) }
|
func (m *OpMetadata) String() string { return proto.CompactTextString(m) }
|
||||||
func (*OpMetadata) ProtoMessage() {}
|
func (*OpMetadata) ProtoMessage() {}
|
||||||
func (*OpMetadata) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{13} }
|
func (*OpMetadata) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{14} }
|
||||||
|
|
||||||
func (m *OpMetadata) GetIgnoreCache() bool {
|
func (m *OpMetadata) GetIgnoreCache() bool {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -811,7 +877,7 @@ type ExportCache struct {
|
||||||
func (m *ExportCache) Reset() { *m = ExportCache{} }
|
func (m *ExportCache) Reset() { *m = ExportCache{} }
|
||||||
func (m *ExportCache) String() string { return proto.CompactTextString(m) }
|
func (m *ExportCache) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ExportCache) ProtoMessage() {}
|
func (*ExportCache) ProtoMessage() {}
|
||||||
func (*ExportCache) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{14} }
|
func (*ExportCache) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{15} }
|
||||||
|
|
||||||
func (m *ExportCache) GetValue() bool {
|
func (m *ExportCache) GetValue() bool {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -830,7 +896,7 @@ type ProxyEnv struct {
|
||||||
func (m *ProxyEnv) Reset() { *m = ProxyEnv{} }
|
func (m *ProxyEnv) Reset() { *m = ProxyEnv{} }
|
||||||
func (m *ProxyEnv) String() string { return proto.CompactTextString(m) }
|
func (m *ProxyEnv) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ProxyEnv) ProtoMessage() {}
|
func (*ProxyEnv) ProtoMessage() {}
|
||||||
func (*ProxyEnv) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{15} }
|
func (*ProxyEnv) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{16} }
|
||||||
|
|
||||||
func (m *ProxyEnv) GetHttpProxy() string {
|
func (m *ProxyEnv) GetHttpProxy() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -868,7 +934,7 @@ type WorkerConstraints struct {
|
||||||
func (m *WorkerConstraints) Reset() { *m = WorkerConstraints{} }
|
func (m *WorkerConstraints) Reset() { *m = WorkerConstraints{} }
|
||||||
func (m *WorkerConstraints) String() string { return proto.CompactTextString(m) }
|
func (m *WorkerConstraints) String() string { return proto.CompactTextString(m) }
|
||||||
func (*WorkerConstraints) ProtoMessage() {}
|
func (*WorkerConstraints) ProtoMessage() {}
|
||||||
func (*WorkerConstraints) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{16} }
|
func (*WorkerConstraints) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{17} }
|
||||||
|
|
||||||
func (m *WorkerConstraints) GetFilter() []string {
|
func (m *WorkerConstraints) GetFilter() []string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -889,7 +955,7 @@ type Definition struct {
|
||||||
func (m *Definition) Reset() { *m = Definition{} }
|
func (m *Definition) Reset() { *m = Definition{} }
|
||||||
func (m *Definition) String() string { return proto.CompactTextString(m) }
|
func (m *Definition) String() string { return proto.CompactTextString(m) }
|
||||||
func (*Definition) ProtoMessage() {}
|
func (*Definition) ProtoMessage() {}
|
||||||
func (*Definition) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{17} }
|
func (*Definition) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{18} }
|
||||||
|
|
||||||
func (m *Definition) GetDef() [][]byte {
|
func (m *Definition) GetDef() [][]byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -913,7 +979,7 @@ type HostIP struct {
|
||||||
func (m *HostIP) Reset() { *m = HostIP{} }
|
func (m *HostIP) Reset() { *m = HostIP{} }
|
||||||
func (m *HostIP) String() string { return proto.CompactTextString(m) }
|
func (m *HostIP) String() string { return proto.CompactTextString(m) }
|
||||||
func (*HostIP) ProtoMessage() {}
|
func (*HostIP) ProtoMessage() {}
|
||||||
func (*HostIP) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{18} }
|
func (*HostIP) Descriptor() ([]byte, []int) { return fileDescriptorOps, []int{19} }
|
||||||
|
|
||||||
func (m *HostIP) GetHost() string {
|
func (m *HostIP) GetHost() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -938,6 +1004,7 @@ func init() {
|
||||||
proto.RegisterType((*Mount)(nil), "pb.Mount")
|
proto.RegisterType((*Mount)(nil), "pb.Mount")
|
||||||
proto.RegisterType((*CacheOpt)(nil), "pb.CacheOpt")
|
proto.RegisterType((*CacheOpt)(nil), "pb.CacheOpt")
|
||||||
proto.RegisterType((*SecretOpt)(nil), "pb.SecretOpt")
|
proto.RegisterType((*SecretOpt)(nil), "pb.SecretOpt")
|
||||||
|
proto.RegisterType((*SSHOpt)(nil), "pb.SSHOpt")
|
||||||
proto.RegisterType((*CopyOp)(nil), "pb.CopyOp")
|
proto.RegisterType((*CopyOp)(nil), "pb.CopyOp")
|
||||||
proto.RegisterType((*CopySource)(nil), "pb.CopySource")
|
proto.RegisterType((*CopySource)(nil), "pb.CopySource")
|
||||||
proto.RegisterType((*SourceOp)(nil), "pb.SourceOp")
|
proto.RegisterType((*SourceOp)(nil), "pb.SourceOp")
|
||||||
|
@ -1355,6 +1422,18 @@ func (m *Mount) MarshalTo(dAtA []byte) (int, error) {
|
||||||
}
|
}
|
||||||
i += n11
|
i += n11
|
||||||
}
|
}
|
||||||
|
if m.SSHOpt != nil {
|
||||||
|
dAtA[i] = 0xb2
|
||||||
|
i++
|
||||||
|
dAtA[i] = 0x1
|
||||||
|
i++
|
||||||
|
i = encodeVarintOps(dAtA, i, uint64(m.SSHOpt.Size()))
|
||||||
|
n12, err := m.SSHOpt.MarshalTo(dAtA[i:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i += n12
|
||||||
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1436,6 +1515,55 @@ func (m *SecretOpt) MarshalTo(dAtA []byte) (int, error) {
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalTo(dAtA)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
var i int
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.ID) > 0 {
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
i++
|
||||||
|
i = encodeVarintOps(dAtA, i, uint64(len(m.ID)))
|
||||||
|
i += copy(dAtA[i:], m.ID)
|
||||||
|
}
|
||||||
|
if m.Uid != 0 {
|
||||||
|
dAtA[i] = 0x10
|
||||||
|
i++
|
||||||
|
i = encodeVarintOps(dAtA, i, uint64(m.Uid))
|
||||||
|
}
|
||||||
|
if m.Gid != 0 {
|
||||||
|
dAtA[i] = 0x18
|
||||||
|
i++
|
||||||
|
i = encodeVarintOps(dAtA, i, uint64(m.Gid))
|
||||||
|
}
|
||||||
|
if m.Mode != 0 {
|
||||||
|
dAtA[i] = 0x20
|
||||||
|
i++
|
||||||
|
i = encodeVarintOps(dAtA, i, uint64(m.Mode))
|
||||||
|
}
|
||||||
|
if m.Optional {
|
||||||
|
dAtA[i] = 0x28
|
||||||
|
i++
|
||||||
|
if m.Optional {
|
||||||
|
dAtA[i] = 1
|
||||||
|
} else {
|
||||||
|
dAtA[i] = 0
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *CopyOp) Marshal() (dAtA []byte, err error) {
|
func (m *CopyOp) Marshal() (dAtA []byte, err error) {
|
||||||
size := m.Size()
|
size := m.Size()
|
||||||
dAtA = make([]byte, size)
|
dAtA = make([]byte, size)
|
||||||
|
@ -1523,10 +1651,15 @@ func (m *SourceOp) MarshalTo(dAtA []byte) (int, error) {
|
||||||
i += copy(dAtA[i:], m.Identifier)
|
i += copy(dAtA[i:], m.Identifier)
|
||||||
}
|
}
|
||||||
if len(m.Attrs) > 0 {
|
if len(m.Attrs) > 0 {
|
||||||
|
keysForAttrs := make([]string, 0, len(m.Attrs))
|
||||||
for k, _ := range m.Attrs {
|
for k, _ := range m.Attrs {
|
||||||
|
keysForAttrs = append(keysForAttrs, string(k))
|
||||||
|
}
|
||||||
|
sortkeys.Strings(keysForAttrs)
|
||||||
|
for _, k := range keysForAttrs {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
v := m.Attrs[k]
|
v := m.Attrs[string(k)]
|
||||||
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + len(v) + sovOps(uint64(len(v)))
|
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + len(v) + sovOps(uint64(len(v)))
|
||||||
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
|
@ -1563,10 +1696,15 @@ func (m *BuildOp) MarshalTo(dAtA []byte) (int, error) {
|
||||||
i = encodeVarintOps(dAtA, i, uint64(m.Builder))
|
i = encodeVarintOps(dAtA, i, uint64(m.Builder))
|
||||||
}
|
}
|
||||||
if len(m.Inputs) > 0 {
|
if len(m.Inputs) > 0 {
|
||||||
|
keysForInputs := make([]string, 0, len(m.Inputs))
|
||||||
for k, _ := range m.Inputs {
|
for k, _ := range m.Inputs {
|
||||||
|
keysForInputs = append(keysForInputs, string(k))
|
||||||
|
}
|
||||||
|
sortkeys.Strings(keysForInputs)
|
||||||
|
for _, k := range keysForInputs {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
v := m.Inputs[k]
|
v := m.Inputs[string(k)]
|
||||||
msgSize := 0
|
msgSize := 0
|
||||||
if v != nil {
|
if v != nil {
|
||||||
msgSize = v.Size()
|
msgSize = v.Size()
|
||||||
|
@ -1582,11 +1720,11 @@ func (m *BuildOp) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintOps(dAtA, i, uint64(v.Size()))
|
i = encodeVarintOps(dAtA, i, uint64(v.Size()))
|
||||||
n12, err := v.MarshalTo(dAtA[i:])
|
n13, err := v.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n12
|
i += n13
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1594,17 +1732,22 @@ func (m *BuildOp) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintOps(dAtA, i, uint64(m.Def.Size()))
|
i = encodeVarintOps(dAtA, i, uint64(m.Def.Size()))
|
||||||
n13, err := m.Def.MarshalTo(dAtA[i:])
|
n14, err := m.Def.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n13
|
i += n14
|
||||||
}
|
}
|
||||||
if len(m.Attrs) > 0 {
|
if len(m.Attrs) > 0 {
|
||||||
|
keysForAttrs := make([]string, 0, len(m.Attrs))
|
||||||
for k, _ := range m.Attrs {
|
for k, _ := range m.Attrs {
|
||||||
|
keysForAttrs = append(keysForAttrs, string(k))
|
||||||
|
}
|
||||||
|
sortkeys.Strings(keysForAttrs)
|
||||||
|
for _, k := range keysForAttrs {
|
||||||
dAtA[i] = 0x22
|
dAtA[i] = 0x22
|
||||||
i++
|
i++
|
||||||
v := m.Attrs[k]
|
v := m.Attrs[string(k)]
|
||||||
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + len(v) + sovOps(uint64(len(v)))
|
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + len(v) + sovOps(uint64(len(v)))
|
||||||
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
|
@ -1669,10 +1812,15 @@ func (m *OpMetadata) MarshalTo(dAtA []byte) (int, error) {
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
if len(m.Description) > 0 {
|
if len(m.Description) > 0 {
|
||||||
|
keysForDescription := make([]string, 0, len(m.Description))
|
||||||
for k, _ := range m.Description {
|
for k, _ := range m.Description {
|
||||||
|
keysForDescription = append(keysForDescription, string(k))
|
||||||
|
}
|
||||||
|
sortkeys.Strings(keysForDescription)
|
||||||
|
for _, k := range keysForDescription {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
v := m.Description[k]
|
v := m.Description[string(k)]
|
||||||
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + len(v) + sovOps(uint64(len(v)))
|
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + len(v) + sovOps(uint64(len(v)))
|
||||||
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
|
@ -1689,17 +1837,22 @@ func (m *OpMetadata) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x22
|
dAtA[i] = 0x22
|
||||||
i++
|
i++
|
||||||
i = encodeVarintOps(dAtA, i, uint64(m.ExportCache.Size()))
|
i = encodeVarintOps(dAtA, i, uint64(m.ExportCache.Size()))
|
||||||
n14, err := m.ExportCache.MarshalTo(dAtA[i:])
|
n15, err := m.ExportCache.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n14
|
i += n15
|
||||||
}
|
}
|
||||||
if len(m.Caps) > 0 {
|
if len(m.Caps) > 0 {
|
||||||
|
keysForCaps := make([]string, 0, len(m.Caps))
|
||||||
for k, _ := range m.Caps {
|
for k, _ := range m.Caps {
|
||||||
|
keysForCaps = append(keysForCaps, string(k))
|
||||||
|
}
|
||||||
|
sortkeys.Strings(keysForCaps)
|
||||||
|
for _, k := range keysForCaps {
|
||||||
dAtA[i] = 0x2a
|
dAtA[i] = 0x2a
|
||||||
i++
|
i++
|
||||||
v := m.Caps[k]
|
v := m.Caps[github_com_moby_buildkit_util_apicaps.CapID(k)]
|
||||||
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + 1
|
mapSize := 1 + len(k) + sovOps(uint64(len(k))) + 1 + 1
|
||||||
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
i = encodeVarintOps(dAtA, i, uint64(mapSize))
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
|
@ -1846,10 +1999,15 @@ func (m *Definition) MarshalTo(dAtA []byte) (int, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(m.Metadata) > 0 {
|
if len(m.Metadata) > 0 {
|
||||||
|
keysForMetadata := make([]string, 0, len(m.Metadata))
|
||||||
for k, _ := range m.Metadata {
|
for k, _ := range m.Metadata {
|
||||||
|
keysForMetadata = append(keysForMetadata, string(k))
|
||||||
|
}
|
||||||
|
sortkeys.Strings(keysForMetadata)
|
||||||
|
for _, k := range keysForMetadata {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
v := m.Metadata[k]
|
v := m.Metadata[github_com_opencontainers_go_digest.Digest(k)]
|
||||||
msgSize := 0
|
msgSize := 0
|
||||||
if (&v) != nil {
|
if (&v) != nil {
|
||||||
msgSize = (&v).Size()
|
msgSize = (&v).Size()
|
||||||
|
@ -1864,11 +2022,11 @@ func (m *Definition) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintOps(dAtA, i, uint64((&v).Size()))
|
i = encodeVarintOps(dAtA, i, uint64((&v).Size()))
|
||||||
n15, err := (&v).MarshalTo(dAtA[i:])
|
n16, err := (&v).MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n15
|
i += n16
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
|
@ -2099,6 +2257,10 @@ func (m *Mount) Size() (n int) {
|
||||||
l = m.SecretOpt.Size()
|
l = m.SecretOpt.Size()
|
||||||
n += 2 + l + sovOps(uint64(l))
|
n += 2 + l + sovOps(uint64(l))
|
||||||
}
|
}
|
||||||
|
if m.SSHOpt != nil {
|
||||||
|
l = m.SSHOpt.Size()
|
||||||
|
n += 2 + l + sovOps(uint64(l))
|
||||||
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2137,6 +2299,28 @@ func (m *SecretOpt) Size() (n int) {
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *SSHOpt) Size() (n int) {
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.ID)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovOps(uint64(l))
|
||||||
|
}
|
||||||
|
if m.Uid != 0 {
|
||||||
|
n += 1 + sovOps(uint64(m.Uid))
|
||||||
|
}
|
||||||
|
if m.Gid != 0 {
|
||||||
|
n += 1 + sovOps(uint64(m.Gid))
|
||||||
|
}
|
||||||
|
if m.Mode != 0 {
|
||||||
|
n += 1 + sovOps(uint64(m.Mode))
|
||||||
|
}
|
||||||
|
if m.Optional {
|
||||||
|
n += 2
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
func (m *CopyOp) Size() (n int) {
|
func (m *CopyOp) Size() (n int) {
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
|
@ -3508,6 +3692,39 @@ func (m *Mount) Unmarshal(dAtA []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
|
case 22:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field SSHOpt", wireType)
|
||||||
|
}
|
||||||
|
var msglen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
msglen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if msglen < 0 {
|
||||||
|
return ErrInvalidLengthOps
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + msglen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
if m.SSHOpt == nil {
|
||||||
|
m.SSHOpt = &SSHOpt{}
|
||||||
|
}
|
||||||
|
if err := m.SSHOpt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
default:
|
default:
|
||||||
iNdEx = preIndex
|
iNdEx = preIndex
|
||||||
skippy, err := skipOps(dAtA[iNdEx:])
|
skippy, err := skipOps(dAtA[iNdEx:])
|
||||||
|
@ -3783,6 +4000,162 @@ func (m *SecretOpt) Unmarshal(dAtA []byte) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func (m *SSHOpt) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: SSHOpt: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: SSHOpt: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType)
|
||||||
|
}
|
||||||
|
var stringLen uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
stringLen |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
intStringLen := int(stringLen)
|
||||||
|
if intStringLen < 0 {
|
||||||
|
return ErrInvalidLengthOps
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + intStringLen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.ID = string(dAtA[iNdEx:postIndex])
|
||||||
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 0 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType)
|
||||||
|
}
|
||||||
|
m.Uid = 0
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
m.Uid |= (uint32(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
if wireType != 0 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Gid", wireType)
|
||||||
|
}
|
||||||
|
m.Gid = 0
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
m.Gid |= (uint32(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
if wireType != 0 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType)
|
||||||
|
}
|
||||||
|
m.Mode = 0
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
m.Mode |= (uint32(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
if wireType != 0 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType)
|
||||||
|
}
|
||||||
|
var v int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowOps
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
v |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m.Optional = bool(v != 0)
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipOps(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if skippy < 0 {
|
||||||
|
return ErrInvalidLengthOps
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
func (m *CopyOp) Unmarshal(dAtA []byte) error {
|
func (m *CopyOp) Unmarshal(dAtA []byte) error {
|
||||||
l := len(dAtA)
|
l := len(dAtA)
|
||||||
iNdEx := 0
|
iNdEx := 0
|
||||||
|
@ -5663,94 +6036,96 @@ var (
|
||||||
func init() { proto.RegisterFile("ops.proto", fileDescriptorOps) }
|
func init() { proto.RegisterFile("ops.proto", fileDescriptorOps) }
|
||||||
|
|
||||||
var fileDescriptorOps = []byte{
|
var fileDescriptorOps = []byte{
|
||||||
// 1415 bytes of a gzipped FileDescriptorProto
|
// 1444 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0x1b, 0x45,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4b, 0x6f, 0x1b, 0x47,
|
||||||
0x14, 0x8f, 0xd7, 0x9f, 0xfb, 0x9c, 0xa4, 0x66, 0xfa, 0x81, 0x09, 0x25, 0x09, 0x5b, 0x40, 0x69,
|
0x12, 0x16, 0x87, 0xcf, 0x29, 0x4a, 0x32, 0xb7, 0xfd, 0x58, 0xae, 0xd6, 0x2b, 0x69, 0xc7, 0xbb,
|
||||||
0xd2, 0x38, 0x92, 0x2b, 0xb5, 0x15, 0x87, 0x8a, 0xf8, 0xa3, 0x8a, 0x29, 0x89, 0xa3, 0x71, 0x08,
|
0x81, 0x2c, 0x59, 0x14, 0x40, 0x03, 0xb6, 0x91, 0x83, 0x11, 0xf1, 0x61, 0x88, 0x71, 0x24, 0x0a,
|
||||||
0xc7, 0x6a, 0xb3, 0x1e, 0x3b, 0xab, 0x38, 0x3b, 0xab, 0xdd, 0x71, 0x1b, 0x5f, 0x38, 0xf4, 0x2f,
|
0x4d, 0x45, 0x39, 0x1a, 0xa3, 0x61, 0x93, 0x1a, 0x88, 0x9a, 0x1e, 0xcc, 0x34, 0x6d, 0xf1, 0x92,
|
||||||
0x40, 0x42, 0xe2, 0xce, 0x91, 0x0b, 0xff, 0x01, 0xf7, 0x1e, 0xb9, 0xc2, 0xa1, 0xa0, 0xf2, 0x8f,
|
0x83, 0x7f, 0x41, 0x80, 0x00, 0xb9, 0xe7, 0x98, 0x1f, 0x91, 0xbb, 0x8f, 0x41, 0x4e, 0x49, 0x0e,
|
||||||
0xa0, 0xf7, 0x66, 0xd6, 0xbb, 0xfd, 0x40, 0xb4, 0x82, 0x93, 0xdf, 0xbc, 0xf7, 0x9b, 0xdf, 0xcc,
|
0x4e, 0xa0, 0xfc, 0x91, 0xa0, 0xaa, 0x7b, 0x38, 0xe3, 0x47, 0x10, 0x1b, 0x09, 0x72, 0x62, 0x75,
|
||||||
0xfc, 0xde, 0x9b, 0x79, 0x6b, 0xb0, 0x65, 0x18, 0x37, 0xc2, 0x48, 0x2a, 0xc9, 0xac, 0xf0, 0x64,
|
0xd5, 0xd7, 0x5f, 0xd7, 0xab, 0xbb, 0x86, 0x60, 0xcb, 0x30, 0x6e, 0x84, 0x91, 0x54, 0x92, 0x59,
|
||||||
0x65, 0x7b, 0xec, 0xab, 0xd3, 0xe9, 0x49, 0xc3, 0x93, 0xe7, 0x3b, 0x63, 0x39, 0x96, 0x3b, 0x14,
|
0xe1, 0xc9, 0xca, 0xf6, 0xd8, 0x57, 0xa7, 0xd3, 0x93, 0x86, 0x27, 0xcf, 0x77, 0xc6, 0x72, 0x2c,
|
||||||
0x3a, 0x99, 0x8e, 0x68, 0x44, 0x03, 0xb2, 0xf4, 0x14, 0xe7, 0x47, 0x0b, 0xac, 0x7e, 0xc8, 0x3e,
|
0x77, 0xc8, 0x74, 0x32, 0x1d, 0xd1, 0x8a, 0x16, 0x24, 0xe9, 0x2d, 0xce, 0xd7, 0x16, 0x58, 0xfd,
|
||||||
0x86, 0x92, 0x1f, 0x84, 0x53, 0x15, 0xd7, 0x73, 0xeb, 0xf9, 0x8d, 0x6a, 0xd3, 0x6e, 0x84, 0x27,
|
0x90, 0xfd, 0x17, 0x4a, 0x7e, 0x10, 0x4e, 0x55, 0x5c, 0xcf, 0xad, 0xe7, 0x37, 0xaa, 0x4d, 0xbb,
|
||||||
0x8d, 0x1e, 0x7a, 0xb8, 0x09, 0xb0, 0x75, 0x28, 0x88, 0x0b, 0xe1, 0xd5, 0xad, 0xf5, 0xdc, 0x46,
|
0x11, 0x9e, 0x34, 0x7a, 0xa8, 0xe1, 0xc6, 0xc0, 0xd6, 0xa1, 0x20, 0x2e, 0x84, 0x57, 0xb7, 0xd6,
|
||||||
0xb5, 0x09, 0x08, 0xe8, 0x5e, 0x08, 0xaf, 0x1f, 0xee, 0x2d, 0x70, 0x8a, 0xb0, 0xcf, 0xa0, 0x14,
|
0x73, 0x1b, 0xd5, 0x26, 0x20, 0xa0, 0x7b, 0x21, 0xbc, 0x7e, 0xb8, 0xb7, 0xc0, 0xc9, 0xc2, 0x3e,
|
||||||
0xcb, 0x69, 0xe4, 0x89, 0x7a, 0x9e, 0x30, 0x8b, 0x88, 0x19, 0x90, 0x87, 0x50, 0x26, 0x8a, 0x4c,
|
0x80, 0x52, 0x2c, 0xa7, 0x91, 0x27, 0xea, 0x79, 0xc2, 0x2c, 0x22, 0x66, 0x40, 0x1a, 0x42, 0x19,
|
||||||
0x9e, 0x0c, 0x67, 0xf5, 0x42, 0xca, 0xd4, 0x96, 0xe1, 0x4c, 0x33, 0x61, 0x84, 0xdd, 0x80, 0xe2,
|
0x2b, 0x32, 0x79, 0x32, 0x9c, 0xd5, 0x0b, 0x29, 0x53, 0x5b, 0x86, 0x33, 0xcd, 0x84, 0x16, 0x76,
|
||||||
0xc9, 0xd4, 0x9f, 0x0c, 0xeb, 0x45, 0x82, 0x54, 0x11, 0xd2, 0x42, 0x07, 0x61, 0x74, 0x8c, 0x6d,
|
0x0b, 0x8a, 0x27, 0x53, 0x7f, 0x32, 0xac, 0x17, 0x09, 0x52, 0x45, 0x48, 0x0b, 0x15, 0x84, 0xd1,
|
||||||
0x40, 0x25, 0x9c, 0xb8, 0x6a, 0x24, 0xa3, 0xf3, 0x3a, 0xa4, 0x0b, 0x1e, 0x1a, 0x1f, 0x9f, 0x47,
|
0x36, 0xb6, 0x01, 0x95, 0x70, 0xe2, 0xaa, 0x91, 0x8c, 0xce, 0xeb, 0x90, 0x1e, 0x78, 0x68, 0x74,
|
||||||
0xd9, 0x5d, 0xa8, 0x7a, 0x32, 0x88, 0x55, 0xe4, 0xfa, 0x81, 0x8a, 0xeb, 0x55, 0x02, 0x5f, 0x45,
|
0x7c, 0x6e, 0x65, 0xf7, 0xa1, 0xea, 0xc9, 0x20, 0x56, 0x91, 0xeb, 0x07, 0x2a, 0xae, 0x57, 0x09,
|
||||||
0xf0, 0x37, 0x32, 0x3a, 0x13, 0x51, 0x3b, 0x0d, 0xf2, 0x2c, 0xb2, 0x55, 0x00, 0x4b, 0x86, 0xce,
|
0x7c, 0x1d, 0xc1, 0x9f, 0xc9, 0xe8, 0x4c, 0x44, 0xed, 0xd4, 0xc8, 0xb3, 0xc8, 0x56, 0x01, 0x2c,
|
||||||
0x0f, 0x39, 0xa8, 0x24, 0xac, 0xcc, 0x81, 0xc5, 0xdd, 0xc8, 0x3b, 0xf5, 0x95, 0xf0, 0xd4, 0x34,
|
0x19, 0x3a, 0x5f, 0xe5, 0xa0, 0x92, 0xb0, 0x32, 0x07, 0x16, 0x77, 0x23, 0xef, 0xd4, 0x57, 0xc2,
|
||||||
0x12, 0xf5, 0xdc, 0x7a, 0x6e, 0xc3, 0xe6, 0x2f, 0xf9, 0xd8, 0x32, 0x58, 0xfd, 0x01, 0x09, 0x65,
|
0x53, 0xd3, 0x48, 0xd4, 0x73, 0xeb, 0xb9, 0x0d, 0x9b, 0xbf, 0xa2, 0x63, 0xcb, 0x60, 0xf5, 0x07,
|
||||||
0x73, 0xab, 0x3f, 0x60, 0x75, 0x28, 0x1f, 0xbb, 0x91, 0xef, 0x06, 0x8a, 0x94, 0xb1, 0x79, 0x32,
|
0x94, 0x28, 0x9b, 0x5b, 0xfd, 0x01, 0xab, 0x43, 0xf9, 0xd8, 0x8d, 0x7c, 0x37, 0x50, 0x94, 0x19,
|
||||||
0x64, 0xd7, 0xc1, 0xee, 0x0f, 0x8e, 0x45, 0x14, 0xfb, 0x32, 0x20, 0x3d, 0x6c, 0x9e, 0x3a, 0xd8,
|
0x9b, 0x27, 0x4b, 0x76, 0x13, 0xec, 0xfe, 0xe0, 0x58, 0x44, 0xb1, 0x2f, 0x03, 0xca, 0x87, 0xcd,
|
||||||
0x2a, 0x40, 0x7f, 0xf0, 0x40, 0xb8, 0x48, 0x1a, 0xd7, 0x8b, 0xeb, 0xf9, 0x0d, 0x9b, 0x67, 0x3c,
|
0x53, 0x05, 0x5b, 0x05, 0xe8, 0x0f, 0x1e, 0x09, 0x17, 0x49, 0xe3, 0x7a, 0x71, 0x3d, 0xbf, 0x61,
|
||||||
0xce, 0xb7, 0x50, 0xa4, 0x1c, 0xb1, 0x2f, 0xa1, 0x34, 0xf4, 0xc7, 0x22, 0x56, 0x7a, 0x3b, 0xad,
|
0xf3, 0x8c, 0xc6, 0xf9, 0x1c, 0x8a, 0x54, 0x23, 0xf6, 0x31, 0x94, 0x86, 0xfe, 0x58, 0xc4, 0x4a,
|
||||||
0xe6, 0xb3, 0xe7, 0x6b, 0x0b, 0xbf, 0x3f, 0x5f, 0xdb, 0xcc, 0x14, 0x83, 0x0c, 0x45, 0xe0, 0xc9,
|
0xbb, 0xd3, 0x6a, 0xbe, 0x78, 0xb9, 0xb6, 0xf0, 0xd3, 0xcb, 0xb5, 0xcd, 0x4c, 0x33, 0xc8, 0x50,
|
||||||
0x40, 0xb9, 0x7e, 0x20, 0xa2, 0x78, 0x67, 0x2c, 0xb7, 0xf5, 0x94, 0x46, 0x87, 0x7e, 0xb8, 0x61,
|
0x04, 0x9e, 0x0c, 0x94, 0xeb, 0x07, 0x22, 0x8a, 0x77, 0xc6, 0x72, 0x5b, 0x6f, 0x69, 0x74, 0xe8,
|
||||||
0x60, 0x37, 0xa1, 0xe8, 0x07, 0x43, 0x71, 0x41, 0xfb, 0xcf, 0xb7, 0x2e, 0x1b, 0xaa, 0x6a, 0x7f,
|
0x87, 0x1b, 0x06, 0x76, 0x1b, 0x8a, 0x7e, 0x30, 0x14, 0x17, 0xe4, 0x7f, 0xbe, 0x75, 0xd5, 0x50,
|
||||||
0xaa, 0xc2, 0xa9, 0xea, 0x61, 0x88, 0x6b, 0x84, 0x13, 0x42, 0x49, 0x97, 0x00, 0xbb, 0x0e, 0x85,
|
0x55, 0xfb, 0x53, 0x15, 0x4e, 0x55, 0x0f, 0x4d, 0x5c, 0x23, 0x9c, 0x10, 0x4a, 0xba, 0x05, 0xd8,
|
||||||
0x73, 0xa1, 0x5c, 0x5a, 0xbe, 0xda, 0xac, 0xa0, 0xb4, 0xfb, 0x42, 0xb9, 0x9c, 0xbc, 0x58, 0x5d,
|
0x4d, 0x28, 0x9c, 0x0b, 0xe5, 0xd2, 0xf1, 0xd5, 0x66, 0x05, 0x53, 0xbb, 0x2f, 0x94, 0xcb, 0x49,
|
||||||
0xe7, 0x72, 0x8a, 0xd2, 0x5b, 0x69, 0x75, 0xed, 0xa3, 0x87, 0x9b, 0x00, 0xfb, 0x14, 0xca, 0x81,
|
0x8b, 0xdd, 0x75, 0x2e, 0xa7, 0x98, 0x7a, 0x2b, 0xed, 0xae, 0x7d, 0xd4, 0x70, 0x63, 0x60, 0xff,
|
||||||
0x50, 0x4f, 0x64, 0x74, 0x46, 0x12, 0x2d, 0xeb, 0x9c, 0x1f, 0x08, 0xb5, 0x2f, 0x87, 0x82, 0x27,
|
0x87, 0x72, 0x20, 0xd4, 0x33, 0x19, 0x9d, 0x51, 0x8a, 0x96, 0x75, 0xcd, 0x0f, 0x84, 0xda, 0x97,
|
||||||
0x31, 0xe7, 0xa7, 0x1c, 0x14, 0x90, 0x98, 0x31, 0x28, 0xb8, 0xd1, 0x58, 0x97, 0xab, 0xcd, 0xc9,
|
0x43, 0xc1, 0x13, 0x9b, 0xf3, 0x4d, 0x0e, 0x0a, 0x48, 0xcc, 0x18, 0x14, 0xdc, 0x68, 0xac, 0xdb,
|
||||||
0x66, 0x35, 0xc8, 0x8b, 0xe0, 0x31, 0xad, 0x61, 0x73, 0x34, 0xd1, 0xe3, 0x3d, 0x19, 0x1a, 0xd1,
|
0xd5, 0xe6, 0x24, 0xb3, 0x1a, 0xe4, 0x45, 0xf0, 0x94, 0xce, 0xb0, 0x39, 0x8a, 0xa8, 0xf1, 0x9e,
|
||||||
0xd1, 0xc4, 0x79, 0xd3, 0x58, 0x44, 0x46, 0x6b, 0xb2, 0xd9, 0x4d, 0xb0, 0xc3, 0x48, 0x5e, 0xcc,
|
0x0d, 0x4d, 0xd2, 0x51, 0xc4, 0x7d, 0xd3, 0x58, 0x44, 0x26, 0xd7, 0x24, 0xb3, 0xdb, 0x60, 0x87,
|
||||||
0x1e, 0xe1, 0xec, 0x62, 0xa6, 0x92, 0xd0, 0xd9, 0x0d, 0x1e, 0xf3, 0x4a, 0x68, 0x2c, 0xb6, 0x09,
|
0x91, 0xbc, 0x98, 0x3d, 0xc1, 0xdd, 0xc5, 0x4c, 0x27, 0xa1, 0xb2, 0x1b, 0x3c, 0xe5, 0x95, 0xd0,
|
||||||
0x20, 0x2e, 0x54, 0xe4, 0xee, 0xc9, 0x58, 0xc5, 0xf5, 0x12, 0x9d, 0x86, 0x0a, 0x18, 0x1d, 0xbd,
|
0x48, 0x6c, 0x13, 0x40, 0x5c, 0xa8, 0xc8, 0xdd, 0x93, 0xb1, 0x8a, 0xeb, 0x25, 0x8a, 0x86, 0x1a,
|
||||||
0x43, 0x9e, 0x89, 0x3a, 0x3f, 0x5b, 0x50, 0xa4, 0x43, 0xb2, 0x0d, 0x94, 0x34, 0x9c, 0xea, 0xec,
|
0x18, 0x15, 0xbd, 0x43, 0x9e, 0xb1, 0x3a, 0xdf, 0x5b, 0x50, 0xa4, 0x20, 0xd9, 0x06, 0xa6, 0x34,
|
||||||
0xe4, 0x5b, 0xcc, 0x48, 0x0a, 0x94, 0xbc, 0xb9, 0xa2, 0x98, 0xc8, 0x15, 0xa8, 0xc4, 0x62, 0x22,
|
0x9c, 0xea, 0xea, 0xe4, 0x5b, 0xcc, 0xa4, 0x14, 0xa8, 0x78, 0xf3, 0x8c, 0x62, 0x21, 0x57, 0xa0,
|
||||||
0x3c, 0x25, 0x23, 0x53, 0x3f, 0xf3, 0x31, 0x6e, 0x7d, 0x88, 0x29, 0xd6, 0xa7, 0x21, 0x9b, 0x6d,
|
0x12, 0x8b, 0x89, 0xf0, 0x94, 0x8c, 0x4c, 0xff, 0xcc, 0xd7, 0xe8, 0xfa, 0x10, 0x4b, 0xac, 0xa3,
|
||||||
0x41, 0x49, 0x52, 0x5e, 0xe8, 0x40, 0xff, 0x90, 0x2d, 0x03, 0x41, 0xf2, 0x48, 0xb8, 0x43, 0x19,
|
0x21, 0x99, 0x6d, 0x41, 0x49, 0x52, 0x5d, 0x28, 0xa0, 0xdf, 0xa9, 0x96, 0x81, 0x20, 0x79, 0x24,
|
||||||
0x4c, 0x66, 0x74, 0xcc, 0x0a, 0x9f, 0x8f, 0xd9, 0x16, 0xd8, 0x94, 0x89, 0xa3, 0x59, 0x28, 0xea,
|
0xdc, 0xa1, 0x0c, 0x26, 0x33, 0x0a, 0xb3, 0xc2, 0xe7, 0x6b, 0xb6, 0x05, 0x36, 0x55, 0xe2, 0x68,
|
||||||
0x25, 0xca, 0xc0, 0xd2, 0x3c, 0x4b, 0xe8, 0xe4, 0x69, 0x1c, 0x6f, 0x9e, 0xe7, 0x7a, 0xa7, 0xa2,
|
0x16, 0x8a, 0x7a, 0x89, 0x2a, 0xb0, 0x34, 0xaf, 0x12, 0x2a, 0x79, 0x6a, 0xc7, 0x9b, 0xe7, 0xb9,
|
||||||
0x1f, 0xaa, 0xfa, 0x95, 0x54, 0xaf, 0xb6, 0xf1, 0xf1, 0x79, 0x14, 0x69, 0x63, 0xe1, 0x45, 0x42,
|
0xde, 0xa9, 0xe8, 0x87, 0xaa, 0x7e, 0x2d, 0xcd, 0x57, 0xdb, 0xe8, 0xf8, 0xdc, 0x8a, 0xb4, 0xb1,
|
||||||
0x21, 0xf4, 0x2a, 0x41, 0x89, 0x76, 0x90, 0x38, 0x79, 0x1a, 0x77, 0x7a, 0x50, 0x49, 0x28, 0xf0,
|
0xf0, 0x22, 0xa1, 0x10, 0x7a, 0x9d, 0xa0, 0x44, 0x3b, 0x48, 0x94, 0x3c, 0xb5, 0x33, 0x07, 0x4a,
|
||||||
0x0a, 0xf5, 0x3a, 0xe6, 0x72, 0x59, 0xbd, 0x0e, 0xdb, 0x86, 0x72, 0x7c, 0xea, 0x46, 0x7e, 0x30,
|
0x83, 0xc1, 0x1e, 0x22, 0x6f, 0xa4, 0x2f, 0x83, 0xd6, 0x70, 0x63, 0x71, 0x7a, 0x50, 0x49, 0x8e,
|
||||||
0x26, 0x5d, 0x96, 0x9b, 0x97, 0xe7, 0x2b, 0x0e, 0xb4, 0x1f, 0xc9, 0x12, 0x8c, 0x23, 0xc1, 0x9e,
|
0xc1, 0x6b, 0xd6, 0xeb, 0x98, 0x0b, 0x68, 0xf5, 0x3a, 0x6c, 0x1b, 0xca, 0xf1, 0xa9, 0x1b, 0xf9,
|
||||||
0x2f, 0xf1, 0x1a, 0x57, 0x0d, 0xf2, 0x53, 0x7f, 0x48, 0x3c, 0x4b, 0x1c, 0x4d, 0xf4, 0x8c, 0x7d,
|
0xc1, 0x98, 0x72, 0xb7, 0xdc, 0xbc, 0x3a, 0xf7, 0x6a, 0xa0, 0xf5, 0xc8, 0x94, 0x60, 0x1c, 0x09,
|
||||||
0x5d, 0x27, 0x4b, 0x1c, 0x4d, 0x14, 0xfb, 0x5c, 0x0e, 0x05, 0xc9, 0xba, 0xc4, 0xc9, 0x46, 0xfd,
|
0xf6, 0xdc, 0x8d, 0x37, 0xb8, 0x6a, 0x90, 0x9f, 0xfa, 0x43, 0xe2, 0x59, 0xe2, 0x28, 0xa2, 0x66,
|
||||||
0x64, 0xa8, 0x7c, 0x19, 0xb8, 0x93, 0x44, 0xbf, 0x64, 0xec, 0xdc, 0x87, 0x92, 0x7e, 0xc3, 0xd8,
|
0xec, 0xeb, 0x5e, 0x5a, 0xe2, 0x28, 0x62, 0x41, 0xce, 0xe5, 0x50, 0x50, 0xea, 0x97, 0x38, 0xc9,
|
||||||
0x3a, 0xe4, 0xe3, 0xc8, 0x33, 0xef, 0xe8, 0x72, 0xf2, 0xb8, 0xe9, 0x67, 0x90, 0x63, 0x68, 0x9e,
|
0x98, 0x63, 0x19, 0x2a, 0x5f, 0x06, 0xee, 0x24, 0xc9, 0x71, 0xb2, 0x76, 0x26, 0x49, 0x7c, 0x7f,
|
||||||
0x48, 0x2b, 0x4d, 0xa4, 0xc3, 0x01, 0x52, 0xd8, 0xff, 0x53, 0x30, 0xce, 0xf7, 0x39, 0xa8, 0x24,
|
0xcb, 0x69, 0x0f, 0xa1, 0xa4, 0x5f, 0x55, 0xb6, 0x0e, 0xf9, 0x38, 0xf2, 0xcc, 0xcb, 0xbe, 0x9c,
|
||||||
0xcf, 0x2f, 0xbe, 0x25, 0xfe, 0x50, 0x04, 0xca, 0x1f, 0xf9, 0x22, 0x32, 0x62, 0x64, 0x3c, 0x6c,
|
0x3c, 0xb7, 0xfa, 0x61, 0xe6, 0x68, 0x9a, 0xb7, 0x96, 0x95, 0xb6, 0x96, 0xc3, 0x01, 0x52, 0xd8,
|
||||||
0x1b, 0x8a, 0xae, 0x52, 0x51, 0x72, 0x45, 0xdf, 0xcf, 0xbe, 0xdd, 0x8d, 0x5d, 0x8c, 0x74, 0x03,
|
0x5f, 0xd3, 0xc2, 0xce, 0x97, 0x39, 0xa8, 0x24, 0x03, 0x01, 0x5f, 0x37, 0x7f, 0x28, 0x02, 0xe5,
|
||||||
0x15, 0xcd, 0xb8, 0x46, 0xad, 0xdc, 0x03, 0x48, 0x9d, 0xa8, 0xdf, 0x99, 0x98, 0x19, 0x56, 0x34,
|
0x8f, 0x7c, 0x11, 0x99, 0x64, 0x64, 0x34, 0x6c, 0x1b, 0x8a, 0xae, 0x52, 0x51, 0xf2, 0x68, 0xfc,
|
||||||
0xd9, 0x15, 0x28, 0x3e, 0x76, 0x27, 0x53, 0x61, 0x36, 0xa5, 0x07, 0x9f, 0x5b, 0xf7, 0x72, 0xce,
|
0x33, 0x3b, 0x4d, 0x1a, 0xbb, 0x68, 0xe9, 0x06, 0x2a, 0x9a, 0x71, 0x8d, 0x5a, 0x79, 0x00, 0x90,
|
||||||
0x2f, 0x16, 0x94, 0xcd, 0x5b, 0xce, 0x6e, 0x41, 0x99, 0xde, 0x72, 0xb3, 0xa3, 0x37, 0x9f, 0x34,
|
0x2a, 0x31, 0x7f, 0x67, 0x62, 0x66, 0x58, 0x51, 0x64, 0xd7, 0xa0, 0xf8, 0xd4, 0x9d, 0x4c, 0x85,
|
||||||
0x81, 0xb0, 0x9d, 0x79, 0x93, 0xca, 0xec, 0xd1, 0x50, 0xe9, 0x66, 0x65, 0xf6, 0x98, 0xb6, 0xac,
|
0x71, 0x4a, 0x2f, 0x3e, 0xb4, 0x1e, 0xe4, 0x9c, 0x6f, 0x2d, 0x28, 0x9b, 0xe9, 0xc2, 0xee, 0x40,
|
||||||
0xfc, 0x50, 0x8c, 0x4c, 0x37, 0xa2, 0x54, 0x74, 0xc4, 0xc8, 0x0f, 0x7c, 0xcc, 0x19, 0xc7, 0x10,
|
0x99, 0xa6, 0x8b, 0xf1, 0xe8, 0xed, 0x91, 0x26, 0x10, 0xb6, 0x33, 0x1f, 0x9b, 0x19, 0x1f, 0x0d,
|
||||||
0xbb, 0x95, 0x9c, 0xba, 0x40, 0x8c, 0xd7, 0xb2, 0x8c, 0xaf, 0x1f, 0xba, 0x07, 0xd5, 0xcc, 0x32,
|
0x95, 0x1e, 0x9f, 0xc6, 0xc7, 0x74, 0x88, 0xe6, 0x87, 0x62, 0x64, 0xe6, 0x23, 0x95, 0xa2, 0x23,
|
||||||
0x6f, 0x38, 0xf5, 0x27, 0xd9, 0x53, 0x9b, 0x25, 0x89, 0x4e, 0xb7, 0xd2, 0x54, 0x85, 0xff, 0xa0,
|
0x46, 0x7e, 0xe0, 0x63, 0xcd, 0x38, 0x9a, 0xd8, 0x9d, 0x24, 0xea, 0x02, 0x31, 0xde, 0xc8, 0x32,
|
||||||
0xdf, 0x1d, 0x80, 0x94, 0xf2, 0xed, 0x2b, 0xc5, 0x79, 0x9a, 0x07, 0xe8, 0x87, 0xf8, 0x78, 0x0e,
|
0xbe, 0x19, 0x74, 0x0f, 0xaa, 0x99, 0x63, 0xde, 0x12, 0xf5, 0xff, 0xb2, 0x51, 0x9b, 0x23, 0x89,
|
||||||
0x5d, 0x7a, 0x93, 0x17, 0xfd, 0x71, 0x20, 0x23, 0xf1, 0x88, 0x2e, 0x2b, 0xcd, 0xaf, 0xf0, 0xaa,
|
0x4e, 0x0f, 0xf7, 0x34, 0x0b, 0x7f, 0x22, 0x7f, 0xf7, 0x00, 0x52, 0xca, 0x77, 0xef, 0x14, 0xe7,
|
||||||
0xf6, 0xd1, 0xbd, 0x62, 0xbb, 0x50, 0x1d, 0x8a, 0xd8, 0x8b, 0x7c, 0x2a, 0x72, 0x23, 0xfa, 0x1a,
|
0x79, 0x1e, 0xa0, 0x1f, 0xe2, 0x73, 0x3e, 0x74, 0x69, 0x4a, 0x2c, 0xfa, 0xe3, 0x40, 0x46, 0xe2,
|
||||||
0x9e, 0x29, 0xe5, 0x69, 0x74, 0x52, 0x84, 0xd6, 0x2a, 0x3b, 0x87, 0x35, 0x61, 0x51, 0x5c, 0x84,
|
0x09, 0x3d, 0x1f, 0xb4, 0xbf, 0xc2, 0xab, 0x5a, 0x47, 0xb7, 0x98, 0xed, 0x42, 0x75, 0x28, 0x62,
|
||||||
0x32, 0x52, 0x66, 0x15, 0xdd, 0xf2, 0x2f, 0xe9, 0x8f, 0x07, 0xf4, 0xd3, 0x4a, 0xbc, 0x2a, 0xd2,
|
0x2f, 0xf2, 0xa9, 0xc9, 0x4d, 0xd2, 0xd7, 0x30, 0xa6, 0x94, 0xa7, 0xd1, 0x49, 0x11, 0x3a, 0x57,
|
||||||
0x01, 0x73, 0xa1, 0xe0, 0xb9, 0xa1, 0xee, 0x77, 0xd5, 0x66, 0xfd, 0x95, 0xf5, 0xda, 0x6e, 0xa8,
|
0xd9, 0x3d, 0xac, 0x09, 0x8b, 0xe2, 0x22, 0x94, 0x91, 0x32, 0xa7, 0xe8, 0x8f, 0x90, 0x2b, 0xfa,
|
||||||
0x45, 0x6b, 0xdd, 0xc6, 0xb3, 0x3e, 0xfd, 0x63, 0x6d, 0x2b, 0xd3, 0xe4, 0xce, 0xe5, 0xc9, 0x6c,
|
0x73, 0x06, 0xf5, 0x74, 0x12, 0xaf, 0x8a, 0x74, 0xc1, 0x5c, 0x28, 0x78, 0x6e, 0xa8, 0x27, 0x70,
|
||||||
0x87, 0xea, 0xe5, 0xcc, 0x57, 0x3b, 0x53, 0xe5, 0x4f, 0x76, 0xdc, 0xd0, 0x47, 0x3a, 0x9c, 0xd8,
|
0xb5, 0x59, 0x7f, 0xed, 0xbc, 0xb6, 0x1b, 0xea, 0xa4, 0xb5, 0xee, 0x62, 0xac, 0xcf, 0x7f, 0x5e,
|
||||||
0xeb, 0x70, 0xa2, 0x5e, 0xb9, 0x0f, 0xb5, 0x57, 0xf7, 0xfd, 0x2e, 0x39, 0x58, 0xb9, 0x0b, 0xf6,
|
0xdb, 0xca, 0x8c, 0xdd, 0x73, 0x79, 0x32, 0xdb, 0xa1, 0x7e, 0x39, 0xf3, 0xd5, 0xce, 0x54, 0xf9,
|
||||||
0x7c, 0x1f, 0xff, 0x36, 0xb1, 0x92, 0x4d, 0xde, 0x0d, 0xa8, 0x66, 0xce, 0x8d, 0xc0, 0x63, 0x02,
|
0x93, 0x1d, 0x37, 0xf4, 0x91, 0x0e, 0x37, 0xf6, 0x3a, 0x9c, 0xa8, 0x57, 0x1e, 0x42, 0xed, 0x75,
|
||||||
0x6a, 0xf5, 0xf5, 0xc0, 0x79, 0x8a, 0xdf, 0x1b, 0x49, 0xc7, 0xf9, 0x08, 0xe0, 0x54, 0xa9, 0xf0,
|
0xbf, 0xdf, 0xa7, 0x06, 0x2b, 0xf7, 0xc1, 0x9e, 0xfb, 0xf1, 0x47, 0x1b, 0x2b, 0xd9, 0xe2, 0xdd,
|
||||||
0x11, 0xb5, 0x20, 0xb3, 0x88, 0x8d, 0x1e, 0x42, 0xb0, 0x35, 0xa8, 0xe2, 0x20, 0x36, 0x71, 0xbd,
|
0x82, 0x6a, 0x26, 0x6e, 0x04, 0x1e, 0x13, 0x50, 0x67, 0x5f, 0x2f, 0x9c, 0xe7, 0xf8, 0x05, 0x94,
|
||||||
0x53, 0x9a, 0x11, 0x6b, 0xc0, 0x87, 0x60, 0x8f, 0xe6, 0xd3, 0x75, 0xeb, 0xa8, 0x8c, 0x92, 0xd9,
|
0xcc, 0xc0, 0xff, 0x00, 0x9c, 0x2a, 0x15, 0x3e, 0xa1, 0xa1, 0x68, 0x0e, 0xb1, 0x51, 0x43, 0x08,
|
||||||
0x1f, 0x40, 0x25, 0x90, 0x26, 0xa6, 0x3b, 0x62, 0x39, 0x90, 0x14, 0x72, 0xb6, 0xe0, 0xbd, 0xd7,
|
0xb6, 0x06, 0x55, 0x5c, 0xc4, 0xc6, 0xae, 0x3d, 0xa5, 0x1d, 0xb1, 0x06, 0xfc, 0x1b, 0xec, 0xd1,
|
||||||
0x3e, 0x8e, 0xd8, 0x35, 0x28, 0x8d, 0xfc, 0x89, 0xa2, 0xeb, 0x8a, 0x4d, 0xd6, 0x8c, 0x9c, 0xdf,
|
0x7c, 0xbb, 0x1e, 0x66, 0x95, 0x51, 0xb2, 0xfb, 0x5f, 0x50, 0x09, 0xa4, 0xb1, 0xe9, 0x19, 0x5d,
|
||||||
0x72, 0x00, 0xe9, 0xd5, 0x42, 0x45, 0xf0, 0xde, 0x21, 0x66, 0x51, 0xdf, 0xb3, 0x09, 0x54, 0xce,
|
0x0e, 0x24, 0x99, 0x9c, 0x2d, 0xf8, 0xc7, 0x1b, 0x9f, 0x6b, 0xec, 0x06, 0x94, 0x46, 0xfe, 0x44,
|
||||||
0x4d, 0x06, 0x4d, 0x1d, 0x5d, 0x7f, 0xf9, 0x3a, 0x36, 0x92, 0x04, 0xeb, 0xdc, 0x36, 0x4d, 0x6e,
|
0xd1, 0x75, 0xc5, 0xb1, 0x6f, 0x56, 0xce, 0x8f, 0x39, 0x80, 0xf4, 0x6a, 0x61, 0x46, 0xf0, 0xde,
|
||||||
0xdf, 0xe5, 0x03, 0x66, 0xbe, 0xc2, 0xca, 0x43, 0x58, 0x7a, 0x89, 0xee, 0x2d, 0x6f, 0x6a, 0x5a,
|
0x21, 0x66, 0x51, 0xdf, 0xb3, 0x09, 0x54, 0xce, 0x4d, 0x05, 0x4d, 0x1f, 0xdd, 0x7c, 0xf5, 0x3a,
|
||||||
0x65, 0xd9, 0x94, 0xdd, 0x82, 0x92, 0x6e, 0xee, 0xf8, 0x6e, 0xa3, 0x65, 0x68, 0xc8, 0xa6, 0xde,
|
0x36, 0x92, 0x02, 0xeb, 0xda, 0x36, 0x4d, 0x6d, 0xdf, 0xe7, 0x93, 0x6a, 0x7e, 0xc2, 0xca, 0x63,
|
||||||
0x72, 0x98, 0x7c, 0xea, 0xf5, 0x0e, 0x37, 0x37, 0xa0, 0x6c, 0x3e, 0x5a, 0x98, 0x0d, 0xc5, 0xaf,
|
0x58, 0x7a, 0x85, 0xee, 0x1d, 0x6f, 0x6a, 0xda, 0x65, 0xd9, 0x92, 0xdd, 0x81, 0x92, 0xfe, 0xdc,
|
||||||
0x0f, 0x06, 0xdd, 0xa3, 0xda, 0x02, 0xab, 0x40, 0x61, 0xaf, 0x3f, 0x38, 0xaa, 0xe5, 0xd0, 0x3a,
|
0xc0, 0x77, 0x1b, 0x25, 0x43, 0x43, 0x32, 0xcd, 0x96, 0xc3, 0xe4, 0xe3, 0xb3, 0x77, 0xb8, 0xb9,
|
||||||
0xe8, 0x1f, 0x74, 0x6b, 0xd6, 0xe6, 0x17, 0x60, 0xcf, 0x9b, 0x2b, 0xba, 0x5b, 0xbd, 0x83, 0x4e,
|
0x01, 0x65, 0xf3, 0x19, 0xc5, 0x6c, 0x28, 0x7e, 0x7a, 0x30, 0xe8, 0x1e, 0xd5, 0x16, 0x58, 0x05,
|
||||||
0x6d, 0x81, 0x01, 0x94, 0x06, 0xdd, 0x36, 0xef, 0x22, 0xb8, 0x0c, 0xf9, 0xc1, 0x60, 0xaf, 0x66,
|
0x0a, 0x7b, 0xfd, 0xc1, 0x51, 0x2d, 0x87, 0xd2, 0x41, 0xff, 0xa0, 0x5b, 0xb3, 0x36, 0x3f, 0x02,
|
||||||
0x21, 0x55, 0x7b, 0xb7, 0xbd, 0xd7, 0xad, 0xe5, 0xd1, 0x3c, 0xda, 0x3f, 0x7c, 0x30, 0xa8, 0x15,
|
0x7b, 0x3e, 0xee, 0x51, 0xdd, 0xea, 0x1d, 0x74, 0x6a, 0x0b, 0x0c, 0xa0, 0x34, 0xe8, 0xb6, 0x79,
|
||||||
0x36, 0xef, 0xc0, 0xa5, 0x57, 0x1a, 0x20, 0xcd, 0xde, 0xdb, 0xe5, 0x5d, 0x64, 0xaa, 0x42, 0xf9,
|
0x17, 0xc1, 0x65, 0xc8, 0x0f, 0x06, 0x7b, 0x35, 0x0b, 0xa9, 0xda, 0xbb, 0xed, 0xbd, 0x6e, 0x2d,
|
||||||
0x90, 0xf7, 0x8e, 0x77, 0x8f, 0xba, 0xb5, 0x1c, 0x06, 0xbe, 0xea, 0xb7, 0x1f, 0x76, 0x3b, 0x35,
|
0x8f, 0xe2, 0xd1, 0xfe, 0xe1, 0xa3, 0x41, 0xad, 0xb0, 0x79, 0x0f, 0xae, 0xbc, 0x36, 0x6e, 0x69,
|
||||||
0xab, 0x55, 0x7b, 0xf6, 0x62, 0x35, 0xf7, 0xeb, 0x8b, 0xd5, 0xdc, 0x9f, 0x2f, 0x56, 0x73, 0xdf,
|
0xf7, 0xde, 0x2e, 0xef, 0x22, 0x53, 0x15, 0xca, 0x87, 0xbc, 0x77, 0xbc, 0x7b, 0xd4, 0xad, 0xe5,
|
||||||
0xfd, 0xb5, 0xba, 0x70, 0x52, 0xa2, 0x3f, 0x03, 0xb7, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x8c,
|
0xd0, 0xf0, 0x49, 0xbf, 0xfd, 0xb8, 0xdb, 0xa9, 0x59, 0xad, 0x6b, 0x2f, 0x2e, 0x57, 0x73, 0xdf,
|
||||||
0x1e, 0x1e, 0x98, 0x4c, 0x0c, 0x00, 0x00,
|
0x5d, 0xae, 0xe6, 0x7e, 0xb8, 0x5c, 0xcd, 0xfd, 0x72, 0xb9, 0x9a, 0xfb, 0xe2, 0xd7, 0xd5, 0x85,
|
||||||
|
0x93, 0x12, 0xfd, 0x45, 0xb9, 0xfb, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0xfe, 0x08, 0x0c,
|
||||||
|
0xe2, 0x0c, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@ package pb;
|
||||||
|
|
||||||
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
|
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
|
||||||
|
|
||||||
|
option (gogoproto.stable_marshaler_all) = true;
|
||||||
|
|
||||||
// Op represents a vertex of the LLB DAG.
|
// Op represents a vertex of the LLB DAG.
|
||||||
message Op {
|
message Op {
|
||||||
// inputs is a set of input edges.
|
// inputs is a set of input edges.
|
||||||
|
@ -72,6 +74,7 @@ message Mount {
|
||||||
MountType mountType = 6;
|
MountType mountType = 6;
|
||||||
CacheOpt cacheOpt = 20;
|
CacheOpt cacheOpt = 20;
|
||||||
SecretOpt secretOpt = 21;
|
SecretOpt secretOpt = 21;
|
||||||
|
SSHOpt SSHOpt = 22;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MountType defines a type of a mount from a supported set
|
// MountType defines a type of a mount from a supported set
|
||||||
|
@ -116,6 +119,21 @@ message SecretOpt {
|
||||||
bool optional = 5;
|
bool optional = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SSHOpt defines options describing secret mounts
|
||||||
|
message SSHOpt {
|
||||||
|
// ID of exposed ssh rule. Used for quering the value.
|
||||||
|
string ID = 1;
|
||||||
|
// UID of agent socket
|
||||||
|
uint32 uid = 2;
|
||||||
|
// GID of agent socket
|
||||||
|
uint32 gid = 3;
|
||||||
|
// Mode is the filesystem mode of agent socket
|
||||||
|
uint32 mode = 4;
|
||||||
|
// Optional defines if ssh socket is required. Error is produced
|
||||||
|
// if client does not expose ssh.
|
||||||
|
bool optional = 5;
|
||||||
|
}
|
||||||
|
|
||||||
// CopyOp copies files across Ops.
|
// CopyOp copies files across Ops.
|
||||||
message CopyOp {
|
message CopyOp {
|
||||||
repeated CopySource src = 1;
|
repeated CopySource src = 1;
|
||||||
|
|
|
@ -371,7 +371,7 @@ func debugSchedulerPreUnpark(e *edge, inc []pipe.Sender, updates, allPipes []pip
|
||||||
if dep.req != nil {
|
if dep.req != nil {
|
||||||
des = dep.req.Request().(*edgeRequest).desiredState
|
des = dep.req.Request().(*edgeRequest).desiredState
|
||||||
}
|
}
|
||||||
logrus.Debugf(":: dep%d %s state=%s des=%s keys=%s hasslowcache=%v", i, e.edge.Vertex.Inputs()[i].Vertex.Name(), dep.state, des, len(dep.keys), e.slowCacheFunc(dep) != nil)
|
logrus.Debugf(":: dep%d %s state=%s des=%s keys=%d hasslowcache=%v", i, e.edge.Vertex.Inputs()[i].Vertex.Name(), dep.state, des, len(dep.keys), e.slowCacheFunc(dep) != nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, in := range inc {
|
for i, in := range inc {
|
||||||
|
|
|
@ -11,7 +11,6 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/docker/docker/pkg/locker"
|
"github.com/docker/docker/pkg/locker"
|
||||||
"github.com/moby/buildkit/cache"
|
"github.com/moby/buildkit/cache"
|
||||||
"github.com/moby/buildkit/cache/metadata"
|
"github.com/moby/buildkit/cache/metadata"
|
||||||
|
@ -22,6 +21,7 @@ import (
|
||||||
"github.com/moby/buildkit/util/progress/logs"
|
"github.com/moby/buildkit/util/progress/logs"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
var validHex = regexp.MustCompile(`^[a-f0-9]{40}$`)
|
var validHex = regexp.MustCompile(`^[a-f0-9]{40}$`)
|
||||||
|
|
|
@ -15,7 +15,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/docker/docker/pkg/locker"
|
"github.com/docker/docker/pkg/locker"
|
||||||
"github.com/moby/buildkit/cache"
|
"github.com/moby/buildkit/cache"
|
||||||
"github.com/moby/buildkit/cache/metadata"
|
"github.com/moby/buildkit/cache/metadata"
|
||||||
|
@ -24,6 +23,7 @@ import (
|
||||||
"github.com/moby/buildkit/util/tracing"
|
"github.com/moby/buildkit/util/tracing"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Opt struct {
|
type Opt struct {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
|
||||||
"github.com/moby/buildkit/cache"
|
"github.com/moby/buildkit/cache"
|
||||||
"github.com/moby/buildkit/cache/contenthash"
|
"github.com/moby/buildkit/cache/contenthash"
|
||||||
"github.com/moby/buildkit/cache/metadata"
|
"github.com/moby/buildkit/cache/metadata"
|
||||||
|
@ -20,6 +19,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/tonistiigi/fsutil"
|
"github.com/tonistiigi/fsutil"
|
||||||
|
bolt "go.etcd.io/bbolt"
|
||||||
"golang.org/x/time/rate"
|
"golang.org/x/time/rate"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
|
|
@ -3,10 +3,13 @@ package contentutil
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/containerd/containerd/content"
|
"github.com/containerd/containerd/content"
|
||||||
|
"github.com/containerd/containerd/images"
|
||||||
"github.com/containerd/containerd/remotes"
|
"github.com/containerd/containerd/remotes"
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Copy(ctx context.Context, ingester content.Ingester, provider content.Provider, desc ocispec.Descriptor) error {
|
func Copy(ctx context.Context, ingester content.Ingester, provider content.Provider, desc ocispec.Descriptor) error {
|
||||||
|
@ -41,3 +44,38 @@ func (r *rc) Read(b []byte) (int, error) {
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CopyChain(ctx context.Context, ingester content.Ingester, provider content.Provider, desc ocispec.Descriptor) error {
|
||||||
|
var m sync.Mutex
|
||||||
|
manifestStack := []ocispec.Descriptor{}
|
||||||
|
|
||||||
|
filterHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
||||||
|
switch desc.MediaType {
|
||||||
|
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest,
|
||||||
|
images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
|
||||||
|
m.Lock()
|
||||||
|
manifestStack = append(manifestStack, desc)
|
||||||
|
m.Unlock()
|
||||||
|
return nil, images.ErrStopHandler
|
||||||
|
default:
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
})
|
||||||
|
handlers := []images.Handler{
|
||||||
|
images.ChildrenHandler(provider),
|
||||||
|
filterHandler,
|
||||||
|
remotes.FetchHandler(ingester, &localFetcher{provider}),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := images.Dispatch(ctx, images.Handlers(handlers...), desc); err != nil {
|
||||||
|
return errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := len(manifestStack) - 1; i >= 0; i-- {
|
||||||
|
if err := Copy(ctx, ingester, provider, manifestStack[i]); err != nil {
|
||||||
|
return errors.WithStack(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -55,6 +55,9 @@ func (r *readerAt) ReadAt(b []byte, off int64) (int, error) {
|
||||||
var totalN int
|
var totalN int
|
||||||
for len(b) > 0 {
|
for len(b) > 0 {
|
||||||
n, err := r.Reader.Read(b)
|
n, err := r.Reader.Read(b)
|
||||||
|
if err == io.EOF && n == len(b) {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
r.offset += int64(n)
|
r.offset += int64(n)
|
||||||
totalN += n
|
totalN += n
|
||||||
b = b[n:]
|
b = b[n:]
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewMultiProvider creates a new mutable provider with a base provider
|
||||||
func NewMultiProvider(base content.Provider) *MultiProvider {
|
func NewMultiProvider(base content.Provider) *MultiProvider {
|
||||||
return &MultiProvider{
|
return &MultiProvider{
|
||||||
base: base,
|
base: base,
|
||||||
|
@ -18,12 +19,14 @@ func NewMultiProvider(base content.Provider) *MultiProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MultiProvider is a provider backed by a mutable map of providers
|
||||||
type MultiProvider struct {
|
type MultiProvider struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
base content.Provider
|
base content.Provider
|
||||||
sub map[digest.Digest]content.Provider
|
sub map[digest.Digest]content.Provider
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReaderAt returns a content.ReaderAt
|
||||||
func (mp *MultiProvider) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.ReaderAt, error) {
|
func (mp *MultiProvider) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.ReaderAt, error) {
|
||||||
mp.mu.RLock()
|
mp.mu.RLock()
|
||||||
if p, ok := mp.sub[desc.Digest]; ok {
|
if p, ok := mp.sub[desc.Digest]; ok {
|
||||||
|
@ -37,6 +40,7 @@ func (mp *MultiProvider) ReaderAt(ctx context.Context, desc ocispec.Descriptor)
|
||||||
return mp.base.ReaderAt(ctx, desc)
|
return mp.base.ReaderAt(ctx, desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add adds a new child provider for a specific digest
|
||||||
func (mp *MultiProvider) Add(dgst digest.Digest, p content.Provider) {
|
func (mp *MultiProvider) Add(dgst digest.Digest, p content.Provider) {
|
||||||
mp.mu.Lock()
|
mp.mu.Lock()
|
||||||
defer mp.mu.Unlock()
|
defer mp.mu.Unlock()
|
||||||
|
|
57
vendor/github.com/moby/buildkit/util/contentutil/refs.go
сгенерированный
поставляемый
Normal file
57
vendor/github.com/moby/buildkit/util/contentutil/refs.go
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
package contentutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/content"
|
||||||
|
"github.com/containerd/containerd/remotes"
|
||||||
|
"github.com/containerd/containerd/remotes/docker"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ProviderFromRef(ref string) (ocispec.Descriptor, content.Provider, error) {
|
||||||
|
remote := docker.NewResolver(docker.ResolverOptions{
|
||||||
|
Client: http.DefaultClient,
|
||||||
|
})
|
||||||
|
|
||||||
|
name, desc, err := remote.Resolve(context.TODO(), ref)
|
||||||
|
if err != nil {
|
||||||
|
return ocispec.Descriptor{}, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fetcher, err := remote.Fetcher(context.TODO(), name)
|
||||||
|
if err != nil {
|
||||||
|
return ocispec.Descriptor{}, nil, err
|
||||||
|
}
|
||||||
|
return desc, FromFetcher(fetcher), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func IngesterFromRef(ref string) (content.Ingester, error) {
|
||||||
|
remote := docker.NewResolver(docker.ResolverOptions{
|
||||||
|
Client: http.DefaultClient,
|
||||||
|
})
|
||||||
|
|
||||||
|
pusher, err := remote.Pusher(context.TODO(), ref)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ingester{
|
||||||
|
pusher: pusher,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ingester struct {
|
||||||
|
pusher remotes.Pusher
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *ingester) Writer(ctx context.Context, opts ...content.WriterOpt) (content.Writer, error) {
|
||||||
|
var wo content.WriterOpts
|
||||||
|
for _, o := range opts {
|
||||||
|
if err := o(&wo); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return w.pusher.Push(ctx, wo.Desc)
|
||||||
|
}
|
|
@ -21,11 +21,13 @@ type contextKeyT string
|
||||||
|
|
||||||
var contextKey = contextKeyT("buildkit/util/flightcontrol.progress")
|
var contextKey = contextKeyT("buildkit/util/flightcontrol.progress")
|
||||||
|
|
||||||
|
// Group is a flightcontrol syncronization group
|
||||||
type Group struct {
|
type Group struct {
|
||||||
mu sync.Mutex // protects m
|
mu sync.Mutex // protects m
|
||||||
m map[string]*call // lazily initialized
|
m map[string]*call // lazily initialized
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do executes a context function syncronized by the key
|
||||||
func (g *Group) Do(ctx context.Context, key string, fn func(ctx context.Context) (interface{}, error)) (v interface{}, err error) {
|
func (g *Group) Do(ctx context.Context, key string, fn func(ctx context.Context) (interface{}, error)) (v interface{}, err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if errors.Cause(err) == errRetry {
|
if errors.Cause(err) == errRetry {
|
||||||
|
@ -312,13 +314,3 @@ func (ps *progressState) close(pw progress.Writer) {
|
||||||
}
|
}
|
||||||
ps.mu.Unlock()
|
ps.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func WriteProgress(ctx context.Context, pw progress.Writer) error {
|
|
||||||
v := ctx.Value(contextKey)
|
|
||||||
p, ok := v.(*progressState)
|
|
||||||
if !ok {
|
|
||||||
return errors.Errorf("invalid context not from flightcontrol")
|
|
||||||
}
|
|
||||||
p.add(pw)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,12 +14,12 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
type IngesterProvider interface {
|
type ContentCache interface {
|
||||||
content.Ingester
|
content.Ingester
|
||||||
content.Provider
|
content.Provider
|
||||||
}
|
}
|
||||||
|
|
||||||
func Config(ctx context.Context, str string, resolver remotes.Resolver, ingester IngesterProvider, p *specs.Platform) (digest.Digest, []byte, error) {
|
func Config(ctx context.Context, str string, resolver remotes.Resolver, cache ContentCache, p *specs.Platform) (digest.Digest, []byte, error) {
|
||||||
// TODO: fix buildkit to take interface instead of struct
|
// TODO: fix buildkit to take interface instead of struct
|
||||||
var platform platforms.MatchComparer
|
var platform platforms.MatchComparer
|
||||||
if p != nil {
|
if p != nil {
|
||||||
|
@ -36,7 +36,7 @@ func Config(ctx context.Context, str string, resolver remotes.Resolver, ingester
|
||||||
Digest: ref.Digest(),
|
Digest: ref.Digest(),
|
||||||
}
|
}
|
||||||
if desc.Digest != "" {
|
if desc.Digest != "" {
|
||||||
ra, err := ingester.ReaderAt(ctx, desc)
|
ra, err := cache.ReaderAt(ctx, desc)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
desc.Size = ra.Size()
|
desc.Size = ra.Size()
|
||||||
mt, err := DetectManifestMediaType(ra)
|
mt, err := DetectManifestMediaType(ra)
|
||||||
|
@ -58,19 +58,23 @@ func Config(ctx context.Context, str string, resolver remotes.Resolver, ingester
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if desc.MediaType == images.MediaTypeDockerSchema1Manifest {
|
||||||
|
return readSchema1Config(ctx, ref.String(), desc, fetcher, cache)
|
||||||
|
}
|
||||||
|
|
||||||
handlers := []images.Handler{
|
handlers := []images.Handler{
|
||||||
remotes.FetchHandler(ingester, fetcher),
|
remotes.FetchHandler(cache, fetcher),
|
||||||
childrenConfigHandler(ingester, platform),
|
childrenConfigHandler(cache, platform),
|
||||||
}
|
}
|
||||||
if err := images.Dispatch(ctx, images.Handlers(handlers...), desc); err != nil {
|
if err := images.Dispatch(ctx, images.Handlers(handlers...), desc); err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
config, err := images.Config(ctx, ingester, desc, platform)
|
config, err := images.Config(ctx, cache, desc, platform)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
dt, err := content.ReadBlob(ctx, ingester, config)
|
dt, err := content.ReadBlob(ctx, cache, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|
87
vendor/github.com/moby/buildkit/util/imageutil/schema1.go
сгенерированный
поставляемый
Normal file
87
vendor/github.com/moby/buildkit/util/imageutil/schema1.go
сгенерированный
поставляемый
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
package imageutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/remotes"
|
||||||
|
digest "github.com/opencontainers/go-digest"
|
||||||
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func readSchema1Config(ctx context.Context, ref string, desc specs.Descriptor, fetcher remotes.Fetcher, cache ContentCache) (digest.Digest, []byte, error) {
|
||||||
|
rc, err := fetcher.Fetch(ctx, desc)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
defer rc.Close()
|
||||||
|
dt, err := ioutil.ReadAll(rc)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, errors.Wrap(err, "failed to fetch schema1 manifest")
|
||||||
|
}
|
||||||
|
dt, err = convertSchema1ConfigMeta(dt)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
return desc.Digest, dt, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertSchema1ConfigMeta(in []byte) ([]byte, error) {
|
||||||
|
type history struct {
|
||||||
|
V1Compatibility string `json:"v1Compatibility"`
|
||||||
|
}
|
||||||
|
var m struct {
|
||||||
|
History []history `json:"history"`
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(in, &m); err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to unmarshal schema1 manifest")
|
||||||
|
}
|
||||||
|
if len(m.History) == 0 {
|
||||||
|
return nil, errors.Errorf("invalid schema1 manifest")
|
||||||
|
}
|
||||||
|
|
||||||
|
var img specs.Image
|
||||||
|
if err := json.Unmarshal([]byte(m.History[0].V1Compatibility), &img); err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to unmarshal image from schema 1 history")
|
||||||
|
}
|
||||||
|
|
||||||
|
img.RootFS = specs.RootFS{
|
||||||
|
Type: "layers", // filled in by exporter
|
||||||
|
}
|
||||||
|
img.History = make([]specs.History, len(m.History))
|
||||||
|
|
||||||
|
for i := range m.History {
|
||||||
|
var h v1History
|
||||||
|
if err := json.Unmarshal([]byte(m.History[i].V1Compatibility), &h); err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to unmarshal history")
|
||||||
|
}
|
||||||
|
img.History[len(m.History)-i-1] = specs.History{
|
||||||
|
Author: h.Author,
|
||||||
|
Comment: h.Comment,
|
||||||
|
Created: &h.Created,
|
||||||
|
CreatedBy: strings.Join(h.ContainerConfig.Cmd, " "),
|
||||||
|
EmptyLayer: (h.ThrowAway != nil && *h.ThrowAway) || (h.Size != nil && *h.Size == 0),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err := json.MarshalIndent(img, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to marshal schema1 config")
|
||||||
|
}
|
||||||
|
return dt, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type v1History struct {
|
||||||
|
Author string `json:"author,omitempty"`
|
||||||
|
Created time.Time `json:"created"`
|
||||||
|
Comment string `json:"comment,omitempty"`
|
||||||
|
ThrowAway *bool `json:"throwaway,omitempty"`
|
||||||
|
Size *int `json:"Size,omitempty"` // used before ThrowAway field
|
||||||
|
ContainerConfig struct {
|
||||||
|
Cmd []string `json:"Cmd,omitempty"`
|
||||||
|
} `json:"container_config,omitempty"`
|
||||||
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
github.com/boltdb/bolt e9cf4fae01b5a8ff89d0ec6b32f0d9c9f79aefdd
|
|
||||||
github.com/pkg/errors v0.8.0
|
github.com/pkg/errors v0.8.0
|
||||||
|
go.etcd.io/bbolt v1.3.1-etcd.8
|
||||||
|
|
||||||
github.com/stretchr/testify v1.1.4
|
github.com/stretchr/testify v1.1.4
|
||||||
github.com/davecgh/go-spew v1.1.0
|
github.com/davecgh/go-spew v1.1.0
|
||||||
github.com/pmezard/go-difflib v1.0.0
|
github.com/pmezard/go-difflib v1.0.0
|
||||||
golang.org/x/sys 1b2967e3c290b7c545b3db0deeda16e9be4f98a2
|
golang.org/x/sys 1b2967e3c290b7c545b3db0deeda16e9be4f98a2
|
||||||
|
|
||||||
github.com/containerd/containerd v1.2.0-beta.2
|
github.com/containerd/containerd d97a907f7f781c0ab8340877d8e6b53cc7f1c2f6
|
||||||
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
|
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
|
||||||
golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
|
golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
|
||||||
github.com/sirupsen/logrus v1.0.0
|
github.com/sirupsen/logrus v1.0.0
|
||||||
|
@ -16,19 +16,20 @@ golang.org/x/net 0ed95abb35c445290478a5348a7b38bb154135fd
|
||||||
github.com/gogo/protobuf v1.0.0
|
github.com/gogo/protobuf v1.0.0
|
||||||
github.com/gogo/googleapis b23578765ee54ff6bceff57f397d833bf4ca6869
|
github.com/gogo/googleapis b23578765ee54ff6bceff57f397d833bf4ca6869
|
||||||
github.com/golang/protobuf v1.1.0
|
github.com/golang/protobuf v1.1.0
|
||||||
github.com/containerd/continuity d3c23511c1bf5851696cba83143d9cbcd666869b
|
github.com/containerd/continuity f44b615e492bdfb371aae2f76ec694d9da1db537
|
||||||
github.com/opencontainers/image-spec v1.0.1
|
github.com/opencontainers/image-spec v1.0.1
|
||||||
github.com/opencontainers/runc 20aff4f0488c6d4b8df4d85b4f63f1f704c11abd
|
github.com/opencontainers/runc 20aff4f0488c6d4b8df4d85b4f63f1f704c11abd
|
||||||
github.com/Microsoft/go-winio v0.4.10
|
github.com/Microsoft/go-winio v0.4.11
|
||||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
|
||||||
github.com/opencontainers/runtime-spec d810dbc60d8c5aeeb3d054bd1132fab2121968ce # v1.0.1-43-gd810dbc
|
github.com/opencontainers/runtime-spec eba862dc2470385a233c7507392675cbeadf7353 # v1.0.1-45-geba862d
|
||||||
github.com/containerd/go-runc acb7c88cac264acca9b5eae187a117f4d77a1292
|
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
|
||||||
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
|
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
|
||||||
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
||||||
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
|
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
|
||||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||||
github.com/syndtr/gocapability db04d3cc01c8b54962a58ec7e491717d06cfcc16
|
github.com/syndtr/gocapability db04d3cc01c8b54962a58ec7e491717d06cfcc16
|
||||||
github.com/Microsoft/hcsshim 44c060121b68e8bdc40b411beba551f3b4ee9e55
|
github.com/Microsoft/hcsshim v0.7.3
|
||||||
|
golang.org/x/crypto 0709b304e793a5edb4a2c0145f281ecdc20838a4
|
||||||
|
|
||||||
github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
|
github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
|
||||||
github.com/morikuni/aec 39771216ff4c63d11f5e604076f9c45e8be1067b
|
github.com/morikuni/aec 39771216ff4c63d11f5e604076f9c45e8be1067b
|
||||||
|
@ -49,8 +50,9 @@ github.com/docker/distribution 30578ca32960a4d368bf6db67b0a33c2a1f3dc6f
|
||||||
github.com/tonistiigi/units 6950e57a87eaf136bbe44ef2ec8e75b9e3569de2
|
github.com/tonistiigi/units 6950e57a87eaf136bbe44ef2ec8e75b9e3569de2
|
||||||
github.com/docker/cli 99576756eb3303b7af8102c502f21a912e3c1af6 https://github.com/tonistiigi/docker-cli.git
|
github.com/docker/cli 99576756eb3303b7af8102c502f21a912e3c1af6 https://github.com/tonistiigi/docker-cli.git
|
||||||
github.com/docker/docker-credential-helpers d68f9aeca33f5fd3f08eeae5e9d175edf4e731d1
|
github.com/docker/docker-credential-helpers d68f9aeca33f5fd3f08eeae5e9d175edf4e731d1
|
||||||
github.com/docker/libnetwork 822e5b59d346b7ad0735df2c8e445e9787320e67
|
github.com/docker/libnetwork 36d3bed0e9f4b3c8c66df9bd45278bb90b33e911
|
||||||
github.com/BurntSushi/toml 3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005
|
github.com/BurntSushi/toml 3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005
|
||||||
|
github.com/ishidawataru/sctp 07191f837fedd2f13d1ec7b5f885f0f3ec54b1cb
|
||||||
|
|
||||||
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
|
||||||
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7
|
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7
|
||||||
|
|
|
@ -36,7 +36,7 @@ func (s *cacheResultStorage) Save(res solver.Result) (solver.CacheResult, error)
|
||||||
return solver.CacheResult{ID: ref.ID(), CreatedAt: time.Now()}, nil
|
return solver.CacheResult{ID: ref.ID(), CreatedAt: time.Now()}, nil
|
||||||
}
|
}
|
||||||
func (s *cacheResultStorage) Load(ctx context.Context, res solver.CacheResult) (solver.Result, error) {
|
func (s *cacheResultStorage) Load(ctx context.Context, res solver.CacheResult) (solver.Result, error) {
|
||||||
return s.load(res.ID)
|
return s.load(res.ID, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *cacheResultStorage) getWorkerRef(id string) (Worker, string, error) {
|
func (s *cacheResultStorage) getWorkerRef(id string) (Worker, string, error) {
|
||||||
|
@ -51,7 +51,7 @@ func (s *cacheResultStorage) getWorkerRef(id string) (Worker, string, error) {
|
||||||
return w, refID, nil
|
return w, refID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *cacheResultStorage) load(id string) (solver.Result, error) {
|
func (s *cacheResultStorage) load(id string, hidden bool) (solver.Result, error) {
|
||||||
w, refID, err := s.getWorkerRef(id)
|
w, refID, err := s.getWorkerRef(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -59,7 +59,7 @@ func (s *cacheResultStorage) load(id string) (solver.Result, error) {
|
||||||
if refID == "" {
|
if refID == "" {
|
||||||
return NewWorkerRefResult(nil, w), nil
|
return NewWorkerRefResult(nil, w), nil
|
||||||
}
|
}
|
||||||
ref, err := w.LoadRef(refID)
|
ref, err := w.LoadRef(refID, hidden)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ func (s *cacheResultStorage) LoadRemote(ctx context.Context, res solver.CacheRes
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ref, err := w.LoadRef(refID)
|
ref, err := w.LoadRef(refID, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ func (s *cacheResultStorage) LoadRemote(ctx context.Context, res solver.CacheRes
|
||||||
return remote, nil
|
return remote, nil
|
||||||
}
|
}
|
||||||
func (s *cacheResultStorage) Exists(id string) bool {
|
func (s *cacheResultStorage) Exists(id string) bool {
|
||||||
ref, err := s.load(id)
|
ref, err := s.load(id, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ type Worker interface {
|
||||||
Labels() map[string]string
|
Labels() map[string]string
|
||||||
Platforms() []specs.Platform
|
Platforms() []specs.Platform
|
||||||
GCPolicy() []client.PruneInfo
|
GCPolicy() []client.PruneInfo
|
||||||
LoadRef(id string) (cache.ImmutableRef, error)
|
LoadRef(id string, hidden bool) (cache.ImmutableRef, error)
|
||||||
// ResolveOp resolves Vertex.Sys() to Op implementation.
|
// ResolveOp resolves Vertex.Sys() to Op implementation.
|
||||||
ResolveOp(v solver.Vertex, s frontend.FrontendLLBBridge) (solver.Op, error)
|
ResolveOp(v solver.Vertex, s frontend.FrontendLLBBridge) (solver.Op, error)
|
||||||
ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error)
|
ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче