Skip to content

Commit

Permalink
chore: sync with master (#267)
Browse files Browse the repository at this point in the history
  • Loading branch information
knechtionscoding authored Aug 16, 2024
1 parent d365c8a commit d7dc5eb
Show file tree
Hide file tree
Showing 20 changed files with 1,469 additions and 718 deletions.
26 changes: 13 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,20 @@ build-arm:
# cd cmd/keel && env GOARCH=arm64 GOOS=linux go build -ldflags="$(ARMFLAGS)" -o release/keel-linux-aarc64

armhf-latest:
docker build -t datagravity-ai/keel-arm:latest -f Dockerfile.armhf .
docker push datagravity-ai/keel-arm:latest
docker build -t keelhq/keel-arm:latest -f Dockerfile.armhf .
docker push keelhq/keel-arm:latest

aarch64-latest:
docker build -t datagravity-ai/keel-aarch64:latest -f Dockerfile.aarch64 .
docker push datagravity-ai/keel-aarch64:latest
docker build -t keelhq/keel-aarch64:latest -f Dockerfile.aarch64 .
docker push keelhq/keel-aarch64:latest

armhf:
docker build -t datagravity-ai/keel-arm:$(VERSION) -f Dockerfile.armhf .
# docker push datagravity-ai/keel-arm:$(VERSION)
docker build -t keelhq/keel-arm:$(VERSION) -f Dockerfile.armhf .
# docker push keelhq/keel-arm:$(VERSION)

aarch64:
docker build -t datagravity-ai/keel-aarch64:$(VERSION) -f Dockerfile.aarch64 .
docker push datagravity-ai/keel-aarch64:$(VERSION)
docker build -t keelhq/keel-aarch64:$(VERSION) -f Dockerfile.aarch64 .
docker push keelhq/keel-aarch64:$(VERSION)

arm: build-arm fetch-certs armhf aarch64

Expand All @@ -65,14 +65,14 @@ install:
GOOS=linux go install -ldflags "$(LDFLAGS)" github.com/datagravity-ai/keel/cmd/keel

image:
docker build -t datagravity-ai/keel:alpha -f Dockerfile .
docker build -t keelhq/keel:alpha -f Dockerfile .

image-debian:
docker build -t datagravity-ai/keel:alpha -f Dockerfile.debian .
docker build -t keelhq/keel:alpha -f Dockerfile.debian .

alpha: image
@echo "++ Pushing keel alpha"
docker push datagravity-ai/keel:alpha
docker push keelhq/keel:alpha

e2e: install
cd tests && go test
Expand All @@ -89,8 +89,8 @@ run-ui:
cd ui && yarn run serve

build-ui:
docker build -t datagravity-ai/keel:ui -f Dockerfile .
docker push datagravity-ai/keel:ui
docker build -t keelhq/keel:ui -f Dockerfile .
docker push keelhq/keel:ui

run-debug: install
DEBUG=true keel --no-incluster
269 changes: 155 additions & 114 deletions bot/slack/approvals.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,134 +2,175 @@ package slack

import (
"fmt"
"github.com/datagravity-ai/keel/bot"
log "github.com/sirupsen/logrus"
"strings"
"unicode"

"github.com/datagravity-ai/keel/types"
"github.com/slack-go/slack"
)

// Request - request approval
func (b *Bot) RequestApproval(req *types.Approval) error {
return b.postMessage(
"Approval required",
req.Message,
types.LevelSuccess.Color(),
[]slack.AttachmentField{
{
Title: "Approval required!",
Value: req.Message + "\n" + fmt.Sprintf("To vote for change type '%s approve %s' to reject it: '%s reject %s'.", b.name, req.Identifier, b.name, req.Identifier),
Short: false,
},
{
Title: "Votes",
Value: fmt.Sprintf("%d/%d", req.VotesReceived, req.VotesRequired),
Short: true,
},
{
Title: "Delta",
Value: req.Delta(),
Short: true,
},
{
Title: "Identifier",
Value: req.Identifier,
Short: true,
},
{
Title: "Provider",
Value: req.Provider.String(),
Short: true,
},
})
return b.postApprovalMessageBlock(
req.ID,
createBlockMessage("Approval required! :mega:", b.name, req),
)
}

func (b *Bot) ReplyToApproval(approval *types.Approval) error {
var title string
switch approval.Status() {
case types.ApprovalStatusPending:
b.postMessage(
"Vote received",
"All approvals received, thanks for voting!",
types.LevelInfo.Color(),
[]slack.AttachmentField{
{
Title: "vote received!",
Value: "Waiting for remaining votes.",
Short: false,
},
{
Title: "Votes",
Value: fmt.Sprintf("%d/%d", approval.VotesReceived, approval.VotesRequired),
Short: true,
},
{
Title: "Delta",
Value: approval.Delta(),
Short: true,
},
{
Title: "Identifier",
Value: approval.Identifier,
Short: true,
},
})
title = "Approval required! :mega:"
case types.ApprovalStatusRejected:
b.postMessage(
"Change rejected",
"Change was rejected",
types.LevelWarn.Color(),
[]slack.AttachmentField{
{
Title: "change rejected",
Value: "Change was rejected.",
Short: false,
},
{
Title: "Status",
Value: approval.Status().String(),
Short: true,
},
{
Title: "Votes",
Value: fmt.Sprintf("%d/%d", approval.VotesReceived, approval.VotesRequired),
Short: true,
},
{
Title: "Delta",
Value: approval.Delta(),
Short: true,
},
{
Title: "Identifier",
Value: approval.Identifier,
Short: true,
},
})
title = "Change rejected! :negative_squared_cross_mark:"
case types.ApprovalStatusApproved:
b.postMessage(
"approval received",
"All approvals received, thanks for voting!",
types.LevelSuccess.Color(),
[]slack.AttachmentField{
{
Title: "update approved!",
Value: "All approvals received, thanks for voting!",
Short: false,
},
{
Title: "Votes",
Value: fmt.Sprintf("%d/%d", approval.VotesReceived, approval.VotesRequired),
Short: true,
},
{
Title: "Delta",
Value: approval.Delta(),
Short: true,
},
{
Title: "Identifier",
Value: approval.Identifier,
Short: true,
},
})
title = "Change approved! :tada:"
}

b.upsertApprovalMessage(approval.ID, createBlockMessage(title, b.name, approval))
return nil
}

func createBlockMessage(title string, botName string, req *types.Approval) slack.Blocks {
if req.Expired() {
title = title + " (Expired)"
}

headerText := slack.NewTextBlockObject(
"plain_text",
title,
true,
false,
)
headerSection := slack.NewHeaderBlock(headerText)

messageSection := slack.NewTextBlockObject(
"mrkdwn",
req.Message,
false,
false,
)
messageBlock := slack.NewSectionBlock(messageSection, nil, nil)

votesField := slack.NewTextBlockObject(
"mrkdwn",
fmt.Sprintf("*Votes:*\n%d/%d", req.VotesReceived, req.VotesRequired),
false,
false,
)
deltaField := slack.NewTextBlockObject(
"mrkdwn",
"*Delta:*\n"+req.Delta(),
false,
false,
)
leftDetailSection := slack.NewSectionBlock(
nil,
[]*slack.TextBlockObject{
votesField,
deltaField,
},
nil,
)

identifierField := slack.NewTextBlockObject(
"mrkdwn",
"*Identifier:*\n"+req.Identifier,
false,
false,
)
providerField := slack.NewTextBlockObject(
"mrkdwn",
"*Provider:*\n"+req.Provider.String(),
false,
false,
)
rightDetailSection := slack.NewSectionBlock(nil, []*slack.TextBlockObject{identifierField, providerField}, nil)

commands := bot.BotEventTextToResponse["help"]
var commandTexts []slack.MixedElement

for i, cmd := range commands {
// -- avoid adding first line in commands which is the title.
if i == 0 {
continue
}
cmd = addBotMentionToCommand(cmd, botName)
commandTexts = append(commandTexts, slack.NewTextBlockObject("mrkdwn", cmd, false, false))
}
commandsBlock := slack.NewContextBlock("", commandTexts...)
header := commands[0]

blocks := []slack.Block{
headerSection,
messageBlock,
leftDetailSection,
rightDetailSection,
slack.NewDividerBlock(),
slack.NewContextBlock("", slack.NewTextBlockObject("mrkdwn", header, false, false)),
commandsBlock,
}

if req.VotesReceived < req.VotesRequired && !req.Expired() && !req.Rejected {
approveButton := slack.NewButtonBlockElement(
bot.ApprovalResponseKeyword,
req.Identifier,
slack.NewTextBlockObject(
"plain_text",
"Approve",
true,
false,
),
)
approveButton.Style = slack.StylePrimary

rejectButton := slack.NewButtonBlockElement(
bot.RejectResponseKeyword,
req.Identifier,
slack.NewTextBlockObject(
"plain_text",
"Reject",
true,
false,
),
)
rejectButton.Style = slack.StyleDanger

actionBlock := slack.NewActionBlock("", approveButton, rejectButton)

blocks = append(
blocks,
slack.NewDividerBlock(),
actionBlock,
)
}
return slack.Blocks{
BlockSet: blocks,
}
}

func addBotMentionToCommand(command string, botName string) string {
// -- retrieve the first letter of the command in order to insert bot mention
firstLetterPos := -1
for i, r := range command {
if unicode.IsLetter(r) {
firstLetterPos = i
break
}
}

if firstLetterPos < 0 {
log.Debugf("Unable to find the first letter of the command '%s', let the command without the bot mention.", command)
return command
}

return strings.Replace(
command[:firstLetterPos]+fmt.Sprintf("@%s ", botName)+command[firstLetterPos:],
"\"",
"`",
-1,
)
}
Loading

0 comments on commit d7dc5eb

Please sign in to comment.