You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2020/07/08 13:18:26 UTC
[brooklyn-server] 16/20: workaround for classload bug in
kubernetes-client
This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 9aa4eabbdb0ad2563fca209023c7c953b717d1d2
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Tue Jul 7 23:27:15 2020 +0100
workaround for classload bug in kubernetes-client
---
.../location/kubernetes/KubernetesLocation.java | 34 +++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/locations/container/src/main/java/org/apache/brooklyn/container/location/kubernetes/KubernetesLocation.java b/locations/container/src/main/java/org/apache/brooklyn/container/location/kubernetes/KubernetesLocation.java
index 4ab4ca0..2a0bcce 100644
--- a/locations/container/src/main/java/org/apache/brooklyn/container/location/kubernetes/KubernetesLocation.java
+++ b/locations/container/src/main/java/org/apache/brooklyn/container/location/kubernetes/KubernetesLocation.java
@@ -25,15 +25,20 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.ServiceLoader;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import javax.annotation.Nullable;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.location.LocationSpec;
import org.apache.brooklyn.api.location.MachineLocation;
import org.apache.brooklyn.api.location.MachineProvisioningLocation;
import org.apache.brooklyn.api.location.PortRange;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.api.sensor.EnricherSpec;
import org.apache.brooklyn.config.ConfigKey;
@@ -52,6 +57,8 @@ import org.apache.brooklyn.core.location.PortRanges;
import org.apache.brooklyn.core.location.access.PortForwardManager;
import org.apache.brooklyn.core.location.access.PortForwardManagerLocationResolver;
import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
+import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
+import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
import org.apache.brooklyn.core.network.AbstractOnNetworkEnricher;
import org.apache.brooklyn.core.network.OnPublicNetworkEnricher;
import org.apache.brooklyn.core.sensor.Sensors;
@@ -71,6 +78,8 @@ import org.apache.brooklyn.util.stream.Streams;
import org.apache.brooklyn.util.text.Identifiers;
import org.apache.brooklyn.util.text.Strings;
import org.apache.brooklyn.util.time.Duration;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -124,8 +133,11 @@ import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
import io.fabric8.kubernetes.api.model.apps.DeploymentStatus;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
+import io.fabric8.kubernetes.client.Handlers;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.kubernetes.client.ResourceHandler;
+import io.fabric8.kubernetes.client.handlers.ServiceHandler;
public class KubernetesLocation extends AbstractLocation implements MachineProvisioningLocation<KubernetesMachineLocation>, KubernetesLocationConfig {
@@ -166,6 +178,25 @@ public class KubernetesLocation extends AbstractLocation implements MachineProvi
public static final String ADDRESS_KEY = "address";
private ConfigBag currentConfig;
+ private static void fixKubernetesClientClassloadBug(String context, @Nullable ManagementContext mgmt) {
+ // KubernetesListHandler kind Service which means its ResourceHandler.Key clobbers that of ServiceHandler,
+ // causing an error when KubernetesList.edit(item) is called with an item of type Service.
+ // persistently re-declare the ServiceHandler as the preferred item to try to force the right one to be used.
+ // TODO this can be removed once fabric8io has merged https://github.com/fabric8io/kubernetes-client/pull/2336
+ try {
+ // ensure ServiceHandler is loaded in preference to KubernetesList which pretends to be Kind = Service !
+ LOG.trace("HANDLER "+context+" was: "+Handlers.get("Service", "v1"));
+ Handlers.register(new ServiceHandler());
+ LOG.trace("HANDLER "+context+" now: "+Handlers.get("Service", "v1"));
+ } catch (Exception e) {
+ LOG.warn("Error fixing classload error in fabric8/kubernetes-client "+context+"; there may be issues deploying services via KubernetesResource: "+e, e);
+ }
+ }
+
+ static {
+ fixKubernetesClientClassloadBug("on init", null);
+ }
+
public KubernetesLocation() {
super();
}
@@ -344,7 +375,6 @@ public class KubernetesLocation extends AbstractLocation implements MachineProvi
String processedContents = TemplateProcessor.processTemplateContents(templateContents, (EntityInternal) entity, setup.getAllConfig());
InputStream processedResource = Streams.newInputStreamWithContents(processedContents);
-
try (KubernetesClient clientUnnamespaced = getClient()) {
Namespace namespaceFromConfig = null;
Boolean shouldCreate = setup.get(CREATE_NAMESPACE);
@@ -361,7 +391,9 @@ public class KubernetesLocation extends AbstractLocation implements MachineProvi
namespaceFromConfig!=null ?
((DefaultKubernetesClient)clientUnnamespaced).inNamespace(namespaceFromConfig.getMetadata().getName())
: clientUnnamespaced;
+ fixKubernetesClientClassloadBug("before create "+resourceUri, getManagementContext());
final List<HasMetadata> result = client.load(processedResource).createOrReplace();
+ fixKubernetesClientClassloadBug("after create "+resourceUri, getManagementContext());
ExitCondition exitCondition = new ExitCondition() {
@Override