Merge "Fix pre-upgrade check to verify FS allocation"
This commit is contained in:
@@ -1267,7 +1267,10 @@ TIS_STD_BUILD = 'Standard'
|
|||||||
TIS_AIO_BUILD = 'All-in-one'
|
TIS_AIO_BUILD = 'All-in-one'
|
||||||
|
|
||||||
# Free space needed on CentOS for Debian upgrade
|
# Free space needed on CentOS for Debian upgrade
|
||||||
UPGRADE_FREE_SPACE_NEEDED_IN_GIB = 51
|
WORKER_UPGRADE_FREE_SPACE_NEEDED_IN_GIB = 23.5
|
||||||
|
# Total disk space needed on CentOS for Debian upgrade
|
||||||
|
STORAGE_UPGRADE_SPACE_NEEDED_IN_GIB = 118
|
||||||
|
CONTROLLER_UPGRADE_SPACE_NEEDED_IN_GIB = 220
|
||||||
|
|
||||||
# Platform Upgrade states
|
# Platform Upgrade states
|
||||||
UPGRADE_STARTING = 'starting'
|
UPGRADE_STARTING = 'starting'
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ from sysinv.api.controllers.v1 import patch_api
|
|||||||
from sysinv.api.controllers.v1 import vim_api
|
from sysinv.api.controllers.v1 import vim_api
|
||||||
|
|
||||||
import tsconfig.tsconfig as tsc
|
import tsconfig.tsconfig as tsc
|
||||||
from sysinv.agent import disk
|
|
||||||
|
|
||||||
import cgcs_patch.constants as patch_constants
|
import cgcs_patch.constants as patch_constants
|
||||||
|
|
||||||
@@ -38,7 +37,6 @@ class Health(object):
|
|||||||
self._dbapi = dbapi
|
self._dbapi = dbapi
|
||||||
self._ceph = ceph.CephApiOperator()
|
self._ceph = ceph.CephApiOperator()
|
||||||
self._kube_operator = kubernetes.KubeOperator()
|
self._kube_operator = kubernetes.KubeOperator()
|
||||||
self._idisk_operator = disk.DiskOperator()
|
|
||||||
|
|
||||||
def _check_hosts_provisioned(self, hosts):
|
def _check_hosts_provisioned(self, hosts):
|
||||||
"""Checks that each host is provisioned"""
|
"""Checks that each host is provisioned"""
|
||||||
@@ -440,28 +438,42 @@ class Health(object):
|
|||||||
|
|
||||||
return health_ok, output
|
return health_ok, output
|
||||||
|
|
||||||
|
def _check_disk_space_on_host(self, host, hostname, min_space_needed, check_free_space):
|
||||||
|
if check_free_space:
|
||||||
|
available_gib = utils.get_available_gib_in_disk(host, host.rootfs_device, self._dbapi)
|
||||||
|
msg = _("Insufficient unallocated disk space on rootdisk for %s. Current\n"
|
||||||
|
"partitions have allocated disk space such that only %.2fGiB is "
|
||||||
|
"available\nbut %.2fGiB unallocated disk space is needed.\n") % (hostname,
|
||||||
|
available_gib,
|
||||||
|
min_space_needed)
|
||||||
|
else:
|
||||||
|
available_gib = utils.get_size_gib_in_disk(host, host.rootfs_device, self._dbapi)
|
||||||
|
msg = _("Insufficient total disk space on rootdisk for %s, %.2fGiB needed, "
|
||||||
|
"%.2fGiB available.\n") % (hostname,
|
||||||
|
min_space_needed,
|
||||||
|
available_gib)
|
||||||
|
if available_gib < min_space_needed:
|
||||||
|
return msg
|
||||||
|
|
||||||
def _check_free_space_for_upgrade(self):
|
def _check_free_space_for_upgrade(self):
|
||||||
output = ""
|
output = ""
|
||||||
success = True
|
success = True
|
||||||
for ihost in self._dbapi.ihost_get_list():
|
for ihost in self._dbapi.ihost_get_list():
|
||||||
|
min_space_needed = 0
|
||||||
|
check_free_space = False
|
||||||
host = self._dbapi.ihost_get_by_hostname(ihost.hostname)
|
host = self._dbapi.ihost_get_by_hostname(ihost.hostname)
|
||||||
host_subfunctions = host.subfunctions.split(",")
|
host_subfunctions = host.subfunctions.split(",")
|
||||||
if constants.WORKER in host_subfunctions:
|
if constants.WORKER in host_subfunctions:
|
||||||
available_mib = self._idisk_operator.get_disk_available_mib(host.rootfs_device)
|
min_space_needed = constants.WORKER_UPGRADE_FREE_SPACE_NEEDED_IN_GIB
|
||||||
available_gib = available_mib / 1024
|
check_free_space = True
|
||||||
if available_gib < constants.UPGRADE_FREE_SPACE_NEEDED_IN_GIB:
|
elif constants.STORAGE in host_subfunctions:
|
||||||
output += _("Insufficient free diskspace on rootdisk for %s, %iGiB needed, "
|
min_space_needed = constants.STORAGE_UPGRADE_SPACE_NEEDED_IN_GIB
|
||||||
"%.2fGiB available\n") % (ihost.hostname,
|
elif constants.CONTROLLER in host_subfunctions:
|
||||||
constants.UPGRADE_FREE_SPACE_NEEDED_IN_GIB,
|
min_space_needed = constants.CONTROLLER_UPGRADE_SPACE_NEEDED_IN_GIB
|
||||||
available_gib)
|
msg = self._check_disk_space_on_host(
|
||||||
success = False
|
host, ihost.hostname, min_space_needed, check_free_space)
|
||||||
elif constants.STORAGE in host_subfunctions or constants.WORKER not in host_subfunctions:
|
if msg:
|
||||||
cgtsvg_max_free_gib = utils.get_cgtsvg_available_gib(host, self._dbapi)
|
output += msg
|
||||||
if cgtsvg_max_free_gib < constants.UPGRADE_FREE_SPACE_NEEDED_IN_GIB:
|
|
||||||
output += _("Insufficient free diskspace on cgts-vg for %s, %iGiB needed, "
|
|
||||||
"%.2fGiB available \n") % (ihost.hostname,
|
|
||||||
constants.UPGRADE_FREE_SPACE_NEEDED_IN_GIB,
|
|
||||||
cgtsvg_max_free_gib)
|
|
||||||
success = False
|
success = False
|
||||||
return output, success
|
return output, success
|
||||||
|
|
||||||
@@ -572,10 +584,11 @@ class Health(object):
|
|||||||
% (Health.SUCCESS_MSG if success else Health.FAIL_MSG)
|
% (Health.SUCCESS_MSG if success else Health.FAIL_MSG)
|
||||||
|
|
||||||
health_ok = health_ok and success
|
health_ok = health_ok and success
|
||||||
|
# TODO (luisbonatti): remove when CentOS to Debian upgrade is deprecated
|
||||||
if upgrade_version == tsc.SW_VERSION_22_12:
|
if upgrade_version == tsc.SW_VERSION_22_12:
|
||||||
msg, success = self._check_free_space_for_upgrade()
|
msg, success = self._check_free_space_for_upgrade()
|
||||||
output += \
|
output += \
|
||||||
_('Free disk requirement: [%s]\n') \
|
_('Disk space requirement: [%s]\n') \
|
||||||
% (Health.SUCCESS_MSG if success else Health.FAIL_MSG)
|
% (Health.SUCCESS_MSG if success else Health.FAIL_MSG)
|
||||||
if not success:
|
if not success:
|
||||||
output += msg
|
output += msg
|
||||||
|
|||||||
@@ -1674,21 +1674,28 @@ def is_single_controller(dbapi):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def get_cgtsvg_available_gib(host, dbapi):
|
def get_size_gib_in_disk(host, device_path, dbapi):
|
||||||
"""Calculate free space cgtsvg
|
"""Get the size for the device path
|
||||||
returns: cgtsvg free space in GiB
|
returns: size space in GiB
|
||||||
"""
|
"""
|
||||||
cgtsvg_free_mib = 0
|
size_gib = 0
|
||||||
ilvgs = dbapi.ilvg_get_by_ihost(host.uuid)
|
disks = dbapi.idisk_get_by_ihost(host.uuid)
|
||||||
for ilvg in ilvgs:
|
for disk in disks:
|
||||||
if (ilvg.lvm_vg_name == constants.LVG_CGTS_VG and
|
if disk.device_path == device_path:
|
||||||
ilvg.lvm_vg_size and ilvg.lvm_vg_total_pe):
|
size_gib = disk.size_mib / 1024
|
||||||
cgtsvg_free_mib = (int(ilvg.lvm_vg_size) * int(
|
return size_gib
|
||||||
ilvg.lvm_vg_free_pe)
|
|
||||||
/ int(ilvg.lvm_vg_total_pe)) / (1024 * 1024)
|
|
||||||
break
|
def get_available_gib_in_disk(host, device_path, dbapi):
|
||||||
cgtsvg_free_gib = (cgtsvg_free_mib // 1024)
|
"""Get the free space for the device path
|
||||||
return cgtsvg_free_gib
|
returns: Free space in GiB
|
||||||
|
"""
|
||||||
|
available_gib = 0
|
||||||
|
disks = dbapi.idisk_get_by_ihost(host.uuid)
|
||||||
|
for disk in disks:
|
||||||
|
if disk.device_path == device_path:
|
||||||
|
available_gib = disk.available_mib / 1024
|
||||||
|
return available_gib
|
||||||
|
|
||||||
|
|
||||||
def is_partition_the_last(dbapi, partition):
|
def is_partition_the_last(dbapi, partition):
|
||||||
|
|||||||
Reference in New Issue
Block a user