|
@@ -2,10 +2,12 @@ package web
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "fmt"
|
|
|
"log"
|
|
|
"net/http"
|
|
|
"time"
|
|
|
|
|
|
+ "github.com/aws/aws-sdk-go-v2/aws/arn"
|
|
|
"github.com/gin-contrib/sessions"
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
@@ -19,7 +21,7 @@ import (
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
|
|
|
func classifyPolicies(policies map[string]*redriver.QueueRedrivePolicies) (byQueue, wild, closed, sources map[string]redriver.QueueRedrivePolicies, notSources []string) {
|
|
@@ -84,7 +86,7 @@ type link struct{ URL, Text string }
|
|
|
type queueCell struct {
|
|
|
Message string
|
|
|
Link *link
|
|
|
- Links []link
|
|
|
+ Links [][]link
|
|
|
}
|
|
|
|
|
|
type QueueRow [2]queueCell
|
|
@@ -105,43 +107,34 @@ func makeHomeHandler(rd redriver.Redriver) gin.HandlerFunc {
|
|
|
return
|
|
|
}
|
|
|
policies := policiesByURL(c, qURLs, rd, ctx)
|
|
|
- byqueue, wild, closed, sources, notSources := classifyPolicies(policies)
|
|
|
+ byQueue, wild, closed, sources, notSources := classifyPolicies(policies)
|
|
|
|
|
|
- l := len(byqueue)
|
|
|
- if len(wild) > 0 {
|
|
|
- l++
|
|
|
- }
|
|
|
- if len(closed) > 0 {
|
|
|
- l++
|
|
|
- }
|
|
|
- if len(notSources) > 0 {
|
|
|
- l++
|
|
|
- }
|
|
|
- rows := make([]QueueRow, 0, l)
|
|
|
+ rows := make([]QueueRow, 0, len(byQueue)+3)
|
|
|
|
|
|
- rows, err = prepareSingleLeft(wild, rows, "All source queues allowed")
|
|
|
+ rows, err = prepareSingleLeft(rows, wild, "All source queues allowed")
|
|
|
if err != nil {
|
|
|
- log.Printf("failed converting queue URL %q: %v", qURLs, err)
|
|
|
+ log.Printf("failed preparing wild DLQs: %v", err)
|
|
|
c.HTML(http.StatusInternalServerError, "500", nil)
|
|
|
return
|
|
|
}
|
|
|
- rows, err = prepareSingleLeft(closed, rows, "No source queue allowed")
|
|
|
+ rows, err = prepareSingleLeft(rows, closed, "No source queue allowed")
|
|
|
if err != nil {
|
|
|
- log.Printf("failed converting queue URL %q: %v", qURLs, err)
|
|
|
+ log.Printf("failed preparing closed DLQs: %v", err)
|
|
|
c.HTML(http.StatusInternalServerError, "500", nil)
|
|
|
return
|
|
|
}
|
|
|
- rows, err = prepareSingleRight(notSources, rows, "No associated DLQ")
|
|
|
+ rows, err = prepareSingleRight(rows, notSources, "No associated DLQ")
|
|
|
if err != nil {
|
|
|
- log.Printf("failed converting queue URL %q: %v", qURLs, err)
|
|
|
+ log.Printf("failed converting isolated queues: %v", err)
|
|
|
+ c.HTML(http.StatusInternalServerError, "500", nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ rows, err = prepareBindings(rows, byQueue, sources)
|
|
|
+ if err != nil {
|
|
|
+ log.Printf("failed preparing queue bindings: %v", err)
|
|
|
c.HTML(http.StatusInternalServerError, "500", nil)
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- log.Println(sources)
|
|
|
c.HTML(http.StatusOK, "home", gin.H{
|
|
|
"flashes": flashes,
|
|
|
"latency": latency,
|
|
@@ -151,38 +144,98 @@ func makeHomeHandler(rd redriver.Redriver) gin.HandlerFunc {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func prepareSingleLeft(list map[string]redriver.QueueRedrivePolicies, rows []QueueRow, msg string) ([]QueueRow, error) {
|
|
|
+func prepareSingleLeft(rows []QueueRow, list map[string]redriver.QueueRedrivePolicies, msg string) ([]QueueRow, error) {
|
|
|
if len(list) > 0 {
|
|
|
row := QueueRow{
|
|
|
{Message: msg},
|
|
|
- {Links: make([]link, 0, len(list))},
|
|
|
+ {Links: make([][]link, 1)},
|
|
|
}
|
|
|
+ row[1].Links[0] = make([]link, 0, len(list))
|
|
|
for qURL := range list {
|
|
|
name, err := redriver.NameFromURL(qURL)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- row[1].Links = append(row[1].Links, link{URL: "/queue/" + name, Text: name})
|
|
|
+ row[1].Links[0] = append(row[1].Links[0], link{URL: "/queue/" + name, Text: name})
|
|
|
}
|
|
|
rows = append(rows, row)
|
|
|
}
|
|
|
return rows, nil
|
|
|
}
|
|
|
|
|
|
-func prepareSingleRight(list []string, rows []QueueRow, msg string) ([]QueueRow, error) {
|
|
|
+func prepareSingleRight(rows []QueueRow, list []string, msg string) ([]QueueRow, error) {
|
|
|
if len(list) > 0 {
|
|
|
row := QueueRow{
|
|
|
- {Links: make([]link, 0, len(list))},
|
|
|
+ {Links: make([][]link, 1)},
|
|
|
{Message: msg},
|
|
|
}
|
|
|
+ row[0].Links[0] = make([]link, 0, len(list))
|
|
|
for _, qURL := range list {
|
|
|
name, err := redriver.NameFromURL(qURL)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- row[0].Links = append(row[0].Links, link{URL: "/queue/" + name, Text: name})
|
|
|
+ row[0].Links[0] = append(row[0].Links[0], link{URL: "/queue/" + name, Text: name})
|
|
|
}
|
|
|
rows = append(rows, row)
|
|
|
}
|
|
|
return rows, nil
|
|
|
}
|
|
|
+
|
|
|
+func prepareBinding(dlqURL string, DLQrp redriver.QueueRedrivePolicies, sources map[string]redriver.QueueRedrivePolicies) (*QueueRow, error) {
|
|
|
+ var left, right queueCell
|
|
|
+ dlqName, err := redriver.NameFromURL(dlqURL)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("failed parsing DLQ URL %q: %w", dlqURL, err)
|
|
|
+ }
|
|
|
+ right = queueCell{Link: &link{URL: "/queue/" + dlqName, Text: dlqName}}
|
|
|
+
|
|
|
+ a, err := redriver.ARNFromURL(dlqURL)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("failed converting URL %q to ARN: %w", dlqURL, err)
|
|
|
+ }
|
|
|
+ dlqARN := a.String()
|
|
|
+ var bound, unbound, elsewhere []link
|
|
|
+ for _, sourceARN := range DLQrp.SourceQueueARNs {
|
|
|
+ sa, err := arn.Parse(sourceARN)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("failed parsing %q as an ARN: %w", sourceARN, err)
|
|
|
+ }
|
|
|
+ sourceURL, err := redriver.URLFromARN(sa)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("failed converting ARN %q for URL: %w", sa.String(), err)
|
|
|
+ }
|
|
|
+ sourceName := sa.Resource
|
|
|
+ sourceQRP, ok := sources[sourceURL]
|
|
|
+ link := link{
|
|
|
+ URL: "/queue/" + sourceName,
|
|
|
+ Text: sourceName,
|
|
|
+ }
|
|
|
+ if ok {
|
|
|
+ switch sourceQRP.DeadLetterTargetARN {
|
|
|
+ case "":
|
|
|
+ unbound = append(unbound, link)
|
|
|
+ case dlqARN:
|
|
|
+ bound = append(bound, link)
|
|
|
+ default:
|
|
|
+ elsewhere = append(elsewhere, link)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ unbound = append(unbound, link)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ left.Links = [][]link{bound, elsewhere, unbound}
|
|
|
+
|
|
|
+ return &QueueRow{left, right}, nil
|
|
|
+}
|
|
|
+
|
|
|
+func prepareBindings(rows []QueueRow, DLQs, sources map[string]redriver.QueueRedrivePolicies) ([]QueueRow, error) {
|
|
|
+ for dlqURL, DLQrp := range DLQs {
|
|
|
+ row, err := prepareBinding(dlqURL, DLQrp, sources)
|
|
|
+ if err != nil || row == nil {
|
|
|
+ return nil, fmt.Errorf("failed binding DLQ %s: %w", dlqURL, err)
|
|
|
+ }
|
|
|
+ rows = append(rows, *row)
|
|
|
+ }
|
|
|
+ return rows, nil
|
|
|
+}
|