campaigner/cmd/standalone.go

147 lines
3.8 KiB
Go
Raw Normal View History

package cmd
2020-03-01 01:17:41 +01:00
import (
"bytes"
2020-03-01 02:47:50 +01:00
"fmt"
"strings"
"text/template"
2020-03-01 02:47:50 +01:00
"git.ctrlz.es/mgdelacroix/campaigner/jira"
2020-03-01 01:17:41 +01:00
"github.com/spf13/cobra"
)
func StandaloneCmd() *cobra.Command {
2020-03-01 01:17:41 +01:00
cmd := &cobra.Command{
Use: "standalone",
Short: "Standalone fire-and-forget commands",
}
cmd.AddCommand(
CreateJiraTicketStandaloneCmd(),
2020-03-01 13:02:52 +01:00
GetJiraTicketStandaloneCmd(),
2020-03-01 01:17:41 +01:00
)
return cmd
}
2020-03-01 01:17:41 +01:00
func CreateJiraTicketStandaloneCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "create-jira-ticket",
Short: "Creates a jira ticket from a template",
Args: cobra.NoArgs,
RunE: createJiraTicketStandaloneCmdF,
2020-03-01 01:17:41 +01:00
}
2020-03-01 12:30:49 +01:00
cmd.Flags().String("epic", "", "the jira epic id to associate the ticket with")
_ = cmd.MarkFlagRequired("epic")
cmd.Flags().String("team", "", "the team for the new ticket")
_ = cmd.MarkFlagRequired("epic")
cmd.Flags().String("username", "", "the jira username")
2020-03-01 01:17:41 +01:00
_ = cmd.MarkFlagRequired("username")
2020-03-01 12:30:49 +01:00
cmd.Flags().String("token", "", "the jira token")
2020-03-01 01:17:41 +01:00
_ = cmd.MarkFlagRequired("token")
2020-03-01 12:30:49 +01:00
cmd.Flags().String("summary", "", "the summary of the ticket")
2020-03-01 01:17:41 +01:00
_ = cmd.MarkFlagRequired("summary")
2020-03-01 12:30:49 +01:00
cmd.Flags().String("template", "", "the template to render the description of the ticket")
2020-03-01 01:17:41 +01:00
_ = cmd.MarkFlagRequired("template")
cmd.Flags().StringSliceP("vars", "v", []string{}, "the variables to use in the template")
return cmd
}
2020-03-01 13:02:52 +01:00
func GetJiraTicketStandaloneCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "get-jira-ticket",
Short: "Gets the ticket from jira",
Args: cobra.ExactArgs(1),
Run: getJiraTicketStandaloneCmdF,
}
cmd.Flags().String("username", "", "the jira username")
_ = cmd.MarkFlagRequired("username")
cmd.Flags().String("token", "", "the jira token")
_ = cmd.MarkFlagRequired("token")
return cmd
}
func getVarMap(vars []string) (map[string]string, error) {
varMap := map[string]string{}
2020-03-01 02:43:54 +01:00
for _, v := range vars {
parts := strings.Split(v, "=")
if len(parts) < 2 {
2020-03-01 02:43:54 +01:00
return nil, fmt.Errorf("cannot parse var %s", v)
}
varMap[parts[0]] = strings.Join(parts[1:], "=")
}
return varMap, nil
}
2020-03-01 01:17:41 +01:00
func createJiraTicketStandaloneCmdF(cmd *cobra.Command, _ []string) error {
2020-03-01 12:30:49 +01:00
epicId, _ := cmd.Flags().GetString("epic")
team, _ := cmd.Flags().GetString("team")
2020-03-01 02:47:50 +01:00
username, _ := cmd.Flags().GetString("username")
token, _ := cmd.Flags().GetString("token")
summaryTmplStr, _ := cmd.Flags().GetString("summary")
templatePath, _ := cmd.Flags().GetString("template")
2020-03-01 02:47:50 +01:00
vars, _ := cmd.Flags().GetStringSlice("vars")
2020-03-01 12:30:49 +01:00
2020-03-01 02:47:50 +01:00
varMap, err := getVarMap(vars)
if err != nil {
2020-03-01 13:03:47 +01:00
return fmt.Errorf("error processing vars: %w", err)
}
sumTmpl, err := template.New("").Parse(summaryTmplStr)
2020-03-01 02:54:58 +01:00
if err != nil {
ErrorAndExit(cmd, err)
}
var summaryBytes bytes.Buffer
if err := sumTmpl.Execute(&summaryBytes, varMap); err != nil {
ErrorAndExit(cmd, err)
}
summary := summaryBytes.String()
2020-03-01 12:30:49 +01:00
descTmpl, err := template.ParseFiles(templatePath)
if err != nil {
ErrorAndExit(cmd, err)
}
2020-03-01 12:30:49 +01:00
var descriptionBytes bytes.Buffer
if err := descTmpl.Execute(&descriptionBytes, varMap); err != nil {
ErrorAndExit(cmd, err)
}
description := descriptionBytes.String()
2020-03-01 12:30:49 +01:00
jiraClient, err := jira.NewClient(username, token)
if err != nil {
ErrorAndExit(cmd, err)
}
2020-03-01 12:30:49 +01:00
2020-03-01 13:02:52 +01:00
ticketKey, err := jiraClient.CreateIssue(epicId, team, summary, description)
if err != nil {
ErrorAndExit(cmd, err)
}
2020-03-01 12:30:49 +01:00
cmd.Printf("Ticket %s successfully created in JIRA", ticketKey)
2020-03-01 02:47:50 +01:00
return nil
2020-03-01 01:17:41 +01:00
}
2020-03-01 13:02:52 +01:00
func getJiraTicketStandaloneCmdF(cmd *cobra.Command, args []string) {
username, _ := cmd.Flags().GetString("username")
token, _ := cmd.Flags().GetString("token")
jiraClient, err := jira.NewClient(username, token)
if err != nil {
ErrorAndExit(cmd, err)
}
2020-03-01 13:02:52 +01:00
issue, err := jiraClient.GetIssue(args[0])
if err != nil {
ErrorAndExit(cmd, err)
}
fmt.Printf("Summary: %s\nKey: %s\nStatus: %s\nAsignee: %s\n", issue.Fields.Summary, issue.Key, issue.Fields.Status.Name, issue.Fields.Assignee.DisplayName)
2020-03-01 13:02:52 +01:00
}