private static void Scheduler_OnIntentDueCallback(IntentJob intentJob) { if (intentJob.RequiresIteration) { try { var compilerResults = Intent.IntentCompiler.CompileCSharpString(File.ReadAllText(intentJob.FileName)); var tempType = compilerResults.CompiledAssembly.GetType("ShiftPolicy"); List <Topology.Node.Node> iterateNodes = (List <Topology.Node.Node>)tempType.GetMethod("IterateNodes").Invoke(null, new object[] { igp_topology }); foreach (var node in iterateNodes) { var iJob = new IntentJob( fileName: intentJob.FileName, intentCode: IntentJob.Base64Decode(intentJob.Base64IntentCode), period: intentJob.Period, validBefore: intentJob.ValidBefore, requiresIteration: intentJob.RequiresIteration, iterateNode: node ); IntentQueueProducer.Publish(JsonConvert.SerializeObject(iJob)); IntentJobTasksCount.Inc(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } else { IntentQueueProducer.Publish(JsonConvert.SerializeObject(intentJob)); IntentJobTasksCount.Inc(); } }
private void IntentTimer_Elapsed(object sender, ElapsedEventArgs e) { // k8s scaling try { var client = new RestClient(this.config.K8sAPIHelperURI); var getReplicas = new RestRequest("/statefulsets/replicas/" + this.config.K8sNamespace + "/" + this.config.K8sYggdrasil2RunnerStatefulSetName, Method.GET); var response = client.Execute(getReplicas); if (response.StatusCode == System.Net.HttpStatusCode.OK) { JObject jObject = JObject.Parse(response.Content); var replicas = (int)jObject["Replicas"]; // Console.WriteLine("k8s :::: {0} has {1} replicas.", jObject["Name"], replicas); // Replicas Policy var nodes = this.igp_topology.Nodes.Count(n => !string.IsNullOrWhiteSpace(n.IPv4RouterIdentifier)); int iterativeJobs = intent_jobs.Count(j => j.Value.RequiresIteration == true); int nonIterativeJobs = intent_jobs.Count - iterativeJobs; int desiredReplicas = (int)(Math.Ceiling(nodes / 2.0) * Math.Ceiling(iterativeJobs / 2.0)) + (int)(Math.Ceiling(nodes / 2.0) * Math.Ceiling(nonIterativeJobs / 8.0)); // if (replicas != desiredReplicas && desiredReplicas > 0) { var setReplicas = new RestRequest("/statefulsets/replicas/" + this.config.K8sNamespace + "/" + this.config.K8sYggdrasil2RunnerStatefulSetName + "/update/" + desiredReplicas, Method.POST); response = client.Execute(setReplicas); if (response.StatusCode == System.Net.HttpStatusCode.OK) { Console.WriteLine("k8s :::: Scaled {0} to {1} replicas.", jObject["Name"], desiredReplicas); } else { Console.WriteLine("k8s :::: Unable to scale {0} to {1} replicas.", jObject["Name"], desiredReplicas); } } } else { Console.WriteLine("k8s :::: Unable to get replicas for {0}.", config.K8sYggdrasil2RunnerStatefulSetName); } } catch (Exception ex) { Console.WriteLine("{0} ::: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex.Message); } foreach (var file_name in intent_jobs.Keys) { if (File.Exists(file_name) && DateTime.Now < intent_jobs[file_name].ValidBefore) { // If the file exists then check next intent run var next_run = intent_jobs[file_name].NextRun(); // If intent is due then raise intent job event if (DateTime.Now >= next_run) { this.OnIntentDueCallback?.Invoke(intent_jobs[file_name]); } } else { // Remove job if the intent file does not exist anymore // or the intent has expired var value = new IntentJob(); intent_jobs.TryRemove(file_name, out value); IntentJobs.Set(intent_jobs.Count); } } }