LocationProvider.cs
1 using KubernetesWorkflow.Types; 2 using Logging; 3 4 namespace KubernetesWorkflow 5 { 6 public class LocationProvider 7 { 8 private readonly TimeSpan locationsExpirationTime = TimeSpan.FromMinutes(10); 9 private readonly ILog log; 10 private readonly Action<Action<K8sController>> onController; 11 private Location[] knownLocations = Array.Empty<Location>(); 12 private DateTime lastUpdate = DateTime.UtcNow; 13 14 public LocationProvider(ILog log, Action<Action<K8sController>> onController) 15 { 16 this.log = log; 17 this.onController = onController; 18 } 19 20 public IKnownLocations GetAvailableLocations() 21 { 22 if (ShouldUpdateKnownLocations()) 23 { 24 onController(UpdateKnownLocations); 25 } 26 27 return new KnownLocations(knownLocations); 28 } 29 30 private void UpdateKnownLocations(K8sController controller) 31 { 32 knownLocations = controller.GetAvailableK8sNodes().Select(CreateLocation).ToArray(); 33 lastUpdate = DateTime.UtcNow; 34 35 log.Log($"Detected {knownLocations.Length} available locations: '{string.Join(",", knownLocations.Select(l => l.ToString()))}'"); 36 } 37 38 private Location CreateLocation(K8sNodeLabel k8sNode) 39 { 40 return new Location(k8sNode); 41 } 42 43 private bool ShouldUpdateKnownLocations() 44 { 45 if (!knownLocations.Any()) return true; 46 if (DateTime.UtcNow - lastUpdate > locationsExpirationTime) return true; 47 return false; 48 } 49 } 50 }