diff --git a/zvmsdk/smtclient.py b/zvmsdk/smtclient.py index 9a014d6c3..668116a99 100644 --- a/zvmsdk/smtclient.py +++ b/zvmsdk/smtclient.py @@ -1407,56 +1407,75 @@ def guest_capture(self, userid, image_name, capture_type='rootonly', 'successfully' % image_name) def guest_get_os_version(self, userid): - os_version = '' - release_file = self.execute_cmd(userid, 'ls /etc/*-release') - if '/etc/os-release' in release_file: - # Parse os-release file, part of the output looks like: - # NAME="Red Hat Enterprise Linux Server" - # ID="rhel" - # VERSION_ID="7.0" - - release_info = self.execute_cmd(userid, 'cat /etc/os-release') - release_dict = {} - for item in release_info: - if item: - release_dict[item.split('=')[0]] = item.split('=')[1] - distro = release_dict['ID'] - version = release_dict['VERSION_ID'] - if '"' in distro: - distro = eval(distro) - if '"' in version: - version = eval(version) - os_version = '%s%s' % (distro, version) - return os_version - elif '/etc/redhat-release' in release_file: - # The output looks like: - # "Red Hat Enterprise Linux Server release 6.7 (Santiago)" - distro = 'rhel' - release_info = self.execute_cmd(userid, 'cat /etc/redhat-release') - distro_version = release_info[0].split()[6] - os_version = ''.join((distro, distro_version)) - return os_version - elif '/etc/SuSE-release' in release_file: - # The output for this file looks like: - # SUSE Linux Enterprise Server 11 (s390x) - # VERSION = 11 - # PATCHLEVEL = 3 - distro = 'sles' - release_info = self.execute_cmd(userid, 'cat /etc/SuSE-release') - LOG.debug('OS release info is %s' % release_info) - release_version = '.'.join((release_info[1].split('=')[1].strip(), - release_info[2].split('=')[1].strip())) - os_version = ''.join((distro, release_version)) - return os_version - elif '/etc/system-release' in release_file: - # For some rhel6.7 system, it only have system-release file and - # the output looks like: - # "Red Hat Enterprise Linux Server release 6.7 (Santiago)" - distro = 'rhel' - release_info = self.execute_cmd(userid, 'cat /etc/system-release') - distro_version = release_info[0].split()[6] - os_version = ''.join((distro, distro_version)) + """ + Retrieves the operating system name and version of the VM from release file. + :param userid: User ID of the VM. + :return: A string containing the OS name and version information. + Returns "" if IUCV is not configured. + Returns "NA" if no OS release file is found. + """ + + os_version = 'NA' + try: + release_file = self.execute_cmd(userid, 'ls /etc/*-release') + + if '/etc/os-release' in release_file: + # Parse os-release file, part of the output looks like: + # NAME="Red Hat Enterprise Linux Server" + # ID="rhel" + # VERSION_ID="7.0" + + release_info = self.execute_cmd(userid, 'cat /etc/os-release') + release_dict = {} + for item in release_info: + if item: + release_dict[item.split('=')[0]] = item.split('=')[1] + distro = release_dict['ID'] + version = release_dict['VERSION_ID'] + if '"' in distro: + distro = eval(distro) + if '"' in version: + version = eval(version) + os_version = '%s%s' % (distro, version) + + elif '/etc/redhat-release' in release_file: + # The output looks like: + # "Red Hat Enterprise Linux Server release 6.7 (Santiago)" + distro = 'rhel' + release_info = self.execute_cmd(userid, 'cat /etc/redhat-release') + distro_version = release_info[0].split()[6] + os_version = ''.join((distro, distro_version)) + + elif '/etc/SuSE-release' in release_file: + # The output for this file looks like: + # SUSE Linux Enterprise Server 11 (s390x) + # VERSION = 11 + # PATCHLEVEL = 3 + distro = 'sles' + release_info = self.execute_cmd(userid, 'cat /etc/SuSE-release') + LOG.debug('OS release info is %s' % release_info) + release_version = '.'.join((release_info[1].split('=')[1].strip(), + release_info[2].split('=')[1].strip())) + os_version = ''.join((distro, release_version)) + + elif '/etc/system-release' in release_file: + # For some rhel6.7 system, it only have system-release file and + # the output looks like: + # "Red Hat Enterprise Linux Server release 6.7 (Santiago)" + distro = 'rhel' + release_info = self.execute_cmd(userid, 'cat /etc/system-release') + distro_version = release_info[0].split()[6] + os_version = ''.join((distro, distro_version)) + return os_version + except Exception as e: + if e.results['rc'] in (1, 4): + # rc = 1,Command was not authorized or a generic Linux error. + # rc = 4,IUCV socket error + return "" + elif e.results['rc'] == 8: + # rc = 8,Executed command failed + return "NA" def _get_capture_devices(self, userid, capture_type='rootonly'): capture_devices = []