This is an automated email from the ASF dual-hosted git repository.
smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new 82d6d6039 KNOX-2907 - PollingConfigurationAnalyzer ignores services
without service model generator (#755)
82d6d6039 is described below
commit 82d6d603933fd012ad692c7cce729f9b03db1208
Author: Sandor Molnar <[email protected]>
AuthorDate: Fri May 5 17:38:43 2023 +0200
KNOX-2907 - PollingConfigurationAnalyzer ignores services without service
model generator (#755)
---
.../cm/ClouderaManagerServiceDiscovery.java | 15 +------
.../ClouderaManagerServiceDiscoveryMessages.java | 4 +-
.../discovery/cm/ServiceModelGeneratorsHolder.java | 46 ++++++++++++++++++++++
.../cm/monitor/PollingConfigurationAnalyzer.java | 20 +++++++---
.../monitor/PollingConfigurationAnalyzerTest.java | 8 ++--
5 files changed, 69 insertions(+), 24 deletions(-)
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
index f25683b74..016b9467a 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
@@ -45,12 +45,9 @@ import java.security.KeyStore;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
-import java.util.ServiceLoader;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@@ -78,15 +75,7 @@ public class ClouderaManagerServiceDiscovery implements
ServiceDiscovery, Cluste
public static final String CM_SERVICE_TYPE = "CM";
public static final String CM_ROLE_TYPE = "CM_SERVER";
- private static Map<String, List<ServiceModelGenerator>>
serviceModelGenerators = new HashMap<>();
- static {
- ServiceLoader<ServiceModelGenerator> loader =
ServiceLoader.load(ServiceModelGenerator.class);
- for (ServiceModelGenerator serviceModelGenerator : loader) {
- List<ServiceModelGenerator> smgList =
-
serviceModelGenerators.computeIfAbsent(serviceModelGenerator.getServiceType(),
k -> new ArrayList<>());
- smgList.add(serviceModelGenerator);
- }
- }
+ private ServiceModelGeneratorsHolder serviceModelGeneratorsHolder =
ServiceModelGeneratorsHolder.getInstance();
private boolean debug;
@@ -277,7 +266,7 @@ public class ClouderaManagerServiceDiscovery implements
ServiceDiscovery, Cluste
serviceList.add(cmService);
for (ApiService service : serviceList) {
- final List<ServiceModelGenerator> modelGenerators =
serviceModelGenerators.get(service.getType());
+ final List<ServiceModelGenerator> modelGenerators =
serviceModelGeneratorsHolder.getServiceModelGenerators(service.getType());
if (shouldSkipServiceDiscovery(modelGenerators, includedServices)) {
//log.skipServiceDiscovery(service.getName(), service.getType());
//continue;
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
index cd4a1f2f3..06f6f7ff2 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
@@ -196,8 +196,8 @@ public interface ClouderaManagerServiceDiscoveryMessages {
@Message(level = MessageLevel.DEBUG, text = "There is no any activation
event found within the given time period")
void noActivationEventFound();
- @Message(level = MessageLevel.DEBUG, text = "Activation event relevance: {0}
= {1}")
- void activationEventRelevance(String eventId, String relevance);
+ @Message(level = MessageLevel.DEBUG, text = "Activation event relevance: {0}
= {1} ({2} / {3} / {4} / {5})")
+ void activationEventRelevance(String eventId, String relevance, String
command, String status, String serviceType, boolean
serviceModelGeneratorExists);
@Message(level = MessageLevel.DEBUG, text = "Activation event - {0} - has
already been processed, skipping ...")
void activationEventAlreadyProcessed(String eventId);
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGeneratorsHolder.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGeneratorsHolder.java
new file mode 100644
index 000000000..315f80e88
--- /dev/null
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGeneratorsHolder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package org.apache.knox.gateway.topology.discovery.cm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+
+public class ServiceModelGeneratorsHolder {
+
+ private static final ServiceModelGeneratorsHolder INSTANCE = new
ServiceModelGeneratorsHolder();
+ private final Map<String, List<ServiceModelGenerator>>
serviceModelGenerators = new HashMap<>();
+
+ private ServiceModelGeneratorsHolder() {
+ final ServiceLoader<ServiceModelGenerator> loader =
ServiceLoader.load(ServiceModelGenerator.class);
+ for (ServiceModelGenerator serviceModelGenerator : loader) {
+ List<ServiceModelGenerator> smgList =
serviceModelGenerators.computeIfAbsent(serviceModelGenerator.getServiceType(),
k -> new ArrayList<>());
+ smgList.add(serviceModelGenerator);
+ }
+ }
+
+ public static ServiceModelGeneratorsHolder getInstance() {
+ return INSTANCE;
+ }
+
+ public List<ServiceModelGenerator> getServiceModelGenerators(String
serviceType) {
+ return serviceModelGenerators.get(serviceType);
+ }
+
+}
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
index 121b764e5..1c0374d81 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
@@ -46,6 +46,7 @@ import
org.apache.knox.gateway.topology.ClusterConfigurationMonitorService;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import
org.apache.knox.gateway.topology.discovery.cm.ClouderaManagerServiceDiscoveryMessages;
import org.apache.knox.gateway.topology.discovery.cm.DiscoveryApiClient;
+import
org.apache.knox.gateway.topology.discovery.cm.ServiceModelGeneratorsHolder;
import org.apache.knox.gateway.topology.simple.SimpleDescriptor;
import org.apache.knox.gateway.topology.simple.SimpleDescriptorFactory;
@@ -141,6 +142,8 @@ public class PollingConfigurationAnalyzer implements
Runnable {
// The amount of time before "now" to will check for start events the first
time
private long eventQueryDefaultTimestampOffset =
DEFAULT_EVENT_QUERY_DEFAULT_TIMESTAMP_OFFSET;
+ private ServiceModelGeneratorsHolder serviceModelGeneratorsHolder =
ServiceModelGeneratorsHolder.getInstance();
+
private boolean isActive;
private final GatewayConfig gatewayConfig;
@@ -455,11 +458,18 @@ public class PollingConfigurationAnalyzer implements
Runnable {
@SuppressWarnings("unchecked")
private boolean isRelevantEvent(ApiEvent event) {
final Map<String, Object> attributeMap =
getAttributeMap(event.getAttributes());
- final String command =
- attributeMap.containsKey(COMMAND) ? ((List<String>)
attributeMap.get(COMMAND)).get(0) : "";
- final String status =
- attributeMap.containsKey(COMMAND_STATUS) ? ((List<String>)
attributeMap.get(COMMAND_STATUS)).get(0) : "";
- return (ACTIVATION_COMMANDS.contains(command) &&
SUCCEEDED_STATUS.equals(status));
+ final String command = getAttribute(attributeMap, COMMAND);
+ final String status = getAttribute(attributeMap, COMMAND_STATUS);
+ final String serviceType = getAttribute(attributeMap,
StartEvent.ATTR_SERVICE_TYPE);
+ final boolean serviceModelGeneratorExists =
serviceModelGeneratorsHolder.getServiceModelGenerators(serviceType) != null;
+ final boolean relevant = ACTIVATION_COMMANDS.contains(command) &&
SUCCEEDED_STATUS.equals(status) && serviceModelGeneratorExists;
+ log.activationEventRelevance(event.getId(), String.valueOf(relevant),
command, status, serviceType, serviceModelGeneratorExists);
+ return relevant;
+ }
+
+ @SuppressWarnings("unchecked")
+ private String getAttribute( Map<String, Object> attributeMap, String
attributeName) {
+ return attributeMap.containsKey(attributeName) ? ((List<String>)
attributeMap.get(attributeName)).get(0) : "";
}
private Map<String, Object> getAttributeMap(List<ApiEventAttribute>
attributes) {
diff --git
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
index f2df7224d..33f5e8f93 100644
---
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
+++
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
@@ -221,8 +221,8 @@ public class PollingConfigurationAnalyzerTest {
// Simulate a successful rolling cluster restart event
ApiEvent rollingRestartEvent = createApiEvent(clusterName,
-
PollingConfigurationAnalyzer.CM_SERVICE_TYPE,
-
PollingConfigurationAnalyzer.CM_SERVICE,
+
HiveOnTezServiceModelGenerator.SERVICE_TYPE,
+
HiveOnTezServiceModelGenerator.SERVICE,
PollingConfigurationAnalyzer.ROLLING_RESTART_COMMAND,
PollingConfigurationAnalyzer.SUCCEEDED_STATUS,
"EV_CLUSTER_ROLLING_RESTARTED");
@@ -241,7 +241,7 @@ public class PollingConfigurationAnalyzerTest {
final String clusterName = "Cluster 8";
// Simulate a successful restart waiting for staleness event
- final ApiEvent rollingRestartEvent = createApiEvent(clusterName,
PollingConfigurationAnalyzer.CM_SERVICE_TYPE,
PollingConfigurationAnalyzer.CM_SERVICE,
+ final ApiEvent rollingRestartEvent = createApiEvent(clusterName,
HiveOnTezServiceModelGenerator.SERVICE_TYPE,
HiveOnTezServiceModelGenerator.SERVICE,
PollingConfigurationAnalyzer.RESTART_WAITING_FOR_STALENESS_SUCCESS_COMMAND,
PollingConfigurationAnalyzer.SUCCEEDED_STATUS, "EV_CLUSTER_RESTARTED");
final ChangeListener listener = doTestEvent(rollingRestartEvent, address,
clusterName, Collections.emptyMap(), Collections.emptyMap());
@@ -254,7 +254,7 @@ public class PollingConfigurationAnalyzerTest {
final String clusterName = "Cluster 9";
// Simulate a successful restart waiting for staleness event with id = 123
- final ApiEvent rollingRestartEvent = createApiEvent(clusterName,
PollingConfigurationAnalyzer.CM_SERVICE_TYPE,
PollingConfigurationAnalyzer.CM_SERVICE,
+ final ApiEvent rollingRestartEvent = createApiEvent(clusterName,
HiveOnTezServiceModelGenerator.SERVICE_TYPE,
HiveOnTezServiceModelGenerator.SERVICE,
PollingConfigurationAnalyzer.RESTART_WAITING_FOR_STALENESS_SUCCESS_COMMAND,
PollingConfigurationAnalyzer.SUCCEEDED_STATUS, "EV_CLUSTER_RESTARTED",
"123");