func (s *ExportSuite) TestExportModel(c *gc.C) { bytes, err := migration.ExportModel(s.State) c.Assert(err, jc.ErrorIsNil) // The bytes must be a valid model. _, err = description.Deserialize(bytes) c.Assert(err, jc.ErrorIsNil) }
func (m *ModelManagerAPI) dumpModel(args params.Entity) (map[string]interface{}, error) { modelTag, err := names.ParseModelTag(args.Tag) if err != nil { return nil, errors.Trace(err) } isModelAdmin, err := m.authorizer.HasPermission(permission.AdminAccess, modelTag) if err != nil { return nil, errors.Trace(err) } if !isModelAdmin && !m.isAdmin { return nil, common.ErrPerm } st := m.state if st.ModelTag() != modelTag { st, err = m.state.ForModel(modelTag) if err != nil { if errors.IsNotFound(err) { return nil, errors.Trace(common.ErrBadId) } return nil, errors.Trace(err) } defer st.Close() } bytes, err := migration.ExportModel(st) if err != nil { return nil, errors.Trace(err) } // Now read it back into a map. var asMap map[string]interface{} err = yaml.Unmarshal(bytes, &asMap) if err != nil { return nil, errors.Trace(err) } // In order to serialize the map through JSON, we need to make sure // that all the embedded maps are map[string]interface{}, not // map[interface{}]interface{} which is what YAML gives by default. out, err := utils.ConformYAML(asMap) if err != nil { return nil, errors.Trace(err) } return out.(map[string]interface{}), nil }