/// <summary>
        /// Generate Definition for Schemas
        /// </summary>
        /// <param name="resource">resource definition from Azure</param>
        /// <param name="content">schema content, leave in here for depedency injection for testing</param>
        /// <returns></returns>
        public async Task <JObject> GenerateSchemaDefinition(JObject resource, string content = null)
        {
            ARMTemplateClass template  = new ARMTemplateClass();
            var integrationAccountName = template.AddParameter("IntegrationAccountName", "string", integrationAccount);
            var uri         = resource["properties"]["contentLink"].Value <string>("uri").Split('?');
            var rawresource = content;

            if (content == null)
            {
                rawresource = await resourceCollector.GetRawResource(uri[0], uri[1].Replace("api-version=", ""));
            }

            var paramResourceName = template.AddParameter("name", "string", resource.Value <string>("name"));

            //create the resource and add to the template
            var obj = new IntegationAccountResource();

            obj.name = $"[concat(parameters('{integrationAccountName}'), '/' ,parameters('{paramResourceName}'))]";
            obj.type = resource.Value <string>("type");
            //add the current Integration Account parameter name
            var location = template.AddParameter("integrationAccountLocation", "string", "[resourceGroup().location]");

            obj.location = "[parameters('integrationAccountLocation')]";



            obj.properties["schemaType"]   = resource["properties"]["schemaType"];
            obj.properties["documentName"] = resource["properties"]["documentName"];

            obj.properties["content"]     = rawresource;
            obj.properties["contentType"] = "application/xml";


            template.resources.Add(JObject.FromObject(obj));

            return(JObject.FromObject(template));
        }
        public async Task <JObject> generateDefinition(JObject resource)
        {
            ARMTemplateClass template = new ARMTemplateClass();
            var paramiaName           = template.AddParameter("IntegrationAccountName", "string", integrationAccount);
            var uri         = resource["properties"]["contentLink"].Value <string>("uri").Split('?');
            var rawresource = await resourceCollector.GetRawResource(uri[0], uri[1].Replace("api-version=", ""));

            var paramResourceName = template.AddParameter("name", "string", resource.Value <string>("name"));

            //create the resource and add to the template
            var obj = new IntegationAccountResource();

            obj.name = $"[concat(parameters('{paramiaName}'), '/' ,parameters('{paramResourceName}'))]";
            obj.type = resource.Value <string>("type");
            //add the current Integration Account parameter name
            var location = template.AddParameter("integrationAccountLocation", "string", "[resourceGroup().location]");

            obj.location = "[parameters('integrationAccountLocation')]";

            if (type == ARtifactType.Maps)
            {
                obj.properties["mapType"]          = resource["properties"]["mapType"];
                obj.properties["parametersSchema"] = resource["properties"]["parametersSchema"];
                obj.properties["contentType"]      = obj.properties.Value <string>("mapType") == "Liquid" ? "text/plain" : "application/xml";
            }
            else if (type == ARtifactType.Schemas)
            {
                obj.properties["schemaType"]  = resource["properties"]["schemaType"];
                obj.properties["contentType"] = "application/xml";
            }

            obj.properties["content"] = rawresource;

            template.resources.Add(JObject.FromObject(obj));

            return(JObject.FromObject(template));
        }
Esempio n. 3
0
        // the apiDefinition parameter allows dependency injection for unit testing
        public async Task <JObject> generateDefinition(JObject resource, string apiDefinition = null)
        {
            ARMTemplateClass template = new ARMTemplateClass();

            template.AddParameter("customConnectorApiVersion", "string", "1.0.0.0");
            var name     = template.AddParameter("customConnectorName", "string", resource.Value <string>("name"));
            var location = template.AddParameter("customConnectorLocation", "string", "[resourceGroup().location]");

            var uri = resource["properties"]["apiDefinitions"].Value <string>("modifiedSwaggerUrl");

            string swaggerRawDefinition = apiDefinition ?? GetCustomConnectorSwagger(uri);

            JObject preParsedswaggerDefinition = JObject.Parse(swaggerRawDefinition);
            var     host = preParsedswaggerDefinition.Value <string>("host");

            //replace the host with a parameter to allow the scenarios where the host could be different between environments
            var serviceHost = template.AddParameter("serviceHost", "string", host);
            var scheme      = "http";

            if (preParsedswaggerDefinition.ContainsKey("schemes"))
            {
                scheme = preParsedswaggerDefinition["schemes"].Children().First().Value <string>();
            }
            var backendService = template.AddParameter("backendService", "string", scheme + "://" + host + preParsedswaggerDefinition.Value <string>("basePath"));

            swaggerRawDefinition = swaggerRawDefinition.Replace(host, template.WrapParameterName(serviceHost));

            // handle connectionID
            swaggerRawDefinition = swaggerRawDefinition.Replace(@"/{connectionId}", string.Empty);
            JObject swaggerDefinition = JObject.Parse(swaggerRawDefinition);

            // remove all connectionID parameters
            if (swaggerDefinition.ToString().Contains("connectionId"))
            {
                // note: only Json.Net 12.0.1 supports XPath like below, hence guarding with a try/catch just in case of older version of the libray
                try
                {
                    foreach (var token in swaggerDefinition["paths"].SelectTokens(@"$..[?(@.name === 'connectionId')]").ToList())
                    {
                        token.Remove();
                    }
                }
                catch (JsonException) { }
            }


            JObject resourceObject   = new JObject();
            JObject propertiesObject = new JObject();


            // handle ISE

            JToken origIseToken = resource["properties"].SelectToken("integrationServiceEnvironment");

            if (origIseToken != null)
            {
                var iseEnvName = template.AddParameter("ISEEnvironmentName", "string", origIseToken.Value <string>("name"));


                JObject         iseObject = new JObject();
                AzureResourceId iseId     = new AzureResourceId(origIseToken.Value <string>("id"));
                //iseObject.Add("id", origIseToken.Value<string>("id"));
                var iseEnvResouceGroup = template.AddParameter("ISEEnvironmentResourceGroup", "string", iseId.ResourceGroupName);
                iseId.SubscriptionId    = "subscription().subscriptionId";
                iseId.ResourceGroupName = template.WrapParameterName(iseEnvResouceGroup);
                iseId.ResourceName      = template.WrapParameterName(iseEnvName);

                iseObject.Add("id", $"[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/',parameters('{iseEnvResouceGroup}'), '/providers/Microsoft.Logic/integrationServiceEnvironments/', parameters('{iseEnvName}'))]");

                iseObject.Add("name", template.WrapParameterName(iseEnvName));
                iseObject.Add("type", origIseToken.Value <string>("type"));

                propertiesObject.Add("integrationServiceEnvironment", iseObject);
            }

            if (resource["properties"].SelectToken("connectionParameters") != null)
            {
                propertiesObject.Add("connectionParameters", resource["properties"]["connectionParameters"]);
            }

            JObject backendObject = new JObject();

            backendObject.Add("serviceUrl", template.WrapParameterName(backendService));   // $"[parameters('{serviceHost}')]");
            propertiesObject.Add("backendService", backendObject);

            propertiesObject.Add("swagger", swaggerDefinition);
            propertiesObject.Add("description", resource["properties"].Value <string>("description"));
            propertiesObject.Add("displayname", template.WrapParameterName(name));
            propertiesObject.Add("iconUri", resource["properties"].Value <string>("iconUri"));

            resourceObject.Add("apiVersion", "2019-05-01");
            resourceObject.Add("location", template.WrapParameterName(location));
            resourceObject.Add("name", template.WrapParameterName(name));
            resourceObject.Add("type", resource.Value <string>("type"));
            resourceObject.Add("properties", propertiesObject);

            template.resources.Add(resourceObject);

            return(JObject.FromObject(template));
        }