File: manager.go

package info (click to toggle)
singularity-container 4.1.5%2Bds4-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 43,876 kB
  • sloc: asm: 14,840; sh: 3,190; ansic: 1,751; awk: 414; makefile: 413; python: 99
file content (136 lines) | stat: -rw-r--r-- 3,401 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package leaseutil

import (
	"context"
	"sync"
	"time"

	"github.com/containerd/containerd/leases"
	"github.com/containerd/containerd/namespaces"
	"github.com/pkg/errors"
)

func WithLease(ctx context.Context, ls leases.Manager, opts ...leases.Opt) (context.Context, func(context.Context) error, error) {
	_, ok := leases.FromContext(ctx)
	if ok {
		return ctx, func(context.Context) error {
			return nil
		}, nil
	}

	lr, ctx, err := NewLease(ctx, ls, opts...)
	if err != nil {
		return ctx, nil, err
	}

	return ctx, func(ctx context.Context) error {
		return ls.Delete(ctx, lr.l)
	}, nil
}

func NewLease(ctx context.Context, lm leases.Manager, opts ...leases.Opt) (*LeaseRef, context.Context, error) {
	l, err := lm.Create(ctx, append([]leases.Opt{leases.WithRandomID(), leases.WithExpiration(time.Hour)}, opts...)...)
	if err != nil {
		return nil, ctx, err
	}

	ctx = leases.WithLease(ctx, l.ID)
	return &LeaseRef{lm: lm, l: l}, ctx, nil
}

type LeaseRef struct {
	lm leases.Manager
	l  leases.Lease

	once      sync.Once
	resources []leases.Resource
	err       error
}

func (l *LeaseRef) Discard() error {
	return l.lm.Delete(context.Background(), l.l)
}

func (l *LeaseRef) Adopt(ctx context.Context) error {
	l.once.Do(func() {
		resources, err := l.lm.ListResources(ctx, l.l)
		if err != nil {
			l.err = err
			return
		}
		l.resources = resources
	})
	if l.err != nil {
		return l.err
	}
	currentID, ok := leases.FromContext(ctx)
	if !ok {
		return errors.Errorf("missing lease requirement for adopt")
	}
	for _, r := range l.resources {
		if err := l.lm.AddResource(ctx, leases.Lease{ID: currentID}, r); err != nil {
			return err
		}
	}
	if len(l.resources) == 0 {
		l.Discard()
		return nil
	}
	go l.Discard()
	return nil
}

func MakeTemporary(l *leases.Lease) error {
	if l.Labels == nil {
		l.Labels = map[string]string{}
	}
	l.Labels["buildkit/lease.temporary"] = time.Now().UTC().Format(time.RFC3339Nano)
	return nil
}

func WithNamespace(lm leases.Manager, ns string) *Manager {
	return &Manager{manager: lm, ns: ns}
}

type Manager struct {
	manager leases.Manager
	ns      string
}

func (l *Manager) Namespace() string {
	return l.ns
}

func (l *Manager) WithNamespace(ns string) *Manager {
	return WithNamespace(l.manager, ns)
}

func (l *Manager) Create(ctx context.Context, opts ...leases.Opt) (leases.Lease, error) {
	ctx = namespaces.WithNamespace(ctx, l.ns)
	return l.manager.Create(ctx, opts...)
}

func (l *Manager) Delete(ctx context.Context, lease leases.Lease, opts ...leases.DeleteOpt) error {
	ctx = namespaces.WithNamespace(ctx, l.ns)
	return l.manager.Delete(ctx, lease, opts...)
}

func (l *Manager) List(ctx context.Context, filters ...string) ([]leases.Lease, error) {
	ctx = namespaces.WithNamespace(ctx, l.ns)
	return l.manager.List(ctx, filters...)
}

func (l *Manager) AddResource(ctx context.Context, lease leases.Lease, resource leases.Resource) error {
	ctx = namespaces.WithNamespace(ctx, l.ns)
	return l.manager.AddResource(ctx, lease, resource)
}

func (l *Manager) DeleteResource(ctx context.Context, lease leases.Lease, resource leases.Resource) error {
	ctx = namespaces.WithNamespace(ctx, l.ns)
	return l.manager.DeleteResource(ctx, lease, resource)
}

func (l *Manager) ListResources(ctx context.Context, lease leases.Lease) ([]leases.Resource, error) {
	ctx = namespaces.WithNamespace(ctx, l.ns)
	return l.manager.ListResources(ctx, lease)
}