You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2020/09/21 20:58:37 UTC

[sling-org-apache-sling-app-cms] 05/06: Adding support for dynamically updating the distribution targets based on a discovery topology

This is an automated email from the ASF dual-hosted git repository.

dklco pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git

commit 4faa59464e8304e4485f49ce2cea147ec26646f2
Author: Dan Klco <dk...@apache.org>
AuthorDate: Mon Sep 21 16:13:50 2020 -0400

    Adding support for dynamically updating the distribution targets based on a discovery topology
---
 core/pom.xml                                       |   4 +
 .../ForwardAgentEndpointSynchronization.java       | 100 +++++++++++++++++++++
 .../ForwardAgentEndpointSynchronizationConfig.java |  27 ++++++
 .../publication/PublicationPropertyProvider.java   |  62 +++++++++++++
 .../PublicationPropertyProviderConfig.java         |  28 ++++++
 5 files changed, 221 insertions(+)

diff --git a/core/pom.xml b/core/pom.xml
index 139bfc4..af4f12d 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -237,5 +237,9 @@
             <artifactId>org.apache.sling.distribution.api</artifactId>
             <groupId>org.apache.sling</groupId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.discovery.api</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/core/src/main/java/org/apache/sling/cms/core/publication/ForwardAgentEndpointSynchronization.java b/core/src/main/java/org/apache/sling/cms/core/publication/ForwardAgentEndpointSynchronization.java
new file mode 100644
index 0000000..940dc35
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/publication/ForwardAgentEndpointSynchronization.java
@@ -0,0 +1,100 @@
+/*
+ * 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.sling.cms.core.publication;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.sling.cms.publication.INSTANCE_TYPE;
+import org.apache.sling.discovery.InstanceDescription;
+import org.apache.sling.discovery.TopologyEvent;
+import org.apache.sling.discovery.TopologyEventListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.Designate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(service = TopologyEventListener.class, immediate = true)
+@Designate(ocd = ForwardAgentEndpointSynchronizationConfig.class)
+public class ForwardAgentEndpointSynchronization implements TopologyEventListener {
+
+    private static final Logger log = LoggerFactory.getLogger(ForwardAgentEndpointSynchronization.class);
+
+    private ForwardAgentEndpointSynchronizationConfig config;
+
+    public static final String ENDPOINT_PROPERTY = "packageImporter.endpoints";
+
+    @Reference
+    private ConfigurationAdmin configAdmin;
+
+    @Activate
+    public void activate(ForwardAgentEndpointSynchronizationConfig config) {
+        log.info("activate");
+        this.config = config;
+    }
+
+    private void updateInstances(Set<InstanceDescription> instances) {
+        log.info("updateInstances");
+
+        String[] endpoints = instances.stream().map(id -> {
+            String endpointBase = id.getProperty(InstanceDescription.PROPERTY_ENDPOINTS).split("\\,")[0];
+            return endpointBase + id.getProperty(PublicationPropertyProvider.ENDPOINT_PATHS);
+        }).collect(Collectors.toList()).toArray(new String[0]);
+        if (log.isDebugEnabled()) {
+            log.debug("Updating with endpoints: [{}]", Arrays.stream(endpoints).collect(Collectors.joining(",")));
+        }
+        try {
+            log.debug("Updating configurations matching: {}", config.agentTarget());
+            Configuration[] configurations = configAdmin.listConfigurations(
+                    "(&(service.factoryPid=org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory)"
+                            + config.agentTarget() + ")");
+            if (configurations != null) {
+                for (Configuration cfg : configurations) {
+                    log.debug("Updating configuration {}", cfg.getPid());
+                    Dictionary<String, Object> properties = cfg.getProperties();
+                    if (!Arrays.equals(endpoints, (String[]) properties.get(ENDPOINT_PROPERTY))) {
+                        properties.put(ENDPOINT_PROPERTY, endpoints);
+                        cfg.update(properties);
+                        log.debug("Configurations updated!");
+                    } else {
+                        log.debug("Configurations match, not updating");
+                    }
+                }
+            } else {
+                log.warn("No applicable configurations found");
+            }
+        } catch (IOException | InvalidSyntaxException e) {
+            log.error("Failed to update configuration", e);
+        }
+    }
+
+    @Override
+    public void handleTopologyEvent(TopologyEvent event) {
+        Set<InstanceDescription> renderers = event.getNewView().findInstances(id -> INSTANCE_TYPE.RENDERER.toString()
+                .equals(id.getProperty(PublicationPropertyProvider.INSTANCE_TYPE)));
+        updateInstances(renderers);
+    }
+
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/publication/ForwardAgentEndpointSynchronizationConfig.java b/core/src/main/java/org/apache/sling/cms/core/publication/ForwardAgentEndpointSynchronizationConfig.java
new file mode 100644
index 0000000..1234c47
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/publication/ForwardAgentEndpointSynchronizationConfig.java
@@ -0,0 +1,27 @@
+/*
+ * 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.sling.cms.core.publication;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(name = "%forwardagentsync.config.name", description = "%forwardagentsync.config.description", localization = "OSGI-INF/l10n/bundle")
+public @interface ForwardAgentEndpointSynchronizationConfig {
+
+    @AttributeDefinition(name = "%forwardagentsync.param.agentTarget.name", description = "%forwardagentsync.param.agentTarget.description")
+    String agentTarget();
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/publication/PublicationPropertyProvider.java b/core/src/main/java/org/apache/sling/cms/core/publication/PublicationPropertyProvider.java
new file mode 100644
index 0000000..7d46c57
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/publication/PublicationPropertyProvider.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sling.cms.core.publication;
+
+import org.apache.sling.cms.publication.PublicationManagerFactory;
+import org.apache.sling.discovery.PropertyProvider;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.Designate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(service = PropertyProvider.class, property = {
+        PropertyProvider.PROPERTY_PROPERTIES + "=" + PublicationPropertyProvider.ENDPOINT_PATHS,
+        PropertyProvider.PROPERTY_PROPERTIES + "=" + PublicationPropertyProvider.INSTANCE_TYPE })
+@Designate(ocd = PublicationPropertyProviderConfig.class)
+public class PublicationPropertyProvider implements PropertyProvider {
+
+    private static final Logger log = LoggerFactory.getLogger(PublicationPropertyProvider.class);
+    public static final String ENDPOINT_PATHS = "pub.endpointPaths";
+    public static final String INSTANCE_TYPE = "pub.instanceType";
+
+    @Reference
+    private PublicationManagerFactory publicationManagerFactory;
+
+    private PublicationPropertyProviderConfig config;
+
+    @Activate
+    public void activate(PublicationPropertyProviderConfig config) {
+        log.info("activate");
+        this.config = config;
+    }
+
+    @Override
+    public String getProperty(String name) {
+        log.trace("getProperty({})", name);
+        if (ENDPOINT_PATHS.equals(name)) {
+            return config.endpointPath();
+        } else if (INSTANCE_TYPE.equals(name)) {
+            return publicationManagerFactory.getInstanceType().toString();
+        }
+        return null;
+    }
+
+
+
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/publication/PublicationPropertyProviderConfig.java b/core/src/main/java/org/apache/sling/cms/core/publication/PublicationPropertyProviderConfig.java
new file mode 100644
index 0000000..1e79c9f
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/publication/PublicationPropertyProviderConfig.java
@@ -0,0 +1,28 @@
+/*
+ * 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.sling.cms.core.publication;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(name = "%publicationpropprovider.config.name", description = "%publicationpropprovider.config.description", localization = "OSGI-INF/l10n/bundle")
+public @interface PublicationPropertyProviderConfig {
+
+    @AttributeDefinition(name = "%publicationpropprovider.param.endpointPath.name", description = "%publicationpropprovider.param.endpointPath.description")
+    String endpointPath() default "libs/sling/distribution/services/importers/default" ;
+
+}