func (s *PathsSuite) TestOther(c *gc.C) { s.PatchValue(&os.HostOS, func() os.OSType { return os.Unknown }) dataDir := c.MkDir() unitTag := names.NewUnitTag("some-service/323") paths := uniter.NewPaths(dataDir, unitTag) relData := relPathFunc(dataDir) relAgent := relPathFunc(relData("agents", "unit-some-service-323")) c.Assert(paths, jc.DeepEquals, uniter.Paths{ ToolsDir: relData("tools/unit-some-service-323"), Runtime: uniter.RuntimePaths{ JujuRunSocket: relAgent("run.socket"), JujucServerSocket: "@" + relAgent("agent.socket"), }, State: uniter.StatePaths{ BaseDir: relAgent(), CharmDir: relAgent("charm"), OperationsFile: relAgent("state", "uniter"), RelationsDir: relAgent("state", "relations"), BundlesDir: relAgent("state", "bundles"), DeployerDir: relAgent("state", "deployer"), StorageDir: relAgent("state", "storage"), MetricsSpoolDir: relAgent("state", "spool", "metrics"), }, }) }
func (s *upgradeStateContextSuite) initializeContext(c *gc.C, utag names.UnitTag) { paths := uniter.NewPaths(s.datadir, utag) s.uniterStateFile = paths.State.OperationsFile s.statefile = operation.NewStateFile(s.uniterStateFile) c.Assert(os.MkdirAll(filepath.Dir(s.uniterStateFile), 0755), gc.IsNil) s.unitTag = utag }
func (w *collect) do() error { logger.Tracef("recording metrics") config := w.agent.CurrentConfig() tag := config.Tag() unitTag, ok := tag.(names.UnitTag) if !ok { return errors.Errorf("expected a unit tag, got %v", tag) } paths := uniter.NewPaths(config.DataDir(), unitTag) recorder, err := newRecorder(unitTag, paths, w.unitCharmLookup, w.metricFactory) if errors.Cause(err) == errMetricsNotDefined { logger.Tracef("%v", err) return nil } else if err != nil { return errors.Annotate(err, "failed to instantiate metric recorder") } ctx := newHookContext(unitTag.String(), recorder) err = ctx.addJujuUnitsMetric() if err != nil { return errors.Annotatef(err, "error adding 'juju-units' metric") } r := runner.NewRunner(ctx, paths) err = r.RunHook(string(hooks.CollectMetrics)) if err != nil { return errors.Annotatef(err, "error running 'collect-metrics' hook") } return nil }
func (w *activeStatusWorker) runHook(code, info string) (runErr error) { unitTag := w.tag paths := uniter.NewPaths(w.config.DataDir(), unitTag) ctx := NewLimitedContext(unitTag.String()) ctx.SetEnvVars(map[string]string{ "JUJU_METER_STATUS": code, "JUJU_METER_INFO": info, }) r := newRunner(ctx, paths) unlock, err := w.acquireExecutionLock() if err != nil { return errors.Annotate(err, "failed to acquire machine lock") } defer func() { unlockErr := unlock() if unlockErr != nil { logger.Criticalf("hook run resulted in error %v; error overridden by unlock failure error", runErr) runErr = unlockErr } }() err = r.RunHook(string(hooks.MeterStatusChanged)) if err != nil { return errors.Annotatef(err, "error running 'meter-status-changed' hook") } return errors.Trace(w.stateFile.Write(code, info)) }
func (w *activeStatusWorker) runHook(code, info string) (runErr error) { unitTag := w.tag paths := uniter.NewPaths(w.config.DataDir(), unitTag) ctx := NewLimitedContext(unitTag.String()) ctx.SetEnvVars(map[string]string{ "JUJU_METER_STATUS": code, "JUJU_METER_INFO": info, }) r := newRunner(ctx, paths) unlock, err := w.acquireExecutionLock() if err != nil { return errors.Annotate(err, "failed to acquire machine lock") } defer func() { unlockErr := unlock() if unlockErr != nil { logger.Criticalf("hook run resulted in error %v; error overridden by unlock failure error", runErr) runErr = unlockErr } }() err = r.RunHook(string(hooks.MeterStatusChanged)) cause := errors.Cause(err) switch { case context.IsMissingHookError(cause): logger.Infof("skipped %q hook (missing)", string(hooks.MeterStatusChanged)) err = nil case err != nil: logger.Errorf("meter status worker encountered hook error: %v", err) return nil } return errors.Trace(w.stateFile.Write(code, info)) }
func (s *PathsSuite) TestWindows(c *gc.C) { s.PatchValue(&version.Current.OS, version.Windows) dataDir := c.MkDir() unitTag := names.NewUnitTag("some-service/323") paths := uniter.NewPaths(dataDir, unitTag) relData := relPathFunc(dataDir) relAgent := relPathFunc(relData("agents", "unit-some-service-323")) c.Assert(paths, jc.DeepEquals, uniter.Paths{ ToolsDir: relData("tools/unit-some-service-323"), Runtime: uniter.RuntimePaths{ JujuRunSocket: `\\.\pipe\unit-some-service-323-run`, JujucServerSocket: `\\.\pipe\unit-some-service-323-agent`, }, State: uniter.StatePaths{ CharmDir: relAgent("charm"), OperationsFile: relAgent("state", "uniter"), RelationsDir: relAgent("state", "relations"), BundlesDir: relAgent("state", "bundles"), DeployerDir: relAgent("state", "deployer"), StorageDir: relAgent("state", "storage"), MetricsSpoolDir: relAgent("state", "spool", "metrics"), }, }) }
func (w *hookRunner) RunHook(code, info string, interrupt <-chan struct{}) (runErr error) { unitTag := w.tag paths := uniter.NewPaths(w.config.DataDir(), unitTag) ctx := NewLimitedContext(unitTag.String()) ctx.SetEnvVars(map[string]string{ "JUJU_METER_STATUS": code, "JUJU_METER_INFO": info, }) r := runner.NewRunner(ctx, paths) releaser, err := w.acquireExecutionLock(interrupt) if err != nil { return errors.Annotate(err, "failed to acquire machine lock") } // Defer the logging first so it is executed after the Release. LIFO. defer logger.Debugf("release lock %q for meter status hook execution", w.machineLockName) defer releaser.Release() return r.RunHook(string(hooks.MeterStatusChanged)) }
func (w *hookRunner) RunHook(code, info string, interrupt <-chan struct{}) (runErr error) { unitTag := w.tag paths := uniter.NewPaths(w.config.DataDir(), unitTag) ctx := NewLimitedContext(unitTag.String()) ctx.SetEnvVars(map[string]string{ "JUJU_METER_STATUS": code, "JUJU_METER_INFO": info, }) r := runner.NewRunner(ctx, paths) unlock, err := w.acquireExecutionLock(interrupt) if err != nil { return errors.Annotate(err, "failed to acquire machine lock") } defer func() { unlockErr := unlock() if unlockErr != nil { logger.Criticalf("hook run resulted in error %v; unlock failure error: %v", runErr, unlockErr) } }() return r.RunHook(string(hooks.MeterStatusChanged)) }
func downloadDir(ctx *context) string { paths := uniter.NewPaths(ctx.dataDir, ctx.unit.UnitTag()) return filepath.Join(paths.State.BundlesDir, "downloads") }
func (c *RunCommand) socketPath() string { paths := uniter.NewPaths(cmdutil.DataDir, c.unit) return paths.Runtime.JujuRunSocket }