shared-sqs: Этап 4 — изоляция очередей по тенанту
This commit is contained in:
@@ -1,135 +1,118 @@
|
||||
// Изменено: 2026-04-09
|
||||
// GetQueueAttributesV1 — возвращает атрибуты очереди тенанта.
|
||||
package gosqs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"shared-sqs/app/models"
|
||||
"shared-sqs/app/utils"
|
||||
"github.com/mitchellh/copystructure"
|
||||
|
||||
"shared-sqs/app/interfaces"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
"shared-sqs/app/interfaces"
|
||||
"shared-sqs/app/models"
|
||||
"shared-sqs/app/utils"
|
||||
"github.com/mitchellh/copystructure"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func GetQueueAttributesV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
|
||||
requestBody := models.NewGetQueueAttributesRequest()
|
||||
ok := utils.REQUEST_TRANSFORMER(requestBody, req, false)
|
||||
if !ok {
|
||||
log.Error("Invalid Request - GetQueueAttributesV1")
|
||||
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
|
||||
}
|
||||
if requestBody.QueueUrl == "" {
|
||||
log.Error("Missing QueueUrl - GetQueueAttributesV1")
|
||||
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
|
||||
}
|
||||
|
||||
requestedAttributes := func() map[string]bool {
|
||||
attrs := map[string]bool{}
|
||||
if len(requestBody.AttributeNames) == 0 {
|
||||
return map[string]bool{"All": true}
|
||||
}
|
||||
for _, attr := range requestBody.AttributeNames {
|
||||
if "All" == attr {
|
||||
return map[string]bool{"All": true}
|
||||
}
|
||||
attrs[attr] = true
|
||||
}
|
||||
return attrs
|
||||
}()
|
||||
|
||||
dupe, _ := copystructure.Copy(models.AvailableQueueAttributes)
|
||||
includedAttributes, _ := dupe.(map[string]bool)
|
||||
_, ok = requestedAttributes["All"]
|
||||
if !ok {
|
||||
for attr, _ := range includedAttributes {
|
||||
_, ok := requestedAttributes[attr]
|
||||
if !ok {
|
||||
delete(includedAttributes, attr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uriSegments := strings.Split(requestBody.QueueUrl, "/")
|
||||
queueName := uriSegments[len(uriSegments)-1]
|
||||
|
||||
log.Infof("Get Queue QueueAttributes: %s", queueName)
|
||||
queueAttributes := make([]models.Attribute, 0, 0)
|
||||
|
||||
models.SyncQueues.RLock()
|
||||
defer models.SyncQueues.RUnlock()
|
||||
queue, ok := models.SyncQueues.Queues[queueName]
|
||||
if !ok {
|
||||
log.Errorf("Get Queue URL: %s queue does not exist!!!", queueName)
|
||||
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
|
||||
}
|
||||
|
||||
if _, ok := includedAttributes["DelaySeconds"]; ok {
|
||||
attr := models.Attribute{Name: "DelaySeconds", Value: strconv.Itoa(queue.DelaySeconds)}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["MaximumMessageSize"]; ok {
|
||||
attr := models.Attribute{Name: "MaximumMessageSize", Value: strconv.Itoa(queue.MaximumMessageSize)}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["MessageRetentionPeriod"]; ok {
|
||||
attr := models.Attribute{Name: "MessageRetentionPeriod", Value: strconv.Itoa(queue.MessageRetentionPeriod)}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["ReceiveMessageWaitTimeSeconds"]; ok {
|
||||
attr := models.Attribute{Name: "ReceiveMessageWaitTimeSeconds", Value: strconv.Itoa(queue.ReceiveMessageWaitTimeSeconds)}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["VisibilityTimeout"]; ok {
|
||||
attr := models.Attribute{Name: "VisibilityTimeout", Value: strconv.Itoa(queue.VisibilityTimeout)}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["ApproximateNumberOfMessages"]; ok {
|
||||
attr := models.Attribute{Name: "ApproximateNumberOfMessages", Value: strconv.Itoa(len(queue.Messages))}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
// TODO - implement
|
||||
//if _, ok := includedAttributes["ApproximateNumberOfMessagesDelayed"]; ok {
|
||||
// attr := models.Attribute{Name: "ApproximateNumberOfMessagesDelayed", Value: strconv.Itoa(len(queue.Messages))}
|
||||
// queueAttributes = append(queueAttributes, attr)
|
||||
//}
|
||||
if _, ok := includedAttributes["ApproximateNumberOfMessagesNotVisible"]; ok {
|
||||
attr := models.Attribute{Name: "ApproximateNumberOfMessagesNotVisible", Value: strconv.Itoa(numberOfHiddenMessagesInQueue(*queue))}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["CreatedTimestamp"]; ok {
|
||||
attr := models.Attribute{Name: "CreatedTimestamp", Value: "0000000000"}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["LastModifiedTimestamp"]; ok {
|
||||
attr := models.Attribute{Name: "LastModifiedTimestamp", Value: "0000000000"}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
if _, ok := includedAttributes["QueueArn"]; ok {
|
||||
attr := models.Attribute{Name: "QueueArn", Value: queue.Arn}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
// TODO - implement
|
||||
//if _, ok := includedAttributes["Policy"]; ok {
|
||||
// attr := models.Attribute{Name: "Policy", Value: ""}
|
||||
// queueAttributes = append(queueAttributes, attr)
|
||||
//}
|
||||
//if _, ok := includedAttributes["RedriveAllowPolicy"]; ok {
|
||||
// attr := models.Attribute{Name: "RedriveAllowPolicy", Value: ""}
|
||||
// queueAttributes = append(queueAttributes, attr)
|
||||
//}
|
||||
if _, ok := includedAttributes["RedrivePolicy"]; ok && queue.DeadLetterQueue != nil {
|
||||
attr := models.Attribute{Name: "RedrivePolicy", Value: fmt.Sprintf(`{"maxReceiveCount":"%d", "deadLetterTargetArn":"%s"}`, queue.MaxReceiveCount, queue.DeadLetterQueue.Arn)}
|
||||
queueAttributes = append(queueAttributes, attr)
|
||||
}
|
||||
|
||||
respStruct := models.GetQueueAttributesResponse{
|
||||
Xmlns: models.BaseXmlns,
|
||||
Result: models.GetQueueAttributesResult{Attrs: queueAttributes},
|
||||
Metadata: models.BaseResponseMetadata,
|
||||
}
|
||||
return http.StatusOK, respStruct
|
||||
requestBody := models.NewGetQueueAttributesRequest()
|
||||
ok := utils.REQUEST_TRANSFORMER(requestBody, req, false)
|
||||
if !ok {
|
||||
log.Error("Invalid Request - GetQueueAttributesV1")
|
||||
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
|
||||
}
|
||||
if requestBody.QueueUrl == "" {
|
||||
log.Error("Missing QueueUrl - GetQueueAttributesV1")
|
||||
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
|
||||
}
|
||||
|
||||
t := getTenantFromContext(req)
|
||||
if t == nil {
|
||||
return utils.CreateErrorResponseV1("InvalidClientTokenId", true)
|
||||
}
|
||||
|
||||
requestedAttributes := func() map[string]bool {
|
||||
attrs := map[string]bool{}
|
||||
if len(requestBody.AttributeNames) == 0 {
|
||||
return map[string]bool{"All": true}
|
||||
}
|
||||
for _, attr := range requestBody.AttributeNames {
|
||||
if "All" == attr {
|
||||
return map[string]bool{"All": true}
|
||||
}
|
||||
attrs[attr] = true
|
||||
}
|
||||
return attrs
|
||||
}()
|
||||
|
||||
dupe, _ := copystructure.Copy(models.AvailableQueueAttributes)
|
||||
includedAttributes, _ := dupe.(map[string]bool)
|
||||
_, ok = requestedAttributes["All"]
|
||||
if !ok {
|
||||
for attr := range includedAttributes {
|
||||
if _, ok := requestedAttributes[attr]; !ok {
|
||||
delete(includedAttributes, attr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uriSegments := strings.Split(requestBody.QueueUrl, "/")
|
||||
queueName := uriSegments[len(uriSegments)-1]
|
||||
key := tenantQueueKey(t.AccessKey, queueName)
|
||||
|
||||
log.Infof("Get Queue Attributes: %s (tenant: %s)", queueName, t.ID)
|
||||
queueAttributes := make([]models.Attribute, 0)
|
||||
|
||||
models.SyncQueues.RLock()
|
||||
defer models.SyncQueues.RUnlock()
|
||||
queue, ok := models.SyncQueues.Queues[key]
|
||||
if !ok {
|
||||
log.Errorf("Get Queue Attributes: %s queue does not exist for tenant %s", queueName, t.ID)
|
||||
return utils.CreateErrorResponseV1("QueueNotFound", true)
|
||||
}
|
||||
|
||||
if _, ok := includedAttributes["DelaySeconds"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "DelaySeconds", Value: strconv.Itoa(queue.DelaySeconds)})
|
||||
}
|
||||
if _, ok := includedAttributes["MaximumMessageSize"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "MaximumMessageSize", Value: strconv.Itoa(queue.MaximumMessageSize)})
|
||||
}
|
||||
if _, ok := includedAttributes["MessageRetentionPeriod"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "MessageRetentionPeriod", Value: strconv.Itoa(queue.MessageRetentionPeriod)})
|
||||
}
|
||||
if _, ok := includedAttributes["ReceiveMessageWaitTimeSeconds"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "ReceiveMessageWaitTimeSeconds", Value: strconv.Itoa(queue.ReceiveMessageWaitTimeSeconds)})
|
||||
}
|
||||
if _, ok := includedAttributes["VisibilityTimeout"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "VisibilityTimeout", Value: strconv.Itoa(queue.VisibilityTimeout)})
|
||||
}
|
||||
if _, ok := includedAttributes["ApproximateNumberOfMessages"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "ApproximateNumberOfMessages", Value: strconv.Itoa(len(queue.Messages))})
|
||||
}
|
||||
if _, ok := includedAttributes["ApproximateNumberOfMessagesNotVisible"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "ApproximateNumberOfMessagesNotVisible", Value: strconv.Itoa(numberOfHiddenMessagesInQueue(*queue))})
|
||||
}
|
||||
if _, ok := includedAttributes["CreatedTimestamp"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "CreatedTimestamp", Value: "0000000000"})
|
||||
}
|
||||
if _, ok := includedAttributes["LastModifiedTimestamp"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "LastModifiedTimestamp", Value: "0000000000"})
|
||||
}
|
||||
if _, ok := includedAttributes["QueueArn"]; ok {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{Name: "QueueArn", Value: queue.Arn})
|
||||
}
|
||||
if _, ok := includedAttributes["RedrivePolicy"]; ok && queue.DeadLetterQueue != nil {
|
||||
queueAttributes = append(queueAttributes, models.Attribute{
|
||||
Name: "RedrivePolicy",
|
||||
Value: fmt.Sprintf(`{"maxReceiveCount":"%d", "deadLetterTargetArn":"%s"}`, queue.MaxReceiveCount, queue.DeadLetterQueue.Arn),
|
||||
})
|
||||
}
|
||||
|
||||
respStruct := models.GetQueueAttributesResponse{
|
||||
Xmlns: models.BaseXmlns,
|
||||
Result: models.GetQueueAttributesResult{Attrs: queueAttributes},
|
||||
Metadata: models.BaseResponseMetadata,
|
||||
}
|
||||
return http.StatusOK, respStruct
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user