Пример #1
0
        public async Task <IEnumerable <RoleAndDescription> > GetRolesAsync(AvailableRolesOptions?options = null)
        {
            options ??= AvailableRolesOptions.Default;
            var uri = GetRolesUri();

            _logger.LogInformation("Attempting to get all available roles - {uri}", _redactor.MetaData(uri));

            try
            {
                // get roles
                var result = await _client.GetAsync(uri, options.TokenValue).ConfigureAwait(false);

                result.EnsureSuccessStatusCode();

                // get roles from result
                var json = JArray.Parse(await result.Content.ReadAsStringAsync().ConfigureAwait(false));
                return(json.Select(RoleAndDescription.FromJson));
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Error trying to get all available roles - {uri}", _redactor.SystemData(uri));
                throw;
            }
        }
Пример #2
0
        public async Task CreateDataverseAsync(string dataverseName, CreateAnalyticsDataverseOptions?options = null)
        {
            options ??= new CreateAnalyticsDataverseOptions();

            _logger.LogInformation("Attempting to create dataverse with name {dataverseName}",
                                   _redactor.MetaData(dataverseName));

            try
            {
                if (string.IsNullOrWhiteSpace(dataverseName))
                {
                    throw new InvalidArgumentException("dataverseName is a required parameter");
                }

                var ignoreStr = options.IgnoreIfExistsValue ? " IF NOT EXISTS" : string.Empty;
                var statement = $"CREATE DATAVERSE `{dataverseName}`{ignoreStr}";
                await _client
                .QueryAsync <dynamic>(statement, queryOptions => queryOptions.CancellationToken(options.TokenValue))
                .ConfigureAwait(false);
            }
            catch (DataverseExistsException)
            {
                _logger.LogError("Failed to create dataverse with name {dataverseName} because it already exists.",
                                 _redactor.MetaData(dataverseName));
                throw;
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Failed to create dataverse with name {dataverseName}",
                                 _redactor.MetaData(dataverseName));
                throw;
            }
        }
Пример #3
0
        public async Task BuildDeferredIndexesAsync(string bucketName, BuildDeferredQueryIndexOptions?options = null)
        {
            options ??= BuildDeferredQueryIndexOptions.Default;
            _logger.LogInformation("Attempting to build deferred query indexes on bucket {bucketName}",
                                   _redactor.MetaData(bucketName));
            try
            {
                var indexes = await this.GetAllIndexesAsync(bucketName,
                                                            queryOptions => queryOptions.CancellationToken(options.TokenValue)
                                                            ).ConfigureAwait(false);

                var tasks = new List <Task>();
                foreach (var index in indexes.Where(i => i.State == "pending" || i.State == "deferred"))
                {
                    var statement = $"BUILD INDEX ON {bucketName}({index.Name}) USING GSI;";
                    tasks.Add(_queryClient.QueryAsync <dynamic>(statement,
                                                                queryOptions => queryOptions.CancellationToken(options.TokenValue)
                                                                ));
                }

                await Task.WhenAll(tasks).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Error trying to build deferred query indexes on {bucketName}",
                                 _redactor.MetaData(bucketName));
                throw;
            }
        }
Пример #4
0
        public async Task AllowQueryingAsync(string indexName, AllowQueryingSearchIndexOptions?options = null)
        {
            options ??= AllowQueryingSearchIndexOptions.Default;
            var baseUri = GetQueryControlUri(indexName, true);

            _logger.LogInformation("Trying to allow querying for index with name {indexName} - {baseUri}",
                                   _redactor.MetaData(indexName), _redactor.SystemData(baseUri));

            try
            {
                var result = await _client.PostAsync(baseUri, null, options.TokenValue).ConfigureAwait(false);

                if (result.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new SearchIndexNotFound(indexName);
                }

                result.EnsureSuccessStatusCode();
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Failed to allow querying for index with name {indexName} - {baseUri}",
                                 _redactor.MetaData(indexName), _redactor.SystemData(baseUri));
                throw;
            }
        }
        public async Task CreateBucketAsync(BucketSettings settings, CreateBucketOptions?options = null)
        {
            options ??= new CreateBucketOptions();
            var uri = GetUri();

            _logger.LogInformation("Attempting to create bucket with name {settings.Name} - {uri}",
                                   _redactor.MetaData(settings.Name), _redactor.SystemData(uri));

            try
            {
                // create bucket
                var content = new FormUrlEncodedContent(GetBucketSettingAsFormValues(settings));
                var result  = await _client.PostAsync(uri, content, options.TokenValue).ConfigureAwait(false);

                if (result.StatusCode == HttpStatusCode.BadRequest)
                {
                    var json = await result.Content.ReadAsStringAsync().ConfigureAwait(false);

                    if (json.IndexOf("Bucket with given name already exists", StringComparison.InvariantCultureIgnoreCase) >= 0)
                    {
                        throw new BucketExistsException(settings.Name);
                    }
                }

                result.EnsureSuccessStatusCode();
            }
            catch (BucketExistsException)
            {
                _logger.LogError("Failed to create bucket with name {settings.Name} because it already exists",
                                 _redactor.MetaData(settings.Name));
                throw;
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Failed to create bucket with name {settings.Name} - {uri}",
                                 _redactor.MetaData(settings.Name), _redactor.SystemData(uri));
                throw;
            }
        }
        public async Task <DesignDocument> GetDesignDocumentAsync(string designDocName, DesignDocumentNamespace @namespace, GetDesignDocumentOptions?options = null)
        {
            options ??= GetDesignDocumentOptions.Default;
            var uri = GetUri(designDocName, @namespace);

            _logger.LogInformation("Attempting to get design document {_bucketName}/{designDocName} - {uri}",
                                   _redactor.MetaData(_bucketName), _redactor.MetaData(designDocName), _redactor.SystemData(uri));

            try
            {
                using var httpClient = _httpClientFactory.Create();

                var result = await httpClient.GetAsync(uri, options.TokenValue).ConfigureAwait(false);

                if (result.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new DesignDocumentNotFoundException(_bucketName, designDocName);
                }

                result.EnsureSuccessStatusCode();

                var content = await result.Content.ReadAsStringAsync().ConfigureAwait(false);

                var designDocument = JsonConvert.DeserializeObject <DesignDocument>(content);
                designDocument !.Name = designDocName;

                return(designDocument);
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Failed to get design document {_bucketName}/{designDocName} - {uri}",
                                 _redactor.MetaData(_bucketName), _redactor.MetaData(designDocName), _redactor.SystemData(uri));
                throw;
            }
        }
Пример #7
0
        public async Task CreateBucketAsync(BucketSettings settings, CreateBucketOptions?options = null)
        {
            options ??= new CreateBucketOptions();
            var uri = GetUri();

            _logger.LogInformation("Attempting to create bucket with name {settings.Name} - {uri}",
                                   _redactor.MetaData(settings.Name), _redactor.SystemData(uri));

            try
            {
                // create bucket
                var content = new FormUrlEncodedContent(settings !.ToFormValues());
                using var httpClient = _httpClientFactory.Create();
                var result = await httpClient.PostAsync(uri, content, options.TokenValue).ConfigureAwait(false);

                if (result.IsSuccessStatusCode)
                {
                    return;
                }

                var body = await result.Content.ReadAsStringAsync().ConfigureAwait(false);

                var ctx = new ManagementErrorContext
                {
                    HttpStatus = result.StatusCode,
                    Message    = body,
                    Statement  = uri.ToString()
                };

                //Throw specific exception if a rate limiting exception is thrown.
                result.ThrowIfRateLimitingError(body, ctx);



                if (result.StatusCode == HttpStatusCode.BadRequest)
                {
                    if (body.IndexOf("Bucket with given name already exists",
                                     StringComparison.InvariantCultureIgnoreCase) >= 0)
                    {
                        throw new BucketExistsException(settings.Name);
                    }
                }

                //Throw any other error cases
                result.ThrowOnError(ctx);
            }
            catch (BucketExistsException)
            {
                _logger.LogError("Failed to create bucket with name {settings.Name} because it already exists",
                                 _redactor.MetaData(settings.Name));
                throw;
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Failed to create bucket with name {settings.Name} - {uri}",
                                 _redactor.MetaData(settings.Name), _redactor.SystemData(uri));
                throw;
            }
        }
        public async Task CreateDataverseAsync(string dataverseName, CreateAnalyticsDataverseOptions?options = null)
        {
            options ??= new CreateAnalyticsDataverseOptions();

            _logger.LogInformation("Attempting to create dataverse with name {dataverseName}",
                                   _redactor.MetaData(dataverseName));

            try
            {
                dataverseName = UncompoundName(dataverseName);
                var ignoreStr = options.IgnoreIfExistsValue ? " IF NOT EXISTS" : string.Empty;
                var statement = $"CREATE DATAVERSE {dataverseName}{ignoreStr}";

                await _client
                .QueryAsync <dynamic>(statement, options.CreateAnalyticsOptions())
                .ConfigureAwait(false);
            }
            catch (DataverseExistsException)
            {
                _logger.LogError("Failed to create dataverse with name {dataverseName} because it already exists.",
                                 _redactor.MetaData(dataverseName));
                throw;
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Failed to create dataverse with name {dataverseName}",
                                 _redactor.MetaData(dataverseName));
                throw;
            }
        }