// Stage causes subsequent calls to Deploy to deploy the supplied charm. func (d *Deployer) Stage(bun *charm.Bundle, url *charm.URL) error { // Read present state of current. if err := os.MkdirAll(d.path, 0755); err != nil { return err } defer d.collectOrphans() srcExists, err := d.current.Exists() if err != nil { return err } if srcExists { prevURL, err := ReadCharmURL(d.current) if err != nil { return err } if *url == *prevURL { return nil } } // Prepare a fresh repository for the update, using current's history // if it exists. path, err := d.newDir("update") if err != nil { return err } var repo *GitDir if srcExists { repo, err = d.current.Clone(path) } else { repo = NewGitDir(path) err = repo.Init() } if err != nil { return err } // Write the desired new state and commit. if err = bun.ExpandTo(path); err != nil { return err } if err = WriteCharmURL(repo, url); err != nil { return err } if err = repo.Snapshotf("Imported charm %q from %q.", url, bun.Path); err != nil { return err } // Atomically rename fresh repository to current. tmplink := filepath.Join(path, "tmplink") if err = os.Symlink(path, tmplink); err != nil { return err } return os.Rename(tmplink, d.current.Path()) }
// SetCharm adds and removes charms in s. The affected charm is identified by // charmURL, which must be revisioned. If bundle is nil, the charm will be // removed; otherwise, it will be stored. It is an error to store a bundle // under a charmURL that does not share its name and revision. func (s *MockCharmStore) SetCharm(charmURL *charm.URL, bundle *charm.Bundle) error { base := charmURL.WithRevision(-1).String() if charmURL.Revision < 0 { return fmt.Errorf("bad charm url revision") } if bundle == nil { delete(s.charms[base], charmURL.Revision) return nil } bundleRev := bundle.Revision() bundleName := bundle.Meta().Name if bundleName != charmURL.Name || bundleRev != charmURL.Revision { return fmt.Errorf("charm url %s mismatch with bundle %s-%d", charmURL, bundleName, bundleRev) } if _, found := s.charms[base]; !found { s.charms[base] = map[int]*charm.Bundle{} } s.charms[base][charmURL.Revision] = bundle return nil }
func assertCharm(c *C, bun *corecharm.Bundle, sch *state.Charm) { c.Assert(bun.Revision(), Equals, sch.Revision()) c.Assert(bun.Meta(), DeepEquals, sch.Meta()) c.Assert(bun.Config(), DeepEquals, sch.Config()) }