Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Stacki System Installation Checklist · Teradata/stacki Wiki · GitHub
Skip to content

Stacki System Installation Checklist

Aishwarya edited this page Jul 11, 2019 · 16 revisions

Table of Contents

Introduction

checklist.py is written as a systemd service that runs on the frontend all the time and reports the status of backend installations as it progresses through the various states. Typically a backend installation will include the below stages and the backend is expected to progress linearly through these stages except for the 'Install Wait' or 'Install Stalled' stages.

Usage - Redhat 7 or SLES 12: /usr/bin/systemctl start|stop|restart checklist

Usage - SLES 11: service start|stop|restart checklist

Usage - Debug Mode: export STACKDEBUG=y;/opt/stack/bin/checklist.py

The installation messages will be written to /var/log/checklist.log

Installation Stages

Checklist code generates the below messages based on the OS type. Once the 'Reboot_Okay' stage is reached, the message list will be cleared to indicate the end of an install.

Install StageDescriptionSupported in RedhatSupported in SLES
DHCPDISCOVERDHCP Handshake messageYesYes
DHCPOFFERDHCP Handshake messageYesYes
DHCPREQUESTDHCP Handshake messageYesYes
DHCPACKDHCP Handshake messageYesYes
DHCPNACKDHCP Error messageYesYes
DHCPDECLINEDHCP Error messageYesYes
TFTP_RRQTFTP read request for pxelinux.cfg file received for the installing backendYesYes
VMLinuz_RRQ_InstallTFTP read request for VMLinuz file received for the installing backendYesYes
Initrd_RRQTFTP read request for InitRD file received for the installing backendYesYes
Config_SentFile sent to backend as part of installationYes
Common_SentFile sent to backend as part of installationYes
Root_SentFile sent to backend as part of installationYes
Cracklib_Dict_SentFile sent to backend as part of installationYes
Bind_SentFile sent to backend as part of installationYes
SLES_Img_SentFile sent to backend as part of installationYes
Profile_XML_SentInstallation profile file parsed and sent successfully to the backendYesYes
SSH_OpenSSH Port 2200 open on the installing backendYesYes
AUTOINST_Present/tmp/profile/autoinst.xml is present on the installing backend with install profile informationYes
Partition_File_Present/tmp/partition.xml(SLES) or /tmp/partition-info (Redhat) is present on the installing backend with partitionYesYes
Ludicrous_StartedLudicrous client has started on the installing backendYesYes
Ludicrous_PopulatedLudicrous client has started downloading packagesYesYes
Set_DB_PartitionsDatabase partitions from the backend get written to the frontendYesYes
Set_Bootaction_OSbootaction is set to 'os' on the frontend for the installing backendYesYes
Rebooting_HDDInstalling backend reboots from Hard disk on 1st boot after installationYesYes
Reboot_Okay'ssh':'online' heartbeat message received for the installed backend on the 'health' channelYesYes
Install_WaitInstall halted due to manually inserted /tmp/wait file for debugging purposesYes
Install_StalledInstall halted due to errors like missing packages etcYes

Design Architecture

Daemon Design Architecture

Ways to monitor installation progress:

  • Log Files - /var/log/messages, Http log files
  • Message Queue
  • Files on Installing Node - Parsing log files, other system files on the installing node.

checklist.py uses python threaded daemons to monitor the installation progress through all the above mediums.

LogParser - Tail's log files and monitors messages relevant to installation. Below is a list of log files that are read and parsed on the frontend.

Message TypeSLESRedhat
DHCP, TFTP messages/var/log/messages/var/log/messages
Get Install Profiles, Set Bootaction/var/log/httpd/ssl_access_log , /var/log/httpd/access_log/var/log/apache2/ssl_access_log, /var/log/apache2/access_log

MQProcessor - Listens on the Stack Message Queue 'health' channel for messages relevant to backend installations. CheckTimeouts - Triggers a timeout message if backend installation does not progress to the next state within a certain time span.

Message Sharing - Design Architecture

Python Synchronized Queue's are used to share messages between the different threaded daemons. GlobalQueueAdder removes messages from localQ and adds it to the Shared Q. This is done to minimize Shared Q contention and to have the threaded daemons not spend time waiting to add messages to the Shared Q, especially during multiple backend installations.

Adding new install states

  • Create an enum for the install state in class State(Enum) class.
  • Add the enum in the 'class StateSequence' under the relevant OS dictionaries along with the time in seconds by which installation needs to progress to the next state. Make sure it is inserted into the correct place within the dictionary.
  • Determine whether this state needs to be monitored in the frontend or installing backend.
    1. Frontend - If the state can be monitored through the log files mentioned above, then the existing code can be modified to accommodate this. If its a completely different functionality, a new daemon may need to be written similar to LogParser, MQProcessor etc.
    2. Installing Backend - For example if a new state 'DISKS_NUKED' needs to be added, the smq-publish command can be called in the installation code in the below format:
state = DISKS_NUKED
isErr = False
msg = ""
cmd = ['/opt/stack/bin/smq-publish', '-chealth', '-t300',
'{"systest":"%s","flag":"%s","msg":"%s"}' % (state, str(flag), msg)]
pyenv = os.environ.copy()
pyenv["LD_LIBRARY_PATH"] = "/opt/stack/lib/"
if 'PYTHONPATH' in pyenv:
del pyenv['PYTHONPATH']
subprocess.run(cmd, env=pyenv)

Clone this wiki locally