Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-28886

DockerOnceRetentionStrategy becomes a default strategy and breaks use-cases outside docker

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Critical Critical
    • docker-plugin
    • None

      Can be reproduced with mvn hpi:run. Create new slave, hit save.

      javax.servlet.ServletException: java.lang.ClassCastException: hudson.slaves.SlaveComputer cannot be cast to hudson.slaves.AbstractCloudComputer
      	at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:783)
      	at org.kohsuke.stapler.Stapler.invoke(Stapler.java:863)
      	at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:210)
      	at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
      	at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:733)
      	at org.kohsuke.stapler.Stapler.invoke(Stapler.java:863)
      	at org.kohsuke.stapler.Stapler.invoke(Stapler.java:636)
      	at org.kohsuke.stapler.Stapler.service(Stapler.java:225)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
      	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:491)
      	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1074)
      	at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)
      	at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
      	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
      	at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48)
      	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
      	at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
      	at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
      	at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
      	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
      	at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46)
      	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
      	at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
      	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
      	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
      	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:185)
      	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
      	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:689)
      	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:391)
      	at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:146)
      	at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
      	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
      	at org.mortbay.jetty.Server.handle(Server.java:285)
      	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:457)
      	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:765)
      	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:628)
      	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:209)
      	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357)
      	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:329)
      	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475)
      Caused by: java.lang.ClassCastException: hudson.slaves.SlaveComputer cannot be cast to hudson.slaves.AbstractCloudComputer
      	at com.nirima.jenkins.plugins.docker.strategy.DockerOnceRetentionStrategy.start(DockerOnceRetentionStrategy.java:29)
      	at hudson.model.AbstractCIBase.updateComputer(AbstractCIBase.java:129)
      	at hudson.model.AbstractCIBase.updateComputerList(AbstractCIBase.java:179)
      	at jenkins.model.Jenkins.updateComputerList(Jenkins.java:1220)
      	at jenkins.model.Jenkins.setNodes(Jenkins.java:1717)
      	at jenkins.model.Jenkins.addNode(Jenkins.java:1699)
      	at hudson.model.ComputerSet.doDoCreateItem(ComputerSet.java:294)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
      	at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
      	at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
      	at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:120)
      	at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
      	at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:733)
      	... 39 more
      

          [JENKINS-28886] DockerOnceRetentionStrategy becomes a default strategy and breaks use-cases outside docker

          Imho, just filter Cloud based classes from Functions.getRetentionStrategiesDescriptors.

          Kanstantsin Shautsou added a comment - Imho, just filter Cloud based classes from Functions.getRetentionStrategiesDescriptors.

          Filtering in this method will break drop-down in docker where we need all descriptors. I can suggest create additional method .getDumbSlaveRetentionStrategyDescriptors and use it for DumbSlave UI.

          Kanstantsin Shautsou added a comment - Filtering in this method will break drop-down in docker where we need all descriptors. I can suggest create additional method .getDumbSlaveRetentionStrategyDescriptors and use it for DumbSlave UI.

          Oleg Nenashev added a comment -

          I disagree with re-assigning the issue to the core, because users on previous LTS versions are not unable to comfortably use entire Jenkins together with this plugin.

          0.9.3 is required IMO

          Oleg Nenashev added a comment - I disagree with re-assigning the issue to the core, because users on previous LTS versions are not unable to comfortably use entire Jenkins together with this plugin. 0.9.3 is required IMO

          Oleg Nenashev added a comment -

          Kostya, please create another issue to the core. It should be patched as well, of course

          Oleg Nenashev added a comment - Kostya, please create another issue to the core. It should be patched as well, of course

          I disagree that this is a docker issue. I implemented API provided by core and plugin uses all retentions.
          I have no problems with DumbSlave because i'm always reading and verifying what i'm configuring.
          Sorry, but i have no time so feel free to create separate issue. LTS backpoting is in process feel free to propose lts-candidate fix.

          Kanstantsin Shautsou added a comment - I disagree that this is a docker issue. I implemented API provided by core and plugin uses all retentions. I have no problems with DumbSlave because i'm always reading and verifying what i'm configuring. Sorry, but i have no time so feel free to create separate issue. LTS backpoting is in process feel free to propose lts-candidate fix.

          Jesse Glick added a comment -

          Core is behaving as designed. There is no RetentionStrategyDescriptor.isApplicable(Node/Computer) API, so until there is, plugins may not register strategies unless they are safe to use on any node. Most cloud implementations can hardcode a single retention strategy, or offer a custom UI control which would select a strategy behind the scenes. If the Docker cloud implementation wishes to offer any strategy registered as an extension using a hetero list/radio control, and to insert additional options defined in this plugin, it can easily do so using a control-specific technique (typically setting an explicit descriptors parameter).

          Jesse Glick added a comment - Core is behaving as designed. There is no RetentionStrategyDescriptor.isApplicable(Node/Computer) API, so until there is, plugins may not register strategies unless they are safe to use on any node. Most cloud implementations can hardcode a single retention strategy, or offer a custom UI control which would select a strategy behind the scenes. If the Docker cloud implementation wishes to offer any strategy registered as an extension using a hetero list/radio control, and to insert additional options defined in this plugin, it can easily do so using a control-specific technique (typically setting an explicit descriptors parameter).

          I am attaching my original suggestion. Do not register specific strategies as @Extension.

          Oliver Gondža added a comment - I am attaching my original suggestion. Do not register specific strategies as @Extension .

          Code changed in jenkins
          User: Oliver Gondža
          Path:
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerCloudRetentionStrategy.java
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerOnceRetentionStrategy.java
          docker-plugin/src/main/resources/com/nirima/jenkins/plugins/docker/DockerTemplate/config.jelly
          http://jenkins-ci.org/commit/docker-plugin/395665a4ed20223119c57c3f7fb6f19740325e10
          Log:
          [FIXED JENKINS-28886] Do not register specific strategies

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Oliver Gondža Path: docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerCloudRetentionStrategy.java docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerOnceRetentionStrategy.java docker-plugin/src/main/resources/com/nirima/jenkins/plugins/docker/DockerTemplate/config.jelly http://jenkins-ci.org/commit/docker-plugin/395665a4ed20223119c57c3f7fb6f19740325e10 Log: [FIXED JENKINS-28886] Do not register specific strategies

          Code changed in jenkins
          User: Oliver Gondža
          Path:
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java
          http://jenkins-ci.org/commit/docker-plugin/106bc85ed57e40bb96011e0922934b2c6f15e64f
          Log:
          JENKINS-28886 Preserve strategy priority

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Oliver Gondža Path: docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java http://jenkins-ci.org/commit/docker-plugin/106bc85ed57e40bb96011e0922934b2c6f15e64f Log: JENKINS-28886 Preserve strategy priority

          Code changed in jenkins
          User: Kanstantsin Shautsou
          Path:
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerCloudRetentionStrategy.java
          docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerOnceRetentionStrategy.java
          docker-plugin/src/main/resources/com/nirima/jenkins/plugins/docker/DockerTemplate/config.jelly
          http://jenkins-ci.org/commit/docker-plugin/7b0855a187e24a3cfd9f280180bdedc7585e80e8
          Log:
          Merge pull request #247 from olivergondza/restrict-strategies

          [FIXED JENKINS-28886] Do not register specific strategies

          Compare: https://github.com/jenkinsci/docker-plugin/compare/f42b99e9725c...7b0855a187e2

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Kanstantsin Shautsou Path: docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerCloudRetentionStrategy.java docker-plugin/src/main/java/com/nirima/jenkins/plugins/docker/strategy/DockerOnceRetentionStrategy.java docker-plugin/src/main/resources/com/nirima/jenkins/plugins/docker/DockerTemplate/config.jelly http://jenkins-ci.org/commit/docker-plugin/7b0855a187e24a3cfd9f280180bdedc7585e80e8 Log: Merge pull request #247 from olivergondza/restrict-strategies [FIXED JENKINS-28886] Do not register specific strategies Compare: https://github.com/jenkinsci/docker-plugin/compare/f42b99e9725c...7b0855a187e2

            Unassigned Unassigned
            olivergondza Oliver Gondža
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: