func (u *Uniter) init(name string) (err error) { defer trivial.ErrorContextf(&err, "failed to initialize uniter for unit %q", name) u.unit, err = u.st.Unit(name) if err != nil { return err } ename := u.unit.EntityName() u.toolsDir = environs.AgentToolsDir(u.dataDir, ename) if err := EnsureJujucSymlinks(u.toolsDir); err != nil { return err } u.baseDir = filepath.Join(u.dataDir, "agents", ename) u.relationsDir = filepath.Join(u.baseDir, "state", "relations") if err := os.MkdirAll(u.relationsDir, 0755); err != nil { return err } u.service, err = u.st.Service(u.unit.ServiceName()) if err != nil { return err } u.relationers = map[int]*Relationer{} u.relationHooks = make(chan hook.Info) u.charm = charm.NewGitDir(filepath.Join(u.baseDir, "charm")) u.bundles = charm.NewBundlesDir(filepath.Join(u.baseDir, "state", "bundles")) u.deployer = charm.NewDeployer(filepath.Join(u.baseDir, "state", "deployer")) u.sf = NewStateFile(filepath.Join(u.baseDir, "state", "uniter")) u.rand = rand.New(rand.NewSource(time.Now().Unix())) return nil }
func (s *BundlesDirSuite) TestGet(c *C) { basedir := c.MkDir() bunsdir := filepath.Join(basedir, "random", "bundles") d := charm.NewBundlesDir(bunsdir) // Check it doesn't get created until it's needed. _, err := os.Stat(bunsdir) c.Assert(err, checkers.Satisfies, os.IsNotExist) // Add a charm to state that we can try to get. sch, bundata := s.AddCharm(c) // Try to get the charm when the content doesn't match. coretesting.Server.Response(200, nil, []byte("roflcopter")) _, err = d.Read(sch, nil) prefix := fmt.Sprintf(`failed to download charm "cs:series/dummy-1" from %q: `, sch.BundleURL()) c.Assert(err, ErrorMatches, prefix+fmt.Sprintf(`expected sha256 %q, got ".*"`, sch.BundleSha256())) // Try to get a charm whose bundle doesn't exist. coretesting.Server.Response(404, nil, nil) _, err = d.Read(sch, nil) c.Assert(err, ErrorMatches, prefix+`.* 404 Not Found`) // Get a charm whose bundle exists and whose content matches. coretesting.Server.Response(200, nil, bundata) ch, err := d.Read(sch, nil) c.Assert(err, IsNil) assertCharm(c, ch, sch) // Get the same charm again, without preparing a response from the server. ch, err = d.Read(sch, nil) c.Assert(err, IsNil) assertCharm(c, ch, sch) // Abort a download. err = os.RemoveAll(bunsdir) c.Assert(err, IsNil) abort := make(chan struct{}) done := make(chan bool) go func() { ch, err := d.Read(sch, abort) c.Assert(ch, IsNil) c.Assert(err, ErrorMatches, prefix+"aborted") close(done) }() close(abort) coretesting.Server.Response(500, nil, nil) select { case <-done: case <-time.After(coretesting.LongWait): c.Fatalf("timed out waiting for abort") } }