yandex-qatools/teamcity-openstack-plugin

TeamCity 2020.2.2 agent log errors

axel3rd opened this issue ยท 8 comments

Issue for #59 PR

On TeamCity 2020.2.2, v1.4 of plugin provide some errors on agent side initialization.

WIP: Testing v1.5-SNAPSHOT (cloud-openstack.zip) on some TeamCity v2020.2.2 before releasing v1.5.

WIP: Testing v1.5-SNAPSHOT (cloud-openstack.zip) on some TeamCity v2020.2.2 before releasing v1.5.

Even with this SNAPSHOT the log seems always present ๐Ÿค”

[2021-02-25 14:25:52,557]   WARN - inLoader$TeamCityPluginContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jetbrains.buildServer.clouds.openstack.OpenstackAgentProperties#0' defined in Byte array resource [plugin: cloud-openstack-agent#cloud-openstack-agent-1.4.jar!/META-INF/build-agent-plugin-cloud-openstack.xml]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'jetbrains.buildServer.util.EventDispatcher<jetbrains.buildServer.agent.AgentLifeCycleAdapter>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
[2021-02-25 14:25:52,588]  ERROR - gins.spring.SpringPluginLoader - Error loading plugin 'cloud-openstack-agent': Failed to initialize spring context: Error creating bean with name 'jetbrains.buildServer.clouds.openstack.OpenstackAgentProperties#0' defined in Byte array resource [plugin: cloud-openstack-agent#cloud-openstack-agent-1.4.jar!/META-INF/build-agent-plugin-cloud-openstack.xml]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'jetbrains.buildServer.util.EventDispatcher<jetbrains.buildServer.agent.AgentLifeCycleAdapter>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jetbrains.buildServer.clouds.openstack.OpenstackAgentProperties#0' defined in Byte array resource [plugin: cloud-openstack-agent#cloud-openstack-agent-1.4.jar!/META-INF/build-agent-plugin-cloud-openstack.xml]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'jetbrains.buildServer.util.EventDispatcher<jetbrains.buildServer.agent.AgentLifeCycleAdapter>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1196)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1098)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:757)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
	at jetbrains.buildServer.plugins.spring.SpringPluginLoader.pluginClassesLoaded(SpringPluginLoader.java:123)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at jetbrains.buildServer.util.EventDispatcher$3.run(EventDispatcher.java:138)
	at jetbrains.buildServer.util.NamedThreadFactory.executeWithNewThreadName(NamedThreadFactory.java:76)
	at jetbrains.buildServer.util.EventDispatcher.dispatch(EventDispatcher.java:132)
	at jetbrains.buildServer.util.EventDispatcher$2.invoke(EventDispatcher.java:82)
	at com.sun.proxy.$Proxy11.pluginClassesLoaded(Unknown Source)
	at jetbrains.buildServer.plugins.PluginManagerImpl$5.visitPlugin(PluginManagerImpl.java:422)
	at jetbrains.buildServer.plugins.PluginsCollection$1.run(PluginsCollection.java:98)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'jetbrains.buildServer.util.EventDispatcher<jetbrains.buildServer.agent.AgentLifeCycleAdapter>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1490)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1063)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
	... 29 more

It occurs on agent previously builded/started on TeamCity 2020.1. Perhaps the "agent update" fixes the problem, but the name of agent is not correctly updated. In this case.

Error synthesis:

Error creating bean with name 'jetbrains.buildServer.clouds.openstack.OpenstackAgentProperties#0'
Unsatisfied dependency expressed through constructor parameter 1
No qualifying bean of type 'jetbrains.buildServer.util.EventDispatcher<jetbrains.buildServer.agent.AgentLifeCycleAdapter>' available

=> Potential problem with second arg of constructor:

public OpenstackAgentProperties(@NotNull final BuildAgentConfigurationEx agentConfiguration,
@NotNull EventDispatcher<AgentLifeCycleAdapter> dispatcher) {

But no explicit change on jetbrains.buildServer.agent.AgentLifeCycleListener (agent-api-2020.2.2.jar), always says:

 * You should not implement this interface directly in your code. Use {@link AgentLifeCycleAdapter} instead
 * <br />
 * To subscribe to this event listener you should use
 * Spring bean of type {@link jetbrains.buildServer.util.EventDispatcher} of {@link AgentLifeCycleListener }
 * and call {@link jetbrains.buildServer.util.EventDispatcher#addListener(java.util.EventListener)}}
 * method.

@paksv : Sorry to call you like that ๐Ÿ†˜๐Ÿ˜• , but if there is an evident change between TeamCity 2020.1 -> 2020.2 about that ... I'll take it ๐Ÿ˜Š.

paksv commented

@axel3rd , np, jetbrains.buildServer.agent.AgentLifeCycleAdapter is a class (i.e. adapter), but EventDispatcher requires an interface, so you need to declare a constructor parameter as EventDispatcher<AgentLifeCycleListener>.
But when you add a new listener you'd rather want to use Adapter (otherwise you'll have to implement a ton of methods, but this is allowed too)

@paksv : Rahhh thanks a lot. RTFM Alix ... I will change my ๐Ÿ‘€

@captain-bamboo : FYI LGTM with the cloud-openstack.zip (last 1.5-SNAPSHOT), release will coming soon.

release will coming soon

Done, see releases.