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 <[email protected]>
---
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 <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches