111 lines
3.6 KiB
Go
111 lines
3.6 KiB
Go
package processor
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/slack-go/slack"
|
|
"github.com/slack-go/slack/socketmode"
|
|
"go.uber.org/zap"
|
|
"houston/internal/diagnostic"
|
|
"houston/internal/diagnostic/models"
|
|
"houston/internal/processor/action"
|
|
"houston/model/incident"
|
|
"houston/pkg/slackbot"
|
|
"strings"
|
|
)
|
|
|
|
type CommandProcessor interface {
|
|
ProcessSlashCommand(event *socketmode.Event)
|
|
}
|
|
|
|
type SlashCommandProcessor struct {
|
|
logger *zap.Logger
|
|
socketModeClient *socketmode.Client
|
|
slashCommandAction *action.SlashCommandAction
|
|
}
|
|
|
|
type DiagnosticCommandProcessor struct {
|
|
logger *zap.Logger
|
|
socketModeClient *socketmode.Client
|
|
diagnosticCommandActions []action.DiagnosticCommandActionHandler
|
|
}
|
|
|
|
func NewDiagnosticCommandProcessor(logger *zap.Logger, socketModeClient *socketmode.Client, repository *diagnostic.Repository) *DiagnosticCommandProcessor {
|
|
return &DiagnosticCommandProcessor{
|
|
logger: logger,
|
|
socketModeClient: socketModeClient,
|
|
diagnosticCommandActions: []action.DiagnosticCommandActionHandler{
|
|
action.NewDeploymentConfigActionHandler(logger, socketModeClient, repository),
|
|
action.NewGrafanaActionHandler(logger, socketModeClient, repository),
|
|
//action.NewKibanaActionHandler(logger, socketModeClient),
|
|
action.NewDeploymentPortalActionHandler(logger, socketModeClient, repository),
|
|
},
|
|
}
|
|
}
|
|
|
|
func NewSlashCommandProcessor(
|
|
logger *zap.Logger, socketModeClient *socketmode.Client, incidentService *incident.Repository, slackBot *slackbot.Client,
|
|
) *SlashCommandProcessor {
|
|
return &SlashCommandProcessor{
|
|
logger: logger,
|
|
socketModeClient: socketModeClient,
|
|
slashCommandAction: action.NewSlashCommandAction(incidentService, logger, socketModeClient, slackBot),
|
|
}
|
|
}
|
|
|
|
func (scp *SlashCommandProcessor) ProcessSlashCommand(event *socketmode.Event) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
scp.logger.Error(fmt.Sprintf("[SCP] Exception occurred: %v", r.(error)))
|
|
}
|
|
}()
|
|
|
|
scp.slashCommandAction.PerformAction(event)
|
|
}
|
|
|
|
func (dcp *DiagnosticCommandProcessor) ShouldProcessCommand(text string) bool {
|
|
commands := strings.Split(text, " ")
|
|
return len(commands) > 0 && commands[0] == "diagnose"
|
|
}
|
|
|
|
func (dcp *DiagnosticCommandProcessor) ProcessSlashCommand(e *socketmode.Event) {
|
|
dcp.socketModeClient.Ack(*e.Request, nil)
|
|
|
|
_, ok := e.Data.(slack.SlashCommand)
|
|
if !ok {
|
|
dcp.logger.Error("Unable to convert event to slash command", zap.Any("event", e))
|
|
return
|
|
}
|
|
cmd := e.Data.(slack.SlashCommand)
|
|
postAckMessage(&dcp.socketModeClient.Client, &cmd)
|
|
commands := strings.Split(cmd.Text, " ")
|
|
runbooks := make([]models.Runbook, 0)
|
|
for _, actionHandler := range dcp.diagnosticCommandActions {
|
|
runbooks = append(runbooks, actionHandler.HandleAction(e, commands[1]))
|
|
}
|
|
diagnosticDataAssembler := diagnostic.NewDiagnosticDataAssembler2(dcp.logger)
|
|
image, text := diagnosticDataAssembler.HandleData(runbooks)
|
|
postDataOnSlack(&dcp.socketModeClient.Client, &cmd, &image, text)
|
|
|
|
dcp.logger.Error("S3 upload failed", zap.Any("error", e))
|
|
}
|
|
|
|
func postDataOnSlack(api *slack.Client, sh *slack.SlashCommand, message *slack.MsgOption, attachments []slack.Attachment) {
|
|
y, x, err := api.PostMessage(
|
|
sh.ChannelID,
|
|
*message,
|
|
slack.MsgOptionAttachments(attachments...),
|
|
)
|
|
if err != nil {
|
|
fmt.Printf("error occured %s", err)
|
|
}
|
|
fmt.Println(y, x)
|
|
}
|
|
|
|
func postAckMessage(api *slack.Client, sh *slack.SlashCommand) {
|
|
textBlock := slack.NewTextBlockObject("mrkdwn", fmt.Sprintf("Your request has been acknowledged for\n> %s", sh.Text), false, false)
|
|
block := slack.NewSectionBlock(textBlock, nil, nil)
|
|
var messageBlock slack.MsgOption
|
|
messageBlock = slack.MsgOptionBlocks(block)
|
|
postDataOnSlack(api, sh, &messageBlock, nil)
|
|
}
|