func (w *Worker) doIMPORT(targetInfo migration.TargetInfo) (migration.Phase, error) { logger.Infof("exporting model") bytes, err := w.config.Facade.Export() if err != nil { logger.Errorf("model export failed: %v", err) return migration.ABORT, nil } logger.Infof("opening API connection to target controller") conn, err := openAPIConn(targetInfo) if err != nil { logger.Errorf("failed to connect to target controller: %v", err) return migration.ABORT, nil } defer conn.Close() logger.Infof("importing model into target controller") targetClient := migrationtarget.NewClient(conn) err = targetClient.Import(bytes) if err != nil { logger.Errorf("failed to import model into target controller: %v", err) return migration.ABORT, nil } return migration.VALIDATION, nil }
func (s *ClientSuite) getClientAndStub(c *gc.C) (*migrationtarget.Client, *jujutesting.Stub) { var stub jujutesting.Stub apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { stub.AddCall(objType+"."+request, id, arg) return errors.New("boom") }) client := migrationtarget.NewClient(apiCaller) return client, &stub }
func removeImportedModel(targetInfo migration.TargetInfo, modelUUID string) error { conn, err := openAPIConn(targetInfo) if err != nil { return errors.Trace(err) } defer conn.Close() targetClient := migrationtarget.NewClient(conn) err = targetClient.Abort(modelUUID) return errors.Trace(err) }
func (s *ClientSuite) TestImport(c *gc.C) { var stub jujutesting.Stub apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { stub.AddCall(objType+"."+request, id, arg) return errors.New("boom") }) client := migrationtarget.NewClient(apiCaller) err := client.Import([]byte("foo")) expectedArg := params.SerializedModel{Bytes: []byte("foo")} stub.CheckCalls(c, []jujutesting.StubCall{ {"MigrationTarget.Import", []interface{}{"", expectedArg}}, }) c.Assert(err, gc.ErrorMatches, "boom") }
func (w *migrationMaster) run() error { // TODO(mjs) - run the migration phase changes and abort the // migration when things go wrong. // TODO(mjs) - more logging when things go wrong. targetInfo, err := w.waitForMigration() if err != nil { return errors.Trace(err) } logger.Infof("exporting model") bytes, err := w.client.Export() if err != nil { return errors.Annotate(err, "model export") } logger.Infof("opening API connection to target controller") conn, err := openAPIConn(targetInfo) if err != nil { return errors.Trace(err) } defer conn.Close() logger.Infof("importing model into target controller") targetClient := migrationtarget.NewClient(conn) err = targetClient.Import(bytes) if err != nil { return errors.Annotate(err, "model import") } // For now just abort the migration (this is a work in progress) err = w.client.SetPhase(migration.ABORT) if err != nil { return errors.Trace(err) } return errors.New("migration seen and aborted") }
// Check model and source controller. if err := migration.SourcePrecheck(migration.PrecheckShim(st)); err != nil { return errors.Annotate(err, "source prechecks failed") } // Check target controller. conn, err := api.Open(targetToAPIInfo(targetInfo), migration.ControllerDialOpts()) if err != nil { return errors.Annotate(err, "connect to target controller") } defer conn.Close() modelInfo, err := makeModelInfo(st) if err != nil { return errors.Trace(err) } err = migrationtarget.NewClient(conn).Prechecks(modelInfo) return errors.Annotate(err, "target prechecks failed") } func makeModelInfo(st *state.State) (coremigration.ModelInfo, error) { var empty coremigration.ModelInfo model, err := st.Model() if err != nil { return empty, errors.Trace(err) } conf, err := st.ModelConfig() if err != nil { return empty, errors.Trace(err) } agentVersion, _ := conf.AgentVersion()