/ Framework / KubernetesWorkflow / LocationProvider.cs
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  }