gocd-contrib/openstack-elastic-agent

ConnectionException: Already connected

Closed this issue · 5 comments

Hi,

I have not before used this plugin but I tried the pre-release 0.11.0 in my GoCD v18.6.0 and it always fails with ConnectionException. Have you seen this before and is there something I'm missing here?

2018-06-24 09:53:54,221 ERROR [142@MessageListener for CreateAgentListener] JMSMessageListenerAdapter:77 - Exception thrown in message handling by listener com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener@72c57e2e
java.lang.RuntimeException: Interaction with plugin with id 'cd.go.contrib.elastic-agent.openstack' implementing 'elastic-agent' extension failed while requesting for 'cd.go.elastic-agent.create-agent'. Reason: [java.lang.RuntimeException: ConnectionException{message=Already connected, status=0}]
        at com.thoughtworks.go.plugin.access.PluginRequestHelper.submitRequest(PluginRequestHelper.java:57)
        at com.thoughtworks.go.plugin.access.elastic.v3.ElasticAgentExtensionV3.createAgent(ElasticAgentExtensionV3.java:101)
        at com.thoughtworks.go.plugin.access.elastic.ElasticAgentExtension.createAgent(ElasticAgentExtension.java:68)
        at com.thoughtworks.go.plugin.access.elastic.ElasticAgentPluginRegistry.createAgent(ElasticAgentPluginRegistry.java:41)
        at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:32)
        at com.thoughtworks.go.server.messaging.elasticagents.CreateAgentListener.onMessage(CreateAgentListener.java:22)
        at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.runImpl(JMSMessageListenerAdapter.java:73)
        at com.thoughtworks.go.server.messaging.activemq.JMSMessageListenerAdapter.run(JMSMessageListenerAdapter.java:53)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: ConnectionException{message=Already connected, status=0}
        at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.executeActionOnTheService(FelixGoPluginOSGiFramework.java:221)
        at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.doOn(FelixGoPluginOSGiFramework.java:202)
        at com.thoughtworks.go.plugin.infra.DefaultPluginManager.submitTo(DefaultPluginManager.java:140)
        at com.thoughtworks.go.plugin.access.PluginRequestHelper.submitRequest(PluginRequestHelper.java:48)
        ... 8 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: ConnectionException{message=Already connected, status=0}
        at cd.go.contrib.elasticagents.openstack.OpenStackPlugin.handle(OpenStackPlugin.java:85)
        at com.thoughtworks.go.plugin.infra.DefaultPluginManager.lambda$submitTo$0(DefaultPluginManager.java:143)
        at com.thoughtworks.go.plugin.infra.FelixGoPluginOSGiFramework.executeActionOnTheService(FelixGoPluginOSGiFramework.java:219)
        ... 11 common frames omitted
Caused by: java.lang.RuntimeException: ConnectionException{message=Already connected, status=0}
        at cd.go.contrib.elasticagents.openstack.OpenStackPlugin.refreshInstances(OpenStackPlugin.java:94)
        at cd.go.contrib.elasticagents.openstack.OpenStackPlugin.handle(OpenStackPlugin.java:62)
        ... 13 common frames omitted
Caused by: org.openstack4j.api.exceptions.ConnectionException: Already connected
        at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke(HttpExecutorServiceImpl.java:58)
        at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.execute(HttpExecutorServiceImpl.java:33)
        at org.openstack4j.core.transport.internal.HttpExecutor.execute(HttpExecutor.java:51)
        at org.openstack4j.openstack.internal.OSAuthenticator.authenticateV3(OSAuthenticator.java:156)
        at org.openstack4j.openstack.internal.OSAuthenticator.invoke(OSAuthenticator.java:78)
        at org.openstack4j.openstack.client.OSClientBuilder$ClientV3.authenticate(OSClientBuilder.java:163)
        at org.openstack4j.openstack.client.OSClientBuilder$ClientV3.authenticate(OSClientBuilder.java:127)
        at cd.go.contrib.elasticagents.openstack.OpenStackClientFactory.createClient(OpenStackClientFactory.java:61)
        at cd.go.contrib.elasticagents.openstack.OpenStackClientFactory.os_client(OpenStackClientFactory.java:40)
        at cd.go.contrib.elasticagents.openstack.utils.OpenstackClientWrapper.<init>(OpenstackClientWrapper.java:47)
        at cd.go.contrib.elasticagents.openstack.OpenStackInstances.os_client(OpenStackInstances.java:57)
        at cd.go.contrib.elasticagents.openstack.OpenStackInstances.refreshAll(OpenStackInstances.java:85)
        at cd.go.contrib.elasticagents.openstack.OpenStackPlugin.refreshInstances(OpenStackPlugin.java:91)
        ... 14 common frames omitted
Caused by: javax.ws.rs.ProcessingException: Already connected
        at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:233)
        at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:656)
        at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:653)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
        at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:653)
        at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:413)
        at org.openstack4j.connectors.jersey2.HttpCommand.execute(HttpCommand.java:79)
        at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invokeRequest(HttpExecutorServiceImpl.java:65)
        at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke(HttpExecutorServiceImpl.java:56)
        ... 26 common frames omitted
Caused by: java.lang.IllegalStateException: Already connected
        at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3071)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:325)
        at org.glassfish.jersey.client.HttpUrlConnector.setOutboundHeaders(HttpUrlConnector.java:348)
        at org.glassfish.jersey.client.HttpUrlConnector.access$100(HttpUrlConnector.java:87)
        at org.glassfish.jersey.client.HttpUrlConnector$3.getOutputStream(HttpUrlConnector.java:311)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:200)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:194)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.commit(CommittingOutputStream.java:262)
        at org.glassfish.jersey.message.internal.OutboundMessageContext.commitStream(OutboundMessageContext.java:811)
        at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:543)
        at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:315)
        at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:227)
        at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:224)
        ... 37 common frames omitted

Cheers!

tomzo commented

Hi @haxorof
I haven't seen this error before.
I am running 0.11.0 with GoCD 18.3 without issues. However 0.11.0 added caching of openstack API calls, which perhaps could result in this. Did you try 0.10.0 version?

@tomzo I just tried 0.10.0 and got the same problem. Do you have any suggestions how I can debug this to understand better what might be the source to the problem?

tomzo commented

You could try to reproduce this in a test and debug something within this stacktrace

Caused by: org.openstack4j.api.exceptions.ConnectionException: Already connected
        at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke(HttpExecutorServiceImpl.java:58)
        at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.execute(HttpExecutorServiceImpl.java:33)
        at org.openstack4j.core.transport.internal.HttpExecutor.execute(HttpExecutor.java:51)
        at org.openstack4j.openstack.internal.OSAuthenticator.authenticateV3(OSAuthenticator.java:156)
        at org.openstack4j.openstack.internal.OSAuthenticator.invoke(OSAuthenticator.java:78)
        at org.openstack4j.openstack.client.OSClientBuilder$ClientV3.authenticate(OSClientBuilder.java:163)
        at org.openstack4j.openstack.client.OSClientBuilder$ClientV3.authenticate(OSClientBuilder.java:127)
        at cd.go.contrib.elasticagents.openstack.OpenStackClientFactory.createClient(OpenStackClientFactory.java:61)
        at cd.go.contrib.elasticagents.openstack.OpenStackClientFactory.os_client(OpenStackClientFactory.java:40)
        at cd.go.contrib.elasticagents.openstack.utils.OpenstackClientWrapper.<init>(OpenstackClientWrapper.java:47)
        at cd.go.contrib.elasticagents.openstack.OpenStackInstances.os_client(OpenStackInstances.java:57)
        at cd.go.contrib.elasticagents.openstack.OpenStackInstances.refreshAll(OpenStackInstances.java:85)
        at cd.go.contrib.elasticagents.openstack.OpenStackPlugin.refreshInstances(OpenStackPlugin.java:91)
        ... 14 common frames omitted

Since it fails on when creating openstack client, you could try to call cd.go.contrib.elasticagents.openstack.OpenStackClientFactory.createClient(OpenStackClientFactory.java:61) from the test and see what happens. Call it twice in same test and see if it produces this error.
The error says already connected, but that fails only in your setup, so I guess it is specific to the way you connect with openstack.
You'll only need IntelliJ and gradle to develop and debug tests in this plugin.

@tomzo I have done some review of the code and did a quick test and it seems that when the authentications is done it does not give you any options to turn off the strict SSL verification:
https://github.com/gocd-contrib/openstack-elastic-agent/blob/master/src/main/java/cd/go/contrib/elasticagents/openstack/OpenStackClientFactory.java#L57-L61

To fix this a setting needs to be introduced so it will be possible to connect to OpenStack installations with self-signed certificates. Here is an example to resolve it:

return OSFactory.builderV3()
   .endpoint(pluginSettings.getOpenstackEndpoint())
   .credentials(pluginSettings.getOpenstackUser(), pluginSettings.getOpenstackPassword(),
       Identifier.byName(pluginSettings.getOpenstackDomain()))
   .scopeToProject(Identifier.byName(pluginSettings.getOpenstackTenant()),
       Identifier.byName(pluginSettings.getOpenstackDomain()))
   .useNonStrictSSLClient(pluginSettings.getOpenStackNonStrictSSL())
   .authenticate();

I got a OpenStack All-in-One (OSA) which I deployed using OpenStack-Ansible and by default you will only get self-signed certificates. If you want to get them to validate you will need to import the CA certificates on the client hosts which I have not.

Cheers!

tomzo commented

That makes sense. Indeed, we should have a flag to turn off certificate validation if needed.
Thanks for feedback.