Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Restart from INBC #476

Merged
merged 1 commit into from
Feb 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions inbc-program/inbc/command/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
from ..utility import search_keyword

from inbm_lib.timer import Timer
from inbm_lib.constants import RESTART, QUERY, QUERY_CHANNEL, RESTART_CHANNEL
from inbm_lib.constants import RESTART, QUERY
from inbm_common_lib.request_message_constants import COMMAND_SUCCESSFUL, DYNAMIC_TELEMETRY, \
RESTART_SUCCESS, RESTART_FAILURE, QUERY_SUCCESS, QUERY_FAILURE, OTA_IN_PROGRESS, \
QUERY_HOST_SUCCESS, QUERY_HOST_FAILURE, QUERY_HOST_KEYWORD
from inbm_common_lib.request_message_constants import DBS_LOG, DOCKER_NAME, DOCKER_MESSAGE
from inbm_lib.constants import HOST_QUERY_CHANNEL
from inbm_lib.constants import HOST_QUERY_CHANNEL, RESTART_CMD_CHANNEL

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -129,7 +129,7 @@ def invoke_update(self, args: Any) -> None:

@param args: arguments passed to command-line tool.
"""
super()._send_manifest(args, RESTART_CHANNEL)
super()._send_manifest(args, RESTART_CMD_CHANNEL)

def search_response(self, payload: Any) -> None:
"""Search for keywords in response message
Expand Down
2 changes: 1 addition & 1 deletion inbc-program/inbc/command/ota_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from ..utility import search_keyword
from ..ibroker import IBroker

from inbm_lib.constants import CACHE, INSTALL_CHANNEL, FOTA, SOTA, POTA, AOTA
from inbm_lib.constants import FOTA, SOTA, POTA, AOTA
from inbm_common_lib.request_message_constants import OTA_SUCCESS_MESSAGE_LIST, SOTA_FAILURE, \
OTA_FAILURE_MESSAGE_LIST, COMMAND_SUCCESSFUL, SOTA_COMMAND_STATUS_SUCCESSFUL, SOTA_COMMAND_FAILURE, \
FOTA_INPROGRESS_FAILURE
Expand Down
8 changes: 2 additions & 6 deletions inbc-program/inbc/parser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,16 +326,12 @@ def restart(args: argparse.Namespace) -> str:
"""Creates manifest in XML format.

@param args: Arguments provided by the user from command line
@return: Generated xml manifest string
@return: Generated XML manifest string
"""
raise InbcException('Restart command is not supported.')

manifest = ('<?xml version="1.0" encoding="utf-8"?>' +
'<manifest>' +
'<type>cmd</type>' +
'<cmd>restart</cmd>' +
'<restart>' +
'</restart>' +
'</manifest>')
print("manifest {0}".format(manifest))
return manifest
Expand All @@ -345,7 +341,7 @@ def query(args: argparse.Namespace) -> str:
"""Creates manifest in XML format.

@param args: Arguments provided by the user from command line
@return: Generated xml manifest string
@return: Generated XML manifest string
"""
arguments = {
'option': args.option
Expand Down
11 changes: 6 additions & 5 deletions inbc-program/tests/unit/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,12 @@ def test_remove_manifest(self) -> None:
'</configtype></config></manifest>'
self.assertEqual(remove.func(remove), expected)

def test_raise_not_supported_restart_manifest(self) -> None:
restart = self.arg_parser.parse_args(['restart'])
with self.assertRaisesRegex(InbcException, 'Restart command is not supported.'):
restart.func(restart)

def test_create_restart_manifest(self):
s = self.arg_parser.parse_args(['restart'])

expected = '<?xml version="1.0" encoding="utf-8"?><manifest><type>cmd</type><cmd>restart</cmd></manifest>'
assert expected == s.func(s)

def test_query_manifest(self) -> None:
s = self.arg_parser.parse_args(['query', '-o', 'all'])

Expand Down
15 changes: 3 additions & 12 deletions inbm-lib/inbm_lib/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,6 @@
# Path to inbm version files
INBM_VERSION_FILE = get_canonical_representation_of_path(
'/usr/share/intel-manageability/inbm-version.txt')
INBM_VISION_VERSION_FILE_HOST = get_canonical_representation_of_path(
'/usr/share/intel-manageability/inbm-vision-host-version.txt')
INBM_VISION_VERSION_FILE_NODE = get_canonical_representation_of_path(
'/usr/share/intel-manageability/inbm-vision-node-version.txt')

# CentOS version path
CENTOS_VERSION_PATH = get_canonical_representation_of_path('/etc/centos-release')
Expand All @@ -52,6 +48,9 @@
QUERY_CMD_CHANNEL = 'dispatcher/query'
HOST_QUERY_CHANNEL = 'manageability/request/query'

# RESTART
RESTART_CMD_CHANNEL = 'manageability/request/restart'

# OTA types
AOTA = "aota"
FOTA = "fota"
Expand All @@ -66,14 +65,6 @@
APPLICATION = "application"
OS = "os"

OTA_UPDATE = "install"
PROVISION = 'provision'
REQUEST_CHANNEL = 'ma/request/'
INSTALL_CHANNEL = REQUEST_CHANNEL + OTA_UPDATE
RESTART_CHANNEL = REQUEST_CHANNEL + RESTART
QUERY_CHANNEL = REQUEST_CHANNEL + QUERY
PROVISION_CHANNEL = REQUEST_CHANNEL + PROVISION

# Device local cache
CACHE = str(INTEL_MANAGEABILITY_CACHE_PATH_PREFIX / 'repository-tool/')

Expand Down
85 changes: 1 addition & 84 deletions inbm-lib/inbm_lib/version.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional

from inbm_common_lib.version import read_version, read_commit
from inbm_lib.constants import INBM_VERSION_FILE, INBM_VISION_VERSION_FILE_HOST, INBM_VISION_VERSION_FILE_NODE
from inbm_lib.constants import INBM_VERSION_FILE


def _read_inbm_version_file() -> Optional[str]:
Expand All @@ -11,23 +11,6 @@ def _read_inbm_version_file() -> Optional[str]:
except OSError:
return None


def _read_inbm_vision_version_file_host() -> Optional[str]:
try:
version_file = open(INBM_VISION_VERSION_FILE_HOST, "r")
return version_file.read()
except OSError:
return None


def _read_inbm_vision_version_file_node() -> Optional[str]:
try:
version_file = open(INBM_VISION_VERSION_FILE_NODE, "r")
return version_file.read()
except OSError:
return None


def get_inbm_version() -> Optional[str]:
"""Get INBM version from version file
@return: version string, or None if unable
Expand Down Expand Up @@ -67,69 +50,3 @@ def get_friendly_inbm_version_commit() -> str:
commit_str = commit

return f"Intel(R) Manageability version {version_str} ({commit_str})"


def get_inbm_vision_host_version() -> Optional[str]:
"""Get INBM Vision Host version from version file
@return: version string, or None if unable
"""
contents = _read_inbm_vision_version_file_host()
if contents is None:
return None
return read_version(contents)


def get_inbm_vision_host_commit() -> Optional[str]:
"""Get INBM vision host commit from version file
@return: version string, or None if unable
"""
contents = _read_inbm_vision_version_file_host()
if contents is None:
return None
return read_commit(contents)


def get_inbm_vision_node_version() -> Optional[str]:
"""Get INBM Vision Node version from version file
@return: version string, or None if unable
"""
contents = _read_inbm_vision_version_file_node()
if contents is None:
return None
return read_version(contents)


def get_inbm_vision_node_commit() -> Optional[str]:
"""Get INBM vision node commit from version file
@return: version string, or None if unable
"""
contents = _read_inbm_vision_version_file_node()
if contents is None:
return None
return read_commit(contents)


def get_friendly_inbm_vision_version_commit() -> str:
"""Get a friendly version/commit string for inbm vision"""

version = get_inbm_vision_host_version()
commit = get_inbm_vision_host_commit()
type = "host"
if version is None:
version = get_inbm_vision_node_version()
commit = get_inbm_vision_node_commit()
type = "node"

version_str = ""
if version is None:
version_str = "unknown version"
else:
version_str = version

commit_str = ""
if commit is None:
commit_str = "unknown commit"
else:
commit_str = commit

return f"Intel(R) Manageability Vision {type} version {version_str} ({commit_str})"
54 changes: 3 additions & 51 deletions inbm-lib/tests/unit/inbm_lib/test_version.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from unittest import TestCase
from inbm_lib.version import get_inbm_version, get_inbm_commit, get_inbm_vision_host_version, get_inbm_vision_host_commit, get_inbm_vision_node_version, get_inbm_vision_node_commit
from inbm_lib.version import get_friendly_inbm_version_commit, get_friendly_inbm_vision_version_commit
from inbm_lib.version import get_inbm_version, get_inbm_commit
from inbm_lib.version import get_friendly_inbm_version_commit
from unittest.mock import patch, Mock

INBM_VERSION_TEXT = "Version: 1.2.3\r\nCommit: abcdefg\r\n"
Expand All @@ -19,57 +19,9 @@ def test_get_inbm_commit(self, version: Mock) -> None:
version.return_value = INBM_VERSION_TEXT
self.assertEqual("abcdefg", get_inbm_commit())

@patch('inbm_lib.version._read_inbm_vision_version_file_host')
def test_get_inbm_vision_host_version(self, version: Mock) -> None:
version.return_value = INBM_VERSION_TEXT_HOST
self.assertEqual("2.3.4", get_inbm_vision_host_version())

@patch('inbm_lib.version._read_inbm_vision_version_file_host')
def test_get_inbm_vision_host_commit(self, version: Mock) -> None:
version.return_value = INBM_VERSION_TEXT_HOST
self.assertEqual("aaabbbc", get_inbm_vision_host_commit())

@patch('inbm_lib.version._read_inbm_vision_version_file_node')
def test_get_inbm_vision_node_version(self, version: Mock) -> None:
version.return_value = INBM_VERSION_TEXT_NODE
self.assertEqual("3.4.5", get_inbm_vision_node_version())

@patch('inbm_lib.version._read_inbm_vision_version_file_node')
def test_get_inbm_vision_node_commit(self, version: Mock) -> None:
version.return_value = INBM_VERSION_TEXT_NODE
self.assertEqual("fffeeed", get_inbm_vision_node_commit())

@patch('inbm_lib.version._read_inbm_vision_version_file_host')
@patch('inbm_lib.version._read_inbm_vision_version_file_node')
@patch('inbm_lib.version._read_inbm_version_file')
def test_get_friendly_inbm_version_commit(self, tc: Mock, bc_node: Mock, bc_host: Mock) -> None:
def test_get_friendly_inbm_version_commit(self, tc: Mock) -> None:
tc.return_value = INBM_VERSION_TEXT
bc_node.return_value = INBM_VERSION_TEXT_NODE
bc_host.return_value = INBM_VERSION_TEXT_HOST

self.assertEqual("Intel(R) Manageability version 1.2.3 (abcdefg)",
get_friendly_inbm_version_commit())

@patch('inbm_lib.version._read_inbm_vision_version_file_host')
@patch('inbm_lib.version._read_inbm_vision_version_file_node')
@patch('inbm_lib.version._read_inbm_version_file')
def test_get_friendly_inbm_vision_version_commit(self, tc: Mock, bc_node: Mock, bc_host: Mock) -> None:
tc.return_value = INBM_VERSION_TEXT
bc_node.return_value = INBM_VERSION_TEXT_NODE
bc_host.return_value = INBM_VERSION_TEXT_HOST

# Use host version when both node+host present
self.assertEqual("Intel(R) Manageability Vision host version 2.3.4 (aaabbbc)",
get_friendly_inbm_vision_version_commit())

@patch('inbm_lib.version._read_inbm_vision_version_file_host')
@patch('inbm_lib.version._read_inbm_vision_version_file_node')
@patch('inbm_lib.version._read_inbm_version_file')
def test_get_friendly_inbm_vision_version_commit_node_only(self, tc: Mock, bc_node: Mock, bc_host: Mock) -> None:
tc.return_value = INBM_VERSION_TEXT
bc_node.return_value = INBM_VERSION_TEXT_NODE
bc_host.return_value = None

# Use node version.
self.assertEqual("Intel(R) Manageability Vision node version 3.4.5 (fffeeed)",
get_friendly_inbm_vision_version_commit())
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ def __init__(self) -> None:
self.runner = PseudoShellRunner()

def restart(self) -> str:
logger.debug("Restart Linux system command received")
(out, err, code) = self.runner.run(LINUX_POWER + LINUX_RESTART)
if code != 0:
raise DispatcherException(f"Restart FAILED. Error:{err}")
Expand Down
3 changes: 2 additions & 1 deletion inbm/dispatcher-agent/dispatcher/dispatcher_class.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,10 +243,11 @@ def _perform_cmd_type_operation(self, parsed_head: XmlHandler, xml: str) -> Resu
if cmd == "shutdown":
message = self.device_manager.shutdown()
elif cmd == "restart":
logger.info("Restart command received. Restarting system...")
message = self.device_manager.restart()
if message == SUCCESS_RESTART:
state: dispatcher_state.DispatcherState = {'restart_reason': 'restart_cmd'}
dispatcher_state.write_dispatcher_state_to_state_file(state)
dispatcher_state.write_dispatcher_state_to_state_file(state)
elif cmd == "query":
self._dispatcher_broker.mqtt_publish(QUERY_CMD_CHANNEL, xml)
return PUBLISH_SUCCESS
Expand Down
9 changes: 3 additions & 6 deletions inbm/telemetry-agent/telemetry/telemetry_handling.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
get_core_temp_celsius, get_network_telemetry, get_battery_status
from .command import Command
from .telemetry_exception import TelemetryException
from inbm_lib.version import get_friendly_inbm_version_commit, get_friendly_inbm_vision_version_commit
from inbm_lib.version import get_friendly_inbm_version_commit
from telemetry import software_bom_list

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -217,8 +217,7 @@ def get_dynamic_telemetry(is_docker_installed: bool, rm_active: bool = False) ->
'percentDiskUsed': get_percent_disk_used(),
'coreTempCelsius': get_core_temp_celsius(),
'networkInformation': get_network_telemetry(),
'friendlyINBMVersionCommit': get_friendly_inbm_version_commit(),
'friendlyINBMVisionVersionCommit': get_friendly_inbm_vision_version_commit()}
'friendlyINBMVersionCommit': get_friendly_inbm_version_commit()}

if rm_active:
dynamic_telemetry['resourceMonitoring'] = get_pms_rm_telemetry()
Expand Down Expand Up @@ -304,11 +303,9 @@ def get_query_related_info(option: str, info: Dict) -> Dict:
del info['values'][elem]
elif option == "version":
info = {}
info['INBMVersionCommit'] = get_friendly_inbm_version_commit()
info['INBMVisionVersionCommit'] = get_friendly_inbm_vision_version_commit()
info['INBMVersionCommit'] = get_friendly_inbm_version_commit()
elif option == "all":
info['INBMVersionCommit'] = get_friendly_inbm_version_commit()
info['INBMVisionVersionCommit'] = get_friendly_inbm_vision_version_commit()
return info


Expand Down