From 3e32a60e76c715233dd83680e5d2cf3b46b3436e Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Thu, 20 Dec 2018 09:58:04 +0100 Subject: [PATCH] Remote cluster license checker and no license info. (#36837) Fail with a descriptive error when the xpack info returns no license info. Relates to #36815 --- .../license/RemoteClusterLicenseChecker.java | 5 +++ .../RemoteClusterLicenseCheckerTests.java | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/license/RemoteClusterLicenseChecker.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/license/RemoteClusterLicenseChecker.java index e7460d5a2eb38..b50d38c73c827 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/license/RemoteClusterLicenseChecker.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/license/RemoteClusterLicenseChecker.java @@ -7,6 +7,7 @@ package org.elasticsearch.license; import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.ResourceNotFoundException; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.support.ContextPreservingActionListener; import org.elasticsearch.client.Client; @@ -159,6 +160,10 @@ public void checkRemoteClusterLicenses(final List clusterAliases, final @Override public void onResponse(final XPackInfoResponse xPackInfoResponse) { final XPackInfoResponse.LicenseInfo licenseInfo = xPackInfoResponse.getLicenseInfo(); + if (licenseInfo == null) { + listener.onFailure(new ResourceNotFoundException("license info is missing for cluster [" + clusterAlias.get() + "]")); + return; + } if ((licenseInfo.getStatus() == LicenseStatus.ACTIVE) == false || predicate.test(License.OperationMode.resolve(licenseInfo.getMode())) == false) { listener.onResponse(LicenseCheck.failure(new RemoteClusterLicenseInfo(clusterAlias.get(), licenseInfo))); diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/license/RemoteClusterLicenseCheckerTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/license/RemoteClusterLicenseCheckerTests.java index 58ca42c7f681e..24a6960da4833 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/license/RemoteClusterLicenseCheckerTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/license/RemoteClusterLicenseCheckerTests.java @@ -7,6 +7,7 @@ package org.elasticsearch.license; import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.ResourceNotFoundException; import org.elasticsearch.action.ActionListener; import org.elasticsearch.client.Client; import org.elasticsearch.common.settings.Settings; @@ -349,6 +350,41 @@ public void testBuildErrorMessageForInactiveLicense() { equalTo("the license on cluster [expired-cluster] is not active")); } + public void testCheckRemoteClusterLicencesNoLicenseMetadata() { + final ThreadPool threadPool = createMockThreadPool(); + final Client client = createMockClient(threadPool); + doAnswer(invocationMock -> { + @SuppressWarnings("unchecked") ActionListener listener = + (ActionListener) invocationMock.getArguments()[2]; + listener.onResponse(new XPackInfoResponse(null, null, null)); + return null; + }).when(client).execute(same(XPackInfoAction.INSTANCE), any(), any()); + + final RemoteClusterLicenseChecker licenseChecker = + new RemoteClusterLicenseChecker(client, XPackLicenseState::isPlatinumOrTrialOperationMode); + final AtomicReference exception = new AtomicReference<>(); + + licenseChecker.checkRemoteClusterLicenses( + Collections.singletonList("remote"), + doubleInvocationProtectingListener(new ActionListener() { + + @Override + public void onResponse(final RemoteClusterLicenseChecker.LicenseCheck response) { + fail(); + } + + @Override + public void onFailure(final Exception e) { + exception.set(e); + } + + })); + + assertNotNull(exception.get()); + assertThat(exception.get(), instanceOf(ResourceNotFoundException.class)); + assertThat(exception.get().getMessage(), equalTo("license info is missing for cluster [remote]")); + } + private ActionListener doubleInvocationProtectingListener( final ActionListener listener) { final AtomicBoolean listenerInvoked = new AtomicBoolean();