func (s *UpgradeSuite) TestUpgradeStepsStateServer(c *gc.C) { coretesting.SkipIfI386(c, "lp:1444576") coretesting.SkipIfPPC64EL(c, "lp:1444576") coretesting.SkipIfWindowsBug(c, "lp:1446885") s.setInstantRetryStrategy(c) // Upload tools to provider storage, so they can be migrated to environment storage. stor, err := environs.LegacyStorage(s.State) if !errors.IsNotSupported(err) { c.Assert(err, jc.ErrorIsNil) envtesting.AssertUploadFakeToolsVersions( c, stor, "releases", s.Environ.Config().AgentStream(), s.oldVersion) } s.assertUpgradeSteps(c, state.JobManageEnviron) s.assertStateServerUpgrades(c) }
// migrateCustomImageMetadata copies uploaded image metadata from provider // storage to environment storage, preserving paths. func migrateCustomImageMetadata(st *state.State, agentConfig agent.Config) error { logger.Debugf("migrating custom image metadata to environment storage") estor := newStateStorage(st.EnvironUUID(), st.MongoSession()) // Local and manual provider host storage on the state server's // filesystem, and serve via HTTP storage. The storage worker // doesn't run yet, so we just open the files directly. var pstor storage.StorageReader providerType := agentConfig.Value(agent.ProviderType) if providerType == provider.Local || provider.IsManual(providerType) { storageDir := agentConfig.Value(agent.StorageDir) var err error pstor, err = filestorage.NewFileStorageReader(storageDir) if err != nil { return errors.Annotate(err, "cannot get local filesystem storage reader") } } else { var err error pstor, err = environs.LegacyStorage(st) if errors.IsNotSupported(err) { return nil } else if err != nil { return errors.Annotate(err, "cannot get provider storage") } } paths, err := pstor.List(storage.BaseImagesPath) if err != nil { return err } for _, path := range paths { logger.Infof("migrating image metadata at path %q", path) data, err := readImageMetadata(pstor, path) if err != nil { return errors.Annotate(err, "failed to read image metadata") } err = estor.Put(path, bytes.NewReader(data), int64(len(data))) if err != nil { return errors.Annotate(err, "failed to write image metadata") } } return nil }
// migrateToolsStorage copies tools from provider storage to // environment storage. func migrateToolsStorage(st *state.State, agentConfig agent.Config) error { logger.Debugf("migrating tools to environment storage") tstor, err := stateToolsStorage(st) if err != nil { return errors.Annotate(err, "cannot get tools storage") } defer tstor.Close() // Local and manual provider host storage on the state server's // filesystem, and serve via HTTP storage. The storage worker // doesn't run yet, so we just open the files directly. var stor storage.StorageReader providerType := agentConfig.Value(agent.ProviderType) if providerType == provider.Local || provider.IsManual(providerType) { storageDir := agentConfig.Value(agent.StorageDir) var err error stor, err = filestorage.NewFileStorageReader(storageDir) if err != nil { return errors.Annotate(err, "cannot get local filesystem storage reader") } } else { var err error stor, err = environs.LegacyStorage(st) if errors.IsNotSupported(err) { return nil } else if err != nil { return errors.Annotate(err, "cannot get provider storage") } } // Search provider storage for tools. datasource := storage.NewStorageSimpleStreamsDataSource("provider storage", stor, storage.BaseToolsPath) toolsList, err := envtools.FindToolsForCloud( []simplestreams.DataSource{datasource}, simplestreams.CloudSpec{}, envtools.ReleasedStream, -1, -1, tools.Filter{}) switch err { case nil: break case tools.ErrNoMatches, envtools.ErrNoTools: // No tools in provider storage: nothing to do. return nil default: return errors.Annotate(err, "cannot find tools in provider storage") } for _, agentTools := range toolsList { logger.Infof("migrating %v tools to environment storage", agentTools.Version) data, err := fetchToolsArchive(stor, envtools.LegacyReleaseDirectory, agentTools) if err != nil { return errors.Annotatef(err, "failed to fetch %v tools", agentTools.Version) } err = tstor.AddTools(bytes.NewReader(data), toolstorage.Metadata{ Version: agentTools.Version, Size: agentTools.Size, SHA256: agentTools.SHA256, }) if err != nil { return errors.Annotatef(err, "failed to add %v tools to environment storage", agentTools.Version) } } return nil }