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 }