| package containerd |
| |
| import ( |
| "context" |
| "time" |
| |
| leasesapi "github.com/containerd/containerd/api/services/leases/v1" |
| "github.com/containerd/containerd/leases" |
| ) |
| |
| // Lease is used to hold a reference to active resources which have not been |
| // referenced by a root resource. This is useful for preventing garbage |
| // collection of resources while they are actively being updated. |
| type Lease struct { |
| id string |
| createdAt time.Time |
| |
| client *Client |
| } |
| |
| // CreateLease creates a new lease |
| func (c *Client) CreateLease(ctx context.Context) (Lease, error) { |
| lapi := leasesapi.NewLeasesClient(c.conn) |
| resp, err := lapi.Create(ctx, &leasesapi.CreateRequest{}) |
| if err != nil { |
| return Lease{}, err |
| } |
| |
| return Lease{ |
| id: resp.Lease.ID, |
| client: c, |
| }, nil |
| } |
| |
| // ListLeases lists active leases |
| func (c *Client) ListLeases(ctx context.Context) ([]Lease, error) { |
| lapi := leasesapi.NewLeasesClient(c.conn) |
| resp, err := lapi.List(ctx, &leasesapi.ListRequest{}) |
| if err != nil { |
| return nil, err |
| } |
| leases := make([]Lease, len(resp.Leases)) |
| for i := range resp.Leases { |
| leases[i] = Lease{ |
| id: resp.Leases[i].ID, |
| createdAt: resp.Leases[i].CreatedAt, |
| client: c, |
| } |
| } |
| |
| return leases, nil |
| } |
| |
| // WithLease attaches a lease on the context |
| func (c *Client) WithLease(ctx context.Context) (context.Context, func() error, error) { |
| _, ok := leases.Lease(ctx) |
| if ok { |
| return ctx, func() error { |
| return nil |
| }, nil |
| } |
| |
| l, err := c.CreateLease(ctx) |
| if err != nil { |
| return nil, nil, err |
| } |
| |
| ctx = leases.WithLease(ctx, l.ID()) |
| return ctx, func() error { |
| return l.Delete(ctx) |
| }, nil |
| } |
| |
| // ID returns the lease ID |
| func (l Lease) ID() string { |
| return l.id |
| } |
| |
| // CreatedAt returns the time at which the lease was created |
| func (l Lease) CreatedAt() time.Time { |
| return l.createdAt |
| } |
| |
| // Delete deletes the lease, removing the reference to all resources created |
| // during the lease. |
| func (l Lease) Delete(ctx context.Context) error { |
| lapi := leasesapi.NewLeasesClient(l.client.conn) |
| _, err := lapi.Delete(ctx, &leasesapi.DeleteRequest{ |
| ID: l.id, |
| }) |
| return err |
| } |