[
https://issues.apache.org/jira/browse/KNOX-2835?focusedWorklogId=824592&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-824592
]
ASF GitHub Bot logged work on KNOX-2835:
----------------------------------------
Author: ASF GitHub Bot
Created on: 09/Nov/22 14:00
Start Date: 09/Nov/22 14:00
Worklog Time Spent: 10m
Work Description: smolnar82 commented on code in PR #670:
URL: https://github.com/apache/knox/pull/670#discussion_r1017963443
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/DefaultConfigurationMonitorProvider.java:
##########
@@ -16,16 +16,60 @@
*/
package org.apache.knox.gateway.topology.monitor;
+import java.io.File;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
import org.apache.knox.gateway.config.GatewayConfig;
-import
org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.factory.AbstractServiceFactory;
+import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.AliasServiceException;
+import
org.apache.knox.gateway.topology.monitor.db.DbRemoteConfigurationMonitor;
+import org.apache.knox.gateway.topology.monitor.db.LocalDirectory;
+import org.apache.knox.gateway.topology.monitor.db.RemoteConfigDatabase;
+import org.apache.knox.gateway.util.JDBCUtils;
-public class DefaultConfigurationMonitorProvider implements
RemoteConfigurationMonitorProvider {
+public class DefaultConfigurationMonitorProvider extends
AbstractServiceFactory {
+ @Override
+ protected RemoteConfigurationMonitor createService(GatewayServices
gatewayServices,
+ ServiceType serviceType,
+ GatewayConfig gatewayConfig,
+ Map<String, String> options,
+ String implementation) throws
ServiceLifecycleException {
+ RemoteConfigurationMonitor service = null;
+ if (matchesImplementation(implementation,
ZkRemoteConfigurationMonitor.class)) {
+ service = new ZkRemoteConfigurationMonitor(gatewayConfig,
gatewayServices.getService(ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE));
+ } else if (matchesImplementation(implementation,
DbRemoteConfigurationMonitor.class)) {
+ service = createDbBasedMonitor(gatewayConfig,
gatewayServices.getService(ServiceType.ALIAS_SERVICE));
Review Comment:
The abstract class has a protected method called `getAliasService` for the
same; please re-use that.
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/db/DbRemoteConfigurationMonitor.java:
##########
@@ -0,0 +1,144 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.monitor.db;
+
+import static java.util.stream.Collectors.toSet;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.topology.monitor.RemoteConfigurationMonitor;
+
+public class DbRemoteConfigurationMonitor implements
RemoteConfigurationMonitor {
+ private static final GatewayMessages LOG =
MessagesFactory.get(GatewayMessages.class);
+ public static final int OFFSET_SECONDS = 5;
+ private final RemoteConfigDatabase db;
+ private final LocalDirectory providersDir;
+ private final LocalDirectory descriptorsDir;
+ private long intervalSeconds;
+ private final ScheduledExecutorService executor;
+ private Instant lastSyncTime;
+
+ public DbRemoteConfigurationMonitor(RemoteConfigDatabase db, LocalDirectory
providersDir, LocalDirectory descriptorsDir, long intervalSeconds) {
+ this.db = db;
+ this.providersDir = providersDir;
+ this.descriptorsDir = descriptorsDir;
+ this.executor = Executors.newSingleThreadScheduledExecutor();
+ this.intervalSeconds = intervalSeconds;
+ }
+
+ @Override
+ public void init(GatewayConfig config, Map<String, String> options) throws
ServiceLifecycleException {}
+
+ @Override
+ public void start() throws ServiceLifecycleException {
+ LOG.startingDbRemoteConfigurationMonitor(intervalSeconds);
+ executor.scheduleWithFixedDelay(this::sync, intervalSeconds,
intervalSeconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public void stop() throws ServiceLifecycleException {
+ executor.shutdown();
+ }
+
+ @Override
+ public boolean createProvider(String name, String content) {
+ return db.putProvider(name, content);
+ }
+
+ @Override
+ public boolean createDescriptor(String name, String content) {
+ return db.putDescriptor(name, content);
+ }
+
+ @Override
+ public boolean deleteProvider(String name) {
+ return db.deleteProvider(name);
+ }
+
+ @Override
+ public boolean deleteDescriptor(String name) {
+ return db.deleteDescriptor(name);
+ }
+
+ public void sync() {
+ try {
+ syncLocalWithRemote(db.selectProviders(), providersDir);
+ syncLocalWithRemote(db.selectDescriptors(), descriptorsDir);
+ lastSyncTime = Instant.now();
Review Comment:
You may add a DEBUG-level log message with the fact that sync was done.
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/db/DbRemoteConfigurationMonitor.java:
##########
@@ -0,0 +1,144 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.monitor.db;
+
+import static java.util.stream.Collectors.toSet;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.topology.monitor.RemoteConfigurationMonitor;
+
+public class DbRemoteConfigurationMonitor implements
RemoteConfigurationMonitor {
+ private static final GatewayMessages LOG =
MessagesFactory.get(GatewayMessages.class);
+ public static final int OFFSET_SECONDS = 5;
+ private final RemoteConfigDatabase db;
+ private final LocalDirectory providersDir;
+ private final LocalDirectory descriptorsDir;
+ private long intervalSeconds;
+ private final ScheduledExecutorService executor;
+ private Instant lastSyncTime;
+
+ public DbRemoteConfigurationMonitor(RemoteConfigDatabase db, LocalDirectory
providersDir, LocalDirectory descriptorsDir, long intervalSeconds) {
+ this.db = db;
+ this.providersDir = providersDir;
+ this.descriptorsDir = descriptorsDir;
+ this.executor = Executors.newSingleThreadScheduledExecutor();
+ this.intervalSeconds = intervalSeconds;
+ }
+
+ @Override
+ public void init(GatewayConfig config, Map<String, String> options) throws
ServiceLifecycleException {}
+
+ @Override
+ public void start() throws ServiceLifecycleException {
+ LOG.startingDbRemoteConfigurationMonitor(intervalSeconds);
+ executor.scheduleWithFixedDelay(this::sync, intervalSeconds,
intervalSeconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public void stop() throws ServiceLifecycleException {
+ executor.shutdown();
+ }
+
+ @Override
+ public boolean createProvider(String name, String content) {
+ return db.putProvider(name, content);
+ }
+
+ @Override
+ public boolean createDescriptor(String name, String content) {
+ return db.putDescriptor(name, content);
+ }
+
+ @Override
+ public boolean deleteProvider(String name) {
+ return db.deleteProvider(name);
+ }
+
+ @Override
+ public boolean deleteDescriptor(String name) {
+ return db.deleteDescriptor(name);
Review Comment:
DEBUG-level log about removing a descriptor from the DB.
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/DefaultConfigurationMonitorProvider.java:
##########
@@ -16,16 +16,60 @@
*/
package org.apache.knox.gateway.topology.monitor;
+import java.io.File;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
import org.apache.knox.gateway.config.GatewayConfig;
-import
org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.factory.AbstractServiceFactory;
+import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.AliasServiceException;
+import
org.apache.knox.gateway.topology.monitor.db.DbRemoteConfigurationMonitor;
+import org.apache.knox.gateway.topology.monitor.db.LocalDirectory;
+import org.apache.knox.gateway.topology.monitor.db.RemoteConfigDatabase;
+import org.apache.knox.gateway.util.JDBCUtils;
-public class DefaultConfigurationMonitorProvider implements
RemoteConfigurationMonitorProvider {
+public class DefaultConfigurationMonitorProvider extends
AbstractServiceFactory {
Review Comment:
I think this should be called a service factory from now on:
`RemoteConfigurationMonitorServiceFactory`.
##########
gateway-spi/src/main/java/org/apache/knox/gateway/topology/monitor/RemoteConfigurationMonitor.java:
##########
@@ -16,14 +16,11 @@
*/
package org.apache.knox.gateway.topology.monitor;
-import
org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClient;
-
-public interface RemoteConfigurationMonitor {
-
- void start() throws Exception;
-
- void stop() throws Exception;
-
- RemoteConfigurationRegistryClient getClient();
+import org.apache.knox.gateway.services.Service;
+public interface RemoteConfigurationMonitor extends Service {
Review Comment:
This should be called a service to align with current naming conventions:
`RemoteConfigurationMonitorService`
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/db/DbRemoteConfigurationMonitor.java:
##########
@@ -0,0 +1,144 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.monitor.db;
+
+import static java.util.stream.Collectors.toSet;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.topology.monitor.RemoteConfigurationMonitor;
+
+public class DbRemoteConfigurationMonitor implements
RemoteConfigurationMonitor {
+ private static final GatewayMessages LOG =
MessagesFactory.get(GatewayMessages.class);
+ public static final int OFFSET_SECONDS = 5;
+ private final RemoteConfigDatabase db;
+ private final LocalDirectory providersDir;
+ private final LocalDirectory descriptorsDir;
+ private long intervalSeconds;
+ private final ScheduledExecutorService executor;
+ private Instant lastSyncTime;
+
+ public DbRemoteConfigurationMonitor(RemoteConfigDatabase db, LocalDirectory
providersDir, LocalDirectory descriptorsDir, long intervalSeconds) {
+ this.db = db;
+ this.providersDir = providersDir;
+ this.descriptorsDir = descriptorsDir;
+ this.executor = Executors.newSingleThreadScheduledExecutor();
+ this.intervalSeconds = intervalSeconds;
+ }
+
+ @Override
+ public void init(GatewayConfig config, Map<String, String> options) throws
ServiceLifecycleException {}
+
+ @Override
+ public void start() throws ServiceLifecycleException {
+ LOG.startingDbRemoteConfigurationMonitor(intervalSeconds);
+ executor.scheduleWithFixedDelay(this::sync, intervalSeconds,
intervalSeconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public void stop() throws ServiceLifecycleException {
+ executor.shutdown();
+ }
+
+ @Override
+ public boolean createProvider(String name, String content) {
+ return db.putProvider(name, content);
Review Comment:
DEBUG-level log about creating the provider in the DB.
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/db/DbRemoteConfigurationMonitor.java:
##########
@@ -0,0 +1,144 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.monitor.db;
+
+import static java.util.stream.Collectors.toSet;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.topology.monitor.RemoteConfigurationMonitor;
+
+public class DbRemoteConfigurationMonitor implements
RemoteConfigurationMonitor {
+ private static final GatewayMessages LOG =
MessagesFactory.get(GatewayMessages.class);
+ public static final int OFFSET_SECONDS = 5;
+ private final RemoteConfigDatabase db;
+ private final LocalDirectory providersDir;
+ private final LocalDirectory descriptorsDir;
+ private long intervalSeconds;
+ private final ScheduledExecutorService executor;
+ private Instant lastSyncTime;
+
+ public DbRemoteConfigurationMonitor(RemoteConfigDatabase db, LocalDirectory
providersDir, LocalDirectory descriptorsDir, long intervalSeconds) {
+ this.db = db;
+ this.providersDir = providersDir;
+ this.descriptorsDir = descriptorsDir;
+ this.executor = Executors.newSingleThreadScheduledExecutor();
+ this.intervalSeconds = intervalSeconds;
+ }
+
+ @Override
+ public void init(GatewayConfig config, Map<String, String> options) throws
ServiceLifecycleException {}
+
+ @Override
+ public void start() throws ServiceLifecycleException {
+ LOG.startingDbRemoteConfigurationMonitor(intervalSeconds);
+ executor.scheduleWithFixedDelay(this::sync, intervalSeconds,
intervalSeconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public void stop() throws ServiceLifecycleException {
+ executor.shutdown();
+ }
+
+ @Override
+ public boolean createProvider(String name, String content) {
+ return db.putProvider(name, content);
+ }
+
+ @Override
+ public boolean createDescriptor(String name, String content) {
+ return db.putDescriptor(name, content);
Review Comment:
DEBUG-level log about creating the descriptor in the DB.
##########
gateway-server/src/main/java/org/apache/knox/gateway/topology/monitor/db/DbRemoteConfigurationMonitor.java:
##########
@@ -0,0 +1,144 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.monitor.db;
+
+import static java.util.stream.Collectors.toSet;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.topology.monitor.RemoteConfigurationMonitor;
+
+public class DbRemoteConfigurationMonitor implements
RemoteConfigurationMonitor {
+ private static final GatewayMessages LOG =
MessagesFactory.get(GatewayMessages.class);
+ public static final int OFFSET_SECONDS = 5;
+ private final RemoteConfigDatabase db;
+ private final LocalDirectory providersDir;
+ private final LocalDirectory descriptorsDir;
+ private long intervalSeconds;
+ private final ScheduledExecutorService executor;
+ private Instant lastSyncTime;
+
+ public DbRemoteConfigurationMonitor(RemoteConfigDatabase db, LocalDirectory
providersDir, LocalDirectory descriptorsDir, long intervalSeconds) {
+ this.db = db;
+ this.providersDir = providersDir;
+ this.descriptorsDir = descriptorsDir;
+ this.executor = Executors.newSingleThreadScheduledExecutor();
+ this.intervalSeconds = intervalSeconds;
+ }
+
+ @Override
+ public void init(GatewayConfig config, Map<String, String> options) throws
ServiceLifecycleException {}
+
+ @Override
+ public void start() throws ServiceLifecycleException {
+ LOG.startingDbRemoteConfigurationMonitor(intervalSeconds);
+ executor.scheduleWithFixedDelay(this::sync, intervalSeconds,
intervalSeconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public void stop() throws ServiceLifecycleException {
+ executor.shutdown();
+ }
+
+ @Override
+ public boolean createProvider(String name, String content) {
+ return db.putProvider(name, content);
+ }
+
+ @Override
+ public boolean createDescriptor(String name, String content) {
+ return db.putDescriptor(name, content);
+ }
+
+ @Override
+ public boolean deleteProvider(String name) {
+ return db.deleteProvider(name);
Review Comment:
DEBUG-level log about removing the provider from the DB.
Issue Time Tracking
-------------------
Worklog Id: (was: 824592)
Time Spent: 20m (was: 10m)
> SQL DB based topology monitor
> -----------------------------
>
> Key: KNOX-2835
> URL: https://issues.apache.org/jira/browse/KNOX-2835
> Project: Apache Knox
> Issue Type: New Feature
> Reporter: Attila Magyar
> Assignee: Attila Magyar
> Priority: Major
> Time Spent: 20m
> Remaining Estimate: 0h
>
> This is similar to KNOX-1012 but the providers/descriptors are stored in the
> database instead of zookeeper.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)