From 450c3b30f9fce1abf3a4eb3e25bc70e99cb254b4 Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Wed, 17 Apr 2019 13:37:55 +1000 Subject: [PATCH 01/10] Invalidate API key --- .../ApiGenerator/ApiGenerator.cs | 1 - .../security.invalidate_api_key.patch.json | 8 ++ .../RequestParameters.Generated.cs | 5 ++ .../ElasticLowLevelClient.Generated.cs | 10 +++ .../IElasticLowLevelClient.Generated.cs | 8 ++ .../ElasticClient-SecurityInvalidateApiKey.cs | 60 +++++++++++++++ .../SecurityInvalidateApiKeyRequest.cs | 41 ++++++++++ .../SecurityInvalidateApiKeyResponse.cs | 37 +++++++++ src/Nest/_Generated/_Descriptors.generated.cs | 8 ++ .../_Generated/_LowLevelDispatch.generated.cs | 20 +++++ src/Nest/_Generated/_Requests.generated.cs | 12 +++ .../SecurityInvalidateApiKeyApiTests.cs | 75 +++++++++++++++++++ .../SecurityInvalidateApiKeyUrlTests.cs | 16 ++++ 13 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json create mode 100644 src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs create mode 100644 src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs create mode 100644 src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs create mode 100644 src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs create mode 100644 src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs diff --git a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs index 52abfbc19ef..978dd219ca4 100644 --- a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs +++ b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs @@ -37,7 +37,6 @@ public class ApiGenerator "xpack.ml.set_upgrade_mode.json", "security.create_api_key.json", "security.get_api_key.json", - "security.invalidate_api_key.json", "xpack.monitoring.bulk.json", // these API's are not ready for primetime yet diff --git a/src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json b/src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json new file mode 100644 index 00000000000..311767697fd --- /dev/null +++ b/src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json @@ -0,0 +1,8 @@ +{ + "security.invalidate_api_key": { + "url": { + "path": "/_xpack/security/oauth2/token", + "paths": [ "/_xpack/security/oauth2/token" ] + } + } +} diff --git a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs index e642a18c064..6cba446cf03 100644 --- a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs +++ b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs @@ -2718,6 +2718,11 @@ public partial class StopRollupJobRequestParameters : RequestParametersBlock for (at maximum) the specified duration while waiting for the job to stop. Defaults to 30s. public TimeSpan Timeout { get => Q("timeout"); set => Q("timeout", value); } } + ///Request options for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
+ public partial class SecurityInvalidateApiKeyRequestParameters : RequestParameters + { + public override HttpMethod DefaultHttpMethod => HttpMethod.DELETE; + } ///Request options for XpackSecurityAuthenticate
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html
public partial class AuthenticateRequestParameters : RequestParameters { diff --git a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs index a83cddfc1c1..08bb6a8ffa7 100644 --- a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs @@ -4052,6 +4052,16 @@ public TResponse XpackRollupStopJob(string id, StopRollupJobRequestPa ///A func that allows you to describe the querystring parameters & request specific connection settings. public Task XpackRollupStopJobAsync(string id, StopRollupJobRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(POST, Url($"_xpack/rollup/job/{id.NotNull("id")}/_stop"), ctx, null, _params(requestParameters)); + ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///The api key request to invalidate API key(s) + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public TResponse SecurityInvalidateApiKey(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(DELETE, Url($"_xpack/security/oauth2/token"), body, _params(requestParameters)); + ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///The api key request to invalidate API key(s) + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public Task SecurityInvalidateApiKeyAsync(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(DELETE, Url($"_xpack/security/oauth2/token"), ctx, body, _params(requestParameters)); ///GET on /_xpack/security/_authenticate https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html ///A func that allows you to describe the querystring parameters & request specific connection settings. public TResponse XpackSecurityAuthenticate(AuthenticateRequestParameters requestParameters = null) diff --git a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs index bb6e6d7b943..df91b8627ea 100644 --- a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs @@ -3284,6 +3284,14 @@ public partial interface IElasticLowLevelClient ///The ID of the job to stop ///A func that allows you to describe the querystring parameters & request specific connection settings. Task XpackRollupStopJobAsync(string id, StopRollupJobRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///The api key request to invalidate API key(s) + ///A func that allows you to describe the querystring parameters & request specific connection settings. + TResponse SecurityInvalidateApiKey(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///The api key request to invalidate API key(s) + ///A func that allows you to describe the querystring parameters & request specific connection settings. + Task SecurityInvalidateApiKeyAsync(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); ///GET on /_xpack/security/_authenticate https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html ///A func that allows you to describe the querystring parameters & request specific connection settings. TResponse XpackSecurityAuthenticate(AuthenticateRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs b/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs new file mode 100644 index 00000000000..5809dc0de49 --- /dev/null +++ b/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(Func selector = null); + + /// + ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(ISecurityInvalidateApiKeyRequest request); + + /// + Task SecurityInvalidateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task SecurityInvalidateApiKeyAsync(ISecurityInvalidateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(Func selector = null + ) => + SecurityInvalidateApiKey(selector.InvokeOrDefault(new SecurityInvalidateApiKeyDescriptor())); + + /// + public ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(ISecurityInvalidateApiKeyRequest request) => + Dispatcher.Dispatch( + request, + LowLevelDispatch.SecurityInvalidateApiKeyDispatch + ); + + /// + public Task SecurityInvalidateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => + SecurityInvalidateApiKeyAsync(selector.InvokeOrDefault(new SecurityInvalidateApiKeyDescriptor()), cancellationToken); + + /// + public Task SecurityInvalidateApiKeyAsync(ISecurityInvalidateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => + Dispatcher + .DispatchAsync( + request, + cancellationToken, + LowLevelDispatch.SecurityInvalidateApiKeyDispatchAsync + ); + } +} diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs new file mode 100644 index 00000000000..6beb3b91204 --- /dev/null +++ b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; + +namespace Nest +{ + public partial interface ISecurityInvalidateApiKeyRequest + { + [JsonProperty("token")] + string Token { get; set; } + + [JsonProperty("refresh_token")] + string RefreshToken { get; set; } + + [JsonProperty("realm_name")] + string RealmName { get; set; } + + [JsonProperty("username")] + string Username { get; set; } + } + + public partial class SecurityInvalidateApiKeyRequest + { + public string Token { get; set; } + public string RefreshToken { get; set; } + public string RealmName { get; set; } + public string Username { get; set; } + } + + [DescriptorFor("XpackSecuritySecurityInvalidateApiKey")] + public partial class SecurityInvalidateApiKeyDescriptor + { + string ISecurityInvalidateApiKeyRequest.Token { get; set; } + string ISecurityInvalidateApiKeyRequest.RefreshToken { get; set; } + string ISecurityInvalidateApiKeyRequest.RealmName { get; set; } + string ISecurityInvalidateApiKeyRequest.Username { get; set; } + + public SecurityInvalidateApiKeyDescriptor Token(string token) => Assign(token, (a, v) => a.Token = v); + public SecurityInvalidateApiKeyDescriptor RefreshToken(string refreshToken) => Assign(refreshToken, (a, v) => a.RefreshToken = v); + public SecurityInvalidateApiKeyDescriptor RealmName(string realmName) => Assign(realmName, (a, v) => a.RealmName = v); + public SecurityInvalidateApiKeyDescriptor Username(string username) => Assign(username, (a, v) => a.Username = v); + } +} diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs new file mode 100644 index 00000000000..91d1915eb6a --- /dev/null +++ b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using Elasticsearch.Net; +using Newtonsoft.Json; + +namespace Nest +{ + public interface ISecurityInvalidateApiKeyResponse : IResponse + { + [JsonProperty("created")] + bool Created { get; } + + [JsonProperty("invalidated_tokens")] + int InvalidatedTokens { get; } + + [JsonProperty("previously_invalidated_tokens")] + int PreviousInvalidatedTokens { get; } + + [JsonProperty("error_count")] + int? ErrorCount { get; } + + [JsonProperty("error_details")] + IReadOnlyCollection ErrorDetails { get; } + } + + public class SecurityInvalidateApiKeyResponse : ResponseBase, ISecurityInvalidateApiKeyResponse + { + public bool Created { get; internal set; } + + public int InvalidatedTokens { get; internal set; } + + public int PreviousInvalidatedTokens { get; internal set; } + + public int? ErrorCount { get; internal set; } + + public IReadOnlyCollection ErrorDetails { get; internal set; } = EmptyReadOnly.Collection; + } +} diff --git a/src/Nest/_Generated/_Descriptors.generated.cs b/src/Nest/_Generated/_Descriptors.generated.cs index 6f2307e0e6a..7ce8668eab8 100644 --- a/src/Nest/_Generated/_Descriptors.generated.cs +++ b/src/Nest/_Generated/_Descriptors.generated.cs @@ -4962,6 +4962,14 @@ public StopRollupJobDescriptor(Id id) : base(r=>r.Required("id", id)){} ///Block for (at maximum) the specified duration while waiting for the job to stop. Defaults to 30s. public StopRollupJobDescriptor Timeout(Time timeout) => Qs("timeout", timeout); } + ///descriptor for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
+ public partial class SecurityInvalidateApiKeyDescriptor : RequestDescriptorBase, ISecurityInvalidateApiKeyRequest + { + // values part of the url path + + // Request parameters + + } ///descriptor for XpackSecurityAuthenticate
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html
public partial class AuthenticateDescriptor : RequestDescriptorBase, IAuthenticateRequest { diff --git a/src/Nest/_Generated/_LowLevelDispatch.generated.cs b/src/Nest/_Generated/_LowLevelDispatch.generated.cs index 47a3d4a3c90..104a1cf7496 100644 --- a/src/Nest/_Generated/_LowLevelDispatch.generated.cs +++ b/src/Nest/_Generated/_LowLevelDispatch.generated.cs @@ -4642,6 +4642,26 @@ internal partial class LowLevelDispatch throw InvalidDispatch("XpackRollupStopJob", p, new [] { POST }, "/_xpack/rollup/job/{id}/_stop"); } + internal TResponse SecurityInvalidateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case DELETE: + return _lowLevel.SecurityInvalidateApiKey(body,p.RequestParameters); + } + throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_xpack/security/oauth2/token"); + } + + internal Task SecurityInvalidateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case DELETE: + return _lowLevel.SecurityInvalidateApiKeyAsync(body,p.RequestParameters,ct); + } + throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_xpack/security/oauth2/token"); + } + internal TResponse XpackSecurityAuthenticateDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) diff --git a/src/Nest/_Generated/_Requests.generated.cs b/src/Nest/_Generated/_Requests.generated.cs index ae618a6f728..b1ebe07f041 100644 --- a/src/Nest/_Generated/_Requests.generated.cs +++ b/src/Nest/_Generated/_Requests.generated.cs @@ -5663,6 +5663,18 @@ public SearchTemplateRequest(Indices index, Types type) : base(r=>r.Optional("in public bool? TotalHitsAsInteger { get => Q("rest_total_hits_as_int"); set => Q("rest_total_hits_as_int", value); } } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface ISecurityInvalidateApiKeyRequest : IRequest + { + } + ///Request parameters for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
+ public partial class SecurityInvalidateApiKeyRequest : PlainRequestBase, ISecurityInvalidateApiKeyRequest + { + protected ISecurityInvalidateApiKeyRequest Self => this; + // values part of the url path + + // Request parameters + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface ISegmentsRequest : IRequest { Indices Index { get; } diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs new file mode 100644 index 00000000000..2c200e61119 --- /dev/null +++ b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs @@ -0,0 +1,75 @@ +using System; +using Elastic.Xunit.XunitPlumbing; +using Elasticsearch.Net; +using FluentAssertions; +using Nest; +using Tests.Core.Extensions; +using Tests.Core.ManagedElasticsearch.Clusters; +using Tests.Framework; +using Tests.Framework.Integration; +using static Elastic.Managed.Ephemeral.ClusterAuthentication; + +namespace Tests.XPack.Security.User.SecurityInvalidateApiKey +{ + [SkipVersion("<6.7.0", "API has been implemented against Elasticsearch 6.7.0 request and response format.")] + public class SecurityInvalidateApiKeyApiTests + : ApiIntegrationTestBase + { + private const string AccessTokenValueKey = "accesstoken"; + + protected virtual string CurrentAccessToken => RanIntegrationSetup ? ExtendedValue(AccessTokenValueKey) : "foo"; + + public SecurityInvalidateApiKeyApiTests(XPackCluster cluster, EndpointUsage usage) : base(cluster, usage) { } + + protected override void OnBeforeCall(IElasticClient client) + { + var r = client.GetUserAccessToken(Admin.Username, Admin.Password, f => f.Scope("FULL").GrantType(AccessTokenGrantType.Password)); + r.ShouldBeValid(); + ExtendedValue(AccessTokenValueKey, r.AccessToken); + } + + protected override bool ExpectIsValid => true; + + protected override object ExpectJson => new + { + token = CurrentAccessToken + }; + + protected override int ExpectStatusCode => 200; + + protected override Func Fluent => d => d + .Token(CurrentAccessToken) + ; + + protected override HttpMethod HttpMethod => HttpMethod.DELETE; + + protected override SecurityInvalidateApiKeyRequest Initializer => new SecurityInvalidateApiKeyRequest + { + Token = CurrentAccessToken + }; + + protected override bool SupportsDeserialization => false; + + protected override string UrlPath => $"/_xpack/security/oauth2/token"; + + protected override LazyResponses ClientUsage() => Calls( + (client, f) => client.SecurityInvalidateApiKey(f), + (client, f) => client.SecurityInvalidateApiKeyAsync(f), + (client, r) => client.SecurityInvalidateApiKey(r), + (client, r) => client.SecurityInvalidateApiKeyAsync(r) + ); + + protected override SecurityInvalidateApiKeyDescriptor NewDescriptor() => new SecurityInvalidateApiKeyDescriptor(); + + protected override void ExpectResponse(ISecurityInvalidateApiKeyResponse response) + { + response.ShouldBeValid(); + response.Created.Should().BeTrue(); + response.ErrorCount.Should().Be(0); + response.ErrorDetails.Should().BeEmpty(); + response.InvalidatedTokens.Should().Be(1); + response.PreviousInvalidatedTokens.Should().Be(0); + } + } +} diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs new file mode 100644 index 00000000000..610dabdaedb --- /dev/null +++ b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Elastic.Xunit.XunitPlumbing; +using Nest; +using Tests.Framework; + +namespace Tests.XPack.Security.User.SecurityInvalidateApiKey +{ + public class SecurityInvalidateApiKeyUrlTests : UrlTestsBase + { + [U] public override async Task Urls() => await UrlTester.DELETE("/_xpack/security/oauth2/token") + .Fluent(c => c.SecurityInvalidateApiKey()) + .Request(c => c.SecurityInvalidateApiKey(new SecurityInvalidateApiKeyRequest())) + .FluentAsync(c => c.SecurityInvalidateApiKeyAsync()) + .RequestAsync(c => c.SecurityInvalidateApiKeyAsync(new SecurityInvalidateApiKeyRequest())); + } +} From 02e7b5eee99cab708259bcbe971f51ab671fd37a Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Wed, 17 Apr 2019 16:54:57 +1000 Subject: [PATCH 02/10] Implement Create, Get and Invalidate API APIs --- .../ApiGenerator/ApiGenerator.cs | 2 - .../security.invalidate_api_key.patch.json | 8 --- .../RequestParameters.Generated.cs | 23 +++++++ .../ElasticLowLevelClient.Generated.cs | 36 ++++++++-- .../IElasticLowLevelClient.Generated.cs | 26 ++++++- .../ElasticClient-SecurityCreateApiKey.cs | 62 +++++++++++++++++ .../SecurityCreateApiKeyRequest.cs | 62 +++++++++++++++++ .../SecurityCreateApiKeyResponse.cs | 68 +++++++++++++++++++ .../ElasticClient-SecurityGetApiKey.cs | 62 +++++++++++++++++ .../SecurityGetApiKeyRequest.cs | 9 +++ .../SecurityGetApiKeyResponse.cs | 48 +++++++++++++ .../ElasticClient-SecurityInvalidateApiKey.cs | 19 +++--- .../SecurityInvalidateApiKeyRequest.cs | 56 ++++++++++++--- .../SecurityInvalidateApiKeyResponse.cs | 39 +++++++---- src/Nest/_Generated/_Descriptors.generated.cs | 30 ++++++++ .../_Generated/_LowLevelDispatch.generated.cs | 48 ++++++++++++- src/Nest/_Generated/_Requests.generated.cs | 39 +++++++++++ .../SecurityInvalidateApiKeyApiTests.cs | 2 +- .../SecurityInvalidateApiKeyUrlTests.cs | 2 +- 19 files changed, 587 insertions(+), 54 deletions(-) delete mode 100644 src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json create mode 100644 src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs create mode 100644 src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs create mode 100644 src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs create mode 100644 src/Nest/XPack/Security/SecurityGetApiKey/ElasticClient-SecurityGetApiKey.cs create mode 100644 src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyRequest.cs create mode 100644 src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs diff --git a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs index 978dd219ca4..7310d1336be 100644 --- a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs +++ b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs @@ -35,8 +35,6 @@ public class ApiGenerator "indices.freeze.json", "indices.unfreeze.json", "xpack.ml.set_upgrade_mode.json", - "security.create_api_key.json", - "security.get_api_key.json", "xpack.monitoring.bulk.json", // these API's are not ready for primetime yet diff --git a/src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json b/src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json deleted file mode 100644 index 311767697fd..00000000000 --- a/src/CodeGeneration/ApiGenerator/RestSpecification/XPack/Security/security.invalidate_api_key.patch.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "security.invalidate_api_key": { - "url": { - "path": "/_xpack/security/oauth2/token", - "paths": [ "/_xpack/security/oauth2/token" ] - } - } -} diff --git a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs index 6cba446cf03..4c5487a8c6c 100644 --- a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs +++ b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs @@ -2718,6 +2718,29 @@ public partial class StopRollupJobRequestParameters : RequestParametersBlock for (at maximum) the specified duration while waiting for the job to stop. Defaults to 30s. public TimeSpan Timeout { get => Q("timeout"); set => Q("timeout", value); } } + ///Request options for SecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
+ public partial class SecurityCreateApiKeyRequestParameters : RequestParameters + { + public override HttpMethod DefaultHttpMethod => HttpMethod.PUT; + /// + /// If `true` (the default) then refresh the affected shards to make this operation visible to search, if `wait_for` then wait for a refresh + /// to make this operation visible to search, if `false` then do nothing with refreshes. + /// + public Refresh? Refresh { get => Q("refresh"); set => Q("refresh", value); } + } + ///Request options for SecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
+ public partial class SecurityGetApiKeyRequestParameters : RequestParameters + { + public override HttpMethod DefaultHttpMethod => HttpMethod.GET; + ///API key id of the API key to be retrieved + public string Id { get => Q("id"); set => Q("id", value); } + ///API key name of the API key to be retrieved + public string Name { get => Q("name"); set => Q("name", value); } + ///user name of the user who created this API key to be retrieved + public string Username { get => Q("username"); set => Q("username", value); } + ///realm name of the user who created this API key to be retrieved + public string RealmName { get => Q("realm_name"); set => Q("realm_name", value); } + } ///Request options for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
public partial class SecurityInvalidateApiKeyRequestParameters : RequestParameters { diff --git a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs index 08bb6a8ffa7..e2fc4b1f09c 100644 --- a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs @@ -4052,16 +4052,44 @@ public TResponse XpackRollupStopJob(string id, StopRollupJobRequestPa ///A func that allows you to describe the querystring parameters & request specific connection settings. public Task XpackRollupStopJobAsync(string id, StopRollupJobRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(POST, Url($"_xpack/rollup/job/{id.NotNull("id")}/_stop"), ctx, null, _params(requestParameters)); - ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public TResponse SecurityCreateApiKey(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(PUT, Url($"_security/api_key"), body, _params(requestParameters)); + ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public Task SecurityCreateApiKeyAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(PUT, Url($"_security/api_key"), ctx, body, _params(requestParameters)); + ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public TResponse SecurityCreateApiKeyPost(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(POST, Url($"_security/api_key"), body, _params(requestParameters)); + ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public Task SecurityCreateApiKeyPostAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(POST, Url($"_security/api_key"), ctx, body, _params(requestParameters)); + ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public TResponse SecurityGetApiKey(SecurityGetApiKeyRequestParameters requestParameters = null) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(GET, Url($"_security/api_key"), null, _params(requestParameters)); + ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public Task SecurityGetApiKeyAsync(SecurityGetApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(GET, Url($"_security/api_key"), ctx, null, _params(requestParameters)); + ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. public TResponse SecurityInvalidateApiKey(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null) - where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(DELETE, Url($"_xpack/security/oauth2/token"), body, _params(requestParameters)); - ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(DELETE, Url($"_security/api_key"), body, _params(requestParameters)); + ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. public Task SecurityInvalidateApiKeyAsync(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) - where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(DELETE, Url($"_xpack/security/oauth2/token"), ctx, body, _params(requestParameters)); + where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(DELETE, Url($"_security/api_key"), ctx, body, _params(requestParameters)); ///GET on /_xpack/security/_authenticate https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html ///A func that allows you to describe the querystring parameters & request specific connection settings. public TResponse XpackSecurityAuthenticate(AuthenticateRequestParameters requestParameters = null) diff --git a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs index df91b8627ea..f4589786062 100644 --- a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs @@ -3284,11 +3284,33 @@ public partial interface IElasticLowLevelClient ///The ID of the job to stop ///A func that allows you to describe the querystring parameters & request specific connection settings. Task XpackRollupStopJobAsync(string id, StopRollupJobRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); - ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + TResponse SecurityCreateApiKey(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + Task SecurityCreateApiKeyAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + TResponse SecurityCreateApiKeyPost(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html + ///The api key request to create an API key + ///A func that allows you to describe the querystring parameters & request specific connection settings. + Task SecurityCreateApiKeyPostAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html + ///A func that allows you to describe the querystring parameters & request specific connection settings. + TResponse SecurityGetApiKey(SecurityGetApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html + ///A func that allows you to describe the querystring parameters & request specific connection settings. + Task SecurityGetApiKeyAsync(SecurityGetApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. TResponse SecurityInvalidateApiKey(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); - ///DELETE on /_xpack/security/oauth2/token https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html + ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. Task SecurityInvalidateApiKeyAsync(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); diff --git a/src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs b/src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs new file mode 100644 index 00000000000..53234bce850 --- /dev/null +++ b/src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + /// Creates an API key for access without requiring basic authentication. + /// + ISecurityCreateApiKeyResponse SecurityCreateApiKey(Func selector = null); + + /// + ISecurityCreateApiKeyResponse SecurityCreateApiKey(ISecurityCreateApiKeyRequest request); + + /// + Task SecurityCreateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task SecurityCreateApiKeyAsync(ISecurityCreateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public ISecurityCreateApiKeyResponse SecurityCreateApiKey(Func selector = null + ) => + SecurityCreateApiKey(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor())); + + /// + public ISecurityCreateApiKeyResponse SecurityCreateApiKey(ISecurityCreateApiKeyRequest request) => + Dispatcher.Dispatch( + request, + LowLevelDispatch.SecurityCreateApiKeyDispatch + ); + + /// + public Task SecurityCreateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => + SecurityCreateApiKeyAsync(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor()), cancellationToken); + + /// + public Task SecurityCreateApiKeyAsync(ISecurityCreateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => + Dispatcher + .DispatchAsync( + request, + cancellationToken, + LowLevelDispatch.SecurityCreateApiKeyDispatchAsync + ); + } +} diff --git a/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs b/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs new file mode 100644 index 00000000000..66bd35915f1 --- /dev/null +++ b/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs @@ -0,0 +1,62 @@ +using Newtonsoft.Json; + +namespace Nest +{ + public partial interface ISecurityCreateApiKeyRequest + { + /// + /// Name for this API key + /// + [JsonProperty("name")] + string Name { get; set; } + + /// + /// Optional expiration for the API key being generated. + /// If expiration is not provided then the API keys do not expire. + /// + [JsonProperty("expiration")] + Time Expiration { get; set; } + + /// + /// Optional role descriptors for this API key, if not provided then permissions of authenticated user are applied. + /// + [JsonProperty("role_descriptors")] + RoleDescriptors RoleDescriptors { get; set; } + } + + public class RoleDescriptors + { + + } + + public partial class SecurityCreateApiKeyRequest + { + /// + public string Name { get; set; } + + /// + public Time Expiration { get; set; } + + /// + public RoleDescriptors RoleDescriptors { get; set; } + } + + [DescriptorFor("SecurityCreateApiKey")] + public partial class SecurityCreateApiKeyDescriptor + { + /// + string ISecurityCreateApiKeyRequest.Name { get; set; } + + /// + Time ISecurityCreateApiKeyRequest.Expiration { get; set; } + + /// + RoleDescriptors ISecurityCreateApiKeyRequest.RoleDescriptors { get; set; } + + /// + public SecurityCreateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); + + /// + public SecurityCreateApiKeyDescriptor Expiration(Time expiration) => Assign(expiration, (a, v) => a.Expiration = v); + } +} diff --git a/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs b/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs new file mode 100644 index 00000000000..730a3f7e6b6 --- /dev/null +++ b/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Nest +{ + public interface ISecurityCreateApiKeyResponse : IResponse + { + /// + /// The list of API keys that were retrieved for this request. + /// + [JsonProperty("api_keys")] + IReadOnlyCollection ApiKeys { get; } + } + + public class ApiKeys + { + /// + /// Id for the API key + /// + [JsonProperty("id")] + public string Id { get; set; } + + /// + /// Name of the API key + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// Creation time for the API key + /// + [JsonProperty("creation")] + [JsonConverter(typeof(EpochMillisecondsDateTimeJsonConverter))] + public DateTimeOffset Creation { get; set; } + + /// + /// Optional expiration time for the API key in milliseconds + /// + [JsonProperty("expiration")] + [JsonConverter(typeof(EpochMillisecondsDateTimeJsonConverter))] + public DateTimeOffset? Expiration { get; set; } + + /// + /// Invalidation status for the API key. If the key has been invalidated, it has a value of true. Otherwise, it is false. + /// + [JsonProperty("invalidated")] + public bool Invalidated { get; set; } + + /// + /// Principal for which this API key was created + /// + [JsonProperty("username")] + public string Username { get; set; } + + /// + /// Realm name of the principal for which this API key was created + /// + [JsonProperty("realm")] + public string Realm { get; set; } + } + + public class SecurityCreateApiKeyResponse : ResponseBase, ISecurityCreateApiKeyResponse + { + /// + public IReadOnlyCollection ApiKeys { get; internal set; } = EmptyReadOnly.Collection; + } +} diff --git a/src/Nest/XPack/Security/SecurityGetApiKey/ElasticClient-SecurityGetApiKey.cs b/src/Nest/XPack/Security/SecurityGetApiKey/ElasticClient-SecurityGetApiKey.cs new file mode 100644 index 00000000000..834f363f77a --- /dev/null +++ b/src/Nest/XPack/Security/SecurityGetApiKey/ElasticClient-SecurityGetApiKey.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + /// Retrieves information for one or more API keys. + /// + ISecurityGetApiKeyResponse SecurityGetApiKey(Func selector = null); + + /// + ISecurityGetApiKeyResponse SecurityGetApiKey(ISecurityGetApiKeyRequest request); + + /// + Task SecurityGetApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task SecurityGetApiKeyAsync(ISecurityGetApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public ISecurityGetApiKeyResponse SecurityGetApiKey(Func selector = null + ) => + SecurityGetApiKey(selector.InvokeOrDefault(new SecurityGetApiKeyDescriptor())); + + /// + public ISecurityGetApiKeyResponse SecurityGetApiKey(ISecurityGetApiKeyRequest request) => + Dispatcher.Dispatch( + request, + (p, d) => LowLevelDispatch.SecurityGetApiKeyDispatch(p) + ); + + /// + public Task SecurityGetApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => + SecurityGetApiKeyAsync(selector.InvokeOrDefault(new SecurityGetApiKeyDescriptor()), cancellationToken); + + /// + public Task SecurityGetApiKeyAsync(ISecurityGetApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => + Dispatcher + .DispatchAsync( + request, + cancellationToken, + (p, d, c) => LowLevelDispatch.SecurityGetApiKeyDispatchAsync(p, c) + ); + } +} diff --git a/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyRequest.cs b/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyRequest.cs new file mode 100644 index 00000000000..519a5172b1d --- /dev/null +++ b/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyRequest.cs @@ -0,0 +1,9 @@ +namespace Nest +{ + public partial interface ISecurityGetApiKeyRequest { } + + public partial class SecurityGetApiKeyRequest { } + + [DescriptorFor("SecurityGetApiKey")] + public partial class SecurityGetApiKeyDescriptor { } +} diff --git a/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs b/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs new file mode 100644 index 00000000000..6aaeaf1a1df --- /dev/null +++ b/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs @@ -0,0 +1,48 @@ +using System; +using Newtonsoft.Json; + +namespace Nest +{ + public interface ISecurityGetApiKeyResponse : IResponse + { + /// + /// Unique id for this API key + /// + [JsonProperty("id")] + string Id { get; } + + /// + /// Name for this API key + /// + [JsonProperty("name")] + string Name { get; } + + /// + /// Optional expiration for this API key + /// + [JsonProperty("expiration")] + [JsonConverter(typeof(EpochMillisecondsDateTimeJsonConverter))] + DateTimeOffset? Expiration { get; } + + /// + /// Generated API key + /// + [JsonProperty("api_key")] + string ApiKey { get; } + } + + public class SecurityGetApiKeyResponse : ResponseBase, ISecurityGetApiKeyResponse + { + /// + public string Id { get; internal set; } + + /// + public string Name { get; internal set; } + + /// + public DateTimeOffset? Expiration { get; internal set; } + + /// + public string ApiKey { get; internal set; } + } +} diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs b/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs index 5809dc0de49..11e449af30e 100644 --- a/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs +++ b/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs @@ -7,19 +7,21 @@ namespace Nest { public partial interface IElasticClient { - /// + /// + /// Invalidates one or more API keys. + /// ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(Func selector = null); - /// + /// ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(ISecurityInvalidateApiKeyRequest request); - /// + /// Task SecurityInvalidateApiKeyAsync( Func selector = null, CancellationToken cancellationToken = default(CancellationToken) ); - /// + /// Task SecurityInvalidateApiKeyAsync(ISecurityInvalidateApiKeyRequest request, CancellationToken cancellationToken = default(CancellationToken) ); @@ -27,26 +29,25 @@ Task SecurityInvalidateApiKeyAsync(ISecurityI public partial class ElasticClient { - /// + /// public ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(Func selector = null ) => SecurityInvalidateApiKey(selector.InvokeOrDefault(new SecurityInvalidateApiKeyDescriptor())); - /// + /// public ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(ISecurityInvalidateApiKeyRequest request) => Dispatcher.Dispatch( request, LowLevelDispatch.SecurityInvalidateApiKeyDispatch ); - /// + /// public Task SecurityInvalidateApiKeyAsync( Func selector = null, CancellationToken cancellationToken = default(CancellationToken) ) => SecurityInvalidateApiKeyAsync(selector.InvokeOrDefault(new SecurityInvalidateApiKeyDescriptor()), cancellationToken); - - /// + /// public Task SecurityInvalidateApiKeyAsync(ISecurityInvalidateApiKeyRequest request, CancellationToken cancellationToken = default(CancellationToken) ) => diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs index 6beb3b91204..bf0724ea903 100644 --- a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs +++ b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs @@ -4,38 +4,72 @@ namespace Nest { public partial interface ISecurityInvalidateApiKeyRequest { - [JsonProperty("token")] - string Token { get; set; } + /// + /// An API key id. This parameter cannot be used with any of Name, RealmName or Username are used. + /// + [JsonProperty("id")] + string Id { get; set; } - [JsonProperty("refresh_token")] - string RefreshToken { get; set; } + /// + /// An API key name. This parameter cannot be used with any of Id, RealmName or Username are used. + /// + [JsonProperty("name")] + string Name { get; set; } + /// + /// The name of an authentication realm. This parameter cannot be used with either Id or Name. + /// [JsonProperty("realm_name")] string RealmName { get; set; } + /// + /// The username of a user. This parameter cannot be used with either Id or Name. + /// [JsonProperty("username")] string Username { get; set; } } public partial class SecurityInvalidateApiKeyRequest { - public string Token { get; set; } - public string RefreshToken { get; set; } + /// + public string Id { get; set; } + + /// + public string Name { get; set; } + + /// public string RealmName { get; set; } + + /// public string Username { get; set; } } - [DescriptorFor("XpackSecuritySecurityInvalidateApiKey")] + [DescriptorFor("SecurityInvalidateApiKey")] public partial class SecurityInvalidateApiKeyDescriptor { - string ISecurityInvalidateApiKeyRequest.Token { get; set; } - string ISecurityInvalidateApiKeyRequest.RefreshToken { get; set; } + + /// + string ISecurityInvalidateApiKeyRequest.Id { get; set; } + + /// + string ISecurityInvalidateApiKeyRequest.Name { get; set; } + + /// string ISecurityInvalidateApiKeyRequest.RealmName { get; set; } + + /// string ISecurityInvalidateApiKeyRequest.Username { get; set; } - public SecurityInvalidateApiKeyDescriptor Token(string token) => Assign(token, (a, v) => a.Token = v); - public SecurityInvalidateApiKeyDescriptor RefreshToken(string refreshToken) => Assign(refreshToken, (a, v) => a.RefreshToken = v); + /// + public SecurityInvalidateApiKeyDescriptor Id(string id) => Assign(id, (a, v) => a.Id = v); + + /// + public SecurityInvalidateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); + + /// public SecurityInvalidateApiKeyDescriptor RealmName(string realmName) => Assign(realmName, (a, v) => a.RealmName = v); + + /// public SecurityInvalidateApiKeyDescriptor Username(string username) => Assign(username, (a, v) => a.Username = v); } } diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs index 91d1915eb6a..913bdcb3ff5 100644 --- a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs +++ b/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs @@ -6,32 +6,43 @@ namespace Nest { public interface ISecurityInvalidateApiKeyResponse : IResponse { - [JsonProperty("created")] - bool Created { get; } - - [JsonProperty("invalidated_tokens")] - int InvalidatedTokens { get; } - - [JsonProperty("previously_invalidated_tokens")] - int PreviousInvalidatedTokens { get; } - + /// + /// The ids of the API keys that were invalidated as part of this request. + /// + [JsonProperty("invalidated_api_keys")] + IReadOnlyCollection InvalidatedApiKeys { get; } + + /// + /// The ids of the API keys that were already invalidated. + /// + [JsonProperty("previously_invalidated_api_keys")] + IReadOnlyCollection PreviouslyInvalidatedApiKeys { get; } + + /// + /// The number of errors that were encountered when invalidating the API keys. + /// [JsonProperty("error_count")] int? ErrorCount { get; } + /// + /// Details about these errors. This field is not present in the response when there are no errors. + /// [JsonProperty("error_details")] IReadOnlyCollection ErrorDetails { get; } } public class SecurityInvalidateApiKeyResponse : ResponseBase, ISecurityInvalidateApiKeyResponse { - public bool Created { get; internal set; } - - public int InvalidatedTokens { get; internal set; } + /// + public IReadOnlyCollection InvalidatedApiKeys { get; internal set; } = EmptyReadOnly.Collection; - public int PreviousInvalidatedTokens { get; internal set; } + /// + public IReadOnlyCollection PreviouslyInvalidatedApiKeys { get; internal set; } = EmptyReadOnly.Collection; + /// public int? ErrorCount { get; internal set; } - public IReadOnlyCollection ErrorDetails { get; internal set; } = EmptyReadOnly.Collection; + /// + public IReadOnlyCollection ErrorDetails { get; internal set; } = EmptyReadOnly.Collection; } } diff --git a/src/Nest/_Generated/_Descriptors.generated.cs b/src/Nest/_Generated/_Descriptors.generated.cs index 7ce8668eab8..4bdd2b0ac91 100644 --- a/src/Nest/_Generated/_Descriptors.generated.cs +++ b/src/Nest/_Generated/_Descriptors.generated.cs @@ -4962,6 +4962,36 @@ public StopRollupJobDescriptor(Id id) : base(r=>r.Required("id", id)){} ///Block for (at maximum) the specified duration while waiting for the job to stop. Defaults to 30s. public StopRollupJobDescriptor Timeout(Time timeout) => Qs("timeout", timeout); } + ///descriptor for SecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
+ public partial class SecurityCreateApiKeyDescriptor : RequestDescriptorBase, ISecurityCreateApiKeyRequest + { + // values part of the url path + + // Request parameters + + ///If `true` (the default) then refresh the affected shards to make this operation visible to search, if `wait_for` then wait for a refresh to make this operation visible to search, if `false` then do nothing with refreshes. + public SecurityCreateApiKeyDescriptor Refresh(Refresh? refresh) => Qs("refresh", refresh); + //TODO THIS METHOD IS UNMAPPED! + + } + ///descriptor for SecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
+ public partial class SecurityGetApiKeyDescriptor : RequestDescriptorBase, ISecurityGetApiKeyRequest + { + // values part of the url path + + // Request parameters + + ///API key id of the API key to be retrieved + public SecurityGetApiKeyDescriptor Id(string id) => Qs("id", id); + ///API key name of the API key to be retrieved + public SecurityGetApiKeyDescriptor Name(string name) => Qs("name", name); + ///user name of the user who created this API key to be retrieved + public SecurityGetApiKeyDescriptor Username(string username) => Qs("username", username); + ///realm name of the user who created this API key to be retrieved + public SecurityGetApiKeyDescriptor RealmName(string realmName) => Qs("realm_name", realmName); + //TODO THIS METHOD IS UNMAPPED! + + } ///descriptor for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
public partial class SecurityInvalidateApiKeyDescriptor : RequestDescriptorBase, ISecurityInvalidateApiKeyRequest { diff --git a/src/Nest/_Generated/_LowLevelDispatch.generated.cs b/src/Nest/_Generated/_LowLevelDispatch.generated.cs index 104a1cf7496..2a4dfc99721 100644 --- a/src/Nest/_Generated/_LowLevelDispatch.generated.cs +++ b/src/Nest/_Generated/_LowLevelDispatch.generated.cs @@ -4642,6 +4642,50 @@ internal partial class LowLevelDispatch throw InvalidDispatch("XpackRollupStopJob", p, new [] { POST }, "/_xpack/rollup/job/{id}/_stop"); } + internal TResponse SecurityCreateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case PUT: + return _lowLevel.SecurityCreateApiKey(body,p.RequestParameters); + case POST: + return _lowLevel.SecurityCreateApiKeyPost(body,p.RequestParameters); + } + throw InvalidDispatch("SecurityCreateApiKey", p, new [] { PUT, POST }, "/_security/api_key"); + } + + internal Task SecurityCreateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case PUT: + return _lowLevel.SecurityCreateApiKeyAsync(body,p.RequestParameters,ct); + case POST: + return _lowLevel.SecurityCreateApiKeyPostAsync(body,p.RequestParameters,ct); + } + throw InvalidDispatch("SecurityCreateApiKey", p, new [] { PUT, POST }, "/_security/api_key"); + } + + internal TResponse SecurityGetApiKeyDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case GET: + return _lowLevel.SecurityGetApiKey(p.RequestParameters); + } + throw InvalidDispatch("SecurityGetApiKey", p, new [] { GET }, "/_security/api_key"); + } + + internal Task SecurityGetApiKeyDispatchAsync(IRequest p, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case GET: + return _lowLevel.SecurityGetApiKeyAsync(p.RequestParameters,ct); + } + throw InvalidDispatch("SecurityGetApiKey", p, new [] { GET }, "/_security/api_key"); + } + internal TResponse SecurityInvalidateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) @@ -4649,7 +4693,7 @@ internal partial class LowLevelDispatch case DELETE: return _lowLevel.SecurityInvalidateApiKey(body,p.RequestParameters); } - throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_xpack/security/oauth2/token"); + throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_security/api_key"); } internal Task SecurityInvalidateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() @@ -4659,7 +4703,7 @@ internal partial class LowLevelDispatch case DELETE: return _lowLevel.SecurityInvalidateApiKeyAsync(body,p.RequestParameters,ct); } - throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_xpack/security/oauth2/token"); + throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_security/api_key"); } internal TResponse XpackSecurityAuthenticateDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() diff --git a/src/Nest/_Generated/_Requests.generated.cs b/src/Nest/_Generated/_Requests.generated.cs index b1ebe07f041..c30759693d2 100644 --- a/src/Nest/_Generated/_Requests.generated.cs +++ b/src/Nest/_Generated/_Requests.generated.cs @@ -5663,6 +5663,45 @@ public SearchTemplateRequest(Indices index, Types type) : base(r=>r.Optional("in public bool? TotalHitsAsInteger { get => Q("rest_total_hits_as_int"); set => Q("rest_total_hits_as_int", value); } } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface ISecurityCreateApiKeyRequest : IRequest + { + } + ///Request parameters for SecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
+ public partial class SecurityCreateApiKeyRequest : PlainRequestBase, ISecurityCreateApiKeyRequest + { + protected ISecurityCreateApiKeyRequest Self => this; + // values part of the url path + + // Request parameters + /// + /// If `true` (the default) then refresh the affected shards to make this operation visible to search, if `wait_for` then wait for a refresh + /// to make this operation visible to search, if `false` then do nothing with refreshes. + /// + public Refresh? Refresh { get => Q("refresh"); set => Q("refresh", value); } + //TODO THIS METHOD IS UNMAPPED! + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface ISecurityGetApiKeyRequest : IRequest + { + } + ///Request parameters for SecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
+ public partial class SecurityGetApiKeyRequest : PlainRequestBase, ISecurityGetApiKeyRequest + { + protected ISecurityGetApiKeyRequest Self => this; + // values part of the url path + + // Request parameters + ///API key id of the API key to be retrieved + public string Id { get => Q("id"); set => Q("id", value); } + ///API key name of the API key to be retrieved + public string Name { get => Q("name"); set => Q("name", value); } + ///user name of the user who created this API key to be retrieved + public string Username { get => Q("username"); set => Q("username", value); } + ///realm name of the user who created this API key to be retrieved + public string RealmName { get => Q("realm_name"); set => Q("realm_name", value); } + //TODO THIS METHOD IS UNMAPPED! + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface ISecurityInvalidateApiKeyRequest : IRequest { } diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs index 2c200e61119..0d73b45040f 100644 --- a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs +++ b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs @@ -51,7 +51,7 @@ protected override void OnBeforeCall(IElasticClient client) protected override bool SupportsDeserialization => false; - protected override string UrlPath => $"/_xpack/security/oauth2/token"; + protected override string UrlPath => $"/_security/api_key"; protected override LazyResponses ClientUsage() => Calls( (client, f) => client.SecurityInvalidateApiKey(f), diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs index 610dabdaedb..e8074e183fc 100644 --- a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs +++ b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs @@ -7,7 +7,7 @@ namespace Tests.XPack.Security.User.SecurityInvalidateApiKey { public class SecurityInvalidateApiKeyUrlTests : UrlTestsBase { - [U] public override async Task Urls() => await UrlTester.DELETE("/_xpack/security/oauth2/token") + [U] public override async Task Urls() => await UrlTester.DELETE("/_security/api_key") .Fluent(c => c.SecurityInvalidateApiKey()) .Request(c => c.SecurityInvalidateApiKey(new SecurityInvalidateApiKeyRequest())) .FluentAsync(c => c.SecurityInvalidateApiKeyAsync()) From 772a1dca852b08c5d58be0384dbf31be57fd14c0 Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Wed, 17 Apr 2019 20:07:03 +1000 Subject: [PATCH 03/10] Implement Get, Great and Invalidate Api Keys --- .../ElasticClient-SecurityCreateApiKey.cs | 9 +++------ .../SecurityCreateApiKeyRequest.cs | 12 +++++++----- .../SecurityCreateApiKeyResponse.cs} | 13 +++++++------ .../ElasticClient-SecurityGetApiKey.cs | 0 .../GetApiKey}/SecurityGetApiKeyRequest.cs | 0 .../GetApiKey/SecurityGetApiKeyResponse.cs} | 14 +++++++------- .../ElasticClient-SecurityInvalidateApiKey.cs | 0 .../SecurityInvalidateApiKeyRequest.cs | 0 .../SecurityInvalidateApiKeyResponse.cs | 0 .../SecurityInvalidateApiKeyApiTests.cs | 17 +++++++---------- 10 files changed, 31 insertions(+), 34 deletions(-) rename src/Nest/XPack/Security/{SecurityCreateApiKey => ApiKey/CreateApiKey}/ElasticClient-SecurityCreateApiKey.cs (92%) rename src/Nest/XPack/Security/{SecurityCreateApiKey => ApiKey/CreateApiKey}/SecurityCreateApiKeyRequest.cs (93%) rename src/Nest/XPack/Security/{SecurityGetApiKey/SecurityGetApiKeyResponse.cs => ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs} (70%) rename src/Nest/XPack/Security/{SecurityGetApiKey => ApiKey/GetApiKey}/ElasticClient-SecurityGetApiKey.cs (100%) rename src/Nest/XPack/Security/{SecurityGetApiKey => ApiKey/GetApiKey}/SecurityGetApiKeyRequest.cs (100%) rename src/Nest/XPack/Security/{SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs => ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs} (91%) rename src/Nest/XPack/Security/{SecurityInvalidateApiKey => ApiKey/InvalidateApiKey}/ElasticClient-SecurityInvalidateApiKey.cs (100%) rename src/Nest/XPack/Security/{SecurityInvalidateApiKey => ApiKey/InvalidateApiKey}/SecurityInvalidateApiKeyRequest.cs (100%) rename src/Nest/XPack/Security/{SecurityInvalidateApiKey => ApiKey/InvalidateApiKey}/SecurityInvalidateApiKeyResponse.cs (100%) diff --git a/src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs similarity index 92% rename from src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs rename to src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs index 53234bce850..9257969db76 100644 --- a/src/Nest/XPack/Security/SecurityCreateApiKey/ElasticClient-SecurityCreateApiKey.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs @@ -31,8 +31,7 @@ public partial class ElasticClient { /// public ISecurityCreateApiKeyResponse SecurityCreateApiKey(Func selector = null - ) => - SecurityCreateApiKey(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor())); + ) => SecurityCreateApiKey(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor())); /// public ISecurityCreateApiKeyResponse SecurityCreateApiKey(ISecurityCreateApiKeyRequest request) => @@ -45,14 +44,12 @@ public ISecurityCreateApiKeyResponse SecurityCreateApiKey(ISecurityCreateApiKeyR public Task SecurityCreateApiKeyAsync( Func selector = null, CancellationToken cancellationToken = default(CancellationToken) - ) => - SecurityCreateApiKeyAsync(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor()), cancellationToken); + ) => SecurityCreateApiKeyAsync(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor()), cancellationToken); /// public Task SecurityCreateApiKeyAsync(ISecurityCreateApiKeyRequest request, CancellationToken cancellationToken = default(CancellationToken) - ) => - Dispatcher + ) => Dispatcher .DispatchAsync( request, cancellationToken, diff --git a/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs similarity index 93% rename from src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs rename to src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs index 66bd35915f1..9dc583eecfc 100644 --- a/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyRequest.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs @@ -24,11 +24,6 @@ public partial interface ISecurityCreateApiKeyRequest RoleDescriptors RoleDescriptors { get; set; } } - public class RoleDescriptors - { - - } - public partial class SecurityCreateApiKeyRequest { /// @@ -59,4 +54,11 @@ public partial class SecurityCreateApiKeyDescriptor /// public SecurityCreateApiKeyDescriptor Expiration(Time expiration) => Assign(expiration, (a, v) => a.Expiration = v); } + + public class RoleDescriptors : IsADictionaryBase + { + + } + + public class RoleDescriptor{} } diff --git a/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs similarity index 70% rename from src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs rename to src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs index 6aaeaf1a1df..8b61d75c0c8 100644 --- a/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyResponse.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs @@ -1,24 +1,25 @@ using System; +using System.Collections.Generic; using Newtonsoft.Json; namespace Nest { - public interface ISecurityGetApiKeyResponse : IResponse + public interface ISecurityCreateApiKeyResponse : IResponse { /// - /// Unique id for this API key + /// Id for the API key /// [JsonProperty("id")] string Id { get; } /// - /// Name for this API key + /// Name of the API key /// [JsonProperty("name")] string Name { get; } /// - /// Optional expiration for this API key + /// Optional expiration time for the API key in milliseconds /// [JsonProperty("expiration")] [JsonConverter(typeof(EpochMillisecondsDateTimeJsonConverter))] @@ -27,11 +28,11 @@ public interface ISecurityGetApiKeyResponse : IResponse /// /// Generated API key /// - [JsonProperty("api_key")] + [JsonProperty("api_key ")] string ApiKey { get; } } - public class SecurityGetApiKeyResponse : ResponseBase, ISecurityGetApiKeyResponse + public class SecurityCreateApiKeyResponse : ResponseBase, ISecurityCreateApiKeyResponse { /// public string Id { get; internal set; } diff --git a/src/Nest/XPack/Security/SecurityGetApiKey/ElasticClient-SecurityGetApiKey.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-SecurityGetApiKey.cs similarity index 100% rename from src/Nest/XPack/Security/SecurityGetApiKey/ElasticClient-SecurityGetApiKey.cs rename to src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-SecurityGetApiKey.cs diff --git a/src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyRequest.cs similarity index 100% rename from src/Nest/XPack/Security/SecurityGetApiKey/SecurityGetApiKeyRequest.cs rename to src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyRequest.cs diff --git a/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs similarity index 91% rename from src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs rename to src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs index 730a3f7e6b6..9ef87948f1e 100644 --- a/src/Nest/XPack/Security/SecurityCreateApiKey/SecurityCreateApiKeyResponse.cs +++ b/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs @@ -4,7 +4,7 @@ namespace Nest { - public interface ISecurityCreateApiKeyResponse : IResponse + public interface ISecurityGetApiKeyResponse : IResponse { /// /// The list of API keys that were retrieved for this request. @@ -13,6 +13,12 @@ public interface ISecurityCreateApiKeyResponse : IResponse IReadOnlyCollection ApiKeys { get; } } + public class SecurityGetApiKeyResponse : ResponseBase, ISecurityGetApiKeyResponse + { + /// + public IReadOnlyCollection ApiKeys { get; internal set; } = EmptyReadOnly.Collection; + } + public class ApiKeys { /// @@ -59,10 +65,4 @@ public class ApiKeys [JsonProperty("realm")] public string Realm { get; set; } } - - public class SecurityCreateApiKeyResponse : ResponseBase, ISecurityCreateApiKeyResponse - { - /// - public IReadOnlyCollection ApiKeys { get; internal set; } = EmptyReadOnly.Collection; - } } diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs similarity index 100% rename from src/Nest/XPack/Security/SecurityInvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs rename to src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyRequest.cs similarity index 100% rename from src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyRequest.cs rename to src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyRequest.cs diff --git a/src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyResponse.cs similarity index 100% rename from src/Nest/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyResponse.cs rename to src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyResponse.cs diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs index 0d73b45040f..b46515bcf33 100644 --- a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs +++ b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs @@ -16,37 +16,37 @@ public class SecurityInvalidateApiKeyApiTests : ApiIntegrationTestBase { - private const string AccessTokenValueKey = "accesstoken"; + private const string ApiKey = "apikey"; - protected virtual string CurrentAccessToken => RanIntegrationSetup ? ExtendedValue(AccessTokenValueKey) : "foo"; + protected virtual string CurrentApiKey => RanIntegrationSetup ? ExtendedValue(ApiKey) : "-"; public SecurityInvalidateApiKeyApiTests(XPackCluster cluster, EndpointUsage usage) : base(cluster, usage) { } protected override void OnBeforeCall(IElasticClient client) { - var r = client.GetUserAccessToken(Admin.Username, Admin.Password, f => f.Scope("FULL").GrantType(AccessTokenGrantType.Password)); + var r = client.SecurityCreateApiKey(f => f.Name(CallIsolatedValue)); r.ShouldBeValid(); - ExtendedValue(AccessTokenValueKey, r.AccessToken); + ExtendedValue(ApiKey, r.ApiKey); } protected override bool ExpectIsValid => true; protected override object ExpectJson => new { - token = CurrentAccessToken + id = CurrentApiKey }; protected override int ExpectStatusCode => 200; protected override Func Fluent => d => d - .Token(CurrentAccessToken) + .Id(CurrentApiKey) ; protected override HttpMethod HttpMethod => HttpMethod.DELETE; protected override SecurityInvalidateApiKeyRequest Initializer => new SecurityInvalidateApiKeyRequest { - Token = CurrentAccessToken + Id = CurrentApiKey }; protected override bool SupportsDeserialization => false; @@ -65,11 +65,8 @@ protected override LazyResponses ClientUsage() => Calls( protected override void ExpectResponse(ISecurityInvalidateApiKeyResponse response) { response.ShouldBeValid(); - response.Created.Should().BeTrue(); response.ErrorCount.Should().Be(0); response.ErrorDetails.Should().BeEmpty(); - response.InvalidatedTokens.Should().Be(1); - response.PreviousInvalidatedTokens.Should().Be(0); } } } From b924462e9a5c3c88725516fe52cab501fb292061 Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Thu, 18 Apr 2019 18:27:44 +1000 Subject: [PATCH 04/10] First pass at integration tests --- .../SecurityCreateApiKeyRequest.cs | 43 +++- .../Security/ApiKey/SecurityApiKeyTests .cs | 223 ++++++++++++++++++ .../SecurityInvalidateApiKeyUrlTests.cs | 0 .../SecurityInvalidateApiKeyApiTests.cs | 72 ------ 4 files changed, 264 insertions(+), 74 deletions(-) create mode 100644 src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests .cs rename src/Tests/Tests/XPack/Security/{SecurityInvalidateApiKey => ApiKey}/SecurityInvalidateApiKeyUrlTests.cs (100%) delete mode 100644 src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs index 9dc583eecfc..2e1dd41ae60 100644 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs @@ -1,7 +1,9 @@ -using Newtonsoft.Json; +using System; +using Newtonsoft.Json; namespace Nest { + [JsonConverter(typeof(SecurityCreateApiKeyRequestJsonConverter))] public partial interface ISecurityCreateApiKeyRequest { /// @@ -60,5 +62,42 @@ public class RoleDescriptors : IsADictionaryBase } - public class RoleDescriptor{} + public class RoleDescriptor + { + + } + + internal class SecurityCreateApiKeyRequestJsonConverter : JsonConverter + { + public override bool CanRead => false; + public override bool CanWrite => true; + + public override bool CanConvert(Type objectType) => true; + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var apiKeyRequest = value as ISecurityCreateApiKeyRequest; + writer.WriteStartObject(); + + if (!string.IsNullOrEmpty(apiKeyRequest.Name)) + { + writer.WritePropertyName("name"); + serializer.Serialize(writer, apiKeyRequest.Name); + } + + if (apiKeyRequest.Expiration != null) + { + writer.WritePropertyName("expiration"); + serializer.Serialize(writer, apiKeyRequest.Expiration); + } + + writer.WritePropertyName("role_descriptors"); + serializer.Serialize(writer, apiKeyRequest.RoleDescriptors ?? new object()); // server expects {} if null + + writer.WriteEndObject(); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => + throw new NotSupportedException(); + } } diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests .cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests .cs new file mode 100644 index 00000000000..3d92e9abf54 --- /dev/null +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests .cs @@ -0,0 +1,223 @@ +using System.Threading.Tasks; +using Elastic.Xunit.XunitPlumbing; +using Elasticsearch.Net; +using FluentAssertions; +using Nest; +using Tests.Core.ManagedElasticsearch.Clusters; +using Tests.Framework; +using Tests.Framework.EndpointTests.TestState; +using Tests.Framework.Integration; + +namespace Tests.XPack.CrossClusterReplication +{ + [SkipVersion("<6.7.0", "Security Api Keys are modelled against 6.7.0")] + public class SecurityApiKeyTests : CoordinatedIntegrationTestBase + { + private const string PutRoleStep = nameof(PutRoleStep); + private const string PutUserStep = nameof(PutUserStep); + private const string PutPrivilegesStep = nameof(PutPrivilegesStep); + private const string CreateApiKeyStep = nameof(CreateApiKeyStep); + private const string GetApiKeyStep = nameof(GetApiKeyStep); + private const string InvalidateApiKeyStep = nameof(InvalidateApiKeyStep); + + public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new CoordinatedUsage(cluster, usage) + { + { + PutRoleStep, u => + u.Calls( + v => new PutRoleRequest($"role-{v}") + { + Cluster = new[] { "all" }, + Indices = new IIndicesPrivileges[] + { + new IndicesPrivileges + { + Names = "*", + Privileges = new [] { "all" } + } + }, + Applications = new IApplicationPrivileges[] + { + new ApplicationPrivileges + { + Application = $"app-{v}", + Privileges = new [] { "*" }, + Resources = new [] { "*" } + } + } + }, + (v, d) => d + .Cluster("all") + .Indices(i => i.Add(p => p.Names("*").Privileges("all"))) + .Applications(i => i.Add(p => p.Application($"app-{v}").Privileges("*").Resources("*"))) + , + (v, c, f) => c.PutRole($"role-{v}", f), + (v, c, f) => c.PutRoleAsync($"role-{v}", f), + (v, c, r) => c.PutRole(r), + (v, c, r) => c.PutRoleAsync(r) + ) + }, + { + PutUserStep, u => + u.Calls( + v => new PutUserRequest($"user-{v}") + { + Password = "password", + Roles = new[] { $"role-{v}" }, + FullName = "API key user" + }, + (v, d) => d + .Password("password") + .Roles($"role-{v}") + .FullName("API key user") + , + (v, c, f) => c.PutUser($"user-{v}", f), + (v, c, f) => c.PutUserAsync($"user-{v}", f), + (v, c, r) => c.PutUser(r), + (v, c, r) => c.PutUserAsync(r) + ) + }, + { + PutPrivilegesStep, u => + u.Calls( + v => new PutPrivilegesRequest + { + Applications = new AppPrivileges + { + { + $"app-{v}", new Privileges + { + { + $"read", new PrivilegesActions + { + Actions = new[] { "data:read/*", "cluster:admin/xpack/security/api_key/get", "indices:data/read/search"} + } + }, + { + $"write", new PrivilegesActions + { + Actions = new[] { "data:write/*", "cluster:admin/xpack/security/api_key/create" } + } + } + } + } + } + }, + (v, d) => d + .Applications(a => a + .Application($"app-{v}", pr => pr + .Privilege($"read", ac => ac + .Actions("data:read/*", "cluster:admin/xpack/security/api_key/get", "indices:data/read/search") + ) + .Privilege($"write", ac => ac + .Actions("data:write/*", "cluster:admin/xpack/security/api_key/create") + ) + ) + ) + , + (v, c, f) => c.PutPrivileges(f), + (v, c, f) => c.PutPrivilegesAsync(f), + (v, c, r) => c.PutPrivileges(r), + (v, c, r) => c.PutPrivilegesAsync(r) + ) + }, + { + CreateApiKeyStep, u => + u.Calls( + v => new SecurityCreateApiKeyRequest + { + Name = v, + Expiration = "1d", + RequestConfiguration = new RequestConfiguration + { + BasicAuthenticationCredentials = new BasicAuthenticationCredentials + { + Username = $"user-{v}", + Password = "password" + } + } + }, + (v, d) => d + .Name(v) + .Expiration("1d") + .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) + , + (v, c, f) => c.SecurityCreateApiKey(f), + (v, c, f) => c.SecurityCreateApiKeyAsync(f), + (v, c, r) => c.SecurityCreateApiKey(r), + (v, c, r) => c.SecurityCreateApiKeyAsync(r) + ) + }, + { + GetApiKeyStep, u => + u.Calls( + v => new SecurityGetApiKeyRequest + { + Name = v, + RequestConfiguration = new RequestConfiguration + { + BasicAuthenticationCredentials = new BasicAuthenticationCredentials + { + Username = $"user-{v}", + Password = "password" + } + } + }, + (v, d) => d + .Name(v) + .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) + , + (v, c, f) => c.SecurityGetApiKey(f), + (v, c, f) => c.SecurityGetApiKeyAsync(f), + (v, c, r) => c.SecurityGetApiKey(r), + (v, c, r) => c.SecurityGetApiKeyAsync(r) + ) + }, + { + InvalidateApiKeyStep, u => + u.Calls( + v => new SecurityInvalidateApiKeyRequest + { + Name = v, + RequestConfiguration = new RequestConfiguration + { + BasicAuthenticationCredentials = new BasicAuthenticationCredentials + { + Username = $"user-{v}", + Password = "password" + } + } + }, + (v, d) => d + .Name(v) + .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) + , + (v, c, f) => c.SecurityInvalidateApiKey(f), + (v, c, f) => c.SecurityInvalidateApiKeyAsync(f), + (v, c, r) => c.SecurityInvalidateApiKey(r), + (v, c, r) => c.SecurityInvalidateApiKeyAsync(r) + ) + } + }) { } + + [I] public async Task SecurityCreateApiKeyResponse() => await Assert(CreateApiKeyStep, r => + { + r.IsValid.Should().BeTrue(); + r.Id.Should().NotBeNullOrEmpty(); + r.Name.Should().NotBeNullOrEmpty(); + r.Expiration.Should().NotBeNull(); + r.ApiKey.Should().NotBeNullOrEmpty(); + }); + + [I] public async Task SecurityGetApiKeyResponse() => await Assert(GetApiKeyStep, r => + { + r.IsValid.Should().BeTrue(); + }); + + [I] public async Task SecurityInvalidateApiKeyResponse() => await Assert(InvalidateApiKeyStep, r => + { + r.IsValid.Should().BeTrue(); + }); + + } +} diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityInvalidateApiKeyUrlTests.cs similarity index 100% rename from src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyUrlTests.cs rename to src/Tests/Tests/XPack/Security/ApiKey/SecurityInvalidateApiKeyUrlTests.cs diff --git a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs b/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs deleted file mode 100644 index b46515bcf33..00000000000 --- a/src/Tests/Tests/XPack/Security/SecurityInvalidateApiKey/SecurityInvalidateApiKeyApiTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using Elastic.Xunit.XunitPlumbing; -using Elasticsearch.Net; -using FluentAssertions; -using Nest; -using Tests.Core.Extensions; -using Tests.Core.ManagedElasticsearch.Clusters; -using Tests.Framework; -using Tests.Framework.Integration; -using static Elastic.Managed.Ephemeral.ClusterAuthentication; - -namespace Tests.XPack.Security.User.SecurityInvalidateApiKey -{ - [SkipVersion("<6.7.0", "API has been implemented against Elasticsearch 6.7.0 request and response format.")] - public class SecurityInvalidateApiKeyApiTests - : ApiIntegrationTestBase - { - private const string ApiKey = "apikey"; - - protected virtual string CurrentApiKey => RanIntegrationSetup ? ExtendedValue(ApiKey) : "-"; - - public SecurityInvalidateApiKeyApiTests(XPackCluster cluster, EndpointUsage usage) : base(cluster, usage) { } - - protected override void OnBeforeCall(IElasticClient client) - { - var r = client.SecurityCreateApiKey(f => f.Name(CallIsolatedValue)); - r.ShouldBeValid(); - ExtendedValue(ApiKey, r.ApiKey); - } - - protected override bool ExpectIsValid => true; - - protected override object ExpectJson => new - { - id = CurrentApiKey - }; - - protected override int ExpectStatusCode => 200; - - protected override Func Fluent => d => d - .Id(CurrentApiKey) - ; - - protected override HttpMethod HttpMethod => HttpMethod.DELETE; - - protected override SecurityInvalidateApiKeyRequest Initializer => new SecurityInvalidateApiKeyRequest - { - Id = CurrentApiKey - }; - - protected override bool SupportsDeserialization => false; - - protected override string UrlPath => $"/_security/api_key"; - - protected override LazyResponses ClientUsage() => Calls( - (client, f) => client.SecurityInvalidateApiKey(f), - (client, f) => client.SecurityInvalidateApiKeyAsync(f), - (client, r) => client.SecurityInvalidateApiKey(r), - (client, r) => client.SecurityInvalidateApiKeyAsync(r) - ); - - protected override SecurityInvalidateApiKeyDescriptor NewDescriptor() => new SecurityInvalidateApiKeyDescriptor(); - - protected override void ExpectResponse(ISecurityInvalidateApiKeyResponse response) - { - response.ShouldBeValid(); - response.ErrorCount.Should().Be(0); - response.ErrorDetails.Should().BeEmpty(); - } - } -} From 4c3adad0512fd5f2f7fcc92b811a271bfb746961 Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Thu, 18 Apr 2019 19:36:38 +1000 Subject: [PATCH 05/10] Add Url tests and rename integration tests file --- ...ApiKeyTests .cs => SecurityApiKeyTests.cs} | 0 .../Security/ApiKey/SecurityApiKeyUrlTests.cs | 34 +++++++++++++++++++ .../SecurityInvalidateApiKeyUrlTests.cs | 16 --------- 3 files changed, 34 insertions(+), 16 deletions(-) rename src/Tests/Tests/XPack/Security/ApiKey/{SecurityApiKeyTests .cs => SecurityApiKeyTests.cs} (100%) create mode 100644 src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs delete mode 100644 src/Tests/Tests/XPack/Security/ApiKey/SecurityInvalidateApiKeyUrlTests.cs diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests .cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs similarity index 100% rename from src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests .cs rename to src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs new file mode 100644 index 00000000000..b4df55920aa --- /dev/null +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using Elastic.Xunit.XunitPlumbing; +using Nest; +using Tests.Framework; + +namespace Tests.XPack.Security.User.SecurityInvalidateApiKey +{ + public class SecurityApiKeyUrlTests : UrlTestsBase + { + [U] public override async Task Urls() => await UrlTester.DELETE("/_security/api_key") + .Fluent(c => c.SecurityInvalidateApiKey()) + .Request(c => c.SecurityInvalidateApiKey(new SecurityInvalidateApiKeyRequest())) + .FluentAsync(c => c.SecurityInvalidateApiKeyAsync()) + .RequestAsync(c => c.SecurityInvalidateApiKeyAsync(new SecurityInvalidateApiKeyRequest())); + } + + public class SecurityGetApiKeyUrlTests : UrlTestsBase + { + [U] public override async Task Urls() => await UrlTester.GET("/_security/api_key") + .Fluent(c => c.SecurityGetApiKey()) + .Request(c => c.SecurityGetApiKey(new SecurityGetApiKeyRequest())) + .FluentAsync(c => c.SecurityGetApiKeyAsync()) + .RequestAsync(c => c.SecurityGetApiKeyAsync(new SecurityGetApiKeyRequest())); + } + + public class SecurityCreateApiKeyUrlTests : UrlTestsBase + { + [U] public override async Task Urls() => await UrlTester.POST("/_security/api_key") + .Fluent(c => c.SecurityCreateApiKey()) + .Request(c => c.SecurityCreateApiKey(new SecurityCreateApiKeyRequest())) + .FluentAsync(c => c.SecurityCreateApiKeyAsync()) + .RequestAsync(c => c.SecurityCreateApiKeyAsync(new SecurityCreateApiKeyRequest())); + } +} diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityInvalidateApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityInvalidateApiKeyUrlTests.cs deleted file mode 100644 index e8074e183fc..00000000000 --- a/src/Tests/Tests/XPack/Security/ApiKey/SecurityInvalidateApiKeyUrlTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Threading.Tasks; -using Elastic.Xunit.XunitPlumbing; -using Nest; -using Tests.Framework; - -namespace Tests.XPack.Security.User.SecurityInvalidateApiKey -{ - public class SecurityInvalidateApiKeyUrlTests : UrlTestsBase - { - [U] public override async Task Urls() => await UrlTester.DELETE("/_security/api_key") - .Fluent(c => c.SecurityInvalidateApiKey()) - .Request(c => c.SecurityInvalidateApiKey(new SecurityInvalidateApiKeyRequest())) - .FluentAsync(c => c.SecurityInvalidateApiKeyAsync()) - .RequestAsync(c => c.SecurityInvalidateApiKeyAsync(new SecurityInvalidateApiKeyRequest())); - } -} From fdc367d773a78259debf56d2976abeeefd7c6572 Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Fri, 3 May 2019 17:20:56 +1000 Subject: [PATCH 06/10] Fix integration test by giving user the superuser role --- .../SecurityCreateApiKeyResponse.cs | 2 +- .../Security/ApiKey/SecurityApiKeyTests.cs | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs index 8b61d75c0c8..ee6efb4890d 100644 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs @@ -28,7 +28,7 @@ public interface ISecurityCreateApiKeyResponse : IResponse /// /// Generated API key /// - [JsonProperty("api_key ")] + [JsonProperty("api_key")] string ApiKey { get; } } diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs index 3d92e9abf54..b9409a741b7 100644 --- a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs @@ -1,3 +1,5 @@ +using System; +using System.Linq; using System.Threading.Tasks; using Elastic.Xunit.XunitPlumbing; using Elasticsearch.Net; @@ -63,12 +65,12 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new v => new PutUserRequest($"user-{v}") { Password = "password", - Roles = new[] { $"role-{v}" }, + Roles = new[] { $"role-{v}", "superuser" }, FullName = "API key user" }, (v, d) => d .Password("password") - .Roles($"role-{v}") + .Roles($"role-{v}", "superuser") .FullName("API key user") , (v, c, f) => c.PutUser($"user-{v}", f), @@ -90,13 +92,13 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new { $"read", new PrivilegesActions { - Actions = new[] { "data:read/*", "cluster:admin/xpack/security/api_key/get", "indices:data/read/search"} + Actions = new[] { "data:read/*" } } }, { $"write", new PrivilegesActions { - Actions = new[] { "data:write/*", "cluster:admin/xpack/security/api_key/create" } + Actions = new[] { "data:write/*" } } } } @@ -107,10 +109,10 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new .Applications(a => a .Application($"app-{v}", pr => pr .Privilege($"read", ac => ac - .Actions("data:read/*", "cluster:admin/xpack/security/api_key/get", "indices:data/read/search") + .Actions("data:read/*") ) .Privilege($"write", ac => ac - .Actions("data:write/*", "cluster:admin/xpack/security/api_key/create") + .Actions("data:write/*") ) ) ) @@ -212,11 +214,23 @@ [I] public async Task SecurityCreateApiKeyResponse() => await Assert await Assert(GetApiKeyStep, r => { r.IsValid.Should().BeTrue(); + r.ApiKeys.Should().HaveCount(1); + var apiKey = r.ApiKeys.First(); + apiKey.Id.Should().NotBeNullOrEmpty(); + apiKey.Name.Should().NotBeNullOrEmpty(); + apiKey.Creation.Should().BeBefore(DateTimeOffset.UtcNow); + apiKey.Expiration.Should().BeAfter(DateTimeOffset.UtcNow); + apiKey.Invalidated.Should().Be(false); + apiKey.Username.Should().NotBeNullOrEmpty(); + apiKey.Realm.Should().NotBeNullOrEmpty(); }); [I] public async Task SecurityInvalidateApiKeyResponse() => await Assert(InvalidateApiKeyStep, r => { r.IsValid.Should().BeTrue(); + r.ErrorCount.Should().Be(0); + r.PreviouslyInvalidatedApiKeys.Should().BeEmpty(); + r.InvalidatedApiKeys.Should().HaveCount(1); }); } From 6bba879addbe5f9caa089e0e2203f0ff24d0be3b Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Fri, 3 May 2019 17:44:28 +1000 Subject: [PATCH 07/10] Change POST verb to PUT --- src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs index b4df55920aa..331cc86ba25 100644 --- a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs @@ -25,7 +25,7 @@ [U] public override async Task Urls() => await UrlTester.GET("/_security/api_key public class SecurityCreateApiKeyUrlTests : UrlTestsBase { - [U] public override async Task Urls() => await UrlTester.POST("/_security/api_key") + [U] public override async Task Urls() => await UrlTester.PUT("/_security/api_key") .Fluent(c => c.SecurityCreateApiKey()) .Request(c => c.SecurityCreateApiKey(new SecurityCreateApiKeyRequest())) .FluentAsync(c => c.SecurityCreateApiKeyAsync()) From 370eb56883229bd97d088cb302b6e86b3f5068d3 Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Mon, 6 May 2019 15:01:24 +1000 Subject: [PATCH 08/10] Add role customisation --- .../ApiKey/CreateApiKey/ApiKeyPrivileges.cs | 58 +++++++++++ .../ApiKey/CreateApiKey/ApiKeyRole.cs | 52 ++++++++++ .../ApiKey/CreateApiKey/ApiKeyRoles.cs | 26 +++++ .../SecurityCreateApiKeyRequest.cs | 88 +++++------------ .../Security/ApiKey/SecurityApiKeyTests.cs | 95 ++++++++++++++++--- 5 files changed, 240 insertions(+), 79 deletions(-) create mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyPrivileges.cs create mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs create mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRoles.cs diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyPrivileges.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyPrivileges.cs new file mode 100644 index 00000000000..1b86ee74b09 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyPrivileges.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace Nest +{ + public interface IApiKeyPrivileges + { + /// + /// A list of names. + /// + IEnumerable Names { get; set; } + + /// + /// A list of privileges. + /// + IEnumerable Privileges { get; set; } + } + + public class ApiKeyPrivileges : IApiKeyPrivileges + { + /// + public IEnumerable Names { get; set; } + + /// + public IEnumerable Privileges { get; set; } + } + + public class ApiKeyPrivilegesDescriptor + : DescriptorPromiseBase> + { + public ApiKeyPrivilegesDescriptor() : base(new List()) { } + + public ApiKeyPrivilegesDescriptor Index(Func selector) => + Assign(selector, (a, v) => a.Add(v.InvokeOrDefault(new ApiKeyPrivilegeDescriptor()))); + + public class ApiKeyPrivilegeDescriptor + : DescriptorBase, IApiKeyPrivileges + { + /// + IEnumerable IApiKeyPrivileges.Names { get; set; } + + /// + IEnumerable IApiKeyPrivileges.Privileges { get; set; } + + /// + public ApiKeyPrivilegeDescriptor Privileges(params string[] privileges) => Assign(privileges, (a, v) => a.Privileges = v); + + /// + public ApiKeyPrivilegeDescriptor Privileges(IEnumerable privileges) => Assign(privileges, (a, v) => a.Privileges = v); + + /// + public ApiKeyPrivilegeDescriptor Names(params string[] resources) => Assign(resources, (a, v) => a.Names = v); + + /// + public ApiKeyPrivilegeDescriptor Names(IEnumerable resources) => Assign(resources, (a, v) => a.Names = v); + } + } +} diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs new file mode 100644 index 00000000000..65ad99d139e --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Nest +{ + public interface IApiKeyRole + { + /// + /// A list of clusters + /// + [JsonProperty("cluster")] + IEnumerable Cluster { get; set; } + + /// + /// A list of indices. + /// + [JsonProperty("index")] + IEnumerable Index { get; set; } + } + + public class ApiKeyRole : IApiKeyRole + { + /// + [JsonProperty("cluster")] + public IEnumerable Cluster { get; set; } + + /// + [JsonProperty("index")] + public IEnumerable Index { get; set; } + } + + public class ApiKeyRoleDescriptor + : DescriptorBase, IApiKeyRole + { + /// + IEnumerable IApiKeyRole.Cluster { get; set; } + + /// + IEnumerable IApiKeyRole.Index { get; set; } + + /// + public ApiKeyRoleDescriptor Cluster(params string[] cluster) => Assign(cluster, (a, v) => a.Cluster = v); + + /// + public ApiKeyRoleDescriptor Cluster(IEnumerable cluster) => Assign(cluster, (a, v) => a.Cluster = v); + + /// + public ApiKeyRoleDescriptor Indices(Func>> selector + ) => Assign(selector, (a, v) => a.Index = v?.Invoke(new ApiKeyPrivilegesDescriptor())?.Value); + } +} diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRoles.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRoles.cs new file mode 100644 index 00000000000..71caad7c7e0 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRoles.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Nest +{ + [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] + public interface IApiKeyRoles : IIsADictionary { } + + public class ApiKeyRoles : IsADictionaryBase, IApiKeyRoles + { + public ApiKeyRoles() { } + + internal ApiKeyRoles(IDictionary backingDictionary) : base(backingDictionary) { } + + public void Add(string role, IApiKeyRole apiKeyRole) => BackingDictionary.Add(role, apiKeyRole); + } + + public class ApiKeyRolesDescriptor : IsADictionaryDescriptorBase + { + public ApiKeyRolesDescriptor() : base(new ApiKeyRoles()) { } + + public ApiKeyRolesDescriptor Role(string name, Func selector) => + Assign(selector, (a, v) => a.Add(name, v.InvokeOrDefault(new ApiKeyRoleDescriptor()))); + } +} diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs index 2e1dd41ae60..af0c63da161 100644 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs @@ -3,15 +3,8 @@ namespace Nest { - [JsonConverter(typeof(SecurityCreateApiKeyRequestJsonConverter))] public partial interface ISecurityCreateApiKeyRequest { - /// - /// Name for this API key - /// - [JsonProperty("name")] - string Name { get; set; } - /// /// Optional expiration for the API key being generated. /// If expiration is not provided then the API keys do not expire. @@ -19,85 +12,52 @@ public partial interface ISecurityCreateApiKeyRequest [JsonProperty("expiration")] Time Expiration { get; set; } + /// + /// Name for this API key + /// + [JsonProperty("name")] + string Name { get; set; } + /// /// Optional role descriptors for this API key, if not provided then permissions of authenticated user are applied. /// [JsonProperty("role_descriptors")] - RoleDescriptors RoleDescriptors { get; set; } + IApiKeyRoles Roles { get; set; } } public partial class SecurityCreateApiKeyRequest { - /// - public string Name { get; set; } - - /// + /// public Time Expiration { get; set; } - /// - public RoleDescriptors RoleDescriptors { get; set; } + /// + public string Name { get; set; } + + /// + public IApiKeyRoles Roles { get; set; } = new ApiKeyRoles(); // Ensure not null, as server expects {} } [DescriptorFor("SecurityCreateApiKey")] public partial class SecurityCreateApiKeyDescriptor { - /// - string ISecurityCreateApiKeyRequest.Name { get; set; } - - /// + /// Time ISecurityCreateApiKeyRequest.Expiration { get; set; } - /// - RoleDescriptors ISecurityCreateApiKeyRequest.RoleDescriptors { get; set; } - /// - public SecurityCreateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); + string ISecurityCreateApiKeyRequest.Name { get; set; } + + /// + IApiKeyRoles ISecurityCreateApiKeyRequest.Roles { get; set; } = new ApiKeyRoles(); // Ensure not null, as server expects {} /// public SecurityCreateApiKeyDescriptor Expiration(Time expiration) => Assign(expiration, (a, v) => a.Expiration = v); - } - - public class RoleDescriptors : IsADictionaryBase - { - } - - public class RoleDescriptor - { - - } - - internal class SecurityCreateApiKeyRequestJsonConverter : JsonConverter - { - public override bool CanRead => false; - public override bool CanWrite => true; - - public override bool CanConvert(Type objectType) => true; - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - var apiKeyRequest = value as ISecurityCreateApiKeyRequest; - writer.WriteStartObject(); - - if (!string.IsNullOrEmpty(apiKeyRequest.Name)) - { - writer.WritePropertyName("name"); - serializer.Serialize(writer, apiKeyRequest.Name); - } - - if (apiKeyRequest.Expiration != null) - { - writer.WritePropertyName("expiration"); - serializer.Serialize(writer, apiKeyRequest.Expiration); - } - - writer.WritePropertyName("role_descriptors"); - serializer.Serialize(writer, apiKeyRequest.RoleDescriptors ?? new object()); // server expects {} if null - - writer.WriteEndObject(); - } + /// + public SecurityCreateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => - throw new NotSupportedException(); + /// + public SecurityCreateApiKeyDescriptor Roles(Func> selector) => + Assign(selector, + (a, v) => a.Roles = v?.Invoke(new ApiKeyRolesDescriptor())?.Value ?? new ApiKeyRoles()); // Ensure not null, as server expects {} } } diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs index b9409a741b7..3604b7b5980 100644 --- a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Elastic.Xunit.XunitPlumbing; @@ -9,8 +10,9 @@ using Tests.Framework; using Tests.Framework.EndpointTests.TestState; using Tests.Framework.Integration; +using Tests.Mapping.LocalMetadata.Extensions; -namespace Tests.XPack.CrossClusterReplication +namespace Tests.XPack.ApiKey { [SkipVersion("<6.7.0", "Security Api Keys are modelled against 6.7.0")] public class SecurityApiKeyTests : CoordinatedIntegrationTestBase @@ -18,7 +20,8 @@ public class SecurityApiKeyTests : CoordinatedIntegrationTestBase private const string PutRoleStep = nameof(PutRoleStep); private const string PutUserStep = nameof(PutUserStep); private const string PutPrivilegesStep = nameof(PutPrivilegesStep); - private const string CreateApiKeyStep = nameof(CreateApiKeyStep); + private const string CreateApiKeyWithRolesStep = nameof(CreateApiKeyWithRolesStep); + private const string CreateApiKeyWithNoRolesStep = nameof(CreateApiKeyWithNoRolesStep); private const string GetApiKeyStep = nameof(GetApiKeyStep); private const string InvalidateApiKeyStep = nameof(InvalidateApiKeyStep); @@ -124,7 +127,67 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new ) }, { - CreateApiKeyStep, u => + CreateApiKeyWithRolesStep, u => + u.Calls( + v => new SecurityCreateApiKeyRequest + { + Name = v, + Expiration = "1d", + Roles = new ApiKeyRoles + { + { + "role-a", new ApiKeyRole + { + Cluster = new[] { "all" }, + Index = new [] + { + new ApiKeyPrivileges + { + Names = new [] { "index-a*" }, + Privileges = new[] { "read" } + } + } + } + }, + { + "role-b", new ApiKeyRole + { + Cluster = new[] { "all" }, + Index = new [] + { + new ApiKeyPrivileges + { + Names = new [] { "index-b*" }, + Privileges = new[] { "read" } + } + } + } + } + }, + RequestConfiguration = new RequestConfiguration + { + BasicAuthenticationCredentials = new BasicAuthenticationCredentials + { + Username = $"user-{v}", + Password = "password" + } + } + }, + (v, d) => d + .Name(v) + .Expiration("1d") + .Roles(r => r.Role("role-a", o => o.Cluster("all").Indices(i => i.Index(k => k.Names("index-a").Privileges("read")))) + .Role("role-b", o => o.Cluster("all").Indices(i => i.Index(k => k.Names("index-b").Privileges("read"))))) + .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) + , + (v, c, f) => c.SecurityCreateApiKey(f), + (v, c, f) => c.SecurityCreateApiKeyAsync(f), + (v, c, r) => c.SecurityCreateApiKey(r), + (v, c, r) => c.SecurityCreateApiKeyAsync(r) + ) + }, + { + CreateApiKeyWithNoRolesStep, u => u.Calls( v => new SecurityCreateApiKeyRequest { @@ -202,7 +265,7 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new } }) { } - [I] public async Task SecurityCreateApiKeyResponse() => await Assert(CreateApiKeyStep, r => + [I] public async Task SecurityCreateApiKeyResponse() => await Assert(CreateApiKeyWithRolesStep, r => { r.IsValid.Should().BeTrue(); r.Id.Should().NotBeNullOrEmpty(); @@ -214,15 +277,18 @@ [I] public async Task SecurityCreateApiKeyResponse() => await Assert await Assert(GetApiKeyStep, r => { r.IsValid.Should().BeTrue(); - r.ApiKeys.Should().HaveCount(1); - var apiKey = r.ApiKeys.First(); - apiKey.Id.Should().NotBeNullOrEmpty(); - apiKey.Name.Should().NotBeNullOrEmpty(); - apiKey.Creation.Should().BeBefore(DateTimeOffset.UtcNow); - apiKey.Expiration.Should().BeAfter(DateTimeOffset.UtcNow); - apiKey.Invalidated.Should().Be(false); - apiKey.Username.Should().NotBeNullOrEmpty(); - apiKey.Realm.Should().NotBeNullOrEmpty(); + r.ApiKeys.Should().NotBeNullOrEmpty(); + + foreach (var apiKey in r.ApiKeys) + { + apiKey.Id.Should().NotBeNullOrEmpty(); + apiKey.Name.Should().NotBeNullOrEmpty(); + apiKey.Creation.Should().BeBefore(DateTimeOffset.UtcNow); + apiKey.Expiration.Should().BeAfter(DateTimeOffset.UtcNow); + apiKey.Invalidated.Should().Be(false); + apiKey.Username.Should().NotBeNullOrEmpty(); + apiKey.Realm.Should().NotBeNullOrEmpty(); + } }); [I] public async Task SecurityInvalidateApiKeyResponse() => await Assert(InvalidateApiKeyStep, r => @@ -230,8 +296,7 @@ [I] public async Task SecurityInvalidateApiKeyResponse() => await Assert Date: Tue, 7 May 2019 15:46:33 +1000 Subject: [PATCH 09/10] Addr PR feedback, rename XML comments in IApiKeyRole --- src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs index 65ad99d139e..c9abd4ebbf1 100644 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ApiKeyRole.cs @@ -13,7 +13,7 @@ public interface IApiKeyRole IEnumerable Cluster { get; set; } /// - /// A list of indices. + /// A list of API key privileges for indices. /// [JsonProperty("index")] IEnumerable Index { get; set; } From a646975606edfd1f9e7417dc3f52d367b95203ad Mon Sep 17 00:00:00 2001 From: Stuart Cam Date: Tue, 7 May 2019 20:19:07 +1000 Subject: [PATCH 10/10] Renames, dropping Security prefix from all NEST types and adding Xpack prefix to low level dispatch calls --- .../ApiGenerator/ApiGenerator.cs | 10 +- .../RequestParameters.Generated.cs | 12 +-- .../ElasticLowLevelClient.Generated.cs | 16 +-- .../IElasticLowLevelClient.Generated.cs | 16 +-- .../CreateApiKey/CreateApiKeyRequest.cs | 63 +++++++++++ ...KeyResponse.cs => CreateApiKeyResponse.cs} | 4 +- .../ElasticClient-CreateApiKey.cs | 59 +++++++++++ .../ElasticClient-SecurityCreateApiKey.cs | 59 ----------- .../SecurityCreateApiKeyRequest.cs | 63 ----------- .../GetApiKey/ElasticClient-GetApiKey.cs | 62 +++++++++++ .../ElasticClient-SecurityGetApiKey.cs | 62 ----------- .../ApiKey/GetApiKey/GetApiKeyRequest.cs | 9 ++ ...ApiKeyResponse.cs => GetApiKeyResponse.cs} | 4 +- .../GetApiKey/SecurityGetApiKeyRequest.cs | 9 -- .../ElasticClient-InvalidateApiKey.cs | 62 +++++++++++ .../ElasticClient-SecurityInvalidateApiKey.cs | 61 ----------- .../InvalidateApiKeyRequest.cs | 74 +++++++++++++ ...esponse.cs => InvalidateApiKeyResponse.cs} | 4 +- .../SecurityInvalidateApiKeyRequest.cs | 75 ------------- src/Nest/_Generated/_Descriptors.generated.cs | 26 ++--- .../_Generated/_LowLevelDispatch.generated.cs | 40 +++---- src/Nest/_Generated/_Requests.generated.cs | 100 +++++++++--------- .../Security/ApiKey/SecurityApiKeyTests.cs | 57 +++++----- .../Security/ApiKey/SecurityApiKeyUrlTests.cs | 26 ++--- 24 files changed, 486 insertions(+), 487 deletions(-) create mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyRequest.cs rename src/Nest/XPack/Security/ApiKey/CreateApiKey/{SecurityCreateApiKeyResponse.cs => CreateApiKeyResponse.cs} (86%) create mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-CreateApiKey.cs delete mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs delete mode 100644 src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs create mode 100644 src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-GetApiKey.cs delete mode 100644 src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-SecurityGetApiKey.cs create mode 100644 src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyRequest.cs rename src/Nest/XPack/Security/ApiKey/GetApiKey/{SecurityGetApiKeyResponse.cs => GetApiKeyResponse.cs} (92%) delete mode 100644 src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyRequest.cs create mode 100644 src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-InvalidateApiKey.cs delete mode 100644 src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs create mode 100644 src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyRequest.cs rename src/Nest/XPack/Security/ApiKey/InvalidateApiKey/{SecurityInvalidateApiKeyResponse.cs => InvalidateApiKeyResponse.cs} (89%) delete mode 100644 src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyRequest.cs diff --git a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs index 7310d1336be..e52b4c975b0 100644 --- a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs +++ b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs @@ -176,7 +176,15 @@ private static Dictionary CreateCommonApiQueryParame return ApiQueryParametersPatcher.Patch(null, commonParameters, null, false); } - private static string CreateMethodName(string apiEndpointKey) => PascalCase(apiEndpointKey); + private static string CreateMethodName(string apiEndpointKey) + { + var pascalCased = PascalCase(apiEndpointKey); + if (pascalCased.StartsWith("Security")) + { + pascalCased = "Xpack" + pascalCased; + } + return pascalCased; + } private static string DoRazor(string name, string template, RestApiSpec model) => Razor.CompileRenderAsync(name, template, model).GetAwaiter().GetResult(); diff --git a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs index 4c5487a8c6c..ef9b8204091 100644 --- a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs +++ b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs @@ -2718,8 +2718,8 @@ public partial class StopRollupJobRequestParameters : RequestParametersBlock for (at maximum) the specified duration while waiting for the job to stop. Defaults to 30s. public TimeSpan Timeout { get => Q("timeout"); set => Q("timeout", value); } } - ///Request options for SecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
- public partial class SecurityCreateApiKeyRequestParameters : RequestParameters + ///Request options for XpackSecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
+ public partial class CreateApiKeyRequestParameters : RequestParameters { public override HttpMethod DefaultHttpMethod => HttpMethod.PUT; /// @@ -2728,8 +2728,8 @@ public partial class SecurityCreateApiKeyRequestParameters : RequestParameters public Refresh? Refresh { get => Q("refresh"); set => Q("refresh", value); } } - ///Request options for SecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
- public partial class SecurityGetApiKeyRequestParameters : RequestParameters + ///Request options for XpackSecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
+ public partial class GetApiKeyRequestParameters : RequestParameters { public override HttpMethod DefaultHttpMethod => HttpMethod.GET; ///API key id of the API key to be retrieved @@ -2741,8 +2741,8 @@ public partial class SecurityGetApiKeyRequestParameters : RequestParametersrealm name of the user who created this API key to be retrieved
public string RealmName { get => Q("realm_name"); set => Q("realm_name", value); } } - ///Request options for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
- public partial class SecurityInvalidateApiKeyRequestParameters : RequestParameters + ///Request options for XpackSecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
+ public partial class InvalidateApiKeyRequestParameters : RequestParameters { public override HttpMethod DefaultHttpMethod => HttpMethod.DELETE; } diff --git a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs index e2fc4b1f09c..9d5e2723991 100644 --- a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs @@ -4055,40 +4055,40 @@ public TResponse XpackRollupStopJob(string id, StopRollupJobRequestPa ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - public TResponse SecurityCreateApiKey(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) + public TResponse XpackSecurityCreateApiKey(PostData body, CreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(PUT, Url($"_security/api_key"), body, _params(requestParameters)); ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - public Task SecurityCreateApiKeyAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + public Task XpackSecurityCreateApiKeyAsync(PostData body, CreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(PUT, Url($"_security/api_key"), ctx, body, _params(requestParameters)); ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - public TResponse SecurityCreateApiKeyPost(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) + public TResponse XpackSecurityCreateApiKeyPost(PostData body, CreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(POST, Url($"_security/api_key"), body, _params(requestParameters)); ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - public Task SecurityCreateApiKeyPostAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + public Task XpackSecurityCreateApiKeyPostAsync(PostData body, CreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(POST, Url($"_security/api_key"), ctx, body, _params(requestParameters)); ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html ///A func that allows you to describe the querystring parameters & request specific connection settings. - public TResponse SecurityGetApiKey(SecurityGetApiKeyRequestParameters requestParameters = null) + public TResponse XpackSecurityGetApiKey(GetApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(GET, Url($"_security/api_key"), null, _params(requestParameters)); ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html ///A func that allows you to describe the querystring parameters & request specific connection settings. - public Task SecurityGetApiKeyAsync(SecurityGetApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + public Task XpackSecurityGetApiKeyAsync(GetApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(GET, Url($"_security/api_key"), ctx, null, _params(requestParameters)); ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. - public TResponse SecurityInvalidateApiKey(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null) + public TResponse XpackSecurityInvalidateApiKey(PostData body, InvalidateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(DELETE, Url($"_security/api_key"), body, _params(requestParameters)); ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. - public Task SecurityInvalidateApiKeyAsync(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + public Task XpackSecurityInvalidateApiKeyAsync(PostData body, InvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(DELETE, Url($"_security/api_key"), ctx, body, _params(requestParameters)); ///GET on /_xpack/security/_authenticate https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html ///A func that allows you to describe the querystring parameters & request specific connection settings. diff --git a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs index f4589786062..6652d72c20d 100644 --- a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs @@ -3287,33 +3287,33 @@ public partial interface IElasticLowLevelClient ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - TResponse SecurityCreateApiKey(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + TResponse XpackSecurityCreateApiKey(PostData body, CreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); ///PUT on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - Task SecurityCreateApiKeyAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + Task XpackSecurityCreateApiKeyAsync(PostData body, CreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - TResponse SecurityCreateApiKeyPost(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + TResponse XpackSecurityCreateApiKeyPost(PostData body, CreateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); ///POST on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html ///The api key request to create an API key ///A func that allows you to describe the querystring parameters & request specific connection settings. - Task SecurityCreateApiKeyPostAsync(PostData body, SecurityCreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + Task XpackSecurityCreateApiKeyPostAsync(PostData body, CreateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html ///A func that allows you to describe the querystring parameters & request specific connection settings. - TResponse SecurityGetApiKey(SecurityGetApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + TResponse XpackSecurityGetApiKey(GetApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); ///GET on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html ///A func that allows you to describe the querystring parameters & request specific connection settings. - Task SecurityGetApiKeyAsync(SecurityGetApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + Task XpackSecurityGetApiKeyAsync(GetApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. - TResponse SecurityInvalidateApiKey(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + TResponse XpackSecurityInvalidateApiKey(PostData body, InvalidateApiKeyRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); ///DELETE on /_security/api_key https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html ///The api key request to invalidate API key(s) ///A func that allows you to describe the querystring parameters & request specific connection settings. - Task SecurityInvalidateApiKeyAsync(PostData body, SecurityInvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + Task XpackSecurityInvalidateApiKeyAsync(PostData body, InvalidateApiKeyRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); ///GET on /_xpack/security/_authenticate https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-authenticate.html ///A func that allows you to describe the querystring parameters & request specific connection settings. TResponse XpackSecurityAuthenticate(AuthenticateRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyRequest.cs new file mode 100644 index 00000000000..34812d5aac4 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyRequest.cs @@ -0,0 +1,63 @@ +using System; +using Newtonsoft.Json; + +namespace Nest +{ + public partial interface ICreateApiKeyRequest + { + /// + /// Optional expiration for the API key being generated. + /// If expiration is not provided then the API keys do not expire. + /// + [JsonProperty("expiration")] + Time Expiration { get; set; } + + /// + /// Name for this API key + /// + [JsonProperty("name")] + string Name { get; set; } + + /// + /// Optional role descriptors for this API key, if not provided then permissions of authenticated user are applied. + /// + [JsonProperty("role_descriptors")] + IApiKeyRoles Roles { get; set; } + } + + public partial class CreateApiKeyRequest + { + /// + public Time Expiration { get; set; } + + /// + public string Name { get; set; } + + /// + public IApiKeyRoles Roles { get; set; } = new ApiKeyRoles(); // Ensure not null, as server expects {} + } + + [DescriptorFor("XpackSecurityCreateApiKey")] + public partial class CreateApiKeyDescriptor + { + /// + Time ICreateApiKeyRequest.Expiration { get; set; } + + /// + string ICreateApiKeyRequest.Name { get; set; } + + /// + IApiKeyRoles ICreateApiKeyRequest.Roles { get; set; } = new ApiKeyRoles(); // Ensure not null, as server expects {} + + /// + public CreateApiKeyDescriptor Expiration(Time expiration) => Assign(expiration, (a, v) => a.Expiration = v); + + /// + public CreateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); + + /// + public CreateApiKeyDescriptor Roles(Func> selector) => + Assign(selector, + (a, v) => a.Roles = v?.Invoke(new ApiKeyRolesDescriptor())?.Value ?? new ApiKeyRoles()); // Ensure not null, as server expects {} + } +} diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyResponse.cs similarity index 86% rename from src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs rename to src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyResponse.cs index ee6efb4890d..ec5b9e11738 100644 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyResponse.cs +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/CreateApiKeyResponse.cs @@ -4,7 +4,7 @@ namespace Nest { - public interface ISecurityCreateApiKeyResponse : IResponse + public interface ICreateApiKeyResponse : IResponse { /// /// Id for the API key @@ -32,7 +32,7 @@ public interface ISecurityCreateApiKeyResponse : IResponse string ApiKey { get; } } - public class SecurityCreateApiKeyResponse : ResponseBase, ISecurityCreateApiKeyResponse + public class CreateApiKeyResponse : ResponseBase, ICreateApiKeyResponse { /// public string Id { get; internal set; } diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-CreateApiKey.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-CreateApiKey.cs new file mode 100644 index 00000000000..ef30796ed3c --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-CreateApiKey.cs @@ -0,0 +1,59 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + /// Creates an API key for access without requiring basic authentication. + /// + ICreateApiKeyResponse CreateApiKey(Func selector = null); + + /// + ICreateApiKeyResponse CreateApiKey(ICreateApiKeyRequest request); + + /// + Task CreateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task CreateApiKeyAsync(ICreateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public ICreateApiKeyResponse CreateApiKey(Func selector = null + ) => CreateApiKey(selector.InvokeOrDefault(new CreateApiKeyDescriptor())); + + /// + public ICreateApiKeyResponse CreateApiKey(ICreateApiKeyRequest request) => + Dispatcher.Dispatch( + request, + LowLevelDispatch.XpackSecurityCreateApiKeyDispatch + ); + + /// + public Task CreateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => CreateApiKeyAsync(selector.InvokeOrDefault(new CreateApiKeyDescriptor()), cancellationToken); + + /// + public Task CreateApiKeyAsync(ICreateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => Dispatcher + .DispatchAsync( + request, + cancellationToken, + LowLevelDispatch.XpackSecurityCreateApiKeyDispatchAsync + ); + } +} diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs deleted file mode 100644 index 9257969db76..00000000000 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/ElasticClient-SecurityCreateApiKey.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Elasticsearch.Net; - -namespace Nest -{ - public partial interface IElasticClient - { - /// - /// Creates an API key for access without requiring basic authentication. - /// - ISecurityCreateApiKeyResponse SecurityCreateApiKey(Func selector = null); - - /// - ISecurityCreateApiKeyResponse SecurityCreateApiKey(ISecurityCreateApiKeyRequest request); - - /// - Task SecurityCreateApiKeyAsync( - Func selector = null, - CancellationToken cancellationToken = default(CancellationToken) - ); - - /// - Task SecurityCreateApiKeyAsync(ISecurityCreateApiKeyRequest request, - CancellationToken cancellationToken = default(CancellationToken) - ); - } - - public partial class ElasticClient - { - /// - public ISecurityCreateApiKeyResponse SecurityCreateApiKey(Func selector = null - ) => SecurityCreateApiKey(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor())); - - /// - public ISecurityCreateApiKeyResponse SecurityCreateApiKey(ISecurityCreateApiKeyRequest request) => - Dispatcher.Dispatch( - request, - LowLevelDispatch.SecurityCreateApiKeyDispatch - ); - - /// - public Task SecurityCreateApiKeyAsync( - Func selector = null, - CancellationToken cancellationToken = default(CancellationToken) - ) => SecurityCreateApiKeyAsync(selector.InvokeOrDefault(new SecurityCreateApiKeyDescriptor()), cancellationToken); - - /// - public Task SecurityCreateApiKeyAsync(ISecurityCreateApiKeyRequest request, - CancellationToken cancellationToken = default(CancellationToken) - ) => Dispatcher - .DispatchAsync( - request, - cancellationToken, - LowLevelDispatch.SecurityCreateApiKeyDispatchAsync - ); - } -} diff --git a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs deleted file mode 100644 index af0c63da161..00000000000 --- a/src/Nest/XPack/Security/ApiKey/CreateApiKey/SecurityCreateApiKeyRequest.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using Newtonsoft.Json; - -namespace Nest -{ - public partial interface ISecurityCreateApiKeyRequest - { - /// - /// Optional expiration for the API key being generated. - /// If expiration is not provided then the API keys do not expire. - /// - [JsonProperty("expiration")] - Time Expiration { get; set; } - - /// - /// Name for this API key - /// - [JsonProperty("name")] - string Name { get; set; } - - /// - /// Optional role descriptors for this API key, if not provided then permissions of authenticated user are applied. - /// - [JsonProperty("role_descriptors")] - IApiKeyRoles Roles { get; set; } - } - - public partial class SecurityCreateApiKeyRequest - { - /// - public Time Expiration { get; set; } - - /// - public string Name { get; set; } - - /// - public IApiKeyRoles Roles { get; set; } = new ApiKeyRoles(); // Ensure not null, as server expects {} - } - - [DescriptorFor("SecurityCreateApiKey")] - public partial class SecurityCreateApiKeyDescriptor - { - /// - Time ISecurityCreateApiKeyRequest.Expiration { get; set; } - - /// - string ISecurityCreateApiKeyRequest.Name { get; set; } - - /// - IApiKeyRoles ISecurityCreateApiKeyRequest.Roles { get; set; } = new ApiKeyRoles(); // Ensure not null, as server expects {} - - /// - public SecurityCreateApiKeyDescriptor Expiration(Time expiration) => Assign(expiration, (a, v) => a.Expiration = v); - - /// - public SecurityCreateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); - - /// - public SecurityCreateApiKeyDescriptor Roles(Func> selector) => - Assign(selector, - (a, v) => a.Roles = v?.Invoke(new ApiKeyRolesDescriptor())?.Value ?? new ApiKeyRoles()); // Ensure not null, as server expects {} - } -} diff --git a/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-GetApiKey.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-GetApiKey.cs new file mode 100644 index 00000000000..6e9357a51d1 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-GetApiKey.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + /// Retrieves information for one or more API keys. + /// + IGetApiKeyResponse GetApiKey(Func selector = null); + + /// + IGetApiKeyResponse GetApiKey(IGetApiKeyRequest request); + + /// + Task GetApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task GetApiKeyAsync(IGetApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public IGetApiKeyResponse GetApiKey(Func selector = null + ) => + GetApiKey(selector.InvokeOrDefault(new GetApiKeyDescriptor())); + + /// + public IGetApiKeyResponse GetApiKey(IGetApiKeyRequest request) => + Dispatcher.Dispatch( + request, + (p, d) => LowLevelDispatch.XpackSecurityGetApiKeyDispatch(p) + ); + + /// + public Task GetApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => + GetApiKeyAsync(selector.InvokeOrDefault(new GetApiKeyDescriptor()), cancellationToken); + + /// + public Task GetApiKeyAsync(IGetApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => + Dispatcher + .DispatchAsync( + request, + cancellationToken, + (p, d, c) => LowLevelDispatch.XpackSecurityGetApiKeyDispatchAsync(p, c) + ); + } +} diff --git a/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-SecurityGetApiKey.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-SecurityGetApiKey.cs deleted file mode 100644 index 834f363f77a..00000000000 --- a/src/Nest/XPack/Security/ApiKey/GetApiKey/ElasticClient-SecurityGetApiKey.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Elasticsearch.Net; - -namespace Nest -{ - public partial interface IElasticClient - { - /// - /// Retrieves information for one or more API keys. - /// - ISecurityGetApiKeyResponse SecurityGetApiKey(Func selector = null); - - /// - ISecurityGetApiKeyResponse SecurityGetApiKey(ISecurityGetApiKeyRequest request); - - /// - Task SecurityGetApiKeyAsync( - Func selector = null, - CancellationToken cancellationToken = default(CancellationToken) - ); - - /// - Task SecurityGetApiKeyAsync(ISecurityGetApiKeyRequest request, - CancellationToken cancellationToken = default(CancellationToken) - ); - } - - public partial class ElasticClient - { - /// - public ISecurityGetApiKeyResponse SecurityGetApiKey(Func selector = null - ) => - SecurityGetApiKey(selector.InvokeOrDefault(new SecurityGetApiKeyDescriptor())); - - /// - public ISecurityGetApiKeyResponse SecurityGetApiKey(ISecurityGetApiKeyRequest request) => - Dispatcher.Dispatch( - request, - (p, d) => LowLevelDispatch.SecurityGetApiKeyDispatch(p) - ); - - /// - public Task SecurityGetApiKeyAsync( - Func selector = null, - CancellationToken cancellationToken = default(CancellationToken) - ) => - SecurityGetApiKeyAsync(selector.InvokeOrDefault(new SecurityGetApiKeyDescriptor()), cancellationToken); - - /// - public Task SecurityGetApiKeyAsync(ISecurityGetApiKeyRequest request, - CancellationToken cancellationToken = default(CancellationToken) - ) => - Dispatcher - .DispatchAsync( - request, - cancellationToken, - (p, d, c) => LowLevelDispatch.SecurityGetApiKeyDispatchAsync(p, c) - ); - } -} diff --git a/src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyRequest.cs new file mode 100644 index 00000000000..7c3cea8b760 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyRequest.cs @@ -0,0 +1,9 @@ +namespace Nest +{ + public partial interface IGetApiKeyRequest { } + + public partial class GetApiKeyRequest { } + + [DescriptorFor("XpackSecurityGetApiKey")] + public partial class GetApiKeyDescriptor { } +} diff --git a/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyResponse.cs similarity index 92% rename from src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs rename to src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyResponse.cs index 9ef87948f1e..e221a92efaa 100644 --- a/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyResponse.cs +++ b/src/Nest/XPack/Security/ApiKey/GetApiKey/GetApiKeyResponse.cs @@ -4,7 +4,7 @@ namespace Nest { - public interface ISecurityGetApiKeyResponse : IResponse + public interface IGetApiKeyResponse : IResponse { /// /// The list of API keys that were retrieved for this request. @@ -13,7 +13,7 @@ public interface ISecurityGetApiKeyResponse : IResponse IReadOnlyCollection ApiKeys { get; } } - public class SecurityGetApiKeyResponse : ResponseBase, ISecurityGetApiKeyResponse + public class GetApiKeyResponse : ResponseBase, IGetApiKeyResponse { /// public IReadOnlyCollection ApiKeys { get; internal set; } = EmptyReadOnly.Collection; diff --git a/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyRequest.cs deleted file mode 100644 index 519a5172b1d..00000000000 --- a/src/Nest/XPack/Security/ApiKey/GetApiKey/SecurityGetApiKeyRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Nest -{ - public partial interface ISecurityGetApiKeyRequest { } - - public partial class SecurityGetApiKeyRequest { } - - [DescriptorFor("SecurityGetApiKey")] - public partial class SecurityGetApiKeyDescriptor { } -} diff --git a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-InvalidateApiKey.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-InvalidateApiKey.cs new file mode 100644 index 00000000000..1104d7fc509 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-InvalidateApiKey.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + /// Invalidates one or more API keys. + /// + IInvalidateApiKeyResponse InvalidateApiKey(Func selector = null); + + /// + IInvalidateApiKeyResponse InvalidateApiKey(IInvalidateApiKeyRequest request); + + /// + Task InvalidateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task InvalidateApiKeyAsync(IInvalidateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public IInvalidateApiKeyResponse InvalidateApiKey(Func selector = null + ) => + InvalidateApiKey(selector.InvokeOrDefault(new InvalidateApiKeyDescriptor())); + + /// + public IInvalidateApiKeyResponse InvalidateApiKey(IInvalidateApiKeyRequest request) => + Dispatcher.Dispatch( + request, + LowLevelDispatch.XpackSecurityInvalidateApiKeyDispatch + ); + + /// + public Task InvalidateApiKeyAsync( + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => + InvalidateApiKeyAsync(selector.InvokeOrDefault(new InvalidateApiKeyDescriptor()), cancellationToken); + + /// + public Task InvalidateApiKeyAsync(IInvalidateApiKeyRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => + Dispatcher + .DispatchAsync( + request, + cancellationToken, + LowLevelDispatch.XpackSecurityInvalidateApiKeyDispatchAsync + ); + } +} diff --git a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs deleted file mode 100644 index 11e449af30e..00000000000 --- a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/ElasticClient-SecurityInvalidateApiKey.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Elasticsearch.Net; - -namespace Nest -{ - public partial interface IElasticClient - { - /// - /// Invalidates one or more API keys. - /// - ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(Func selector = null); - - /// - ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(ISecurityInvalidateApiKeyRequest request); - - /// - Task SecurityInvalidateApiKeyAsync( - Func selector = null, - CancellationToken cancellationToken = default(CancellationToken) - ); - - /// - Task SecurityInvalidateApiKeyAsync(ISecurityInvalidateApiKeyRequest request, - CancellationToken cancellationToken = default(CancellationToken) - ); - } - - public partial class ElasticClient - { - /// - public ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(Func selector = null - ) => - SecurityInvalidateApiKey(selector.InvokeOrDefault(new SecurityInvalidateApiKeyDescriptor())); - - /// - public ISecurityInvalidateApiKeyResponse SecurityInvalidateApiKey(ISecurityInvalidateApiKeyRequest request) => - Dispatcher.Dispatch( - request, - LowLevelDispatch.SecurityInvalidateApiKeyDispatch - ); - - /// - public Task SecurityInvalidateApiKeyAsync( - Func selector = null, - CancellationToken cancellationToken = default(CancellationToken) - ) => - SecurityInvalidateApiKeyAsync(selector.InvokeOrDefault(new SecurityInvalidateApiKeyDescriptor()), cancellationToken); - /// - public Task SecurityInvalidateApiKeyAsync(ISecurityInvalidateApiKeyRequest request, - CancellationToken cancellationToken = default(CancellationToken) - ) => - Dispatcher - .DispatchAsync( - request, - cancellationToken, - LowLevelDispatch.SecurityInvalidateApiKeyDispatchAsync - ); - } -} diff --git a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyRequest.cs new file mode 100644 index 00000000000..f1b4ed1bb64 --- /dev/null +++ b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyRequest.cs @@ -0,0 +1,74 @@ +using Newtonsoft.Json; + +namespace Nest +{ + public partial interface IInvalidateApiKeyRequest + { + /// + /// An API key id. This parameter cannot be used with any of Name, RealmName or Username are used. + /// + [JsonProperty("id")] + string Id { get; set; } + + /// + /// An API key name. This parameter cannot be used with any of Id, RealmName or Username are used. + /// + [JsonProperty("name")] + string Name { get; set; } + + /// + /// The name of an authentication realm. This parameter cannot be used with either Id or Name. + /// + [JsonProperty("realm_name")] + string RealmName { get; set; } + + /// + /// The username of a user. This parameter cannot be used with either Id or Name. + /// + [JsonProperty("username")] + string Username { get; set; } + } + + public partial class InvalidateApiKeyRequest + { + /// + public string Id { get; set; } + + /// + public string Name { get; set; } + + /// + public string RealmName { get; set; } + + /// + public string Username { get; set; } + } + + [DescriptorFor("XpackSecurityInvalidateApiKey")] + public partial class InvalidateApiKeyDescriptor + { + /// + string IInvalidateApiKeyRequest.Id { get; set; } + + /// + string IInvalidateApiKeyRequest.Name { get; set; } + + /// + string IInvalidateApiKeyRequest.RealmName { get; set; } + + /// + string IInvalidateApiKeyRequest.Username { get; set; } + + /// + public InvalidateApiKeyDescriptor Id(string id) => Assign(id, (a, v) => a.Id = v); + + /// + public InvalidateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); + + /// + public InvalidateApiKeyDescriptor RealmName(string realmName) => Assign(realmName, (a, v) => a.RealmName = v); + + /// + public InvalidateApiKeyDescriptor Username(string username) => Assign(username, (a, v) => a.Username = v); + } +} diff --git a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyResponse.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyResponse.cs similarity index 89% rename from src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyResponse.cs rename to src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyResponse.cs index 913bdcb3ff5..47427b282da 100644 --- a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyResponse.cs +++ b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/InvalidateApiKeyResponse.cs @@ -4,7 +4,7 @@ namespace Nest { - public interface ISecurityInvalidateApiKeyResponse : IResponse + public interface IInvalidateApiKeyResponse : IResponse { /// /// The ids of the API keys that were invalidated as part of this request. @@ -31,7 +31,7 @@ public interface ISecurityInvalidateApiKeyResponse : IResponse IReadOnlyCollection ErrorDetails { get; } } - public class SecurityInvalidateApiKeyResponse : ResponseBase, ISecurityInvalidateApiKeyResponse + public class InvalidateApiKeyResponse : ResponseBase, IInvalidateApiKeyResponse { /// public IReadOnlyCollection InvalidatedApiKeys { get; internal set; } = EmptyReadOnly.Collection; diff --git a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyRequest.cs b/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyRequest.cs deleted file mode 100644 index bf0724ea903..00000000000 --- a/src/Nest/XPack/Security/ApiKey/InvalidateApiKey/SecurityInvalidateApiKeyRequest.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Newtonsoft.Json; - -namespace Nest -{ - public partial interface ISecurityInvalidateApiKeyRequest - { - /// - /// An API key id. This parameter cannot be used with any of Name, RealmName or Username are used. - /// - [JsonProperty("id")] - string Id { get; set; } - - /// - /// An API key name. This parameter cannot be used with any of Id, RealmName or Username are used. - /// - [JsonProperty("name")] - string Name { get; set; } - - /// - /// The name of an authentication realm. This parameter cannot be used with either Id or Name. - /// - [JsonProperty("realm_name")] - string RealmName { get; set; } - - /// - /// The username of a user. This parameter cannot be used with either Id or Name. - /// - [JsonProperty("username")] - string Username { get; set; } - } - - public partial class SecurityInvalidateApiKeyRequest - { - /// - public string Id { get; set; } - - /// - public string Name { get; set; } - - /// - public string RealmName { get; set; } - - /// - public string Username { get; set; } - } - - [DescriptorFor("SecurityInvalidateApiKey")] - public partial class SecurityInvalidateApiKeyDescriptor - { - - /// - string ISecurityInvalidateApiKeyRequest.Id { get; set; } - - /// - string ISecurityInvalidateApiKeyRequest.Name { get; set; } - - /// - string ISecurityInvalidateApiKeyRequest.RealmName { get; set; } - - /// - string ISecurityInvalidateApiKeyRequest.Username { get; set; } - - /// - public SecurityInvalidateApiKeyDescriptor Id(string id) => Assign(id, (a, v) => a.Id = v); - - /// - public SecurityInvalidateApiKeyDescriptor Name(string name) => Assign(name, (a, v) => a.Name = v); - - /// - public SecurityInvalidateApiKeyDescriptor RealmName(string realmName) => Assign(realmName, (a, v) => a.RealmName = v); - - /// - public SecurityInvalidateApiKeyDescriptor Username(string username) => Assign(username, (a, v) => a.Username = v); - } -} diff --git a/src/Nest/_Generated/_Descriptors.generated.cs b/src/Nest/_Generated/_Descriptors.generated.cs index 4bdd2b0ac91..d42f19f87b4 100644 --- a/src/Nest/_Generated/_Descriptors.generated.cs +++ b/src/Nest/_Generated/_Descriptors.generated.cs @@ -4962,38 +4962,34 @@ public StopRollupJobDescriptor(Id id) : base(r=>r.Required("id", id)){} ///Block for (at maximum) the specified duration while waiting for the job to stop. Defaults to 30s. public StopRollupJobDescriptor Timeout(Time timeout) => Qs("timeout", timeout); } - ///descriptor for SecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
- public partial class SecurityCreateApiKeyDescriptor : RequestDescriptorBase, ISecurityCreateApiKeyRequest + ///descriptor for XpackSecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
+ public partial class CreateApiKeyDescriptor : RequestDescriptorBase, ICreateApiKeyRequest { // values part of the url path // Request parameters ///If `true` (the default) then refresh the affected shards to make this operation visible to search, if `wait_for` then wait for a refresh to make this operation visible to search, if `false` then do nothing with refreshes. - public SecurityCreateApiKeyDescriptor Refresh(Refresh? refresh) => Qs("refresh", refresh); - //TODO THIS METHOD IS UNMAPPED! - + public CreateApiKeyDescriptor Refresh(Refresh? refresh) => Qs("refresh", refresh); } - ///descriptor for SecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
- public partial class SecurityGetApiKeyDescriptor : RequestDescriptorBase, ISecurityGetApiKeyRequest + ///descriptor for XpackSecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
+ public partial class GetApiKeyDescriptor : RequestDescriptorBase, IGetApiKeyRequest { // values part of the url path // Request parameters ///API key id of the API key to be retrieved - public SecurityGetApiKeyDescriptor Id(string id) => Qs("id", id); + public GetApiKeyDescriptor Id(string id) => Qs("id", id); ///API key name of the API key to be retrieved - public SecurityGetApiKeyDescriptor Name(string name) => Qs("name", name); + public GetApiKeyDescriptor Name(string name) => Qs("name", name); ///user name of the user who created this API key to be retrieved - public SecurityGetApiKeyDescriptor Username(string username) => Qs("username", username); + public GetApiKeyDescriptor Username(string username) => Qs("username", username); ///realm name of the user who created this API key to be retrieved - public SecurityGetApiKeyDescriptor RealmName(string realmName) => Qs("realm_name", realmName); - //TODO THIS METHOD IS UNMAPPED! - + public GetApiKeyDescriptor RealmName(string realmName) => Qs("realm_name", realmName); } - ///descriptor for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
- public partial class SecurityInvalidateApiKeyDescriptor : RequestDescriptorBase, ISecurityInvalidateApiKeyRequest + ///descriptor for XpackSecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
+ public partial class InvalidateApiKeyDescriptor : RequestDescriptorBase, IInvalidateApiKeyRequest { // values part of the url path diff --git a/src/Nest/_Generated/_LowLevelDispatch.generated.cs b/src/Nest/_Generated/_LowLevelDispatch.generated.cs index 2a4dfc99721..10c4c9712bd 100644 --- a/src/Nest/_Generated/_LowLevelDispatch.generated.cs +++ b/src/Nest/_Generated/_LowLevelDispatch.generated.cs @@ -4642,68 +4642,68 @@ internal partial class LowLevelDispatch throw InvalidDispatch("XpackRollupStopJob", p, new [] { POST }, "/_xpack/rollup/job/{id}/_stop"); } - internal TResponse SecurityCreateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() + internal TResponse XpackSecurityCreateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) { case PUT: - return _lowLevel.SecurityCreateApiKey(body,p.RequestParameters); + return _lowLevel.XpackSecurityCreateApiKey(body,p.RequestParameters); case POST: - return _lowLevel.SecurityCreateApiKeyPost(body,p.RequestParameters); + return _lowLevel.XpackSecurityCreateApiKeyPost(body,p.RequestParameters); } - throw InvalidDispatch("SecurityCreateApiKey", p, new [] { PUT, POST }, "/_security/api_key"); + throw InvalidDispatch("XpackSecurityCreateApiKey", p, new [] { PUT, POST }, "/_security/api_key"); } - internal Task SecurityCreateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + internal Task XpackSecurityCreateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) { case PUT: - return _lowLevel.SecurityCreateApiKeyAsync(body,p.RequestParameters,ct); + return _lowLevel.XpackSecurityCreateApiKeyAsync(body,p.RequestParameters,ct); case POST: - return _lowLevel.SecurityCreateApiKeyPostAsync(body,p.RequestParameters,ct); + return _lowLevel.XpackSecurityCreateApiKeyPostAsync(body,p.RequestParameters,ct); } - throw InvalidDispatch("SecurityCreateApiKey", p, new [] { PUT, POST }, "/_security/api_key"); + throw InvalidDispatch("XpackSecurityCreateApiKey", p, new [] { PUT, POST }, "/_security/api_key"); } - internal TResponse SecurityGetApiKeyDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() + internal TResponse XpackSecurityGetApiKeyDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) { case GET: - return _lowLevel.SecurityGetApiKey(p.RequestParameters); + return _lowLevel.XpackSecurityGetApiKey(p.RequestParameters); } - throw InvalidDispatch("SecurityGetApiKey", p, new [] { GET }, "/_security/api_key"); + throw InvalidDispatch("XpackSecurityGetApiKey", p, new [] { GET }, "/_security/api_key"); } - internal Task SecurityGetApiKeyDispatchAsync(IRequest p, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + internal Task XpackSecurityGetApiKeyDispatchAsync(IRequest p, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) { case GET: - return _lowLevel.SecurityGetApiKeyAsync(p.RequestParameters,ct); + return _lowLevel.XpackSecurityGetApiKeyAsync(p.RequestParameters,ct); } - throw InvalidDispatch("SecurityGetApiKey", p, new [] { GET }, "/_security/api_key"); + throw InvalidDispatch("XpackSecurityGetApiKey", p, new [] { GET }, "/_security/api_key"); } - internal TResponse SecurityInvalidateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() + internal TResponse XpackSecurityInvalidateApiKeyDispatch(IRequest p,SerializableData body) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) { case DELETE: - return _lowLevel.SecurityInvalidateApiKey(body,p.RequestParameters); + return _lowLevel.XpackSecurityInvalidateApiKey(body,p.RequestParameters); } - throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_security/api_key"); + throw InvalidDispatch("XpackSecurityInvalidateApiKey", p, new [] { DELETE }, "/_security/api_key"); } - internal Task SecurityInvalidateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + internal Task XpackSecurityInvalidateApiKeyDispatchAsync(IRequest p,SerializableData body, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) { case DELETE: - return _lowLevel.SecurityInvalidateApiKeyAsync(body,p.RequestParameters,ct); + return _lowLevel.XpackSecurityInvalidateApiKeyAsync(body,p.RequestParameters,ct); } - throw InvalidDispatch("SecurityInvalidateApiKey", p, new [] { DELETE }, "/_security/api_key"); + throw InvalidDispatch("XpackSecurityInvalidateApiKey", p, new [] { DELETE }, "/_security/api_key"); } internal TResponse XpackSecurityAuthenticateDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() diff --git a/src/Nest/_Generated/_Requests.generated.cs b/src/Nest/_Generated/_Requests.generated.cs index c30759693d2..6483e1bb956 100644 --- a/src/Nest/_Generated/_Requests.generated.cs +++ b/src/Nest/_Generated/_Requests.generated.cs @@ -1371,6 +1371,23 @@ public CountRequest(Indices index, Types type) : base(r=>r.Optional("index", ind public long? TerminateAfter { get => Q("terminate_after"); set => Q("terminate_after", value); } } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface ICreateApiKeyRequest : IRequest + { + } + ///Request parameters for XpackSecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
+ public partial class CreateApiKeyRequest : PlainRequestBase, ICreateApiKeyRequest + { + protected ICreateApiKeyRequest Self => this; + // values part of the url path + + // Request parameters + /// + /// If `true` (the default) then refresh the affected shards to make this operation visible to search, if `wait_for` then wait for a refresh + /// to make this operation visible to search, if `false` then do nothing with refreshes. + /// + public Refresh? Refresh { get => Q("refresh"); set => Q("refresh", value); } + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface ICreateAutoFollowPatternRequest : IRequest { Name Name { get; } @@ -2838,6 +2855,26 @@ public GetAnomalyRecordsRequest(Id job_id) : base(r=>r.Required("job_id", job_id // Request parameters } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface IGetApiKeyRequest : IRequest + { + } + ///Request parameters for XpackSecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
+ public partial class GetApiKeyRequest : PlainRequestBase, IGetApiKeyRequest + { + protected IGetApiKeyRequest Self => this; + // values part of the url path + + // Request parameters + ///API key id of the API key to be retrieved + public string Id { get => Q("id"); set => Q("id", value); } + ///API key name of the API key to be retrieved + public string Name { get => Q("name"); set => Q("name", value); } + ///user name of the user who created this API key to be retrieved + public string Username { get => Q("username"); set => Q("username", value); } + ///realm name of the user who created this API key to be retrieved + public string RealmName { get => Q("realm_name"); set => Q("realm_name", value); } + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface IGetAutoFollowPatternRequest : IRequest { Name Name { get; } @@ -4028,6 +4065,18 @@ public IndicesStatsRequest(Indices index, IndicesStatsMetric metric) : base(r=>r public bool? IncludeSegmentFileSizes { get => Q("include_segment_file_sizes"); set => Q("include_segment_file_sizes", value); } } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface IInvalidateApiKeyRequest : IRequest + { + } + ///Request parameters for XpackSecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
+ public partial class InvalidateApiKeyRequest : PlainRequestBase, IInvalidateApiKeyRequest + { + protected IInvalidateApiKeyRequest Self => this; + // values part of the url path + + // Request parameters + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface IInvalidateUserAccessTokenRequest : IRequest { } @@ -5663,57 +5712,6 @@ public SearchTemplateRequest(Indices index, Types type) : base(r=>r.Optional("in public bool? TotalHitsAsInteger { get => Q("rest_total_hits_as_int"); set => Q("rest_total_hits_as_int", value); } } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - public partial interface ISecurityCreateApiKeyRequest : IRequest - { - } - ///Request parameters for SecurityCreateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
- public partial class SecurityCreateApiKeyRequest : PlainRequestBase, ISecurityCreateApiKeyRequest - { - protected ISecurityCreateApiKeyRequest Self => this; - // values part of the url path - - // Request parameters - /// - /// If `true` (the default) then refresh the affected shards to make this operation visible to search, if `wait_for` then wait for a refresh - /// to make this operation visible to search, if `false` then do nothing with refreshes. - /// - public Refresh? Refresh { get => Q("refresh"); set => Q("refresh", value); } - //TODO THIS METHOD IS UNMAPPED! - } - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - public partial interface ISecurityGetApiKeyRequest : IRequest - { - } - ///Request parameters for SecurityGetApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-api-key.html
- public partial class SecurityGetApiKeyRequest : PlainRequestBase, ISecurityGetApiKeyRequest - { - protected ISecurityGetApiKeyRequest Self => this; - // values part of the url path - - // Request parameters - ///API key id of the API key to be retrieved - public string Id { get => Q("id"); set => Q("id", value); } - ///API key name of the API key to be retrieved - public string Name { get => Q("name"); set => Q("name", value); } - ///user name of the user who created this API key to be retrieved - public string Username { get => Q("username"); set => Q("username", value); } - ///realm name of the user who created this API key to be retrieved - public string RealmName { get => Q("realm_name"); set => Q("realm_name", value); } - //TODO THIS METHOD IS UNMAPPED! - } - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - public partial interface ISecurityInvalidateApiKeyRequest : IRequest - { - } - ///Request parameters for SecurityInvalidateApiKey
https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-invalidate-api-key.html
- public partial class SecurityInvalidateApiKeyRequest : PlainRequestBase, ISecurityInvalidateApiKeyRequest - { - protected ISecurityInvalidateApiKeyRequest Self => this; - // values part of the url path - - // Request parameters - } - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface ISegmentsRequest : IRequest { Indices Index { get; } diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs index 3604b7b5980..f98aefc8fb4 100644 --- a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyTests.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Elastic.Xunit.XunitPlumbing; using Elasticsearch.Net; @@ -10,7 +8,6 @@ using Tests.Framework; using Tests.Framework.EndpointTests.TestState; using Tests.Framework.Integration; -using Tests.Mapping.LocalMetadata.Extensions; namespace Tests.XPack.ApiKey { @@ -128,8 +125,8 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new }, { CreateApiKeyWithRolesStep, u => - u.Calls( - v => new SecurityCreateApiKeyRequest + u.Calls( + v => new CreateApiKeyRequest { Name = v, Expiration = "1d", @@ -180,16 +177,16 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new .Role("role-b", o => o.Cluster("all").Indices(i => i.Index(k => k.Names("index-b").Privileges("read"))))) .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) , - (v, c, f) => c.SecurityCreateApiKey(f), - (v, c, f) => c.SecurityCreateApiKeyAsync(f), - (v, c, r) => c.SecurityCreateApiKey(r), - (v, c, r) => c.SecurityCreateApiKeyAsync(r) + (v, c, f) => c.CreateApiKey(f), + (v, c, f) => c.CreateApiKeyAsync(f), + (v, c, r) => c.CreateApiKey(r), + (v, c, r) => c.CreateApiKeyAsync(r) ) }, { CreateApiKeyWithNoRolesStep, u => - u.Calls( - v => new SecurityCreateApiKeyRequest + u.Calls( + v => new CreateApiKeyRequest { Name = v, Expiration = "1d", @@ -207,16 +204,16 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new .Expiration("1d") .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) , - (v, c, f) => c.SecurityCreateApiKey(f), - (v, c, f) => c.SecurityCreateApiKeyAsync(f), - (v, c, r) => c.SecurityCreateApiKey(r), - (v, c, r) => c.SecurityCreateApiKeyAsync(r) + (v, c, f) => c.CreateApiKey(f), + (v, c, f) => c.CreateApiKeyAsync(f), + (v, c, r) => c.CreateApiKey(r), + (v, c, r) => c.CreateApiKeyAsync(r) ) }, { GetApiKeyStep, u => - u.Calls( - v => new SecurityGetApiKeyRequest + u.Calls( + v => new GetApiKeyRequest { Name = v, RequestConfiguration = new RequestConfiguration @@ -232,16 +229,16 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new .Name(v) .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) , - (v, c, f) => c.SecurityGetApiKey(f), - (v, c, f) => c.SecurityGetApiKeyAsync(f), - (v, c, r) => c.SecurityGetApiKey(r), - (v, c, r) => c.SecurityGetApiKeyAsync(r) + (v, c, f) => c.GetApiKey(f), + (v, c, f) => c.GetApiKeyAsync(f), + (v, c, r) => c.GetApiKey(r), + (v, c, r) => c.GetApiKeyAsync(r) ) }, { InvalidateApiKeyStep, u => - u.Calls( - v => new SecurityInvalidateApiKeyRequest + u.Calls( + v => new InvalidateApiKeyRequest { Name = v, RequestConfiguration = new RequestConfiguration @@ -257,15 +254,15 @@ public SecurityApiKeyTests(XPackCluster cluster, EndpointUsage usage) : base(new .Name(v) .RequestConfiguration(r => r.BasicAuthentication($"user-{v}", "password")) , - (v, c, f) => c.SecurityInvalidateApiKey(f), - (v, c, f) => c.SecurityInvalidateApiKeyAsync(f), - (v, c, r) => c.SecurityInvalidateApiKey(r), - (v, c, r) => c.SecurityInvalidateApiKeyAsync(r) + (v, c, f) => c.InvalidateApiKey(f), + (v, c, f) => c.InvalidateApiKeyAsync(f), + (v, c, r) => c.InvalidateApiKey(r), + (v, c, r) => c.InvalidateApiKeyAsync(r) ) } }) { } - [I] public async Task SecurityCreateApiKeyResponse() => await Assert(CreateApiKeyWithRolesStep, r => + [I] public async Task SecurityCreateApiKeyResponse() => await Assert(CreateApiKeyWithRolesStep, r => { r.IsValid.Should().BeTrue(); r.Id.Should().NotBeNullOrEmpty(); @@ -274,7 +271,7 @@ [I] public async Task SecurityCreateApiKeyResponse() => await Assert await Assert(GetApiKeyStep, r => + [I] public async Task SecurityGetApiKeyResponse() => await Assert(GetApiKeyStep, r => { r.IsValid.Should().BeTrue(); r.ApiKeys.Should().NotBeNullOrEmpty(); @@ -291,7 +288,7 @@ [I] public async Task SecurityGetApiKeyResponse() => await Assert await Assert(InvalidateApiKeyStep, r => + [I] public async Task SecurityInvalidateApiKeyResponse() => await Assert(InvalidateApiKeyStep, r => { r.IsValid.Should().BeTrue(); r.ErrorCount.Should().Be(0); diff --git a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs index 331cc86ba25..12400724c51 100644 --- a/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs +++ b/src/Tests/Tests/XPack/Security/ApiKey/SecurityApiKeyUrlTests.cs @@ -3,32 +3,32 @@ using Nest; using Tests.Framework; -namespace Tests.XPack.Security.User.SecurityInvalidateApiKey +namespace Tests.XPack.Security.ApiKey { public class SecurityApiKeyUrlTests : UrlTestsBase { [U] public override async Task Urls() => await UrlTester.DELETE("/_security/api_key") - .Fluent(c => c.SecurityInvalidateApiKey()) - .Request(c => c.SecurityInvalidateApiKey(new SecurityInvalidateApiKeyRequest())) - .FluentAsync(c => c.SecurityInvalidateApiKeyAsync()) - .RequestAsync(c => c.SecurityInvalidateApiKeyAsync(new SecurityInvalidateApiKeyRequest())); + .Fluent(c => c.InvalidateApiKey()) + .Request(c => c.InvalidateApiKey(new InvalidateApiKeyRequest())) + .FluentAsync(c => c.InvalidateApiKeyAsync()) + .RequestAsync(c => c.InvalidateApiKeyAsync(new InvalidateApiKeyRequest())); } public class SecurityGetApiKeyUrlTests : UrlTestsBase { [U] public override async Task Urls() => await UrlTester.GET("/_security/api_key") - .Fluent(c => c.SecurityGetApiKey()) - .Request(c => c.SecurityGetApiKey(new SecurityGetApiKeyRequest())) - .FluentAsync(c => c.SecurityGetApiKeyAsync()) - .RequestAsync(c => c.SecurityGetApiKeyAsync(new SecurityGetApiKeyRequest())); + .Fluent(c => c.GetApiKey()) + .Request(c => c.GetApiKey(new GetApiKeyRequest())) + .FluentAsync(c => c.GetApiKeyAsync()) + .RequestAsync(c => c.GetApiKeyAsync(new GetApiKeyRequest())); } public class SecurityCreateApiKeyUrlTests : UrlTestsBase { [U] public override async Task Urls() => await UrlTester.PUT("/_security/api_key") - .Fluent(c => c.SecurityCreateApiKey()) - .Request(c => c.SecurityCreateApiKey(new SecurityCreateApiKeyRequest())) - .FluentAsync(c => c.SecurityCreateApiKeyAsync()) - .RequestAsync(c => c.SecurityCreateApiKeyAsync(new SecurityCreateApiKeyRequest())); + .Fluent(c => c.CreateApiKey()) + .Request(c => c.CreateApiKey(new CreateApiKeyRequest())) + .FluentAsync(c => c.CreateApiKeyAsync()) + .RequestAsync(c => c.CreateApiKeyAsync(new CreateApiKeyRequest())); } }