示例#1
0
        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();
            }
        }
示例#2
0
        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);
                }
            }
        }