Add DeleteOpts for container deletion
Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
parent
bcb04540fa
commit
3f45e4369e
@ -31,7 +31,7 @@ func BenchmarkContainerCreate(b *testing.B) {
|
|||||||
var containers []Container
|
var containers []Container
|
||||||
defer func() {
|
defer func() {
|
||||||
for _, c := range containers {
|
for _, c := range containers {
|
||||||
if err := c.Delete(ctx); err != nil {
|
if err := c.Delete(ctx, WithRootFSDeletion); err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ func BenchmarkContainerStart(b *testing.B) {
|
|||||||
var containers []Container
|
var containers []Container
|
||||||
defer func() {
|
defer func() {
|
||||||
for _, c := range containers {
|
for _, c := range containers {
|
||||||
if err := c.Delete(ctx); err != nil {
|
if err := c.Delete(ctx, WithRootFSDeletion); err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ func TestCheckpointRestore(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
task, err := container.NewTask(ctx, empty())
|
task, err := container.NewTask(ctx, empty())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -132,7 +132,7 @@ func TestCheckpointRestoreNewContainer(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
task, err := container.NewTask(ctx, empty())
|
task, err := container.NewTask(ctx, empty())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -167,7 +167,7 @@ func TestCheckpointRestoreNewContainer(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err := container.Delete(ctx); err != nil {
|
if err := container.Delete(ctx, WithRootFSDeletion); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
22
container.go
22
container.go
@ -22,10 +22,12 @@ var (
|
|||||||
ErrDeleteRunningTask = errors.New("cannot delete container with running task")
|
ErrDeleteRunningTask = errors.New("cannot delete container with running task")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type DeleteOpts func(context.Context, *Client, containers.Container) error
|
||||||
|
|
||||||
type Container interface {
|
type Container interface {
|
||||||
ID() string
|
ID() string
|
||||||
Proto() containers.Container
|
Proto() containers.Container
|
||||||
Delete(context.Context) error
|
Delete(context.Context, ...DeleteOpts) error
|
||||||
NewTask(context.Context, IOCreation, ...NewTaskOpts) (Task, error)
|
NewTask(context.Context, IOCreation, ...NewTaskOpts) (Task, error)
|
||||||
Spec() (*specs.Spec, error)
|
Spec() (*specs.Spec, error)
|
||||||
Task(context.Context, IOAttach) (Task, error)
|
Task(context.Context, IOAttach) (Task, error)
|
||||||
@ -66,16 +68,24 @@ func (c *container) Spec() (*specs.Spec, error) {
|
|||||||
return &s, nil
|
return &s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithRootFSDeletion deletes the rootfs allocated for the container
|
||||||
|
func WithRootFSDeletion(ctx context.Context, client *Client, c containers.Container) error {
|
||||||
|
if c.RootFS != "" {
|
||||||
|
return client.SnapshotService().Remove(ctx, c.RootFS)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Delete deletes an existing container
|
// Delete deletes an existing container
|
||||||
// an error is returned if the container has running tasks
|
// an error is returned if the container has running tasks
|
||||||
func (c *container) Delete(ctx context.Context) (err error) {
|
func (c *container) Delete(ctx context.Context, opts ...DeleteOpts) (err error) {
|
||||||
if _, err := c.Task(ctx, nil); err == nil {
|
if _, err := c.Task(ctx, nil); err == nil {
|
||||||
return ErrDeleteRunningTask
|
return ErrDeleteRunningTask
|
||||||
}
|
}
|
||||||
// TODO: should the client be the one removing resources attached
|
for _, o := range opts {
|
||||||
// to the container at the moment before we have GC?
|
if err := o(ctx, c.client, c.c); err != nil {
|
||||||
if c.c.RootFS != "" {
|
return err
|
||||||
err = c.client.SnapshotService().Remove(ctx, c.c.RootFS)
|
}
|
||||||
}
|
}
|
||||||
if _, cerr := c.client.ContainerService().Delete(ctx, &containers.DeleteContainerRequest{
|
if _, cerr := c.client.ContainerService().Delete(ctx, &containers.DeleteContainerRequest{
|
||||||
ID: c.c.ID,
|
ID: c.c.ID,
|
||||||
|
@ -109,7 +109,7 @@ func TestContainerStart(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
task, err := container.NewTask(ctx, Stdio)
|
task, err := container.NewTask(ctx, Stdio)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -180,7 +180,7 @@ func TestContainerOutput(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
stdout := bytes.NewBuffer(nil)
|
stdout := bytes.NewBuffer(nil)
|
||||||
task, err := container.NewTask(ctx, NewIO(bytes.NewBuffer(nil), stdout, bytes.NewBuffer(nil)))
|
task, err := container.NewTask(ctx, NewIO(bytes.NewBuffer(nil), stdout, bytes.NewBuffer(nil)))
|
||||||
@ -252,7 +252,7 @@ func TestContainerExec(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
task, err := container.NewTask(ctx, empty())
|
task, err := container.NewTask(ctx, empty())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -347,7 +347,7 @@ func TestContainerProcesses(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
task, err := container.NewTask(ctx, empty())
|
task, err := container.NewTask(ctx, empty())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -420,7 +420,7 @@ func TestContainerCloseIO(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
const expected = "hello\n"
|
const expected = "hello\n"
|
||||||
stdout := bytes.NewBuffer(nil)
|
stdout := bytes.NewBuffer(nil)
|
||||||
@ -504,7 +504,7 @@ func TestContainerAttach(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
expected := "hello\n"
|
expected := "hello\n"
|
||||||
stdout := bytes.NewBuffer(nil)
|
stdout := bytes.NewBuffer(nil)
|
||||||
@ -629,7 +629,7 @@ func TestDeleteRunningContainer(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer container.Delete(ctx)
|
defer container.Delete(ctx, WithRootFSDeletion)
|
||||||
|
|
||||||
task, err := container.NewTask(ctx, empty())
|
task, err := container.NewTask(ctx, empty())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -652,7 +652,7 @@ func TestDeleteRunningContainer(t *testing.T) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = container.Delete(ctx)
|
err = container.Delete(ctx, WithRootFSDeletion)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Error("delete did not error with running task")
|
t.Error("delete did not error with running task")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user