diff options
Diffstat (limited to 'cns-libs/cnslibs')
-rw-r--r-- | cns-libs/cnslibs/common/openshift_ops.py | 40 | ||||
-rw-r--r-- | cns-libs/cnslibs/common/waiter.py | 3 |
2 files changed, 38 insertions, 5 deletions
diff --git a/cns-libs/cnslibs/common/openshift_ops.py b/cns-libs/cnslibs/common/openshift_ops.py index 523cc375..6cfff3f8 100644 --- a/cns-libs/cnslibs/common/openshift_ops.py +++ b/cns-libs/cnslibs/common/openshift_ops.py @@ -32,6 +32,7 @@ PODS_WIDE_RE = re.compile( SERVICE_STATUS = "systemctl status %s" SERVICE_RESTART = "systemctl restart %s" SERVICE_STATUS_REGEX = "Active: active \((.*)\) since .*;.*" +OC_VERSION = None def oc_get_pods(ocp_node): @@ -470,7 +471,17 @@ def oc_delete(ocp_node, rtype, name, raise_on_absence=True): if not oc_get_yaml(ocp_node, rtype, name, raise_on_error=raise_on_absence): return - ret, out, err = g.run(ocp_node, ['oc', 'delete', rtype, name]) + cmd = ['oc', 'delete', rtype, name] + + global OC_VERSION + if not OC_VERSION: + OC_VERSION = oc_version(ocp_node) + + versions = ['v3.6', 'v3.7', 'v3.9', 'v3.10'] + if not OC_VERSION.rsplit('.', 1)[0] in versions: + cmd.append('--wait=false') + + ret, out, err = g.run(ocp_node, cmd) if ret != 0: g.log.error('Failed to delete resource: %s, %s: %r; %r', rtype, name, out, err) @@ -621,11 +632,12 @@ def create_namespace(hostname, namespace): def wait_for_resource_absence(ocp_node, rtype, name, - interval=10, timeout=120): + interval=5, timeout=300): _waiter = waiter.Waiter(timeout=timeout, interval=interval) + resource, pv_name = None, None for w in _waiter: try: - oc_get_yaml(ocp_node, rtype, name, raise_on_error=True) + resource = oc_get_yaml(ocp_node, rtype, name, raise_on_error=True) except AssertionError: break if rtype == 'pvc': @@ -633,11 +645,29 @@ def wait_for_resource_absence(ocp_node, rtype, name, name) for w in _waiter: ret, out, err = g.run(ocp_node, cmd, "root") + _pv_name = out.strip() + if _pv_name and not pv_name: + pv_name = _pv_name if ret != 0: break if w.expired: - error_msg = "%s '%s' still exists after waiting for it %d seconds" % ( - rtype, name, timeout) + # Gather more info for ease of debugging + try: + r_events = get_events(ocp_node, obj_name=name) + except Exception: + r_events = '?' + error_msg = ( + "%s '%s' still exists after waiting for it %d seconds.\n" + "Resource info: %s\n" + "Resource related events: %s" % ( + rtype, name, timeout, resource, r_events)) + if rtype == 'pvc' and pv_name: + try: + pv_events = get_events(ocp_node, obj_name=pv_name) + except Exception: + pv_events = '?' + error_msg += "\nPV events: %s" % pv_events + g.log.error(error_msg) raise exceptions.ExecutionError(error_msg) diff --git a/cns-libs/cnslibs/common/waiter.py b/cns-libs/cnslibs/common/waiter.py index 0a6e72b5..0d0c8c3a 100644 --- a/cns-libs/cnslibs/common/waiter.py +++ b/cns-libs/cnslibs/common/waiter.py @@ -33,3 +33,6 @@ class Waiter(object): time.sleep(self.interval) self._attempt += 1 return self + + # NOTE(vponomar): py3 uses "__next__" method instead of "next" one. + __next__ = next |