diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/Bus.sfproj b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/Bus.sfproj index 0a56c800e..f3c97ff8b 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/Bus.sfproj +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/Bus.sfproj @@ -1,11 +1,11 @@  - + f29e27c9-0d5e-4a57-adbf-dd651649d2a1 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/packages.config b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/packages.config +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricBus/Bus/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/NoSQL.sfproj b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/NoSQL.sfproj index f07ff03a9..7a36d1971 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/NoSQL.sfproj +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/NoSQL.sfproj @@ -1,11 +1,11 @@  - + eb070036-ec60-49a6-88e1-562a2043c3d7 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/packages.config b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/packages.config +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricNoSql/NoSQL/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/Redis.sfproj b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/Redis.sfproj index 5b28bfdba..259062845 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/Redis.sfproj +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/Redis.sfproj @@ -1,11 +1,11 @@  - + 17acd9ea-8f16-4091-aa29-c67002971eee - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/packages.config b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/packages.config +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricRedis/Redis/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/Sql.sfproj b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/Sql.sfproj index 48447811e..afea64488 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/Sql.sfproj +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/Sql.sfproj @@ -1,11 +1,11 @@  - + 65a83188-79c1-47ad-931d-8e8a87247408 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/packages.config b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/packages.config +++ b/ServiceFabric/Linux/Infrastructure/eShopOnServiceFabricSql/Sql/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabric/eShopOnServiceFabric.sfproj b/ServiceFabric/Linux/eShopOnServiceFabric/eShopOnServiceFabric.sfproj index e345590fb..869298e5b 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabric/eShopOnServiceFabric.sfproj +++ b/ServiceFabric/Linux/eShopOnServiceFabric/eShopOnServiceFabric.sfproj @@ -1,10 +1,11 @@  - + 983eab84-65c5-4793-a300-08f97c791a15 - 1.6 + 2.1 1.5 + 1.6.7 @@ -49,9 +50,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabric/packages.config b/ServiceFabric/Linux/eShopOnServiceFabric/packages.config index c5f59e48e..661a56a70 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabric/packages.config +++ b/ServiceFabric/Linux/eShopOnServiceFabric/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ApiGw_Base.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ApiGw_Base.cs new file mode 100644 index 000000000..fbbc721be --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ApiGw_Base.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Fabric; +using System.IO; +using System.Linq; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.ServiceFabric.Services.Communication.AspNetCore; +using Microsoft.ServiceFabric.Services.Communication.Runtime; +using Microsoft.ServiceFabric.Services.Runtime; +using Microsoft.ServiceFabric.Data; + +namespace ApiGw_Base +{ + /// + /// The FabricRuntime creates an instance of this class for each service type instance. + /// + internal sealed class ApiGw_Base : StatelessService + { + public ApiGw_Base(StatelessServiceContext context) + : base(context) + { } + + /// + /// Optional override to create listeners (like tcp, http) for this service instance. + /// + /// The collection of listeners. + protected override IEnumerable CreateServiceInstanceListeners() + { + return new ServiceInstanceListener[] + { + new ServiceInstanceListener(serviceContext => + new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => + { + ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}"); + + return new WebHostBuilder() + .UseKestrel(opt => + { + int port = serviceContext.CodePackageActivationContext.GetEndpoint("ServiceEndpoint").Port; + opt.Listen(IPAddress.IPv6Any, port, listenOptions => + { + listenOptions.UseHttps(GetCertificateFromStore()); + listenOptions.NoDelay = true; + }); + }) + .ConfigureServices( + services => services + .AddSingleton(serviceContext)) + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseStartup() + .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None) + .UseUrls(url) + .Build(); + })) + }; + } + + /// + /// Finds the ASP .NET Core HTTPS development certificate in development environment. Update this method to use the appropriate certificate for production environment. + /// + /// Returns the ASP .NET Core HTTPS development certificate + private static X509Certificate2 GetCertificateFromStore() + { + string aspNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + if (string.Equals(aspNetCoreEnvironment, "Development", StringComparison.OrdinalIgnoreCase)) + { + const string aspNetHttpsOid = "1.3.6.1.4.1.311.84.1.1"; + const string CNName = "CN=localhost"; + using (X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine)) + { + store.Open(OpenFlags.ReadOnly); + var certCollection = store.Certificates; + var currentCerts = certCollection.Find(X509FindType.FindByExtension, aspNetHttpsOid, true); + currentCerts = currentCerts.Find(X509FindType.FindByIssuerDistinguishedName, CNName, true); + return currentCerts.Count == 0 ? null : currentCerts[0]; + } + } + else + { + throw new NotImplementedException("GetCertificateFromStore should be updated to retrieve the certificate for non Development environment"); + } + } + } +} diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ApiGw_Base.csproj b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ApiGw_Base.csproj new file mode 100644 index 000000000..d0ca885ee --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ApiGw_Base.csproj @@ -0,0 +1,21 @@ + + + + netcoreapp2.1 + True + True + win7-x64 + False + + + + + + + + + + + + + diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Mobile.Bff.Marketing.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Mobile.Bff.Marketing.json new file mode 100644 index 000000000..85d6777e6 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Mobile.Bff.Marketing.json @@ -0,0 +1,34 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/m/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/l/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Mobile.Bff.Shopping.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Mobile.Bff.Shopping.json new file mode 100644 index 000000000..0fd6d9024 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Mobile.Bff.Shopping.json @@ -0,0 +1,118 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/c/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "mobileshoppingagg", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/{everything}", + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "payment.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Web.Bff.Marketing.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Web.Bff.Marketing.json new file mode 100644 index 000000000..8afe4a4d6 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Web.Bff.Marketing.json @@ -0,0 +1,34 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/m/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/l/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } +} + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Web.Bff.Shopping.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Web.Bff.Shopping.json new file mode 100644 index 000000000..b3e01d773 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Configurations/configuration.Web.Bff.Shopping.json @@ -0,0 +1,130 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/c/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "webshoppingagg", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/{everything}", + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.signalrhub", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/hub/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "payment.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Controllers/ConfigurationController.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Controllers/ConfigurationController.cs new file mode 100644 index 000000000..5d24f4895 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Controllers/ConfigurationController.cs @@ -0,0 +1,49 @@ +using ApiGw_Base.Enums; +using Microsoft.AspNetCore.Mvc; +using System; +using System.IO; +using System.Text; + +namespace ApiGw_Base.Controllers +{ + [Route("[controller]")] + [ApiController] + public class ConfigurationController : ControllerBase + { + [HttpGet("mobile/marketing")] + public IActionResult MobileMarketing() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Marketing); + + [HttpGet("mobile/shopping")] + public IActionResult MobileShopping() => ReadConfigurationFile(ConfigurationType.Mobile, ConfigurationBffType.Shopping); + + [HttpGet("web/marketing")] + public IActionResult WebMarketing() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Marketing); + + [HttpGet("web/shopping")] + public IActionResult WebShopping() => ReadConfigurationFile(ConfigurationType.Web, ConfigurationBffType.Shopping); + + private IActionResult ReadConfigurationFile(ConfigurationType configurationType, ConfigurationBffType configurationBffType) + { + try + { + var path = $"{AppDomain.CurrentDomain.BaseDirectory}/Configurations/configuration.{configurationType}.Bff.{configurationBffType}.json"; + + using (var streamReader = new StreamReader(path, Encoding.UTF8)) + { + var jsonString = streamReader.ReadToEnd(); + + if (string.IsNullOrWhiteSpace(jsonString)) + { + return BadRequest($"Configuration file 'configuration.{configurationType}.Bff.{configurationBffType}.json' not found"); + } + + return Ok(jsonString); + } + } + catch (Exception exception) + { + return BadRequest(exception.Message); + } + } + } +} \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationBffType.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationBffType.cs new file mode 100644 index 000000000..72de5df8a --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationBffType.cs @@ -0,0 +1,8 @@ +namespace ApiGw_Base.Enums +{ + public enum ConfigurationBffType + { + Marketing, + Shopping + } +} \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationType.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationType.cs new file mode 100644 index 000000000..54bb41913 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Enums/ConfigurationType.cs @@ -0,0 +1,8 @@ +namespace ApiGw_Base.Enums +{ + public enum ConfigurationType + { + Web, + Mobile + } +} \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/PackageRoot/Config/Settings.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/PackageRoot/Config/Settings.xml new file mode 100644 index 000000000..ad84ffd8a --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/PackageRoot/Config/Settings.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/PackageRoot/ServiceManifest.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/PackageRoot/ServiceManifest.xml new file mode 100644 index 000000000..3538961fa --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/PackageRoot/ServiceManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + ApiGw_Base.exe + CodePackage + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Program.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Program.cs new file mode 100644 index 000000000..e9f64858f --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Program.cs @@ -0,0 +1,38 @@ +using Microsoft.ServiceFabric.Services.Runtime; +using System; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; + +namespace ApiGw_Base +{ + internal static class Program + { + /// + /// This is the entry point of the service host process. + /// + private static void Main() + { + try + { + // The ServiceManifest.XML file defines one or more service type names. + // Registering a service maps a service type name to a .NET type. + // When Service Fabric creates an instance of this service type, + // an instance of the class is created in this host process. + + ServiceRuntime.RegisterServiceAsync("ApiGw_BaseType", + context => new ApiGw_Base(context)).GetAwaiter().GetResult(); + + ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(ApiGw_Base).Name); + + // Prevents this host process from terminating so services keeps running. + Thread.Sleep(Timeout.Infinite); + } + catch (Exception e) + { + ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString()); + throw; + } + } + } +} diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Properties/launchSettings.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Properties/launchSettings.json new file mode 100644 index 000000000..a4095d193 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:51647", + "sslPort": 44363 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "api/values", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "ApiGw_Base": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "api/values", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ServiceEventSource.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ServiceEventSource.cs new file mode 100644 index 000000000..8135727de --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/ServiceEventSource.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.Fabric; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.ServiceFabric.Services.Runtime; + +namespace ApiGw_Base +{ + [EventSource(Name = "MyCompany-eShopOnServiceFabricApiGW-ApiGw_Base")] + internal sealed class ServiceEventSource : EventSource + { + public static readonly ServiceEventSource Current = new ServiceEventSource(); + + static ServiceEventSource() + { + // A workaround for the problem where ETW activities do not get tracked until Tasks infrastructure is initialized. + // This problem will be fixed in .NET Framework 4.6.2. + Task.Run(() => { }); + } + + // Instance constructor is private to enforce singleton semantics + private ServiceEventSource() : base() { } + + #region Keywords + // Event keywords can be used to categorize events. + // Each keyword is a bit flag. A single event can be associated with multiple keywords (via EventAttribute.Keywords property). + // Keywords must be defined as a public class named 'Keywords' inside EventSource that uses them. + public static class Keywords + { + public const EventKeywords Requests = (EventKeywords)0x1L; + public const EventKeywords ServiceInitialization = (EventKeywords)0x2L; + } + #endregion + + #region Events + // Define an instance method for each event you want to record and apply an [Event] attribute to it. + // The method name is the name of the event. + // Pass any parameters you want to record with the event (only primitive integer types, DateTime, Guid & string are allowed). + // Each event method implementation should check whether the event source is enabled, and if it is, call WriteEvent() method to raise the event. + // The number and types of arguments passed to every event method must exactly match what is passed to WriteEvent(). + // Put [NonEvent] attribute on all methods that do not define an event. + // For more information see https://msdn.microsoft.com/en-us/library/system.diagnostics.tracing.eventsource.aspx + + [NonEvent] + public void Message(string message, params object[] args) + { + if (this.IsEnabled()) + { + string finalMessage = string.Format(message, args); + Message(finalMessage); + } + } + + private const int MessageEventId = 1; + [Event(MessageEventId, Level = EventLevel.Informational, Message = "{0}")] + public void Message(string message) + { + if (this.IsEnabled()) + { + WriteEvent(MessageEventId, message); + } + } + + [NonEvent] + public void ServiceMessage(ServiceContext serviceContext, string message, params object[] args) + { + if (this.IsEnabled()) + { + + string finalMessage = string.Format(message, args); + ServiceMessage( + serviceContext.ServiceName.ToString(), + serviceContext.ServiceTypeName, + GetReplicaOrInstanceId(serviceContext), + serviceContext.PartitionId, + serviceContext.CodePackageActivationContext.ApplicationName, + serviceContext.CodePackageActivationContext.ApplicationTypeName, + serviceContext.NodeContext.NodeName, + finalMessage); + } + } + + // For very high-frequency events it might be advantageous to raise events using WriteEventCore API. + // This results in more efficient parameter handling, but requires explicit allocation of EventData structure and unsafe code. + // To enable this code path, define UNSAFE conditional compilation symbol and turn on unsafe code support in project properties. + private const int ServiceMessageEventId = 2; + [Event(ServiceMessageEventId, Level = EventLevel.Informational, Message = "{7}")] + private +#if UNSAFE + unsafe +#endif + void ServiceMessage( + string serviceName, + string serviceTypeName, + long replicaOrInstanceId, + Guid partitionId, + string applicationName, + string applicationTypeName, + string nodeName, + string message) + { +#if !UNSAFE + WriteEvent(ServiceMessageEventId, serviceName, serviceTypeName, replicaOrInstanceId, partitionId, applicationName, applicationTypeName, nodeName, message); +#else + const int numArgs = 8; + fixed (char* pServiceName = serviceName, pServiceTypeName = serviceTypeName, pApplicationName = applicationName, pApplicationTypeName = applicationTypeName, pNodeName = nodeName, pMessage = message) + { + EventData* eventData = stackalloc EventData[numArgs]; + eventData[0] = new EventData { DataPointer = (IntPtr) pServiceName, Size = SizeInBytes(serviceName) }; + eventData[1] = new EventData { DataPointer = (IntPtr) pServiceTypeName, Size = SizeInBytes(serviceTypeName) }; + eventData[2] = new EventData { DataPointer = (IntPtr) (&replicaOrInstanceId), Size = sizeof(long) }; + eventData[3] = new EventData { DataPointer = (IntPtr) (&partitionId), Size = sizeof(Guid) }; + eventData[4] = new EventData { DataPointer = (IntPtr) pApplicationName, Size = SizeInBytes(applicationName) }; + eventData[5] = new EventData { DataPointer = (IntPtr) pApplicationTypeName, Size = SizeInBytes(applicationTypeName) }; + eventData[6] = new EventData { DataPointer = (IntPtr) pNodeName, Size = SizeInBytes(nodeName) }; + eventData[7] = new EventData { DataPointer = (IntPtr) pMessage, Size = SizeInBytes(message) }; + + WriteEventCore(ServiceMessageEventId, numArgs, eventData); + } +#endif + } + + private const int ServiceTypeRegisteredEventId = 3; + [Event(ServiceTypeRegisteredEventId, Level = EventLevel.Informational, Message = "Service host process {0} registered service type {1}", Keywords = Keywords.ServiceInitialization)] + public void ServiceTypeRegistered(int hostProcessId, string serviceType) + { + WriteEvent(ServiceTypeRegisteredEventId, hostProcessId, serviceType); + } + + private const int ServiceHostInitializationFailedEventId = 4; + [Event(ServiceHostInitializationFailedEventId, Level = EventLevel.Error, Message = "Service host initialization failed", Keywords = Keywords.ServiceInitialization)] + public void ServiceHostInitializationFailed(string exception) + { + WriteEvent(ServiceHostInitializationFailedEventId, exception); + } + + // A pair of events sharing the same name prefix with a "Start"/"Stop" suffix implicitly marks boundaries of an event tracing activity. + // These activities can be automatically picked up by debugging and profiling tools, which can compute their execution time, child activities, + // and other statistics. + private const int ServiceRequestStartEventId = 5; + [Event(ServiceRequestStartEventId, Level = EventLevel.Informational, Message = "Service request '{0}' started", Keywords = Keywords.Requests)] + public void ServiceRequestStart(string requestTypeName) + { + WriteEvent(ServiceRequestStartEventId, requestTypeName); + } + + private const int ServiceRequestStopEventId = 6; + [Event(ServiceRequestStopEventId, Level = EventLevel.Informational, Message = "Service request '{0}' finished", Keywords = Keywords.Requests)] + public void ServiceRequestStop(string requestTypeName, string exception = "") + { + WriteEvent(ServiceRequestStopEventId, requestTypeName, exception); + } + #endregion + + #region Private methods + private static long GetReplicaOrInstanceId(ServiceContext context) + { + StatelessServiceContext stateless = context as StatelessServiceContext; + if (stateless != null) + { + return stateless.InstanceId; + } + + StatefulServiceContext stateful = context as StatefulServiceContext; + if (stateful != null) + { + return stateful.ReplicaId; + } + + throw new NotSupportedException("Context type not supported."); + } +#if UNSAFE + private int SizeInBytes(string s) + { + if (s == null) + { + return 0; + } + else + { + return (s.Length + 1) * sizeof(char); + } + } +#endif + #endregion + } +} diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Startup.cs b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Startup.cs new file mode 100644 index 000000000..35fa8bab3 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/Startup.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace ApiGw_Base +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseMvc(); + } + } +} diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/appsettings.Development.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/appsettings.Development.json new file mode 100644 index 000000000..e203e9407 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/appsettings.json b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/appsettings.json new file mode 100644 index 000000000..def9159a7 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/ApiGw_Base/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationPackageRoot/ApplicationManifest.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationPackageRoot/ApplicationManifest.xml new file mode 100644 index 000000000..37a0974bf --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationPackageRoot/ApplicationManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Cloud.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Cloud.xml new file mode 100644 index 000000000..daa60c2ba --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Cloud.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Local.1Node.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Local.1Node.xml new file mode 100644 index 000000000..39f1750be --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Local.1Node.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Local.5Node.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Local.5Node.xml new file mode 100644 index 000000000..39f1750be --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/ApplicationParameters/Local.5Node.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Cloud.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Cloud.xml new file mode 100644 index 000000000..a88f72851 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Cloud.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Local.1Node.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Local.1Node.xml new file mode 100644 index 000000000..6e1403e96 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Local.1Node.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Local.5Node.xml b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Local.5Node.xml new file mode 100644 index 000000000..f42d759c3 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/PublishProfiles/Local.5Node.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/Scripts/Deploy-FabricApplication.ps1 b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/Scripts/Deploy-FabricApplication.ps1 new file mode 100644 index 000000000..7dd779bdc --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/Scripts/Deploy-FabricApplication.ps1 @@ -0,0 +1,273 @@ +<# +.SYNOPSIS +Deploys a Service Fabric application type to a cluster. + +.DESCRIPTION +This script deploys a Service Fabric application type to a cluster. It is invoked by Visual Studio when deploying a Service Fabric Application project. + +.NOTES +WARNING: This script file is invoked by Visual Studio. Its parameters must not be altered but its logic can be customized as necessary. + +.PARAMETER PublishProfileFile +Path to the file containing the publish profile. + +.PARAMETER ApplicationPackagePath +Path to the folder of the packaged Service Fabric application. + +.PARAMETER DeployOnly +Indicates that the Service Fabric application should not be created or upgraded after registering the application type. + +.PARAMETER ApplicationParameter +Hashtable of the Service Fabric application parameters to be used for the application. + +.PARAMETER UnregisterUnusedApplicationVersionsAfterUpgrade +Indicates whether to unregister any unused application versions that exist after an upgrade is finished. + +.PARAMETER OverrideUpgradeBehavior +Indicates the behavior used to override the upgrade settings specified by the publish profile. +'None' indicates that the upgrade settings will not be overridden. +'ForceUpgrade' indicates that an upgrade will occur with default settings, regardless of what is specified in the publish profile. +'VetoUpgrade' indicates that an upgrade will not occur, regardless of what is specified in the publish profile. + +.PARAMETER UseExistingClusterConnection +Indicates that the script should make use of an existing cluster connection that has already been established in the PowerShell session. The cluster connection parameters configured in the publish profile are ignored. + +.PARAMETER OverwriteBehavior +Overwrite Behavior if an application exists in the cluster with the same name. Available Options are Never, Always, SameAppTypeAndVersion. This setting is not applicable when upgrading an application. +'Never' will not remove the existing application. This is the default behavior. +'Always' will remove the existing application even if its Application type and Version is different from the application being created. +'SameAppTypeAndVersion' will remove the existing application only if its Application type and Version is same as the application being created. + +.PARAMETER SkipPackageValidation +Switch signaling whether the package should be validated or not before deployment. + +.PARAMETER SecurityToken +A security token for authentication to cluster management endpoints. Used for silent authentication to clusters that are protected by Azure Active Directory. + +.PARAMETER CopyPackageTimeoutSec +Timeout in seconds for copying application package to image store. + +.EXAMPLE +. Scripts\Deploy-FabricApplication.ps1 -ApplicationPackagePath 'pkg\Debug' + +Deploy the application using the default package location for a Debug build. + +.EXAMPLE +. Scripts\Deploy-FabricApplication.ps1 -ApplicationPackagePath 'pkg\Debug' -DoNotCreateApplication + +Deploy the application but do not create the application instance. + +.EXAMPLE +. Scripts\Deploy-FabricApplication.ps1 -ApplicationPackagePath 'pkg\Debug' -ApplicationParameter @{CustomParameter1='MyValue'; CustomParameter2='MyValue'} + +Deploy the application by providing values for parameters that are defined in the application manifest. +#> + +Param +( + [String] + $PublishProfileFile, + + [String] + $ApplicationPackagePath, + + [Switch] + $DeployOnly, + + [Hashtable] + $ApplicationParameter, + + [Boolean] + $UnregisterUnusedApplicationVersionsAfterUpgrade, + + [String] + [ValidateSet('None', 'ForceUpgrade', 'VetoUpgrade')] + $OverrideUpgradeBehavior = 'None', + + [Switch] + $UseExistingClusterConnection, + + [String] + [ValidateSet('Never','Always','SameAppTypeAndVersion')] + $OverwriteBehavior = 'Never', + + [Switch] + $SkipPackageValidation, + + [String] + $SecurityToken, + + [int] + $CopyPackageTimeoutSec, + + [int] + $RegisterApplicationTypeTimeoutSec +) + +function Read-XmlElementAsHashtable +{ + Param ( + [System.Xml.XmlElement] + $Element + ) + + $hashtable = @{} + if ($Element.Attributes) + { + $Element.Attributes | + ForEach-Object { + $boolVal = $null + if ([bool]::TryParse($_.Value, [ref]$boolVal)) { + $hashtable[$_.Name] = $boolVal + } + else { + $hashtable[$_.Name] = $_.Value + } + } + } + + return $hashtable +} + +function Read-PublishProfile +{ + Param ( + [ValidateScript({Test-Path $_ -PathType Leaf})] + [String] + $PublishProfileFile + ) + + $publishProfileXml = [Xml] (Get-Content $PublishProfileFile) + $publishProfile = @{} + + $publishProfile.ClusterConnectionParameters = Read-XmlElementAsHashtable $publishProfileXml.PublishProfile.Item("ClusterConnectionParameters") + $publishProfile.UpgradeDeployment = Read-XmlElementAsHashtable $publishProfileXml.PublishProfile.Item("UpgradeDeployment") + $publishProfile.CopyPackageParameters = Read-XmlElementAsHashtable $publishProfileXml.PublishProfile.Item("CopyPackageParameters") + $publishProfile.RegisterApplicationParameters = Read-XmlElementAsHashtable $publishProfileXml.PublishProfile.Item("RegisterApplicationParameters") + + if ($publishProfileXml.PublishProfile.Item("UpgradeDeployment")) + { + $publishProfile.UpgradeDeployment.Parameters = Read-XmlElementAsHashtable $publishProfileXml.PublishProfile.Item("UpgradeDeployment").Item("Parameters") + if ($publishProfile.UpgradeDeployment["Mode"]) + { + $publishProfile.UpgradeDeployment.Parameters[$publishProfile.UpgradeDeployment["Mode"]] = $true + } + } + + $publishProfileFolder = (Split-Path $PublishProfileFile) + $publishProfile.ApplicationParameterFile = [System.IO.Path]::Combine($PublishProfileFolder, $publishProfileXml.PublishProfile.ApplicationParameterFile.Path) + + return $publishProfile +} + +$LocalFolder = (Split-Path $MyInvocation.MyCommand.Path) + +if (!$PublishProfileFile) +{ + $PublishProfileFile = "$LocalFolder\..\PublishProfiles\Local.xml" +} + +if (!$ApplicationPackagePath) +{ + $ApplicationPackagePath = "$LocalFolder\..\pkg\Release" +} + +$ApplicationPackagePath = Resolve-Path $ApplicationPackagePath + +$publishProfile = Read-PublishProfile $PublishProfileFile + +if (-not $UseExistingClusterConnection) +{ + $ClusterConnectionParameters = $publishProfile.ClusterConnectionParameters + if ($SecurityToken) + { + $ClusterConnectionParameters["SecurityToken"] = $SecurityToken + } + + try + { + [void](Connect-ServiceFabricCluster @ClusterConnectionParameters) + } + catch [System.Fabric.FabricObjectClosedException] + { + Write-Warning "Service Fabric cluster may not be connected." + throw + } +} + +$RegKey = "HKLM:\SOFTWARE\Microsoft\Service Fabric SDK" +$ModuleFolderPath = (Get-ItemProperty -Path $RegKey -Name FabricSDKPSModulePath).FabricSDKPSModulePath +Import-Module "$ModuleFolderPath\ServiceFabricSDK.psm1" + +$IsUpgrade = ($publishProfile.UpgradeDeployment -and $publishProfile.UpgradeDeployment.Enabled -and $OverrideUpgradeBehavior -ne 'VetoUpgrade') -or $OverrideUpgradeBehavior -eq 'ForceUpgrade' + +$PublishParameters = @{ + 'ApplicationPackagePath' = $ApplicationPackagePath + 'ApplicationParameterFilePath' = $publishProfile.ApplicationParameterFile + 'ApplicationParameter' = $ApplicationParameter + 'ErrorAction' = 'Stop' +} + +if ($publishProfile.CopyPackageParameters.CopyPackageTimeoutSec) +{ + $PublishParameters['CopyPackageTimeoutSec'] = $publishProfile.CopyPackageParameters.CopyPackageTimeoutSec +} + +if ($publishProfile.CopyPackageParameters.CompressPackage) +{ + $PublishParameters['CompressPackage'] = $publishProfile.CopyPackageParameters.CompressPackage +} + +if ($publishProfile.RegisterApplicationParameters.RegisterApplicationTypeTimeoutSec) +{ + $PublishParameters['RegisterApplicationTypeTimeoutSec'] = $publishProfile.RegisterApplicationParameters.RegisterApplicationTypeTimeoutSec +} + +# CopyPackageTimeoutSec parameter overrides the value from the publish profile +if ($CopyPackageTimeoutSec) +{ + $PublishParameters['CopyPackageTimeoutSec'] = $CopyPackageTimeoutSec +} + +# RegisterApplicationTypeTimeoutSec parameter overrides the value from the publish profile +if ($RegisterApplicationTypeTimeoutSec) +{ + $PublishParameters['RegisterApplicationTypeTimeoutSec'] = $RegisterApplicationTypeTimeoutSec +} + +if ($IsUpgrade) +{ + $Action = "RegisterAndUpgrade" + if ($DeployOnly) + { + $Action = "Register" + } + + $UpgradeParameters = $publishProfile.UpgradeDeployment.Parameters + + if ($OverrideUpgradeBehavior -eq 'ForceUpgrade') + { + # Warning: Do not alter these upgrade parameters. It will create an inconsistency with Visual Studio's behavior. + $UpgradeParameters = @{ UnmonitoredAuto = $true; Force = $true } + } + + $PublishParameters['Action'] = $Action + $PublishParameters['UpgradeParameters'] = $UpgradeParameters + $PublishParameters['UnregisterUnusedVersions'] = $UnregisterUnusedApplicationVersionsAfterUpgrade + + Publish-UpgradedServiceFabricApplication @PublishParameters +} +else +{ + $Action = "RegisterAndCreate" + if ($DeployOnly) + { + $Action = "Register" + } + + $PublishParameters['Action'] = $Action + $PublishParameters['OverwriteBehavior'] = $OverwriteBehavior + $PublishParameters['SkipPackageValidation'] = $SkipPackageValidation + + Publish-NewServiceFabricApplication @PublishParameters +} \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/eShopOnServiceFabricApiGW.sfproj b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/eShopOnServiceFabricApiGW.sfproj new file mode 100644 index 000000000..b5d23e859 --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/eShopOnServiceFabricApiGW.sfproj @@ -0,0 +1,47 @@ + + + + + 70ead9e4-3357-4e09-a920-2a819d7d75bb + 2.4 + 1.5 + 1.6.7 + v4.6.1 + + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets + + + + + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/packages.config b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/packages.config new file mode 100644 index 000000000..45379443b --- /dev/null +++ b/ServiceFabric/Linux/eShopOnServiceFabricApiGateWays/eShopOnServiceFabricApiGW/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv.sfproj b/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv.sfproj index 1d0d025a9..b8bff9a92 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv.sfproj +++ b/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv.sfproj @@ -1,11 +1,11 @@  - + 39b54901-d57d-416e-b51e-33c4017ca464 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/packages.config b/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/packages.config +++ b/ServiceFabric/Linux/eShopOnServiceFabricIdSrv/eShopOnServiceFabricIdSrv/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC.sfproj b/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC.sfproj index ff4ce2247..1a56ff683 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC.sfproj +++ b/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC.sfproj @@ -1,11 +1,11 @@  - + 0cf895ff-3616-4d1f-8d2e-5d856cdf3612 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/packages.config b/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/packages.config +++ b/ServiceFabric/Linux/eShopOnServiceFabricWebMVC/eShopOnServiceFabricWebMVC/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA.sfproj b/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA.sfproj index 05ed606be..f5bc6bc77 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA.sfproj +++ b/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA.sfproj @@ -1,11 +1,11 @@  - + 1670de10-5626-429d-a74a-2dd8281cc0c9 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/packages.config b/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/packages.config +++ b/ServiceFabric/Linux/eShopOnServiceFabricWebSPA/eShopOnServiceFabricWebSPA/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus.sfproj b/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus.sfproj index 1d4def7f2..b31452a26 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus.sfproj +++ b/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus.sfproj @@ -1,11 +1,11 @@  - + 25f73fd9-b32f-401a-80e8-17c72606a7e1 - 1.7 + 2.1 1.5 - 1.6 + 1.6.7 v4.6.1 @@ -38,9 +38,9 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets - + - - + + \ No newline at end of file diff --git a/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/packages.config b/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/packages.config index 3dc0a332b..45379443b 100644 --- a/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/packages.config +++ b/ServiceFabric/Linux/eShopOnServiceFabricWebStatus/eShopOnServiceFabricWebStatus/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/ServiceFabric/Linux/sfLinux.sln b/ServiceFabric/Linux/sfLinux.sln new file mode 100644 index 000000000..0800198f2 --- /dev/null +++ b/ServiceFabric/Linux/sfLinux.sln @@ -0,0 +1,131 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.168 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "eShopOnServiceFabric", "eShopOnServiceFabric\eShopOnServiceFabric.sfproj", "{983EAB84-65C5-4793-A300-08F97C791A15}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "eShopOnServiceFabricIdSrv", "eShopOnServiceFabricIdSrv\eShopOnServiceFabricIdSrv\eShopOnServiceFabricIdSrv.sfproj", "{39B54901-D57D-416E-B51E-33C4017CA464}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "eShopOnServiceFabricWebMVC", "eShopOnServiceFabricWebMVC\eShopOnServiceFabricWebMVC\eShopOnServiceFabricWebMVC.sfproj", "{0CF895FF-3616-4D1F-8D2E-5D856CDF3612}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "eShopOnServiceFabricWebSPA", "eShopOnServiceFabricWebSPA\eShopOnServiceFabricWebSPA\eShopOnServiceFabricWebSPA.sfproj", "{1670DE10-5626-429D-A74A-2DD8281CC0C9}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "eShopOnServiceFabricWebStatus", "eShopOnServiceFabricWebStatus\eShopOnServiceFabricWebStatus\eShopOnServiceFabricWebStatus.sfproj", "{25F73FD9-B32F-401A-80E8-17C72606A7E1}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "Bus", "Infrastructure\eShopOnServiceFabricBus\Bus\Bus.sfproj", "{F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "NoSQL", "Infrastructure\eShopOnServiceFabricNoSql\NoSQL\NoSQL.sfproj", "{EB070036-EC60-49A6-88E1-562A2043C3D7}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "Redis", "Infrastructure\eShopOnServiceFabricRedis\Redis\Redis.sfproj", "{17ACD9EA-8F16-4091-AA29-C67002971EEE}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "Sql", "Infrastructure\eShopOnServiceFabricSql\Sql\Sql.sfproj", "{65A83188-79C1-47AD-931D-8E8A87247408}" +EndProject +Project("{A07B5EB6-E848-4116-A8D0-A826331D98C6}") = "eShopOnServiceFabricApiGW", "eShopOnServiceFabricApiGateWays\eShopOnServiceFabricApiGW\eShopOnServiceFabricApiGW.sfproj", "{70EAD9E4-3357-4E09-A920-2A819D7D75BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiGw_Base", "eShopOnServiceFabricApiGateWays\ApiGw_Base\ApiGw_Base.csproj", "{915E300A-B501-45A5-8A21-E39F72937FF1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {983EAB84-65C5-4793-A300-08F97C791A15}.Debug|Any CPU.ActiveCfg = Debug|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Debug|x64.ActiveCfg = Debug|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Debug|x64.Build.0 = Debug|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Debug|x64.Deploy.0 = Debug|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Release|Any CPU.ActiveCfg = Release|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Release|x64.ActiveCfg = Release|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Release|x64.Build.0 = Release|x64 + {983EAB84-65C5-4793-A300-08F97C791A15}.Release|x64.Deploy.0 = Release|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Debug|Any CPU.ActiveCfg = Debug|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Debug|x64.ActiveCfg = Debug|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Debug|x64.Build.0 = Debug|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Debug|x64.Deploy.0 = Debug|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Release|Any CPU.ActiveCfg = Release|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Release|x64.ActiveCfg = Release|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Release|x64.Build.0 = Release|x64 + {39B54901-D57D-416E-B51E-33C4017CA464}.Release|x64.Deploy.0 = Release|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Debug|Any CPU.ActiveCfg = Debug|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Debug|x64.ActiveCfg = Debug|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Debug|x64.Build.0 = Debug|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Debug|x64.Deploy.0 = Debug|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Release|Any CPU.ActiveCfg = Release|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Release|x64.ActiveCfg = Release|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Release|x64.Build.0 = Release|x64 + {0CF895FF-3616-4D1F-8D2E-5D856CDF3612}.Release|x64.Deploy.0 = Release|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Debug|x64.ActiveCfg = Debug|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Debug|x64.Build.0 = Debug|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Debug|x64.Deploy.0 = Debug|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Release|Any CPU.ActiveCfg = Release|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Release|x64.ActiveCfg = Release|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Release|x64.Build.0 = Release|x64 + {1670DE10-5626-429D-A74A-2DD8281CC0C9}.Release|x64.Deploy.0 = Release|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Debug|Any CPU.ActiveCfg = Debug|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Debug|x64.ActiveCfg = Debug|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Debug|x64.Build.0 = Debug|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Debug|x64.Deploy.0 = Debug|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Release|Any CPU.ActiveCfg = Release|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Release|x64.ActiveCfg = Release|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Release|x64.Build.0 = Release|x64 + {25F73FD9-B32F-401A-80E8-17C72606A7E1}.Release|x64.Deploy.0 = Release|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Debug|Any CPU.ActiveCfg = Debug|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Debug|x64.ActiveCfg = Debug|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Debug|x64.Build.0 = Debug|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Debug|x64.Deploy.0 = Debug|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Release|Any CPU.ActiveCfg = Release|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Release|x64.ActiveCfg = Release|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Release|x64.Build.0 = Release|x64 + {F29E27C9-0D5E-4A57-ADBF-DD651649D2A1}.Release|x64.Deploy.0 = Release|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Debug|x64.ActiveCfg = Debug|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Debug|x64.Build.0 = Debug|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Debug|x64.Deploy.0 = Debug|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Release|Any CPU.ActiveCfg = Release|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Release|x64.ActiveCfg = Release|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Release|x64.Build.0 = Release|x64 + {EB070036-EC60-49A6-88E1-562A2043C3D7}.Release|x64.Deploy.0 = Release|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Debug|Any CPU.ActiveCfg = Debug|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Debug|x64.ActiveCfg = Debug|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Debug|x64.Build.0 = Debug|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Debug|x64.Deploy.0 = Debug|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Release|Any CPU.ActiveCfg = Release|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Release|x64.ActiveCfg = Release|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Release|x64.Build.0 = Release|x64 + {17ACD9EA-8F16-4091-AA29-C67002971EEE}.Release|x64.Deploy.0 = Release|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Debug|Any CPU.ActiveCfg = Debug|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Debug|x64.ActiveCfg = Debug|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Debug|x64.Build.0 = Debug|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Debug|x64.Deploy.0 = Debug|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Release|Any CPU.ActiveCfg = Release|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Release|x64.ActiveCfg = Release|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Release|x64.Build.0 = Release|x64 + {65A83188-79C1-47AD-931D-8E8A87247408}.Release|x64.Deploy.0 = Release|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Debug|Any CPU.ActiveCfg = Debug|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Debug|x64.ActiveCfg = Debug|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Debug|x64.Build.0 = Debug|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Debug|x64.Deploy.0 = Debug|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Release|Any CPU.ActiveCfg = Release|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Release|x64.ActiveCfg = Release|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Release|x64.Build.0 = Release|x64 + {70EAD9E4-3357-4E09-A920-2A819D7D75BB}.Release|x64.Deploy.0 = Release|x64 + {915E300A-B501-45A5-8A21-E39F72937FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Debug|x64.ActiveCfg = Debug|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Debug|x64.Build.0 = Debug|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Release|Any CPU.Build.0 = Release|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Release|x64.ActiveCfg = Release|Any CPU + {915E300A-B501-45A5-8A21-E39F72937FF1}.Release|x64.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {68BA4E9C-6CEE-4B8F-81D2-BA0C75DB3265} + EndGlobalSection +EndGlobal