func (p *dockerProvisioner) Destroy(app provision.App) error { containers, err := p.listContainersByApp(app.GetName()) if err != nil { log.Errorf("Failed to list app containers: %s", err.Error()) return err } args := changeUnitsPipelineArgs{ app: app, toRemove: containers, writer: ioutil.Discard, provisioner: p, appDestroy: true, } pipeline := action.NewPipeline( &removeOldRoutes, &provisionRemoveOldUnits, &provisionUnbindOldUnits, ) err = pipeline.Execute(args) if err != nil { return err } images, err := listAppImages(app.GetName()) if err != nil { log.Errorf("Failed to get image ids for app %s: %s", app.GetName(), err.Error()) } cluster := p.Cluster() for _, imageId := range images { err = cluster.RemoveImage(imageId) if err != nil { log.Errorf("Failed to remove image %s: %s", imageId, err.Error()) } err = cluster.RemoveFromRegistry(imageId) if err != nil { log.Errorf("Failed to remove image %s from registry: %s", imageId, err.Error()) } } err = deleteAllAppImageNames(app.GetName()) if err != nil { log.Errorf("Failed to remove image names from storage for app %s: %s", app.GetName(), err.Error()) } r, err := getRouterForApp(app) if err != nil { log.Errorf("Failed to get router: %s", err.Error()) return err } err = r.RemoveBackend(app.GetName()) if err != nil { log.Errorf("Failed to remove route backend: %s", err.Error()) return err } return nil }
func (p *dockerProvisioner) Destroy(app provision.App) error { containers, err := p.listContainersByApp(app.GetName()) if err != nil { log.Errorf("Failed to list app containers: %s", err.Error()) return err } runInContainers(containers, func(c *container, _ chan *container) error { unit := c.asUnit(app) err := app.UnbindUnit(&unit) if err != nil { log.Errorf("Unable to unbind unit %q: %s", c.ID, err) } err = p.removeContainer(c, app) if err != nil { log.Errorf("Unable to destroy container %s: %s", c.ID, err.Error()) } return nil }, nil, true) images, err := listAppImages(app.GetName()) if err != nil { log.Errorf("Failed to get image ids for app %s: %s", app.GetName(), err.Error()) } cluster := p.getCluster() for _, imageId := range images { err := cluster.RemoveImage(imageId) if err != nil { log.Errorf("Failed to remove image %s: %s", imageId, err.Error()) } err = cluster.RemoveFromRegistry(imageId) if err != nil { log.Errorf("Failed to remove image %s from registry: %s", imageId, err.Error()) } } err = deleteAllAppImageNames(app.GetName()) if err != nil { log.Errorf("Failed to remove image names from storage for app %s: %s", app.GetName(), err.Error()) } r, err := getRouterForApp(app) if err != nil { log.Errorf("Failed to get router: %s", err.Error()) return err } err = r.RemoveBackend(app.GetName()) if err != nil { log.Errorf("Failed to remove route backend: %s", err.Error()) return err } return nil }