// agentDoing returns what hook or action, if any, // the agent is currently executing. // The hook name or action is extracted from the agent message. func agentDoing(status statusInfoContents) string { if status.Current != params.StatusExecuting { return "" } // First see if we can determine a hook name. var hookNames []string for _, h := range hooks.UnitHooks() { hookNames = append(hookNames, string(h)) } for _, h := range hooks.RelationHooks() { hookNames = append(hookNames, string(h)) } hookExp := regexp.MustCompile(fmt.Sprintf(`running (?P<hook>%s?) hook`, strings.Join(hookNames, "|"))) match := hookExp.FindStringSubmatch(status.Message) if len(match) > 0 { return match[1] } // Now try for an action name. actionExp := regexp.MustCompile(`running action (?P<action>.*)`) match = actionExp.FindStringSubmatch(status.Message) if len(match) > 0 { return match[1] } return "" }
func (c *debugHooksCommand) validateHooks() error { if len(c.hooks) == 0 { return nil } service, err := names.UnitService(c.Target) if err != nil { return err } serviceApi, err := c.getServiceAPI() if err != nil { return err } relations, err := serviceApi.CharmRelations(service) if err != nil { return err } validHooks := make(map[string]bool) for _, hook := range hooks.UnitHooks() { validHooks[string(hook)] = true } for _, relation := range relations { for _, hook := range hooks.RelationHooks() { hook := fmt.Sprintf("%s-%s", relation, hook) validHooks[hook] = true } } for _, hook := range c.hooks { if !validHooks[hook] { names := make([]string, 0, len(validHooks)) for hookName := range validHooks { names = append(names, hookName) } sort.Strings(names) logger.Infof("unknown hook %s, valid hook names: %v", hook, names) return fmt.Errorf("unit %q does not contain hook %q", c.Target, hook) } } return nil }