aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2024-05-07 14:49:03 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-05-07 16:12:57 +0000
commit1fd7f5f1d71ca60610ccd739a9479871864303c0 (patch)
tree8ce7c019e3ff1a2186eba6525c4fac965fdb60aa
parentec80a59572352e07ed1086fcb3da06d4a99cec75 (diff)
installations.ini: differentiate preview releases3.0
Add contextual --add-key-value option used in pair with --register, which can be used for inserting additional key-value pairs to the installations.ini section written when registering the installation. The supported key-value pair at the moment is "preview=true", which indicates a pre-release of the license service. In the CIP side, when looking for matching service installation to kick start, preview sections are preferred only if no same version exists in a non-preview section. Change-Id: I0dbc7c05dfeff81162e36cb5a13cf6f2682157c6 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io> (cherry picked from commit b8d173a7899ffeaa044ffed2cb9458a0ecdec5f4) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 69274e5f5f9cbeca5ae2065377a48e689fb8d140)
-rw-r--r--src/daemons/daemon.h36
-rw-r--r--src/libs/qlicensecore/licdsetup.cpp30
-rw-r--r--src/libs/qlicensecore/licdsetup.h3
-rw-r--r--tests/auto/licdsetup/tst_licdsetup.cpp23
4 files changed, 81 insertions, 11 deletions
diff --git a/src/daemons/daemon.h b/src/daemons/daemon.h
index a2bc26b..a3ba824 100644
--- a/src/daemons/daemon.h
+++ b/src/daemons/daemon.h
@@ -79,6 +79,8 @@ void printHelp()
printf(" --register <source> : Registers itself in the 'installations.ini' file\n");
printf(" The <source> defines the entity calling this. E.g. 'installer'.\n");
printf(" --unregister : Unregister itself from the 'installations.ini' file\n");
+ printf(" --add-key-value <key=value>\n");
+ printf(" : Add additional key-value pair to the installations.ini on register\n");
printf(" --help : This help\n");
#ifdef _WIN32
printf(" --install : Installs the daemon executable as system service\n");
@@ -107,7 +109,8 @@ void printHelp()
}
-bool handleArgs(int argc, char *argv[], uint16_t& tcpPort, DaemonRunMode &daemonRunMode, std::string &workDir, std::string &message) {
+bool handleArgs(int argc, char *argv[], uint16_t& tcpPort, DaemonRunMode &daemonRunMode, std::string &workDir, std::string &message)
+{
// Parse env vars
if (const char* logLevel = std::getenv("QTLICD_LOG_LEVEL")) {
if (!parseLogLevel(logLevel, message)) {
@@ -129,12 +132,39 @@ bool handleArgs(int argc, char *argv[], uint16_t& tcpPort, DaemonRunMode &daemon
std::cout << "Build date: " << BUILD_DATE << std::endl;
exit(EXIT_SUCCESS);
} else if (arg == "--register") {
+ static const std::string sc_optionPrefix = "--";
+
std::string installSource;
- if (argc == i + 1)
+ if ((argc == i + 1) || std::string(argv[i + 1]).substr(0, sc_optionPrefix.size()) == sc_optionPrefix)
installSource = "undefined";
else
installSource = argv[i + 1];
- LicdSetup::registerInstallation(installSource);
+
+ // Second iteration to find the contextual option
+ std::string valuesString;
+ for (int j = 1; j < argc; ++j) {
+ std::string arg = argv[j];
+ if (arg == "--add-key-value" && (j + 1 < argc)) {
+ valuesString = argv[j + 1];
+ break;
+ }
+ }
+
+ std::map<std::string, std::string> keyValues;
+ if (!valuesString.empty()) {
+ std::istringstream iss(valuesString);
+ std::string pair;
+
+ while (std::getline(iss, pair, ',')) {
+ std::istringstream pairIss(pair);
+ std::string key;
+ std::string value;
+ if (std::getline(pairIss, key, '=') && std::getline(pairIss, value))
+ keyValues[key] = value;
+ }
+ }
+
+ LicdSetup::registerInstallation(installSource, keyValues);
exit(EXIT_SUCCESS);
} else if (arg == "--unregister") {
LicdSetup::unregisterInstallation();
diff --git a/src/libs/qlicensecore/licdsetup.cpp b/src/libs/qlicensecore/licdsetup.cpp
index eeda7f7..331d071 100644
--- a/src/libs/qlicensecore/licdsetup.cpp
+++ b/src/libs/qlicensecore/licdsetup.cpp
@@ -289,9 +289,11 @@ std::string LicdSetup::parseMatchingServiceInstallation(const std::string &confi
return "";
}
std::map<std::string, std::string> suitableMatches;
+ std::map<std::string, std::string> suitablePreviewMatches;
for (const auto &section : sections) {
const std::string &foundVersion = sections[section.first]["version"];
const std::string &foundPath = sections[section.first]["path"];
+ const std::string &foundPreview = sections[section.first]["preview"];
if (foundVersion.empty()) {
logDebug("Misconfiguration in '%s'. Version not found for: %s", configPath.c_str(),
foundPath.c_str());
@@ -304,9 +306,15 @@ std::string LicdSetup::parseMatchingServiceInstallation(const std::string &confi
}
// we can replace existing match if the version number matches as if the versions match
// then they should be identical
- suitableMatches[foundVersion] = foundPath;
+ if (foundPreview == "true")
+ suitablePreviewMatches[foundVersion] = foundPath;
+ else
+ suitableMatches[foundVersion] = foundPath;
}
+ // Insert preview elements, if the container doesn't already contain the same version key
+ suitableMatches.insert(suitablePreviewMatches.begin(), suitablePreviewMatches.end());
+
if (!suitableMatches.empty()) {
auto bestMatch = *suitableMatches.rbegin();
const std::string foundVersion = bestMatch.first;
@@ -322,7 +330,8 @@ std::string LicdSetup::parseMatchingServiceInstallation(const std::string &confi
}
-void LicdSetup::registerInstallation(const std::string &installSource)
+void LicdSetup::registerInstallation(const std::string &installSource,
+ const std::map<std::string, std::string> &keyValues)
{
const std::string installationsFile =
LicdSetup::getQtAppDataLocation() + USER_SETTINGS_FOLDER_NAME + DIR_SEPARATOR
@@ -330,12 +339,19 @@ void LicdSetup::registerInstallation(const std::string &installSource)
const std::string currentTime = utils::localTimeToString(utils::localTime());
const std::string programPath = utils::getProgramPath();
const std::string formattedProgramPath = utils::replaceCharacters(programPath, ":/\\", '_');
+
+ std::map<std::string, std::string> installationContent = {
+ { "path", programPath },
+ { "source", installSource },
+ { "version", DAEMON_VERSION },
+ { "timestamp", currentTime }
+ };
+
+ if (!keyValues.empty())
+ installationContent.insert(keyValues.begin(), keyValues.end());
+
IniFileParser parser(installationsFile);
- if (parser.writeKeyValue(formattedProgramPath,
- { { "path", programPath },
- { "source", installSource },
- { "version", DAEMON_VERSION },
- { "timestamp", currentTime } })) {
+ if (parser.writeKeyValue(formattedProgramPath, installationContent)) {
logInfo("%s registered into: %s by: %s", programPath.c_str(), installationsFile.c_str(),
installSource.c_str());
} else {
diff --git a/src/libs/qlicensecore/licdsetup.h b/src/libs/qlicensecore/licdsetup.h
index 0406f53..88ef9e4 100644
--- a/src/libs/qlicensecore/licdsetup.h
+++ b/src/libs/qlicensecore/licdsetup.h
@@ -40,7 +40,8 @@ public:
static std::string getMatchingServiceInstallation(const std::string &version);
static std::string parseMatchingServiceInstallation(const std::string &configPath,
const std::string &version);
- static void registerInstallation(const std::string &installSource);
+ static void registerInstallation(const std::string &installSource,
+ const std::map<std::string, std::string> &keyValues);
static void unregisterInstallation();
static void purgeInstallationsConfig(const std::string &path);
diff --git a/tests/auto/licdsetup/tst_licdsetup.cpp b/tests/auto/licdsetup/tst_licdsetup.cpp
index b8100c3..463df48 100644
--- a/tests/auto/licdsetup/tst_licdsetup.cpp
+++ b/tests/auto/licdsetup/tst_licdsetup.cpp
@@ -37,6 +37,17 @@ TEST_CASE("Read matching service installation from installations.ini", "[licdset
}));
REQUIRE(
+ iniHandler.writeKeyValue("_home_foo_bar6_bin_qtlicd", {
+ {"path", "/home/foo/bar6/bin/qtlicd"},
+ {"version", "3.1.0"},
+ {"preview", "true"}
+ }));
+
+ // Test non-preview is preferred when same version is available
+ REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "3.1.0")
+ == "/home/foo/bar1/bin/qtlicd");
+
+ REQUIRE(
iniHandler.writeKeyValue("_home_foo_bar4_bin_qtlicd", {
{"path", "/home/foo/bar4/bin/qtlicd"},
{"version", "3.2.0"}
@@ -59,6 +70,18 @@ TEST_CASE("Read matching service installation from installations.ini", "[licdset
REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "2.2.0")
== "/home/foo/bar3/bin/qtlicd");
+
+ REQUIRE(
+ iniHandler.writeKeyValue("_home_foo_bar7_bin_qtlicd", {
+ {"path", "/home/foo/bar7/bin/qtlicd"},
+ {"version", "4.2.0"},
+ {"preview", "true"}
+ }));
+
+ // Test preview is preferred when greater version is available
+ REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "4.1.0")
+ == "/home/foo/bar7/bin/qtlicd");
+
REQUIRE(LicdSetup::parseMatchingServiceInstallation(TEST_INI_FILE, "5.2.0") == "");
}