github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/upgrades/customimagemetadata.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package upgrades
     5  
     6  import (
     7  	"bytes"
     8  	"io/ioutil"
     9  
    10  	"github.com/juju/errors"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/environs/filestorage"
    15  	"github.com/juju/juju/environs/storage"
    16  	"github.com/juju/juju/provider"
    17  	"github.com/juju/juju/state"
    18  	statestorage "github.com/juju/juju/state/storage"
    19  )
    20  
    21  var newStateStorage = statestorage.NewStorage
    22  
    23  // migrateCustomImageMetadata copies uploaded image metadata from provider
    24  // storage to environment storage, preserving paths.
    25  func migrateCustomImageMetadata(st *state.State, agentConfig agent.Config) error {
    26  	logger.Debugf("migrating custom image metadata to environment storage")
    27  	estor := newStateStorage(st.EnvironUUID(), st.MongoSession())
    28  
    29  	// Local and manual provider host storage on the state server's
    30  	// filesystem, and serve via HTTP storage. The storage worker
    31  	// doesn't run yet, so we just open the files directly.
    32  	var pstor storage.StorageReader
    33  	providerType := agentConfig.Value(agent.ProviderType)
    34  	if providerType == provider.Local || provider.IsManual(providerType) {
    35  		storageDir := agentConfig.Value(agent.StorageDir)
    36  		var err error
    37  		pstor, err = filestorage.NewFileStorageReader(storageDir)
    38  		if err != nil {
    39  			return errors.Annotate(err, "cannot get local filesystem storage reader")
    40  		}
    41  	} else {
    42  		var err error
    43  		pstor, err = environs.LegacyStorage(st)
    44  		if errors.IsNotSupported(err) {
    45  			return nil
    46  		} else if err != nil {
    47  			return errors.Annotate(err, "cannot get provider storage")
    48  		}
    49  	}
    50  
    51  	paths, err := pstor.List(storage.BaseImagesPath)
    52  	if err != nil {
    53  		return err
    54  	}
    55  	for _, path := range paths {
    56  		logger.Infof("migrating image metadata at path %q", path)
    57  		data, err := readImageMetadata(pstor, path)
    58  		if err != nil {
    59  			return errors.Annotate(err, "failed to read image metadata")
    60  		}
    61  		err = estor.Put(path, bytes.NewReader(data), int64(len(data)))
    62  		if err != nil {
    63  			return errors.Annotate(err, "failed to write image metadata")
    64  		}
    65  	}
    66  	return nil
    67  }
    68  
    69  func readImageMetadata(stor storage.StorageReader, path string) ([]byte, error) {
    70  	r, err := stor.Get(path)
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  	defer r.Close()
    75  	return ioutil.ReadAll(r)
    76  }