Documentation icon indicating copy to clipboard operation
Documentation copied to clipboard

ChangeFirmwareRequest: wrong firmware path after model update

Open ThE-MaRaC opened this issue 4 years ago • 1 comments

If the firmware is created with one model and later on model is changed, a firmware path doesn't reflect this change and firmware can not be deleted anymore.

For example: Create FW with manufacturer=LAGY and model=Landis_and_Gyr-T_E360_CDMA_SMR5.1_energy_meter

path=/var/www/html/firmware/LAGY/Landis_and_Gyr-T_E360_CDMA_SMR5.1_energy_meter/test-firmware.fw

Update FW with model=E360 CD2D GPRS SMR5

new path should be: /var/www/html/firmware/LAGY/E360_CD2D_GPRS_SMR5/test-firmware.fw

Stacktrace:

2020-06-29 10:28:34.506] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.a.w.e.WebServiceMonitorInterceptor@printSoapMessage:338 - soap message: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><OrganisationIdentification xmlns="http://www.op
ensmartgridplatform.org/schemas/common">test-org</OrganisationIdentification><ApplicationName xmlns="http://www.opensmartgridplatform.org/schemas/common">client-application</ApplicationName><UserName xmlns="http://www.opensmartgridplatform.org/schemas/common">client-application-use
r</UserName></SOAP-ENV:Header><SOAP-ENV:Body><ns2:RemoveFirmwareRequest xmlns:ns2="http://www.opensmartgridplatform.org/schemas/common/firmwaremanagement/2014/10" xmlns:ns3="http://www.opensmartgridplatform.org/schemas/common/2014/10" xmlns:ns4="http://www.opensmartgridplatform.org
/schemas/devicemanagement/2014/10"><ns2:Id>4</ns2:Id></ns2:RemoveFirmwareRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>
2020-06-29 10:28:34.507] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.a.w.c.e.FirmwareManagementEndpoint@removedFirmware:814 - Removing firmware with id:4.
2020-06-29 10:28:34.509] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.d.core.services.SecurityService@checkAuthorization:84 - Organisation test-org is allowed function REMOVE_FIRMWARE
2020-06-29 10:28:34.514] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.a.w.c.a.s.DeviceManagementService@supplyfirmwareFileNotFoundException:715 - FirmwareFile not found for id 4.
2020-06-29 10:28:34.518] [dev-box] [ajp-nio-8009-exec-15] ERROR o.o.a.w.c.e.FirmwareManagementEndpoint@removedFirmware:832 - Exception: [null, 4, test-org] while removing firmware: {} for organisation {}
java.lang.NullPointerException: null
        at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService.removePhysicalFirmwareFile(FirmwareManagementService.java:802)
        at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService.removeFirmware(FirmwareManagementService.java:702)
        at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService$$FastClassBySpringCGLIB$$b1a2241.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
        at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:120)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
        at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService$$EnhancerBySpringCGLIB$$410b0d99.removeFirmware(<generated>)
        at org.opensmartgridplatform.adapter.ws.core.endpoints.FirmwareManagementEndpoint.removedFirmware(FirmwareManagementEndpoint.java:818)
        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 org.springframework.ws.server.endpoint.MethodEndpoint.invoke(MethodEndpoint.java:134)
        at org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter.invokeInternal(DefaultMethodEndpointAdapter.java:291)
        at org.springframework.ws.server.endpoint.adapter.AbstractMethodEndpointAdapter.invoke(AbstractMethodEndpointAdapter.java:55)
        at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:236)
        at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:176)
        at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:89)
        at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:61)
        at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:293)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at psiprobe.Tomcat90AgentValve.invoke(Tomcat90AgentValve.java:35)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

ThE-MaRaC avatar Jun 29 '20 13:06 ThE-MaRaC

@ThE-MaRaC,

Thank you for reporting this issue. I found that updating the device model can lead to the problem you describe. There are 2 solutions I can think of:

  • prevent changing the device model when firmware files are present for the device model (which could be similar to the implementation of the checks in the function org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService#removeDeviceModel(String, String, String))
  • updating the folder on the file system

The first option is the best fit for the behavior of our client application which manages manufacturers, device models and firmware files. I will discuss this issue with the team.

kevinsmeets avatar Jul 03 '20 21:07 kevinsmeets