@@ -56,6 +56,7 @@ class Node:
56
56
"vnc_key" : "{lab}/nodes/{id}/keys/vnc" ,
57
57
"layer3_addresses" : "{lab}/nodes/{id}/layer3_addresses" ,
58
58
"operational" : "{lab}/nodes/{id}?operational=true&exclude_configurations=true" ,
59
+ "inteface_operational" : "{lab}/nodes/{id}/interfaces?data=true&operational=true" ,
59
60
}
60
61
61
62
def __init__ (
@@ -130,6 +131,7 @@ def __init__(
130
131
self ._pinned_compute_id = pinned_compute_id
131
132
self ._stale = False
132
133
self ._last_sync_l3_address_time = 0.0
134
+ self ._last_sync_interface_operational_time = 0.0
133
135
self ._parameters = parameters
134
136
135
137
self .statistics : dict [str , int | float ] = {
@@ -195,6 +197,17 @@ def sync_l3_addresses_if_outdated(self) -> None:
195
197
):
196
198
self .sync_layer3_addresses ()
197
199
200
+ @check_stale
201
+ @locked
202
+ def sync_interface_operational_if_outdated (self ) -> None :
203
+ timestamp = time .time ()
204
+ if (
205
+ self .lab .auto_sync
206
+ and timestamp - self ._last_sync_interface_operational_time
207
+ > self .lab .auto_sync_interval
208
+ ):
209
+ self .sync_interface_operational ()
210
+
198
211
@property
199
212
@locked
200
213
def state (self ) -> str | None :
@@ -835,24 +848,6 @@ def sync_layer3_addresses(self) -> None:
835
848
interfaces = result .get ("interfaces" , {})
836
849
self .map_l3_addresses_to_interfaces (interfaces )
837
850
838
- @check_stale
839
- @locked
840
- def sync_operational (self , response : dict [str , Any ] = None ):
841
- """
842
- Synchronize the operational state of the node.
843
-
844
- :param response: If the operational data was fetched from the server elsewhere,
845
- it can be passed here to save an API call. Will be fetched automatically
846
- otherwise.
847
- """
848
- if response is None :
849
- url = self ._url_for ("operational" )
850
- response = self ._session .get (url ).json ()
851
- self ._pinned_compute_id = response .get ("pinned_compute_id" )
852
- operational = response .get ("operational" , {})
853
- self ._compute_id = operational .get ("compute_id" )
854
- self ._resource_pool = operational .get ("resource_pool" )
855
-
856
851
@check_stale
857
852
@locked
858
853
def map_l3_addresses_to_interfaces (
@@ -879,6 +874,37 @@ def map_l3_addresses_to_interfaces(
879
874
}
880
875
self ._last_sync_l3_address_time = time .time ()
881
876
877
+ @check_stale
878
+ @locked
879
+ def sync_operational (self , response : dict [str , Any ] = None ):
880
+ """
881
+ Synchronize the operational state of the node.
882
+
883
+ :param response: If the operational data was fetched from the server elsewhere,
884
+ it can be passed here to save an API call. Will be fetched automatically
885
+ otherwise.
886
+ """
887
+ if response is None :
888
+ url = self ._url_for ("operational" )
889
+ response = self ._session .get (url ).json ()
890
+ self ._pinned_compute_id = response .get ("pinned_compute_id" )
891
+ operational = response .get ("operational" , {})
892
+ self ._compute_id = operational .get ("compute_id" )
893
+ self ._resource_pool = operational .get ("resource_pool" )
894
+
895
+ @check_stale
896
+ @locked
897
+ def sync_interface_operational (self ):
898
+ """Synchronize the operational state of the node's interfaces."""
899
+ url = self ._url_for ("inteface_operational" )
900
+ response = self ._session .get (url ).json ()
901
+ self .lab .sync_topology_if_outdated ()
902
+ for interface_data in response :
903
+ interface = self .lab ._interfaces [interface_data ["id" ]]
904
+ operational = interface_data .get ("operational" , {})
905
+ interface ._deployed_mac_address = operational .get ("mac_address" )
906
+ self ._last_sync_interface_operational_time = time .time ()
907
+
882
908
def update (
883
909
self ,
884
910
node_data : dict [str , Any ],
0 commit comments