func (s *ReadAllStateDirsSuite) TestReadAllStateDirs(c *gc.C) { basedir := c.MkDir() relsdir := setUpDir(c, basedir, "relations", map[string]string{ "ignored": "blah", "foo-bar-123": "gibberish", }) setUpDir(c, relsdir, "123", map[string]string{ "foo-0": "change-version: 1\n", "foo-1": "change-version: 2\nchanged-pending: true\n", "gibberish": "gibberish", }) setUpDir(c, relsdir, "456", map[string]string{ "bar-0": "change-version: 3\n", "bar-1": "change-version: 4\n", }) setUpDir(c, relsdir, "789", nil) setUpDir(c, relsdir, "onethousand", map[string]string{ "baz-0": "change-version: 3\n", "baz-1": "change-version: 4\n", }) dirs, err := relation.ReadAllStateDirs(relsdir) c.Assert(err, jc.ErrorIsNil) for id, dir := range dirs { c.Logf("%d: %#v", id, dir) } assertState(c, dirs[123], relsdir, 123, msi{"foo/0": 1, "foo/1": 2}, "foo/1", false) assertState(c, dirs[456], relsdir, 456, msi{"bar/0": 3, "bar/1": 4}, "", false) assertState(c, dirs[789], relsdir, 789, msi{}, "", false) c.Assert(dirs, gc.HasLen, 3) }
// restoreRelations reconciles the local relation state dirs with the // remote state of the corresponding relations. func (u *Uniter) restoreRelations() error { joinedRelations, err := u.getJoinedRelations() if err != nil { return err } knownDirs, err := relation.ReadAllStateDirs(u.relationsDir) if err != nil { return err } for id, dir := range knownDirs { if rel, ok := joinedRelations[id]; ok { if err := u.addRelation(rel, dir); err != nil { return err } } else if err := dir.Remove(); err != nil { return err } } for id, rel := range joinedRelations { if _, ok := knownDirs[id]; ok { continue } dir, err := relation.ReadStateDir(u.relationsDir, id) if err != nil { return err } if err := u.addRelation(rel, dir); err != nil { return err } } return nil }
func (s *ReadAllStateDirsSuite) TestBadStateDir(c *gc.C) { basedir := c.MkDir() relsdir := setUpDir(c, basedir, "relations", nil) setUpDir(c, relsdir, "123", map[string]string{ "bad-0": "blah: blah\n", }) _, err := relation.ReadAllStateDirs(relsdir) c.Assert(err, gc.ErrorMatches, `cannot load relations state from .*: cannot load relation state from .*: invalid unit file "bad-0": "changed-version" not set`) }
func (s *ReadAllStateDirsSuite) TestNoDir(c *gc.C) { basedir := c.MkDir() relsdir := filepath.Join(basedir, "relations") dirs, err := relation.ReadAllStateDirs(relsdir) c.Assert(err, jc.ErrorIsNil) c.Assert(dirs, gc.HasLen, 0) _, err = os.Stat(relsdir) c.Assert(err, jc.Satisfies, os.IsNotExist) }
// init reconciles the local relation state dirs with the remote state of // the corresponding relations. It's only expected to be called while a // *relations is being created. func (r *relations) init() error { joinedRelationTags, err := r.unit.JoinedRelations() if err != nil { return errors.Trace(err) } joinedRelations := make(map[int]*uniter.Relation) for _, tag := range joinedRelationTags { relation, err := r.st.Relation(tag) if err != nil { return errors.Trace(err) } joinedRelations[relation.Id()] = relation } knownDirs, err := relation.ReadAllStateDirs(r.relationsDir) if err != nil { return errors.Trace(err) } for id, dir := range knownDirs { if rel, ok := joinedRelations[id]; ok { if err := r.add(rel, dir); err != nil { return errors.Trace(err) } } else if err := dir.Remove(); err != nil { return errors.Trace(err) } } for id, rel := range joinedRelations { if _, ok := knownDirs[id]; ok { continue } dir, err := relation.ReadStateDir(r.relationsDir, id) if err != nil { return errors.Trace(err) } if err := r.add(rel, dir); err != nil { return errors.Trace(err) } } return nil }