Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
1 change: 1 addition & 0 deletions .flake8
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ fcn_exclude_functions =
click,
ast,
filecmp,
datetime,

enable-extensions =
FCN,
32 changes: 30 additions & 2 deletions ocp_resources/node_network_configuration_policy.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import re
from datetime import datetime

from kubernetes.dynamic.exceptions import ConflictError

from ocp_resources.utils.constants import TIMEOUT_4MINUTES
from ocp_resources.utils.constants import TIMEOUT_1MINUTE, TIMEOUT_4MINUTES, TIMEOUT_5SEC
from ocp_resources.exceptions import NNCPConfigurationFailed
from ocp_resources.node import Node
from ocp_resources.node_network_configuration_enactment import (
NodeNetworkConfigurationEnactment,
)
from ocp_resources.node_network_state import NodeNetworkState
from ocp_resources.resource import Resource, ResourceEditor
from timeout_sampler import TimeoutExpiredError, TimeoutSampler, TimeoutWatch
from timeout_sampler import TimeoutExpiredError, TimeoutSampler, TimeoutWatch, retry

IPV4_STR = "ipv4"
IPV6_STR = "ipv6"
Expand Down Expand Up @@ -322,10 +323,37 @@ def _absent_interface(self):
if self.ports:
self.add_ports()

initial_transition_time = self._get_nncp_configured_last_transition_time()
ResourceEditor(
patches={self: {"spec": {"desiredState": {"interfaces": self.desired_state["interfaces"]}}}}
).update()

# If the setup NNCP failed - we don't need to verify its teardown status time is updated.
if initial_transition_time:
self._wait_for_nncp_status_update(initial_transition_time=initial_transition_time)

def _get_nncp_configured_last_transition_time(self):
for condition in self.instance.status.conditions:
if (
condition["type"] == NodeNetworkConfigurationPolicy.Conditions.Type.AVAILABLE
and condition["status"] == "True"
and condition["reason"] == NodeNetworkConfigurationPolicy.Conditions.Reason.SUCCESSFULLY_CONFIGURED
):
return condition["lastTransitionTime"]

@retry(
wait_timeout=TIMEOUT_1MINUTE,
sleep=TIMEOUT_5SEC,
)
def _wait_for_nncp_status_update(self, initial_transition_time):
date_format = "%Y-%m-%dT%H:%M:%SZ"
formatted_initial_transition_time = datetime.strptime(initial_transition_time, date_format)
return any(
condition["type"] == NodeNetworkConfigurationPolicy.Conditions.Type.AVAILABLE
and datetime.strptime(condition["lastTransitionTime"], date_format) > formatted_initial_transition_time
for condition in self.instance.get("status", {}).get("conditions", [])
)

@property
def status(self):
for condition in self.instance.status.conditions:
Expand Down