diff --git a/worker.cpp b/worker.cpp index 031b44f..eaf6836 100644 --- a/worker.cpp +++ b/worker.cpp @@ -68,7 +68,7 @@ Worker::Worker(hwinf *hw, , m_ismasUpdateRequests(ISMAS_UPDATE_REQUESTS) , m_waitForNewUpdates(this) , m_filesToUpdate() - , m_updateProcessRunning(false) + , m_updateProcessRunning(true) , m_returnCode(0) , m_progressValue(0) , m_withoutIsmasDirectPort(false) /* useful for testing */ { @@ -206,77 +206,122 @@ void Worker::privateUpdate() { m_returnCode = -3; } } else { - qInfo() << "CHECKOUT BRANCH..."; - emit appendText("\nInitializing customer environment ..."); - startProgressLoop(); - if (m_gc.gitCheckoutBranch()) { - stopProgressLoop(); - emit replaceLast("Initializing customer environment ...", UPDATE_STEP_DONE); - setProgress(100); + m_ismasClient.setProgressInPercent(10); + if (backendConnected()) { + m_ismasClient.setProgressInPercent(20); + if (updateTriggerSet()) { + m_ismasClient.setProgressInPercent(30); + if (customerEnvironment()) { + m_ismasClient.setProgressInPercent(40); + if (filesToUpdate()) { + // send message to ISMAS about files which have been + // checked in into git repository + m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CHECK_FILES_TO_UPDATE_SUCCESS, + QString("Files to update: ") + m_filesToUpdate.join(',')); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAContinues("CHECK-FILES-TO-UPDATE", + m_updateStatus.m_statusDescription)); + m_ismasClient.setProgressInPercent(50); + if (updateFiles(50)) { + m_ismasClient.setProgressInPercent(60); + if (syncCustomerRepositoryAndFS()) { + m_ismasClient.setProgressInPercent(70); + if (sendIsmasLastVersionNotification()) { + m_ismasClient.setProgressInPercent(80); + sentIsmasLastVersionNotification = true; + if (saveLogFile()) { + m_ismasClient.setProgressInPercent(90); - m_ismasClient.setProgressInPercent(10); - //m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CHECKOUT_BRANCH, - // QString("CHECKED OUT BRANCH: ") + m_gc.branchName()); - //IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, - // QString("#M=APISM#C=CMD_EVENT#J=") + - // m_ismasClient.checkoutBranch( - // m_updateStatus.m_statusDescription, "")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSASucceeded("")); - qInfo() << "CHECKED OUT BRANCH"; - if (backendConnected()) { - m_ismasClient.setProgressInPercent(20); - if (updateTriggerSet()) { - m_ismasClient.setProgressInPercent(30); - if (customerEnvironment()) { - m_ismasClient.setProgressInPercent(40); - if (filesToUpdate()) { - m_ismasClient.setProgressInPercent(50); - if (updateFiles(50)) { - m_ismasClient.setProgressInPercent(60); - if (syncCustomerRepositoryAndFS()) { - m_ismasClient.setProgressInPercent(70); - if (sendIsmasLastVersionNotification()) { - m_ismasClient.setProgressInPercent(80); - sentIsmasLastVersionNotification = true; - if (saveLogFile()) { - m_ismasClient.setProgressInPercent(90); + // mark update as activated -> this resets the WAIT button + m_ismasClient.setProgressInPercent(95); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAActivated()); - IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, - QString("#M=APISM#C=CMD_EVENT#J=") + - m_ismasClient.updateOfPSASucceeded("")); - - // mark update as activated -> this resets the WAIT button - m_ismasClient.setProgressInPercent(95); - IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, - QString("#M=APISM#C=CMD_EVENT#J=") + - m_ismasClient.updateOfPSAActivated()); - - m_returnCode = 0; - } else { - m_returnCode = -12; - } + m_returnCode = 0; } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::SAVE_LOG_FILES_FAILED, + QString("Saving log files failed")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "SAVE-LOG-FILES", + m_updateStatus.m_statusDescription)); m_returnCode = -11; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::ISMAS_SEND_LAST_VERSION_FAILED, + QString("Sending ISMAS last version failed")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "ISMAS-SEND-LAST-VERSION", + m_updateStatus.m_statusDescription)); m_returnCode = -10; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::RSYNC_UPDATES_FAILURE, + QString("Syncing files to update failed")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "RSYNC-UPDATE-FILES", + m_updateStatus.m_statusDescription)); m_returnCode = -9; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::PSA_UPDATE_FILES_FAILED, + QString("Updating files failed")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "UPDATE-FILES", + m_updateStatus.m_statusDescription)); m_returnCode = -8; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE, + QString("No files to update")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "FETCH-FILES-TO-UPDATE", + m_updateStatus.m_statusDescription)); m_returnCode = -7; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CHECKOUT_BRANCH_REQUEST_FAILURE, + QString("Configuring customer environment failed")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "GIT-CHECKOUT-BRANCH", + m_updateStatus.m_statusDescription)); m_returnCode = -6; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::ISMAS_UPDATE_TRIGGER_SET_FAILURE, + QString("ISMAS update trigger wrong")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "CHECK-UPDATE-TRIGGER", + m_updateStatus.m_statusDescription)); m_returnCode = -5; } } else { + m_updateStatus = UpdateStatus(UPDATE_STATUS::ISMAS_BACKEND_CHECK_FAILURE, + QString("ISMAS backend not available")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + "ISMAS-BACKEND-CHECK", + m_updateStatus.m_statusDescription)); m_returnCode = -4; } } @@ -302,45 +347,64 @@ void Worker::privateUpdate() { } bool Worker::backendConnected() { - if (m_withoutIsmasDirectPort) { // useful for testing - return true; - } + // deactivated: REQ_SELF does not really help. Observation was that even + // id ISMAS is reported as 'true', a following check of the update-trigger + // button has no access to ISMAS. + return true; emit appendText("\nConnecting backend ..."); - for (int repeat = 0; repeat < 50; ++repeat) { - qInfo() << "REPEAT" << repeat << "In backendConnected() -> #M=APISM#C=REQ_SELF#J={}"; - startProgressLoop(); - std::optional result - = IsmasClient::sendRequestReceiveResponse( - IsmasClient::APISM::DIRECT_PORT, "#M=APISM#C=REQ_SELF#J={}"); - if (result) { - stopProgressLoop(); - int progress = (m_mainWindow->progressValue()/10) + 10; - setProgress(progress); + if (false) { // so linker removes dead code + for (int repeat = 0; repeat < 50; ++repeat) { + qInfo() << "REPEAT" << repeat << "In backendConnected() -> #M=APISM#C=REQ_SELF#J={}"; + startProgressLoop(); + std::optional result + = IsmasClient::sendRequestReceiveResponse( + IsmasClient::APISM::DIRECT_PORT, "#M=APISM#C=REQ_SELF#J={}"); + if (result) { + stopProgressLoop(); + int progress = (m_mainWindow->progressValue()/10) + 10; + setProgress(progress); - QString msg = result.value(); - qInfo() << "In backendConnected() -> APISM response" << msg; - QJsonParseError parseError; - QJsonDocument document(QJsonDocument::fromJson(msg.toUtf8(), &parseError)); - if (parseError.error != QJsonParseError::NoError) { - qCritical() << "(2) INVALID JSON MSG: PARSING FAILED (msg=" << msg << "):" - << parseError.error << parseError.errorString(); - emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL); - return false; - } - if (!document.isObject()) { - qCritical() << "FILE IS NOT A JSON OBJECT!"; - emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL); - return false; - } + QString msg = result.value(); + qInfo() << "In backendConnected() -> APISM response" << msg; + QJsonParseError parseError; + QJsonDocument document(QJsonDocument::fromJson(msg.toUtf8(), &parseError)); + if (parseError.error != QJsonParseError::NoError) { + qCritical() << "(1) INVALID JSON MSG: PARSING FAILED (msg=" << msg << "):" + << parseError.error << parseError.errorString(); + setProgress(100); + m_updateStatus = UpdateStatus(UPDATE_STATUS::JSON_PARSE_FAILURE, + QString("(2) INVALID JSON %1 %2 %3") + .arg(msg) + .arg(parseError.error) + .arg(parseError.errorString())); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.jsonParseFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + m_updateStatus.m_statusDescription)); + emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL); + return false; + } + if (!document.isObject()) { + qCritical() << "FILE IS NOT A JSON OBJECT!"; + setProgress(100); + m_updateStatus = UpdateStatus(UPDATE_STATUS::JSON_PARSE_FAILURE, + QString("NOT A JSON-OBJECT %1").arg(msg)); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.jsonParseFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + m_updateStatus.m_statusDescription)); + emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL); + return false; + } - setProgress(progress + 1); + setProgress(progress + 1); - QJsonObject obj = document.object(); - QStringList keys = obj.keys(); - for (QString const& key : keys ) { - if (key.contains("CMD_GET_APISMSTATUS_RESPONSE")) { + QJsonObject obj = document.object(); + QStringList keys = obj.keys().filter("CMD_GET_APISMSTATUS_RESPONSE"); + if (keys.size() == 1) { + QString const key = keys.at(0); QJsonValue v = obj.value(key); if (v.isObject()) { obj = v.toObject(); @@ -357,32 +421,61 @@ bool Worker::backendConnected() { return true; } } - emit showErrorMessage("Check backend connection", - QString ("REPEAT %1 Broker=<").arg(repeat) - + status + ">, ISMAS=<" + (ismas ? "true>" : "false>")); + + m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK, + QString ("REPEAT %1 Broker=<").arg(repeat) + + status + ">, ISMAS=<" + (ismas ? "true>" : "false>")); + //IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + // QString("#M=APISM#C=CMD_EVENT#J=") + + // m_ismasClient.updateOfPSAContinues("BACKEND-CHECK", m_updateStatus.m_statusDescription)); + + qInfo() << "BACKEND-CHECK" << m_updateStatus.m_statusDescription; + emit showErrorMessage("Check backend connection", m_updateStatus.m_statusDescription); QThread::sleep(6); continue; + } else { + setProgress(100); + m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK_FAILURE, + "CMD_GET_APISM_STATUS_RESPONSE KEY NOT A JSON-OBJECT"); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.sanityCheckFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + m_updateStatus.m_statusDescription)); + emit showErrorMessage("check backend connection", m_updateStatus.m_statusDescription); + emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL); + return false; } + } else { + setProgress(100); + m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_CHECK_FAILURE, + "CMD_GET_APISMSTATUS_RESPONSE KEY NOT AVAILABLE"); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.sanityCheckFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR, + m_updateStatus.m_statusDescription)); + emit showErrorMessage("check backend connection", m_updateStatus.m_statusDescription); + emit replaceLast("Connecting backend ...", UPDATE_STEP_FAIL); + return false; } + + } else { + stopProgressLoop(); + int progress = (m_mainWindow->progressValue()/10) + 10; + setProgress(progress); } - } else { - stopProgressLoop(); - int progress = (m_mainWindow->progressValue()/10) + 10; - setProgress(progress); } + + setProgress(100); + + emit replaceLast("Connecting backend", UPDATE_STEP_FAIL); + emit showErrorMessage("Error", "Backend not available"); + + m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_NOT_CONNECTED, + QString("NO BACKEND CONNECTION")); + IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, + QString("#M=APISM#C=CMD_EVENT#J=") + + m_ismasClient.errorBackendNotConnected(m_updateStatus.m_statusDescription, "")); } - - setProgress(100); - - emit replaceLast("Connecting backend", UPDATE_STEP_FAIL); - emit showErrorMessage("Error", "Backend not available"); - - m_updateStatus = UpdateStatus(UPDATE_STATUS::BACKEND_NOT_CONNECTED, - QString("NO BACKEND CONNECTION")); - IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT, - QString("#M=APISM#C=CMD_EVENT#J=") + - m_ismasClient.errorBackendNotConnected(m_updateStatus.m_statusDescription, "")); - return false; }