Ori Liel has uploaded a new change for review.

Change subject: restapi: Fix possible version mismatch (#1206068)
......................................................................

restapi: Fix possible version mismatch (#1206068)

GET on the root of the API returns:
  <api>
  .
  .
    <version>...</version>
    <full_version>...</full_version>
  </api>

The first is taken from vdc_options-->VdcVersion.
The second is taken from vdc_options-->ProductRPMVersion.

Sometimes the second value is more accurate and there can be a mismatch.
This patch adds a query to the engine that gets the product version.
The query attempst to parse ProductRPMVersion and use it for both fields.
If parsing fails, VdcVersion is used as fall-back.

Bug-Url: https://bugzilla.redhat.com/1206068
Change-Id: I1bd123c2352db229e52bdbd3f1e2db4ac72018a9
Signed-off-by: Ori Liel <ol...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProductVersionQuery.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetProductVersionQueryTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendApiResource.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VersionMapper.java
6 files changed, 154 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/40085/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProductVersionQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProductVersionQuery.java
new file mode 100644
index 0000000..a1d4b8c
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProductVersionQuery.java
@@ -0,0 +1,64 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.ovirt.engine.core.common.config.Config;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
+import org.ovirt.engine.core.compat.Version;
+
+/**
+ * The query returns the product version. There are two sources for this 
information: 'VdcVersion' contains 'major' and
+ * 'minor' versions. The string looks like: 3.5.0.0, 3.6.0.0, etc. 
'ProductRPMVersion' is more accurate. It usually
+ * looks something like: 3.5.1-0.2.el6ev This query tries to parse 
ProduceRPMVersion to get 'major', 'minor' and 'build'
+ * info. If it fails, it falls back to VdcVersion which has only 'major' and 
'minor' info.
+ */
+public class GetProductVersionQuery<P extends VdcQueryParametersBase> extends 
QueriesCommandBase<P> {
+
+    public static final String RPM_REG_EX = "^\\d+\\.\\d+\\.\\d+";
+    public static final String VDC_VERSION_REG_EX = 
"^\\d+\\.\\d+\\.\\d+\\.\\d+";
+
+    public GetProductVersionQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        String rpmVersion = (String) 
(Config.getValue(ConfigValues.ProductRPMVersion));
+        Version version = parseRpmVersion(rpmVersion);
+        if (version == null) {
+            String vdcVersion = (String) 
(Config.getValue(ConfigValues.VdcVersion));
+            version = parseVdcVersion(vdcVersion);
+        }
+        setReturnValue(version);
+    }
+
+    private Version parseRpmVersion(String rpmVersion) {
+        Pattern pattern = Pattern.compile(RPM_REG_EX);
+        Matcher matcher = pattern.matcher(rpmVersion);
+        if (matcher.find()) {
+            String parts[] = matcher.group(0).split("\\.", -1);
+            return new Version(Integer.parseInt(parts[0]),
+                    Integer.parseInt(parts[1]),
+                    Integer.parseInt(parts[2]), 0);
+        } else {
+            return null;
+        }
+    }
+
+    private Version parseVdcVersion(String vdcVersion) {
+        Pattern pattern = Pattern.compile(VDC_VERSION_REG_EX);
+        Matcher matcher = pattern.matcher(vdcVersion);
+        if (matcher.find()) {
+            String parts[] = vdcVersion.split("\\.", -1);
+            return new Version(Integer.parseInt(parts[0]),
+                    Integer.parseInt(parts[1]),
+                    Integer.parseInt(parts[2]),
+                    Integer.parseInt(parts[3]));
+        } else {
+            return null;
+        }
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetProductVersionQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetProductVersionQueryTest.java
new file mode 100644
index 0000000..67cbf11
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetProductVersionQueryTest.java
@@ -0,0 +1,45 @@
+package org.ovirt.engine.core.bll;
+
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
+import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.utils.MockEJBStrategyRule;
+import static org.junit.Assert.assertEquals;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GetProductVersionQueryTest extends 
AbstractQueryTest<VdcQueryParametersBase, 
GetProductVersionQuery<VdcQueryParametersBase>> {
+
+    @ClassRule
+    public static MockEJBStrategyRule mockEjbRule = new MockEJBStrategyRule();
+
+    @Test
+    public void testExecuteQuery() {
+        mcr.mockConfigValue(ConfigValues.ProductRPMVersion, "11.1.12asdf.");
+        GetProductVersionQuery<VdcQueryParametersBase> query = getQuery();
+        query.executeQueryCommand();
+        Object returnValue = query.getQueryReturnValue().getReturnValue();
+        verifyVersionEqual(returnValue, 11, 1, 12);
+    }
+
+    @Test
+    public void testExecuteQueryUseVdcVersion() {
+        mcr.mockConfigValue(ConfigValues.ProductRPMVersion, 
"1unparsable1.1.12.");
+        mcr.mockConfigValue(ConfigValues.VdcVersion, "3.3.0.0.");
+        GetProductVersionQuery<VdcQueryParametersBase> query = getQuery();
+        query.executeQueryCommand();
+        Object returnValue = query.getQueryReturnValue().getReturnValue();
+        verifyVersionEqual(returnValue, 3, 3, 0);
+    }
+
+    private void verifyVersionEqual(Object returnValue, int major, int minor, 
int build) {
+        Version version = (Version) returnValue;
+        assertEquals(version.getMajor(), major);
+        assertEquals(version.getMinor(), minor);
+        assertEquals(version.getBuild(), build);
+        assertEquals(version.getRevision(), 0);
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index f858899..fa2f9cb 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -372,6 +372,7 @@
     GetUnusedGlusterBricks,
 
     GetDefaultConfigurationVersion(VdcQueryAuthType.User),
+    GetProductVersion(VdcQueryAuthType.User),
     OsRepository(VdcQueryAuthType.User),
     GetArchitectureCapabilities(VdcQueryAuthType.User),
 
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendApiResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendApiResource.java
index fe349bf..f41d239 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendApiResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendApiResource.java
@@ -46,10 +46,11 @@
 import org.ovirt.engine.api.model.StorageDomains;
 import org.ovirt.engine.api.model.Users;
 import org.ovirt.engine.api.model.VMs;
+import org.ovirt.engine.api.model.Version;
 import org.ovirt.engine.api.resource.ApiResource;
 import org.ovirt.engine.api.restapi.types.DateMapper;
+import org.ovirt.engine.api.restapi.types.VersionMapper;
 import org.ovirt.engine.api.restapi.util.ErrorMessageHelper;
-import org.ovirt.engine.api.restapi.util.VersionHelper;
 import org.ovirt.engine.api.rsdl.RsdlManager;
 import org.ovirt.engine.api.utils.ApiRootLinksCreator;
 import org.ovirt.engine.api.utils.LinkHelper;
@@ -59,6 +60,7 @@
 import org.ovirt.engine.core.common.mode.ApplicationMode;
 import org.ovirt.engine.core.common.queries.ConfigurationValues;
 import org.ovirt.engine.core.common.queries.GetSystemStatisticsQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.compat.Guid;
@@ -269,8 +271,13 @@
     }
 
     private RSDL addSystemVersion(RSDL rsdl) {
-            
rsdl.setVersion(VersionHelper.parseVersion(getConfigurationValueDefault(String.class,
 ConfigurationValues.VdcVersion)));
-            return rsdl;
+        rsdl.setVersion(getVersion());
+        return rsdl;
+    }
+
+    private Version getVersion() {
+        VdcQueryReturnValue result = runQuery(VdcQueryType.GetProductVersion, 
new VdcQueryParametersBase());
+        return VersionMapper.map((org.ovirt.engine.core.compat.Version) 
result.getReturnValue(), null);
     }
 
     public synchronized RSDL getRSDL() throws ClassNotFoundException, 
IOException {
@@ -291,7 +298,7 @@
         
api.getProductInfo().setName(obrand.getMessage("obrand.backend.product"));
         
api.getProductInfo().setVendor(obrand.getMessage("obrand.backend.vendor"));
         api.getProductInfo().setFullVersion(productVersion);
-        
api.getProductInfo().setVersion(VersionHelper.parseVersion(getConfigurationValueDefault(String.class,
 ConfigurationValues.VdcVersion)));
+        api.getProductInfo().setVersion(getVersion());
         return api;
     }
 
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java
index cf72733..ff59b54 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendApiResourceTest.java
@@ -30,12 +30,14 @@
 import org.ovirt.engine.api.restapi.util.SessionHelper;
 import org.ovirt.engine.core.common.interfaces.BackendLocal;
 import org.ovirt.engine.core.common.mode.ApplicationMode;
+import org.ovirt.engine.core.common.queries.ConfigurationValues;
 import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters;
 import org.ovirt.engine.core.common.queries.GetSystemStatisticsQueryParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
 
 public class BackendApiResourceTest extends Assert {
 
@@ -439,14 +441,20 @@
     }
 
     protected void setUpGetSystemVersionExpectations() {
-        VdcQueryReturnValue queryResult = 
createMock(VdcQueryReturnValue.class);
+        VdcQueryReturnValue productRpmQueryResult = 
createMock(VdcQueryReturnValue.class);
+        
expect(productRpmQueryResult.getSucceeded()).andReturn(true).anyTimes();
+        
expect(productRpmQueryResult.getReturnValue()).andReturn(SYSTEM_VERSION).anyTimes();
+        expect(backend.runQuery(eq(VdcQueryType.GetConfigurationValue), 
getProductRPMVersionParam())).andReturn(productRpmQueryResult);
 
-        expect(backend.runQuery(eq(VdcQueryType.GetConfigurationValue), 
queryVdcVersionParams())).andReturn(queryResult);
-        expect(backend.runQuery(eq(VdcQueryType.GetConfigurationValue),
-                queryProductRPMVersionParams())).andReturn(queryResult);
+        VdcQueryReturnValue productVersionQueryResult = 
createMock(VdcQueryReturnValue.class);
+        
expect(productVersionQueryResult.getSucceeded()).andReturn(true).anyTimes();
+        expect(productVersionQueryResult.getReturnValue()).andReturn(new 
Version(MAJOR, MINOR, BUILD, REVISION))
+                .anyTimes();
+        expect(backend.runQuery(eq(VdcQueryType.GetProductVersion), 
getProductVersionParams())).andReturn(productVersionQueryResult);
+    }
 
-        expect(queryResult.getSucceeded()).andReturn(true).anyTimes();
-        
expect(queryResult.getReturnValue()).andReturn(SYSTEM_VERSION).anyTimes();
+    private VdcQueryParametersBase getProductVersionParams() {
+        return eqQueryParams(VdcQueryParametersBase.class, new String[0], new 
Object[0]);
     }
 
     protected void setUpGetSystemStatisticsExpectations() {
@@ -460,16 +468,16 @@
         replayAll();
     }
 
-    protected VdcQueryParametersBase queryProductRPMVersionParams() {
+    protected VdcQueryParametersBase getProductRPMVersionParam() {
         return eqQueryParams(GetConfigurationValueParameters.class,
-                             new String[] { "SessionId"},
-                             new Object[] { getSessionId() });
+                new String[] { "SessionId", "ConfigValue" },
+                new Object[] { getSessionId(), 
ConfigurationValues.ProductRPMVersion });
     }
 
-    protected VdcQueryParametersBase queryVdcVersionParams() {
+    protected VdcQueryParametersBase getVdcVersionParam() {
         return eqQueryParams(GetConfigurationValueParameters.class,
-                             new String[] { "SessionId"},
-                             new Object[] { getSessionId() });
+                new String[] { "SessionId", "ConfigValue" },
+                new Object[] { getSessionId(), ConfigurationValues.VdcVersion 
});
     }
 
     protected VdcQueryParametersBase queryParams() {
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VersionMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VersionMapper.java
index d5cb35b..9dfae06 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VersionMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VersionMapper.java
@@ -18,4 +18,17 @@
         }
         return model;
     }
+
+    @Mapping(from = org.ovirt.engine.core.compat.Version.class, to = 
Version.class)
+    public static Version map(org.ovirt.engine.core.compat.Version 
versionEngine, Version versionApi) {
+        if (versionApi == null) {
+            versionApi = new Version();
+        }
+        versionApi.setMajor(versionEngine.getMajor());
+        versionApi.setMinor(versionEngine.getMinor());
+        versionApi.setBuild(versionEngine.getBuild());
+        versionApi.setRevision(versionEngine.getRevision());
+        return versionApi;
+    }
 }
+


-- 
To view, visit https://gerrit.ovirt.org/40085
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1bd123c2352db229e52bdbd3f1e2db4ac72018a9
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Ori Liel <ol...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to