Example #1
0
 public AmazonRecieveMessage(IAmazonInternalSettings amazonInternalSettings, AmazonSQSQueueContext amazonSQSQueueContext, IAmazonMessageProcessorFactory amazonMessageProcessorFactory)
 {
     _amazonMessageProcessorFactory = amazonMessageProcessorFactory;
     m_amazonInternalSettings       = amazonInternalSettings ?? throw new ArgumentNullException(nameof(amazonInternalSettings));
     m_amazonSqsQueueContext        = amazonSQSQueueContext ?? throw new ArgumentNullException(nameof(amazonSQSQueueContext));
     m_log = m_amazonInternalSettings.RebusLoggerFactory.GetLogger <AmazonRecieveMessage>();
 }
Example #2
0
 public SqsAmazonSendMessageProcessor(string destinationAddress, IAmazonInternalSettings amazonInternalSettings, AmazonSQSQueueContext amazonSqsQueueContext, IRebusTime rebusTime)
 {
     this._destinationAddress     = destinationAddress;
     this._amazonInternalSettings = amazonInternalSettings;
     this._amazonSqsQueueContext  = amazonSqsQueueContext;
     this._rebusTime = rebusTime;
 }
        public static async Task CheckSqsPolicy(this IAmazonInternalSettings amazonInternalSettings, ITransactionContext transactionContext, string destinationQueueUrlByName, SqsInfo sqsInformation, string topicArn)
        {
            var logger = amazonInternalSettings.RebusLoggerFactory.GetLogger();

            var sqsClient = amazonInternalSettings.CreateSqsClient(transactionContext);

            var attributes = await sqsClient.GetAttributesAsync(destinationQueueUrlByName);

            var policyKey = "Policy";

            var statement = new Statement(Statement.StatementEffect.Allow).WithPrincipals(Principal.AllUsers).WithResources(new Resource(sqsInformation.Arn)).WithConditions(ConditionFactory.NewSourceArnCondition(topicArn)).WithActionIdentifiers(SQSActionIdentifiers.SendMessage);

            Policy sqsPolicy;

            var setPolicy = false;

            if (attributes.ContainsKey(policyKey))
            {
                logger.Debug($"Updating existing policy on sqs queue {0} for topic {1}", sqsInformation.Url, topicArn);
                var policyString = attributes[policyKey];

                attributes = new Dictionary <string, string>();

                sqsPolicy = Policy.FromJson(policyString);

                if (sqsPolicy.CheckIfStatementExists(statement) == false)
                {
                    sqsPolicy = sqsPolicy.WithStatements(statement);
                    attributes.Add(policyKey, sqsPolicy.ToJson());
                    setPolicy = true;
                }
            }
            else
            {
                logger.Debug($"Creating policy on sqs queue {0} for topic {1}", sqsInformation.Url, topicArn);
                attributes = new Dictionary <string, string>();
                sqsPolicy  = new Policy().WithStatements(statement);
                attributes.Add(policyKey, sqsPolicy.ToJson());
                setPolicy = true;
            }

            if (setPolicy)
            {
                await sqsClient.SetAttributesAsync(sqsInformation.Url, attributes);
            }
        }
        public static async Task <string> GetTopicArn(this IAmazonInternalSettings amazonInternalSettings, string topic, RebusTransactionScope scope = null)
        {
            var result = await Task.FromResult(s_topicArnCache.GetOrAdd(topic, s =>
            {
                var rebusTransactionScope = scope ?? new RebusTransactionScope();
                try
                {
                    var logger = amazonInternalSettings.RebusLoggerFactory.GetLogger();

                    var snsClient = amazonInternalSettings.CreateSnsClient(rebusTransactionScope.TransactionContext);

                    var formatedTopicName = amazonInternalSettings.TopicFormatter.FormatTopic(topic);

                    var findTopicAsync = snsClient.FindTopicAsync(formatedTopicName);

                    AsyncHelpers.RunSync(() => findTopicAsync);

                    var findTopicResult = findTopicAsync.Result;

                    string topicArn = findTopicResult?.TopicArn;

                    if (findTopicResult == null)
                    {
                        logger.Debug($"Did not find sns topic {0}", formatedTopicName);
                        var task = snsClient.CreateTopicAsync(new CreateTopicRequest(formatedTopicName));
                        AsyncHelpers.RunSync(() => task);
                        topicArn = task.Result?.TopicArn;
                        logger.Debug($"Created sns topic {0} => {1}", formatedTopicName, topicArn);
                    }

                    logger.Debug($"Using sns topic {0} => {1}", formatedTopicName, topicArn);
                    return(topicArn);
                }
                finally
                {
                    if (scope == null)
                    {
                        rebusTransactionScope.Dispose();
                    }
                }
            }));

            return(result);
        }
        /// <summary>
        ///     Constructs the transport with the specified settings
        /// </summary>
        public AmazonSqsTransport(IAmazonInternalSettings amazonInternalSettings)
        {
            m_AmazonInternalSettings = amazonInternalSettings ?? throw new ArgumentNullException(nameof(amazonInternalSettings));

            m_log = amazonInternalSettings.RebusLoggerFactory.GetLogger <AmazonSqsTransport>();

            if (amazonInternalSettings.InputQueueAddress != null)
            {
                if (amazonInternalSettings.InputQueueAddress.Contains("/") && !Uri.IsWellFormedUriString(amazonInternalSettings.InputQueueAddress, UriKind.Absolute))
                {
                    var message = $"The input queue address '{amazonInternalSettings.InputQueueAddress}' is not valid - please either use a simple queue name (eg. 'my-queue') or a full URL for the queue endpoint (e.g. 'https://sqs.eu-central-1.amazonaws.com/234234234234234/somqueue').";

                    throw new ArgumentException(message, nameof(amazonInternalSettings.InputQueueAddress));
                }
            }

            m_amazonSQSQueueContext           = new AmazonSQSQueueContext(m_AmazonInternalSettings);
            m_AmazonSendMessageCommandFactory = new AmazonSendMessageCommandFactory(m_AmazonInternalSettings, m_amazonSQSQueueContext);
            m_amazonCreateSqsQueue            = new AmazonCreateSQSQueue(m_AmazonInternalSettings);
            m_amazonSqsQueuePurgeUtility      = new AmazonSQSQueuePurgeUtility(m_AmazonInternalSettings);
            m_AmazonMessageProcessorFactory   = new AmazonMessageProcessorFactory(m_AmazonInternalSettings);
            m_AmazonRecieveMessage            = new AmazonRecieveMessage(m_AmazonInternalSettings, m_amazonSQSQueueContext, m_AmazonMessageProcessorFactory);
        }
 public AmazonSendMessageCommandFactory(IAmazonInternalSettings amazonInternalSettings, AmazonSQSQueueContext amazonSqsQueueContext)
 {
     this._amazonInternalSettings = amazonInternalSettings ?? throw new ArgumentNullException(nameof(amazonInternalSettings));
     this._amazonSqsQueueContext  = amazonSqsQueueContext ?? throw new ArgumentNullException(nameof(amazonSqsQueueContext));
 }
 public AmazonSQSQueueContext(IAmazonInternalSettings m_AmazonInternalSettings)
 {
     this.m_AmazonInternalSettings = m_AmazonInternalSettings;
 }
 /// <summary></summary>
 /// <param name="amazonInternalSettings"></param>
 public AmazonMessageProcessorFactory(IAmazonInternalSettings amazonInternalSettings)
 {
     _amazonInternalSettings = amazonInternalSettings;
 }
 public AmazonSQSTransportFactory(IAmazonInternalSettings amazonInternalSettings, IRebusTime rebusTime)
 {
     m_amazonInternalSettings = amazonInternalSettings;
     _rebusTime = rebusTime;
 }
 public AmazonSQSTransportFactory(IAmazonInternalSettings amazonInternalSettings)
 {
     m_amazonInternalSettings = amazonInternalSettings;
 }
 public RebusMessageAmazonMessageProcessor(Message message, IAmazonInternalSettings amazonInternalSettings)
 {
     _amazonInternalSettings = amazonInternalSettings;
     _message = message;
 }
 public SnsAmazonSendMessageProcessor(string destinationAddress, IAmazonInternalSettings amazonInternalSettings)
 {
     this._destinationAddress     = destinationAddress;
     this._amazonInternalSettings = amazonInternalSettings;
 }
 public AmazonSQSQueuePurgeUtility(IAmazonInternalSettings amazonInternalSettings)
 {
     m_AmazonInternalSettings = amazonInternalSettings;
     m_log = amazonInternalSettings.RebusLoggerFactory.GetLogger <AmazonSQSQueuePurgeUtility>();
 }
Example #14
0
 /// <summary>Initializes a new instance of the <see cref="SnsTopicAmazonMessageProcessor"/> class.</summary>
 /// <param name="message">The message.</param>
 /// <param name="amazonInternalSettings">The amazon internal settings.</param>
 public SnsTopicAmazonMessageProcessor(JObject message, IAmazonInternalSettings amazonInternalSettings)
 {
     _amazonInternalSettings = amazonInternalSettings;
     _message = message;
 }
Example #15
0
        public static async Task <string> GetTopicArn(this IAmazonSimpleNotificationService snsClient, IAmazonInternalSettings m_AmazonInternalSettings, string topic)
        {
            var formatedTopicName = m_AmazonInternalSettings.TopicFormatter.FormatTopic(topic);

            var findTopicResult = await snsClient.FindTopicAsync(formatedTopicName);

            var topicArn = findTopicResult?.TopicArn;

            if (topicArn == null)
            {
                var createTopicResponse = await snsClient.CreateTopicAsync(formatedTopicName);

                if (createTopicResponse.HttpStatusCode != HttpStatusCode.OK)
                {
                    throw new SnsRebusException($"Error creating topic {formatedTopicName}.", createTopicResponse.CreateAmazonExceptionFromResponse());
                }

                topicArn = createTopicResponse.TopicArn;
            }

            return(topicArn);
        }
 public AmazonCreateSQSQueue(IAmazonInternalSettings amazonInternalSettings)
 {
     m_AmazonInternalSettings = amazonInternalSettings ?? throw new ArgumentNullException(nameof(amazonInternalSettings));
     m_log = m_AmazonInternalSettings.RebusLoggerFactory.GetLogger <AmazonCreateSQSQueue>();
 }