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

Email-ext 2.72 and JCasC cause launch failure

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Resolved (View Workflow)
    • Priority: Blocker
    • Resolution: Not A Defect
    • Component/s: email-ext-plugin
    • Labels:
      None
    • Environment:
      Jenkins 2.235.3, JCasC 1.42, Email-Ext 2.72
    • Similar Issues:

      Description

      After update to Jenkins plugins, Email-Ext plugin causes a load failure by JCasC.  See attached.

      Have to downgrade to2.71 to get Jenkins to start again.

      Has changes for JCasC configuration code changed?

       

        Attachments

          Activity

          Hide
          webminster Alan Sparks added a comment -

          Also for completeness, the Jenkins JCasC configuration section as currently (and previously) used:

           

          extendedEmailPublisher:
          adminRequiredForTemplateTesting: false
          allowUnregisteredEnabled: false
          charset: "UTF-8"
          debugMode: false
          defaultBody: " - Build # - :\r\n\r\nCheck console output at to view the results."
          defaultContentType: "text/plain"
          defaultSubject: " - Build # - !"
          maxAttachmentSize: -1
          maxAttachmentSizeMb: 0
          precedenceBulk: false
          smtpServer: "${MF_SMTP_SERVER}"
          useSsl: false
          watchingEnabled: false

          Show
          webminster Alan Sparks added a comment - Also for completeness, the Jenkins JCasC configuration section as currently (and previously) used:   extendedEmailPublisher: adminRequiredForTemplateTesting: false allowUnregisteredEnabled: false charset: "UTF-8" debugMode: false defaultBody: " - Build # - :\r\n\r\nCheck console output at to view the results." defaultContentType: "text/plain" defaultSubject: " - Build # - !" maxAttachmentSize: -1 maxAttachmentSizeMb: 0 precedenceBulk: false smtpServer: "${MF_SMTP_SERVER}" useSsl: false watchingEnabled: false
          Hide
          slide_o_mix Alex Earl added a comment -

          Yes, there have been changes, 2.72 is the first to actually support JCasC. I will look at the trace.

          Show
          slide_o_mix Alex Earl added a comment - Yes, there have been changes, 2.72 is the first to actually support JCasC. I will look at the trace.
          Hide
          slide_o_mix Alex Earl added a comment -

          Looks like it might be as simple as changing your "extendedEmailPublisher:" to "email-ext:"

          Show
          slide_o_mix Alex Earl added a comment - Looks like it might be as simple as changing your "extendedEmailPublisher:" to "email-ext:"
          Hide
          webminster Alan Sparks added a comment -

          I did actually test that a few minutes ago, and got another stack trace as below.

          Do you have idea what options are allowed now, changes since the original working configs?

           

          2020-08-04 15:22:40.194+0000 [id=29] SEVERE jenkins.InitReactorRunner$1#onTaskFailed: Failed ConfigurationAsCode.init
          io.jenkins.plugins.casc.ConfiguratorException: 'useSsl' is deprecated
          at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:321)
          at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287)
          at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:351)
          at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287)
          at io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:755)
          at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:691)
          Caused: io.jenkins.plugins.casc.ConfiguratorException: unclassified: error configuring 'unclassified' with class io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator configurator
          at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:697)
          at io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:755)
          at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:740)
          at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:616)
          at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:298)
          at io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:290)
          Caused: java.lang.reflect.InvocationTargetException
          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 hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104)
          Caused: java.lang.Error
          at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:110)
          at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175)
          at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
          at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131)
          at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
          at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
          at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
          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)
          2020-08-04 15:22:40.197+0000 [id=20] SEVERE hudson.util.BootFailure#publish: Failed to initialize Jenkins
          io.jenkins.plugins.casc.ConfiguratorException: 'useSsl' is deprecated
          at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:321)
          at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287)
          at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:351)
          at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287)
          at io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:755)
          at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:691)
          Caused: io.jenkins.plugins.casc.ConfiguratorException: unclassified: error configuring 'unclassified' with class io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator configurator
          at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:697)
          at io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:755)
          at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:740)
          at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:616)
          at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:298)
          at io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:290)
          Caused: java.lang.reflect.InvocationTargetException
          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 hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104)
          Caused: java.lang.Error
          at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:110)
          at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175)
          at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
          at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131)
          at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
          at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
          at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
          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: org.jvnet.hudson.reactor.ReactorException
          at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:282)
          at jenkins.InitReactorRunner.run(InitReactorRunner.java:50)
          at jenkins.model.Jenkins.executeReactor(Jenkins.java:1164)
          at jenkins.model.Jenkins.<init>(Jenkins.java:964)
          at hudson.model.Hudson.<init>(Hudson.java:85)
          at hudson.model.Hudson.<init>(Hudson.java:81)
          at hudson.WebAppMain$3.run(WebAppMain.java:262)
          Caused: hudson.util.HudsonFailedToLoad
          at hudson.WebAppMain$3.run(WebAppMain.java:279)
          2020-08-04 15:22:40.210+0000 [id=20] INFO jenkins.model.Jenkins#cleanUp: Stopping Jenkins
          2020-08-04 15:22:40.252+0000 [id=20] INFO jenkins.model.Jenkins$18#onAttained: Started termination
          2020-08-04 15:22:40.274+0000 [id=20] INFO jenkins.model.Jenkins$18#onAttained: Completed termination
          2020-08-04 15:22:40.275+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpDisconnectComputers: Starting node disconnection
          2020-08-04 15:22:40.279+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpShutdownPluginManager: Stopping plugin manager
          2020-08-04 15:22:40.944+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpPersistQueue: Persisting build queue
          2020-08-04 15:22:40.970+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpAwaitDisconnects: Waiting for node disconnection completion
          2020-08-04 15:22:40.971+0000 [id=20] INFO jenkins.model.Jenkins#cleanUp: Jenkins stopped

           

           

          Show
          webminster Alan Sparks added a comment - I did actually test that a few minutes ago, and got another stack trace as below. Do you have idea what options are allowed now, changes since the original working configs?   2020-08-04 15:22:40.194+0000 [id=29] SEVERE jenkins.InitReactorRunner$1#onTaskFailed: Failed ConfigurationAsCode.init io.jenkins.plugins.casc.ConfiguratorException: 'useSsl' is deprecated at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:321) at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287) at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:351) at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287) at io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:755) at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:691) Caused: io.jenkins.plugins.casc.ConfiguratorException: unclassified: error configuring 'unclassified' with class io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator configurator at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:697) at io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:755) at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:740) at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:616) at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:298) at io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:290) Caused: java.lang.reflect.InvocationTargetException 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 hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104) Caused: java.lang.Error at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:110) at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296) at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117) at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59) 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) 2020-08-04 15:22:40.197+0000 [id=20] SEVERE hudson.util.BootFailure#publish: Failed to initialize Jenkins io.jenkins.plugins.casc.ConfiguratorException: 'useSsl' is deprecated at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:321) at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287) at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:351) at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287) at io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:755) at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:691) Caused: io.jenkins.plugins.casc.ConfiguratorException: unclassified: error configuring 'unclassified' with class io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator configurator at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:697) at io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:755) at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:740) at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:616) at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:298) at io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:290) Caused: java.lang.reflect.InvocationTargetException 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 hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104) Caused: java.lang.Error at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:110) at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296) at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117) at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59) 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: org.jvnet.hudson.reactor.ReactorException at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:282) at jenkins.InitReactorRunner.run(InitReactorRunner.java:50) at jenkins.model.Jenkins.executeReactor(Jenkins.java:1164) at jenkins.model.Jenkins.<init>(Jenkins.java:964) at hudson.model.Hudson.<init>(Hudson.java:85) at hudson.model.Hudson.<init>(Hudson.java:81) at hudson.WebAppMain$3.run(WebAppMain.java:262) Caused: hudson.util.HudsonFailedToLoad at hudson.WebAppMain$3.run(WebAppMain.java:279) 2020-08-04 15:22:40.210+0000 [id=20] INFO jenkins.model.Jenkins#cleanUp: Stopping Jenkins 2020-08-04 15:22:40.252+0000 [id=20] INFO jenkins.model.Jenkins$18#onAttained: Started termination 2020-08-04 15:22:40.274+0000 [id=20] INFO jenkins.model.Jenkins$18#onAttained: Completed termination 2020-08-04 15:22:40.275+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpDisconnectComputers: Starting node disconnection 2020-08-04 15:22:40.279+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpShutdownPluginManager: Stopping plugin manager 2020-08-04 15:22:40.944+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpPersistQueue: Persisting build queue 2020-08-04 15:22:40.970+0000 [id=20] INFO jenkins.model.Jenkins#_cleanUpAwaitDisconnects: Waiting for node disconnection completion 2020-08-04 15:22:40.971+0000 [id=20] INFO jenkins.model.Jenkins#cleanUp: Jenkins stopped    
          Hide
          slide_o_mix Alex Earl added a comment -

          Adrien Lecharpentier Any help here? I am not super familiar with JCasC

          Show
          slide_o_mix Alex Earl added a comment - Adrien Lecharpentier Any help here? I am not super familiar with JCasC
          Hide
          alecharp Adrien Lecharpentier added a comment -

          Could you make fix the indentation (welcome to the YAML world (sarcasm)) on the configuration example you provided?

          From what I understand of the stack-trace, it seems that the useSsl is being read by the unclassified category. It seems odd.

          Show
          alecharp Adrien Lecharpentier added a comment - Could you make fix the indentation (welcome to the YAML world (sarcasm)) on the configuration example you provided? From what I understand of the stack-trace, it seems that the useSsl is being read by the unclassified category. It seems odd.
          Show
          alecharp Adrien Lecharpentier added a comment - Please see the example on the plugin repository: https://github.com/jenkinsci/email-ext-plugin/blob/master/src/test/resources/configuration-as-code.yml
          Hide
          webminster Alan Sparks added a comment - - edited

          I'll look at the provided config snippet and try to make it work.   It appears there is a serious change in the configuration block, since it worked with the previous indentation.

          It might be a good idea to let people know this appears to be a breaking change for those using JCasC...

          Show
          webminster Alan Sparks added a comment - - edited I'll look at the provided config snippet and try to make it work.   It appears there is a serious change in the configuration block, since it worked with the previous indentation. It might be a good idea to let people know this appears to be a breaking change for those using JCasC...
          Hide
          webminster Alan Sparks added a comment -

          Adrien Lecharpentier Alex Earl Looking at your configuration this is very different from what was working with the last version of email-ext.  Is there any description of all those config items, and which are required?  Especially when talking of new levels, like "addAccount" and "mailAccount".

          Show
          webminster Alan Sparks added a comment - Adrien Lecharpentier Alex Earl Looking at your configuration this is very different from what was working with the last version of email-ext.  Is there any description of all those config items, and which are required?  Especially when talking of new levels, like "addAccount" and "mailAccount".
          Hide
          alecharp Adrien Lecharpentier added a comment -

          Alan Sparks to be honest, I don't think we can say that version prior to 2.72 were JCasC compatible. Sure, some fields were configurable but the complete configuration was not possible.

          Alex Earl did a great job at making sure that everything was configurable through JCasC.

          We could advertise that if anyone was configuring email-ext with JCasC using a version prior to 2.72, then that configuration is no longer compatible.

          This is due to the fact that:

          1. JCasC team did a great job at trying to make as many plugin compatible as possible out of the box. This is why some fields were configurable
          2. however, due to the legacy code in email-ext and the way some fields were configured before (through the UI and some hack in the Java code), Alex Earl had to refactor those elements.

          I do understand  this is not really what you wish to ear Alan Sparks, but in the end, the plugin was not compatible with JCasC before 2.72.

          Show
          alecharp Adrien Lecharpentier added a comment - Alan Sparks to be honest, I don't think we can say that version prior to 2.72 were JCasC compatible. Sure, some fields were configurable but the complete configuration was not possible. Alex Earl did a great job at making sure that everything was configurable through JCasC. We could advertise that if anyone was configuring email-ext with JCasC using a version prior to 2.72 , then that configuration is no longer compatible. This is due to the fact that: JCasC team did a great job at trying to make as many plugin compatible as possible out of the box. This is why some fields were configurable however, due to the legacy code in email-ext and the way some fields were configured before (through the UI and some hack in the Java code), Alex Earl had to refactor those elements. I do understand  this is not really what you wish to ear Alan Sparks , but in the end, the plugin was not compatible with JCasC before 2.72 .
          Hide
          slide_o_mix Alex Earl added a comment -

          This is the first version that JCasC is actually supported in email-ext. I don't know if there is a way to migrate the JCasC settings from a version where it was not supported to a version where it is. JCasC is very new to me. I implemented the changes required for the support, but I don't know much about JCasC itself.

          Show
          slide_o_mix Alex Earl added a comment - This is the first version that JCasC is actually supported in email-ext. I don't know if there is a way to migrate the JCasC settings from a version where it was not supported to a version where it is. JCasC is very new to me. I implemented the changes required for the support, but I don't know much about JCasC itself.
          Hide
          webminster Alan Sparks added a comment -

          OK, that's fair enough - been the second plugin in 2 weeks that required a jenkins.yaml redo because of JCasC support, so very surprised.  Since I'd found JCasC configs for this plugin on the Net was not aware that it wasn't "officially" supported.

          Now that I know this is an issue I can deal with it.  Thanks.

          Show
          webminster Alan Sparks added a comment - OK, that's fair enough - been the second plugin in 2 weeks that required a jenkins.yaml redo because of JCasC support, so very surprised.  Since I'd found JCasC configs for this plugin on the Net was not aware that it wasn't "officially" supported. Now that I know this is an issue I can deal with it.  Thanks.
          Hide
          slide_o_mix Alex Earl added a comment -

          I wish I knew more about JCasC to be able to come up with a better solution. My apologies that it caused you issues.

          Show
          slide_o_mix Alex Earl added a comment - I wish I knew more about JCasC to be able to come up with a better solution. My apologies that it caused you issues.
          Hide
          webminster Alan Sparks added a comment -

          Thanks.  And thanks Adrien Lecharpentier for the pointer to the test config, that helped me change mine.

          Show
          webminster Alan Sparks added a comment - Thanks.  And thanks Adrien Lecharpentier for the pointer to the test config, that helped me change mine.

            People

            Assignee:
            slide_o_mix Alex Earl
            Reporter:
            webminster Alan Sparks
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: