1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
"github.com/juju/errors"
11
"github.com/juju/juju/environs"
12
"github.com/juju/juju/instance"
13
"github.com/juju/juju/storage"
16
// Destroy is a common implementation of the Destroy method defined on
17
// environs.Environ; we strongly recommend that this implementation be
18
// used when writing a new provider.
19
func Destroy(env environs.Environ) error {
20
logger.Infof("destroying model %q", env.Config().Name())
21
if err := destroyInstances(env); err != nil {
22
return errors.Annotate(err, "destroying instances")
24
if err := destroyStorage(env); err != nil {
25
return errors.Annotate(err, "destroying storage")
30
func destroyInstances(env environs.Environ) error {
31
logger.Infof("destroying instances")
32
instances, err := env.AllInstances()
35
ids := make([]instance.Id, len(instances))
36
for i, inst := range instances {
39
if err := env.StopInstances(ids...); err != nil {
43
case environs.ErrNoInstances:
50
func destroyStorage(env environs.Environ) error {
51
logger.Infof("destroying storage")
52
for _, storageProviderType := range env.StorageProviderTypes() {
53
storageProvider, err := env.StorageProvider(storageProviderType)
55
return errors.Trace(err)
57
if !storageProvider.Dynamic() {
60
if storageProvider.Scope() != storage.ScopeEnviron {
63
if err := destroyVolumes(storageProviderType, storageProvider); err != nil {
64
return errors.Trace(err)
66
// TODO(axw) destroy env-level filesystems when we have them.
72
storageProviderType storage.ProviderType,
73
storageProvider storage.Provider,
75
if !storageProvider.Supports(storage.StorageKindBlock) {
79
storageConfig, err := storage.NewConfig(
80
string(storageProviderType),
82
map[string]interface{}{},
85
return errors.Trace(err)
88
volumeSource, err := storageProvider.VolumeSource(storageConfig)
90
return errors.Annotate(err, "getting volume source")
93
volumeIds, err := volumeSource.ListVolumes()
95
return errors.Annotate(err, "listing volumes")
98
var errStrings []string
99
errs, err := volumeSource.DestroyVolumes(volumeIds)
101
return errors.Annotate(err, "destroying volumes")
103
for _, err := range errs {
105
errStrings = append(errStrings, err.Error())
108
if len(errStrings) > 0 {
109
return errors.Errorf("destroying volumes: %s", strings.Join(errStrings, ", "))