public async Task <ApiResult> GetCodeGen([FromBody] JObject config)
        {
            try
            {
                RolesCheck.EnsureWriter(Request, _isLocal);
                Ensure.NotNull(config, "config");

                string queries = string.Join("\n", config.GetValue("query").ToString());

                var ruleDefinitionRaw  = config.Value <JArray>("rules");
                var ruleDefinitionList = ruleDefinitionRaw.ToObject <List <FlowGuiRule> >();
                var ruleDefinitions    = RuleDefinitionGenerator.GenerateRuleDefinitions(ruleDefinitionList, config.GetValue("name").ToString());

                RulesCode codeGen = CodeGen.GenerateCode(queries, ruleDefinitions, config.GetValue("name").ToString());

                await Task.Yield();

                return(ApiResult.CreateSuccess(codeGen.Code));
            }
            catch (Exception e)
            {
                _logger.LogError(e, e.Message);
                return(ApiResult.CreateError(e.Message));
            }
        }
示例#2
0
        public void SimpleRulesTestForDerivedTable()
        {
            Engine engine = new Engine();

            StreamReader sr   = new StreamReader("UserCodeSimRulDerTable.txt");
            string       code = sr.ReadToEnd();

            sr.Close();

            StreamReader sr2   = new StreamReader("Rules.json");
            string       rules = sr2.ReadToEnd();

            sr2.Close();

            StreamReader sr3            = new StreamReader("QueryTemplates.xml");
            string       queryTemplates = sr3.ReadToEnd();

            sr3.Close();

            StreamReader sr4             = new StreamReader("OutputTemplates.xml");
            string       outputTemplates = sr4.ReadToEnd();

            sr4.Close();

            RulesCode result = engine.GenerateCode(code, rules, queryTemplates, outputTemplates, "P5");

            StreamReader sr5             = new StreamReader("CGenSimRulDerTable.txt");
            string       expectedCodegen = sr5.ReadToEnd();

            sr5.Close();

            Assert.AreEqual(result.Code, expectedCodegen, "Codegen is not as expected");
        }
示例#3
0
        public void NoPivotsTest()
        {
            Engine engine = new Engine();

            string code = "T1 = ProcessAggregateRules(DataXProcessedInput)";

            StreamReader sr2   = new StreamReader("Rules.json");
            string       rules = sr2.ReadToEnd();

            sr2.Close();

            StreamReader sr3            = new StreamReader("QueryTemplates.xml");
            string       queryTemplates = sr3.ReadToEnd();

            sr3.Close();

            StreamReader sr4             = new StreamReader("OutputTemplates.xml");
            string       outputTemplates = sr4.ReadToEnd();

            sr4.Close();

            RulesCode result = engine.GenerateCode(code, rules, queryTemplates, outputTemplates, "P8");

            StreamReader sr5             = new StreamReader("CGenNoPivots.txt");
            string       expectedCodegen = sr5.ReadToEnd();

            sr5.Close();

            Assert.AreEqual(result.Code, expectedCodegen, "Codegen is not as expected");
        }
示例#4
0
        public void RulesandAlertsTestWithDefaultTemplate()
        {
            Engine engine = new Engine();

            StreamReader sr   = new StreamReader("usercode.txt");
            string       code = sr.ReadToEnd();

            sr.Close();

            StreamReader sr2   = new StreamReader("Rules.json");
            string       rules = sr2.ReadToEnd();

            sr2.Close();

            StreamReader sr3            = new StreamReader("QueryTemplates.xml");
            string       queryTemplates = sr3.ReadToEnd();

            sr3.Close();

            StreamReader sr4             = new StreamReader("OutputTemplates.xml");
            string       outputTemplates = sr4.ReadToEnd();

            sr4.Close();

            RulesCode result = engine.GenerateCode(code, rules, "P1");

            StreamReader sr5             = new StreamReader("cgenDefault.txt");
            string       expectedCodegen = sr5.ReadToEnd();

            sr5.Close();

            Assert.AreEqual(result.Code, expectedCodegen, "Codegen is not as expected");
        }
示例#5
0
        public void MixedAlertWithTickTest()
        {
            Engine engine = new Engine();

            StreamReader sr   = new StreamReader("UserCodeAggWithDot.txt");
            string       code = sr.ReadToEnd();

            sr.Close();

            StreamReader sr2   = new StreamReader("Rules.json");
            string       rules = sr2.ReadToEnd();

            sr2.Close();

            StreamReader sr3            = new StreamReader("QueryTemplates.xml");
            string       queryTemplates = sr3.ReadToEnd();

            sr3.Close();

            StreamReader sr4             = new StreamReader("OutputTemplates.xml");
            string       outputTemplates = sr4.ReadToEnd();

            sr4.Close();

            RulesCode result = engine.GenerateCode(code, rules, queryTemplates, outputTemplates, "P6.1");

            StreamReader sr5             = new StreamReader("CGenMixedAlertWithTick.txt");
            string       expectedCodegen = sr5.ReadToEnd();

            sr5.Close();

            Assert.AreEqual(result.Code, expectedCodegen, "Codegen is not as expected");
        }
        /// <summary>
        /// Generate and set the info for the transform file which will be used to generate JobConfig
        /// </summary>
        /// <returns></returns>
        public override async Task <string> Process(FlowDeploymentSession flowToDeploy)
        {
            var config    = flowToDeploy.Config;
            var guiConfig = config?.GetGuiConfig();

            if (guiConfig == null)
            {
                return("no gui input, skipped.");
            }
            string queries = string.Join("\n", guiConfig.Process?.Queries);

            string    ruleDefinitions = RuleDefinitionGenerator.GenerateRuleDefinitions(guiConfig.Rules, config.Name);
            RulesCode rulesCode       = CodeGen.GenerateCode(queries, ruleDefinitions, config.Name);

            Ensure.NotNull(rulesCode, "rulesCode");

            // Save the rulesCode object for downstream processing
            flowToDeploy.SetAttachment(AttachmentName_CodeGenObject, rulesCode);

            var runtimeKeyVaultName = flowToDeploy.GetTokenString(PortConfigurationSettings.TokenName_RuntimeKeyVaultName);

            Ensure.NotNull(runtimeKeyVaultName, "runtimeKeyVaultName");

            var secretName = $"{config.Name}-transform";

            Configuration.TryGet(Constants.ConfigSettingName_SparkType, out string sparkType);
            var uriPrefix           = KeyVaultClient.GetUriPrefix(sparkType);
            var transformFileSecret = SecretUriParser.ComposeUri(runtimeKeyVaultName, secretName, uriPrefix);

            flowToDeploy.SetStringToken(TokenName_TransformFile, transformFileSecret);

            await Task.CompletedTask;

            return("done");
        }
        public override async Task <string> Process(FlowDeploymentSession flowToDeploy)
        {
            var config    = flowToDeploy.Config;
            var guiConfig = config?.GetGuiConfig();

            if (guiConfig == null)
            {
                return("no gui input, skipped.");
            }
            string queries = string.Join("\n", guiConfig.Process?.Queries);

            string    ruleDefinitions = RuleDefinitionGenerator.GenerateRuleDefinitions(guiConfig.Rules, config.Name);
            RulesCode rulesCode       = CodeGen.GenerateCode(queries, ruleDefinitions, config.Name);

            Ensure.NotNull(rulesCode, "rulesCode");

            // Save the rulesCode object for downstream processing
            flowToDeploy.SetAttachment(AttachmentName_CodeGenObject, rulesCode);

            var runtimeConfigBaseFolder = flowToDeploy.GetTokenString(PrepareJobConfigVariables.TokenName_RuntimeConfigFolder);

            Ensure.NotNull(runtimeConfigBaseFolder, "runtimeConfigBaseFolder");

            var runtimeKeyVaultName = flowToDeploy.GetTokenString(PortConfigurationSettings.TokenName_RuntimeKeyVaultName);

            Ensure.NotNull(runtimeKeyVaultName, "runtimeKeyVaultName");

            var filePath          = ResourcePathUtil.Combine(runtimeConfigBaseFolder, $"{config.Name}-combined.txt");
            var transformFilePath = await RuntimeStorage.SaveFile(filePath, rulesCode.Code);

            var secretName          = $"{config.Name}-transform";
            var transformFileSecret = await KeyVaultClient.SaveSecretAsync(runtimeKeyVaultName, secretName, transformFilePath);

            flowToDeploy.SetStringToken(TokenName_TransformFile, transformFileSecret);

            return("done");
        }
示例#8
0
        private async Task <FlowOutputSpec[]> ProcessOutputs(FlowGuiOutput[] uiOutputs, RulesCode rulesCode, string configName)
        {
            var outputList = uiOutputs.Select(o => o.Id).ToList();

            var outputsFiltered = rulesCode.Outputs.Where(o => outputList.Contains(o.Item2)).ToList();

            var flattenedOutputs = new Dictionary <string, List <string> >();

            foreach (var o in outputsFiltered)
            {
                var outputNames = o.Item1.Split(new char[] { ',' });
                foreach (string outputName in outputNames)
                {
                    var name = outputName.Trim();
                    if (flattenedOutputs.TryGetValue(name, out List <string> val))
                    {
                        val.Add(o.Item2);
                    }
                    else
                    {
                        flattenedOutputs[name] = new List <string>()
                        {
                            o.Item2
                        };
                    }
                }
            }

            List <FlowOutputSpec> fOutputList = new List <FlowOutputSpec>();

            foreach (var fOut in flattenedOutputs)
            {
                FlowOutputSpec flowOutput = new FlowOutputSpec()
                {
                    Name = fOut.Key
                };

                foreach (var item in fOut.Value)
                {
                    var output = uiOutputs.SingleOrDefault(o => o.Id.Equals(item));
                    switch (output.Type.ToLower())
                    {
                    case "cosmosdb":
                    {
                        var cosmosDbOutput = ProcessOutputCosmosDb(output);
                        Ensure.EnsureNullElseThrowNotSupported(flowOutput.CosmosDbOutput, "Multiple target cosmosDB ouptut for same dataset not supported.");
                        flowOutput.CosmosDbOutput = cosmosDbOutput;
                        break;
                    }

                    case "eventhub":
                    {
                        var eventhubOutput = ProcessOutputEventHub(output);
                        Ensure.EnsureNullElseThrowNotSupported(flowOutput.EventHubOutput, "Multiple target eventHub/metric ouptut for same dataset not supported.");
                        flowOutput.EventHubOutput = eventhubOutput;
                        break;
                    }

                    case "metric":
                    {
                        if (LocalUtility.IsLocalEnabled(Configuration))
                        {
                            if (Configuration.TryGet(Constants.ConfigSettingName_LocalMetricsHttpEndpoint, out string localMetricsEndpoint))
                            {
                                var httpOutput = ProcessLocalOutputMetric(configName, localMetricsEndpoint);
                                Ensure.EnsureNullElseThrowNotSupported(flowOutput.HttpOutput, "Multiple target httpost/metric ouptut for same dataset not supported.");
                                flowOutput.HttpOutput = httpOutput;
                            }
                            break;
                        }
                        else
                        {
                            var eventhubOutput = ProcessOutputMetric(output);
                            Ensure.EnsureNullElseThrowNotSupported(flowOutput.EventHubOutput, "Multiple target eventHub/metric ouptut for same dataset not supported.");
                            flowOutput.EventHubOutput = eventhubOutput;
                            break;
                        }
                    }

                    case "blob":
                    {
                        var blobOutput = await ProcessOutputBlob(configName, output);

                        Ensure.EnsureNullElseThrowNotSupported(flowOutput.BlobOutput, "Multiple target blob ouptut for same dataset not supported.");
                        flowOutput.BlobOutput = blobOutput;
                        break;
                    }

                    case "local":
                    {
                        var blobOutput = ProcessOutputLocal(configName, output);
                        Ensure.EnsureNullElseThrowNotSupported(flowOutput.BlobOutput, "Multiple target blob ouptut for same dataset not supported.");
                        flowOutput.BlobOutput = blobOutput;
                        break;
                    }

                    default:
                        throw new NotSupportedException($"{output.Type} output type not supported");
                    }
                }

                fOutputList.Add(flowOutput);
            }

            return(fOutputList.ToArray());
        }