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