/// <inheritdoc/>
        public Task DeleteWebhookAsync(ScalingGroupId groupId, PolicyId policyId, WebhookId webhookId, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (policyId == null)
            {
                throw new ArgumentNullException("policyId");
            }
            if (webhookId == null)
            {
                throw new ArgumentNullException("webhookId");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/policies/{policyId}/webhooks/{webhookId}");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }, { "policyId", policyId.Value }, { "webhookId", webhookId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.DELETE, template, parameters);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
Example #2
0
        /// <inheritdoc/>
        public Task <QueuedMessage> GetMessageAsync(QueueName queueName, MessageId messageId, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (messageId == null)
            {
                throw new ArgumentNullException("messageId");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/messages/{message_id}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
                { "message_id", messageId.Value },
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <QueuedMessage> > requestResource =
                GetResponseAsyncFunc <QueuedMessage>(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
Example #3
0
        /// <inheritdoc/>
        public Task UpdateClaimAsync(QueueName queueName, Claim claim, TimeSpan timeToLive, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (claim == null)
            {
                throw new ArgumentNullException("claim");
            }
            if (timeToLive <= TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException("timeToLive");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/claims/{claim_id}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
                { "claim_id", claim.Id.Value }
            };

            JObject request = new JObject(new JProperty("ttl", new JValue((int)timeToLive.TotalSeconds)));
            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.PATCH, template, parameters, request);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource));
        }
        /// <inheritdoc/>
        public Task DeleteGroupAsync(ScalingGroupId groupId, bool?force, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}?force={force}");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }
            };

            if (force ?? false)
            {
                parameters.Add("force", force.ToString().ToLowerInvariant());
            }

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.DELETE, template, parameters);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
        /// <inheritdoc/>
        public Task <ReadOnlyCollectionPage <ScalingGroup> > ListScalingGroupsAsync(ScalingGroupId marker, int?limit, CancellationToken cancellationToken)
        {
            if (limit <= 0)
            {
                throw new ArgumentOutOfRangeException("limit");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/?marker={marker}&limit={limit}");
            var parameters = new Dictionary <string, string>();

            if (marker != null)
            {
                parameters.Add("marker", marker.Value);
            }
            if (limit != null)
            {
                parameters.Add("limit", limit.ToString());
            }

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, ReadOnlyCollectionPage <ScalingGroup> > resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JToken valuesToken = result["groups"];
                if (valuesToken == null)
                {
                    return(null);
                }

                JToken linksToken = result["groups_links"];
                Link[] links      = linksToken != null?linksToken.ToObject <Link[]>() : null;

                ScalingGroup[] values = valuesToken.ToObject <ScalingGroup[]>();

                ScalingGroupId nextMarker = values.Any() && (links == null || links.Any(i => string.Equals(i.Rel, "next", StringComparison.OrdinalIgnoreCase))) ? values.Last().Id : null;
                Func <CancellationToken, Task <ReadOnlyCollectionPage <ScalingGroup> > > getNextPageAsync = null;
                if (nextMarker != null)
                {
                    getNextPageAsync = nextCancellationToken => ListScalingGroupsAsync(nextMarker, limit, cancellationToken);
                }

                return(new BasicReadOnlyCollectionPage <ScalingGroup>(values, getNextPageAsync));
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #6
0
        /// <inheritdoc/>
        public Task ReleaseClaimAsync(QueueName queueName, Claim claim, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (claim == null)
            {
                throw new ArgumentNullException("claim");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/claims/{claim_id}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
                { "claim_id", claim.Id.Value },
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.DELETE, template, parameters);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
Example #7
0
        /// <inheritdoc/>
        public Task <HomeDocument> GetHomeAsync(CancellationToken cancellationToken)
        {
            if (_homeDocument != null)
            {
                return(InternalTaskExtensions.CompletedTask(_homeDocument));
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/");
            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, new Dictionary <string, string>());

            Func <Task <HttpWebRequest>, Task <HomeDocument> > requestResource =
                GetResponseAsyncFunc <HomeDocument>(cancellationToken);

            Func <Task <HomeDocument>, HomeDocument> cacheResult =
                task =>
            {
                _homeDocument = task.Result;
                return(task.Result);
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(cacheResult));
        }
        /// <inheritdoc/>
        public Task SetPolicyAsync(ScalingGroupId groupId, PolicyId policyId, PolicyConfiguration configuration, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (policyId == null)
            {
                throw new ArgumentNullException("policyId");
            }
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/policies/{policyId}");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }, { "policyId", policyId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.PUT, template, parameters, configuration);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource));
        }
Example #9
0
        /// <inheritdoc/>
        public Task <bool> QueueExistsAsync(QueueName queueName, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}");
            var parameters = new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value }
            };
            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.HEAD, template, parameters);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            Func <Task <string>, bool> interpretResult =
                task =>
            {
                // a WebException would have been thrown if the queue didn't exist
                if (task.Status == TaskStatus.RanToCompletion)
                {
                    return(true);
                }

                task.Exception.Flatten().Handle(
                    ex =>
                {
                    WebException webException = ex as WebException;
                    if (webException == null)
                    {
                        return(false);
                    }

                    HttpWebResponse response = webException.Response as HttpWebResponse;
                    if (response == null)
                    {
                        return(false);
                    }

                    if (response.StatusCode != HttpStatusCode.NotFound)
                    {
                        return(false);
                    }

                    // a 404 error means the queue does not exist
                    return(true);
                });

                return(false);
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(interpretResult, true));
        }
        /// <inheritdoc/>
        public Task <ReadOnlyCollection <Webhook> > CreateWebhookRangeAsync(ScalingGroupId groupId, PolicyId policyId, IEnumerable <NewWebhookConfiguration> configurations, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (policyId == null)
            {
                throw new ArgumentNullException("policyId");
            }
            if (configurations == null)
            {
                throw new ArgumentNullException("configurations");
            }

            NewWebhookConfiguration[] configurationsArray = configurations.ToArray();
            if (configurationsArray.Contains(null))
            {
                throw new ArgumentException("configurations cannot contain any null values", "configurations");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/policies/{policyId}/webhooks");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }, { "policyId", policyId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters, configurations);

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, ReadOnlyCollection <Webhook> > resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JToken valueToken = result["webhooks"];
                if (valueToken == null)
                {
                    return(null);
                }

                ReadOnlyCollection <Webhook> webhooks = valueToken.ToObject <ReadOnlyCollection <Webhook> >();
                return(webhooks);
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #11
0
        /// <inheritdoc/>
        public Task GetNodeHealthAsync(CancellationToken cancellationToken)
        {
            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/health");
            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.HEAD, template, new Dictionary <string, string>());

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
        /// <inheritdoc/>
        public Task <Webhook> CreateWebhookAsync(ScalingGroupId groupId, PolicyId policyId, NewWebhookConfiguration configuration, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (policyId == null)
            {
                throw new ArgumentNullException("policyId");
            }
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/policies/{policyId}/webhooks");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }, { "policyId", policyId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters, new[] { configuration });

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, Webhook> resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JToken valueToken = result["webhooks"];
                if (valueToken == null)
                {
                    return(null);
                }

                Webhook[] webhooks = valueToken.ToObject <Webhook[]>();
                return(webhooks[0]);
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #13
0
        /// <inheritdoc/>
        public Task <ReadOnlyCollectionPage <CloudQueue> > ListQueuesAsync(QueueName marker, int?limit, bool detailed, CancellationToken cancellationToken)
        {
            if (limit <= 0)
            {
                throw new ArgumentOutOfRangeException("limit");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues?marker={marker}&limit={limit}&detailed={detailed}");
            var parameters = new Dictionary <string, string>
            {
                { "detailed", detailed.ToString().ToLowerInvariant() },
            };

            if (marker != null)
            {
                parameters.Add("marker", marker.Value);
            }
            if (limit.HasValue)
            {
                parameters.Add("limit", limit.ToString());
            }

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <ListCloudQueuesResponse> > requestResource =
                GetResponseAsyncFunc <ListCloudQueuesResponse>(cancellationToken);

            Func <Task <ListCloudQueuesResponse>, ReadOnlyCollectionPage <CloudQueue> > resultSelector =
                task =>
            {
                ReadOnlyCollectionPage <CloudQueue> page = null;
                if (task.Result != null && task.Result.Queues != null)
                {
                    CloudQueue lastQueue  = task.Result.Queues.LastOrDefault();
                    QueueName  nextMarker = lastQueue != null ? lastQueue.Name : marker;
                    Func <CancellationToken, Task <ReadOnlyCollectionPage <CloudQueue> > > getNextPageAsync =
                        nextCancellationToken => ListQueuesAsync(nextMarker, limit, detailed, nextCancellationToken);
                    page = new BasicReadOnlyCollectionPage <CloudQueue>(task.Result.Queues, getNextPageAsync);
                }

                return(page ?? ReadOnlyCollectionPage <CloudQueue> .Empty);
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #14
0
        /// <inheritdoc/>
        public Task <Claim> QueryClaimAsync(QueueName queueName, Claim claim, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (claim == null)
            {
                throw new ArgumentNullException("claim");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/claims/{claim_id}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
                { "claim_id", claim.Id.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <Tuple <HttpWebResponse, string> >, Task <Tuple <Uri, TimeSpan, TimeSpan, IEnumerable <QueuedMessage> > > > parseResult =
                task =>
            {
                // this response uses ContentLocation instead of Location
                string location    = task.Result.Item1.Headers[HttpResponseHeader.ContentLocation];
                Uri    locationUri = location != null ? new Uri(_baseUri, location) : null;

                JObject  result = JsonConvert.DeserializeObject <JObject>(task.Result.Item2);
                TimeSpan age    = TimeSpan.FromSeconds((int)result["age"]);
                TimeSpan ttl    = TimeSpan.FromSeconds((int)result["ttl"]);
                IEnumerable <QueuedMessage> messages = result["messages"].ToObject <IEnumerable <QueuedMessage> >();
                return(InternalTaskExtensions.CompletedTask(Tuple.Create(locationUri, ttl, age, messages)));
            };
            Func <Task <HttpWebRequest>, Task <Tuple <Uri, TimeSpan, TimeSpan, IEnumerable <QueuedMessage> > > > requestResource =
                GetResponseAsyncFunc(cancellationToken, parseResult);

            Func <Task <Tuple <Uri, TimeSpan, TimeSpan, IEnumerable <QueuedMessage> > >, Claim> resultSelector =
                task => new Claim(this, queueName, task.Result.Item1, task.Result.Item2, task.Result.Item3, false, task.Result.Item4);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
        /// <inheritdoc/>
        public Task <Policy> GetPolicyAsync(ScalingGroupId groupId, PolicyId policyId, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (policyId == null)
            {
                throw new ArgumentNullException("policyId");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/policies/{policyId}");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }, { "policyId", policyId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, Policy> resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JToken valueToken = result["policy"];
                if (valueToken == null)
                {
                    return(null);
                }

                return(valueToken.ToObject <Policy>());
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
        /// <inheritdoc/>
        public Task <LaunchConfiguration> GetLaunchConfigurationAsync(ScalingGroupId groupId, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/launch");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, LaunchConfiguration> resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JObject valueToken = result["launchConfiguration"] as JObject;
                if (valueToken == null)
                {
                    return(null);
                }

                return(LaunchConfiguration.FromJObject(valueToken));
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #17
0
        /// <inheritdoc/>
        public Task <MessagesEnqueued> PostMessagesAsync <T>(QueueName queueName, CancellationToken cancellationToken, params Message <T>[] messages)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }
            if (messages.Contains(null))
            {
                throw new ArgumentException("messages cannot contain any null values");
            }

            if (messages.Length == 0)
            {
                return(QueueExistsAsync(queueName, cancellationToken)
                       .Select(_ => MessagesEnqueued.Empty));
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/messages");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
            };

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters, messages);

            Func <Task <HttpWebRequest>, Task <MessagesEnqueued> > requestResource =
                GetResponseAsyncFunc <MessagesEnqueued>(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource));
        }
        /// <inheritdoc/>
        public Task ResumeGroupAsync(ScalingGroupId groupId, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups/{groupId}/resume");
            var parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
        /// <inheritdoc/>
        public Task <ScalingGroup> CreateGroupAsync(ScalingGroupConfiguration configuration, CancellationToken cancellationToken)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/groups");
            var parameters = new Dictionary <string, string>();

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters, configuration);

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, ScalingGroup> resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JToken valueToken = result["group"];
                if (valueToken == null)
                {
                    return(null);
                }

                return(valueToken.ToObject <ScalingGroup>());
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #20
0
        /// <inheritdoc/>
        public Task DeleteMessagesAsync(QueueName queueName, IEnumerable <MessageId> messageIds, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (messageIds == null)
            {
                throw new ArgumentNullException("messageIds");
            }
            if (messageIds.Contains(null))
            {
                throw new ArgumentException("messageIds cannot contain any null values");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/messages?ids={ids}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
                { "ids", string.Join(",", messageIds.Select(i => i.Value).ToArray()) },
            };

            Func <Uri, Uri> uriTransform =
                uri => new Uri(uri.GetLeftPart(UriPartial.Path) + uri.Query.Replace("%2c", ","));

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.DELETE, template, parameters, uriTransform);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
Example #21
0
        /// <inheritdoc/>
        public Task <bool> CreateQueueAsync(QueueName queueName, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}");
            var parameters = new Dictionary <string, string>
            {
                { "queue_name", queueName.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.PUT, template, parameters);

            Func <Task <Tuple <HttpWebResponse, string> >, Task <bool> > parseResult =
                task =>
            {
                if (task.Result.Item1.StatusCode == HttpStatusCode.Created)
                {
                    return(InternalTaskExtensions.CompletedTask(true));
                }
                else
                {
                    return(InternalTaskExtensions.CompletedTask(false));
                }
            };

            Func <Task <HttpWebRequest>, Task <bool> > requestResource =
                GetResponseAsyncFunc(cancellationToken, parseResult);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
Example #22
0
        /// <inheritdoc/>
        public Task <T> GetQueueMetadataAsync <T>(QueueName queueName, CancellationToken cancellationToken)
            where T : class
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/metadata");
            var parameters = new Dictionary <string, string>
            {
                { "queue_name", queueName.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <T> > requestResource =
                GetResponseAsyncFunc <T>(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource));
        }
 public FooIdPage(IWebDriver driver, int id)
     : base(driver)
 {
     PageUriTemplate = new UriTemplate.UriTemplate("foo/{id}");
     SetPageUrl(new Uri(PageManager.Current.BaseUrl, id.ToString()).ToString());
 }
Example #24
0
        /// <inheritdoc/>
        /// <remarks>
        /// This method calls <see cref="ProviderBase{TProvider}.PrepareRequestImpl"/> to create the
        /// initial <see cref="HttpWebRequest"/>, and then sets the <c>Client-Id</c> header according
        /// to the Marconi (Cloud Queues) specification before returning.
        /// </remarks>
        protected override HttpWebRequest PrepareRequestImpl(HttpMethod method, IdentityToken identityToken, UriTemplate.UriTemplate template, Uri baseUri, IDictionary <string, string> parameters, Func <Uri, Uri> uriTransform)
        {
            HttpWebRequest request = base.PrepareRequestImpl(method, identityToken, template, baseUri, parameters, uriTransform);

            request.Headers["Client-Id"] = _clientId.ToString("D");
            return(request);
        }
Example #25
0
        /// <inheritdoc/>
        public Task <QueuedMessageList> ListMessagesAsync(QueueName queueName, QueuedMessageListId marker, int?limit, bool echo, bool includeClaimed, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (limit <= 0)
            {
                throw new ArgumentOutOfRangeException("limit");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/messages?marker={marker}&limit={limit}&echo={echo}&include_claimed={include_claimed}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
                { "echo", echo.ToString() },
                { "include_claimed", includeClaimed.ToString() }
            };

            if (marker != null)
            {
                parameters["marker"] = marker.Value;
            }
            if (limit != null)
            {
                parameters["limit"] = limit.ToString();
            }

            Func <Task <Tuple <IdentityToken, Uri> >, HttpWebRequest> prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.GET, template, parameters);

            Func <Task <HttpWebRequest>, Task <ListCloudQueueMessagesResponse> > requestResource =
                GetResponseAsyncFunc <ListCloudQueueMessagesResponse>(cancellationToken);

            Func <Task <ListCloudQueueMessagesResponse>, QueuedMessageList> resultSelector =
                task =>
            {
                ReadOnlyCollection <QueuedMessage> messages = null;
                if (task.Result != null)
                {
                    messages = task.Result.Messages;
                }

                QueuedMessageListId nextMarker = null;
                if (task.Result != null && task.Result.Links != null)
                {
                    Link nextLink = task.Result.Links.FirstOrDefault(i => string.Equals(i.Rel, "next", StringComparison.OrdinalIgnoreCase));
                    if (nextLink != null)
                    {
                        Uri baseUri = new Uri("https://example.com");
                        Uri absoluteUri;
                        if (nextLink.Href.StartsWith("/v1"))
                        {
                            absoluteUri = new Uri(baseUri, nextLink.Href.Substring("/v1".Length));
                        }
                        else
                        {
                            absoluteUri = new Uri(baseUri, nextLink.Href);
                        }

                        UriTemplate.UriTemplateMatch match = template.Match(baseUri, absoluteUri);
                        if (!string.IsNullOrEmpty(match.BoundVariables["marker"]))
                        {
                            nextMarker = new QueuedMessageListId(match.BoundVariables["marker"]);
                        }
                    }
                }

                if (messages == null || messages.Count == 0)
                {
                    // use the same marker again
                    messages   = messages ?? new ReadOnlyCollection <QueuedMessage>(new QueuedMessage[0]);
                    nextMarker = marker;
                }

                Func <CancellationToken, Task <ReadOnlyCollectionPage <QueuedMessage> > > getNextPageAsync = null;
                if (nextMarker != null || messages.Count == 0)
                {
                    getNextPageAsync =
                        nextCancellationToken => ListMessagesAsync(queueName, nextMarker, limit, echo, includeClaimed, nextCancellationToken)
                        .Select(t => (ReadOnlyCollectionPage <QueuedMessage>)t.Result);
                }

                return(new QueuedMessageList(messages, getNextPageAsync, nextMarker));
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Select(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
Example #26
0
        /// <inheritdoc/>
        public Task <Claim> ClaimMessageAsync(QueueName queueName, int?limit, TimeSpan timeToLive, TimeSpan gracePeriod, CancellationToken cancellationToken)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (limit < 0)
            {
                throw new ArgumentOutOfRangeException("limit");
            }
            if (timeToLive <= TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException("timeToLive");
            }
            if (gracePeriod < TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException("gracePeriod");
            }

            UriTemplate.UriTemplate template = new UriTemplate.UriTemplate("/queues/{queue_name}/claims?limit={limit}");

            var parameters =
                new Dictionary <string, string>()
            {
                { "queue_name", queueName.Value },
            };

            if (limit != null)
            {
                parameters["limit"] = limit.ToString();
            }

            var request = new ClaimMessagesRequest(timeToLive, gracePeriod);

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters, request);

            Func <Task <Tuple <HttpWebResponse, string> >, Task <Tuple <Uri, IEnumerable <QueuedMessage> > > > parseResult =
                task =>
            {
                string location    = task.Result.Item1.Headers[HttpResponseHeader.Location];
                Uri    locationUri = location != null ? new Uri(_baseUri, location) : null;

                if (task.Result.Item1.StatusCode == HttpStatusCode.NoContent)
                {
                    // the queue did not contain any messages to claim
                    Tuple <Uri, IEnumerable <QueuedMessage> > result = Tuple.Create(locationUri, Enumerable.Empty <QueuedMessage>());
                    return(InternalTaskExtensions.CompletedTask(result));
                }

                IEnumerable <QueuedMessage> messages = JsonConvert.DeserializeObject <IEnumerable <QueuedMessage> >(task.Result.Item2);

                return(InternalTaskExtensions.CompletedTask(Tuple.Create(locationUri, messages)));
            };
            Func <Task <HttpWebRequest>, Task <Tuple <Uri, IEnumerable <QueuedMessage> > > > requestResource =
                GetResponseAsyncFunc <Tuple <Uri, IEnumerable <QueuedMessage> > >(cancellationToken, parseResult);

            Func <Task <Tuple <Uri, IEnumerable <QueuedMessage> > >, Claim> resultSelector =
                task => new Claim(this, queueName, task.Result.Item1, timeToLive, TimeSpan.Zero, true, task.Result.Item2);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }