From caf16bc03de557c096ffb07cd1b7e2eae92bd1ff Mon Sep 17 00:00:00 2001 From: Stepan Date: Fri, 9 Mar 2018 19:00:33 +0300 Subject: [PATCH 01/52] Concurrency fix for EventBus Prevent a possible race condition in InMemoryEventBusSubscriptionsManager --- .../EventBus/InMemoryEventBusSubscriptionsManager.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/BuildingBlocks/EventBus/EventBus/InMemoryEventBusSubscriptionsManager.cs b/src/BuildingBlocks/EventBus/EventBus/InMemoryEventBusSubscriptionsManager.cs index 88be8cf96..305f9ff8a 100644 --- a/src/BuildingBlocks/EventBus/EventBus/InMemoryEventBusSubscriptionsManager.cs +++ b/src/BuildingBlocks/EventBus/EventBus/InMemoryEventBusSubscriptionsManager.cs @@ -112,10 +112,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBus private void RaiseOnEventRemoved(string eventName) { var handler = OnEventRemoved; - if (handler != null) - { - OnEventRemoved(this, eventName); - } + handler?.Invoke(this, eventName); } From fb7d83f82f5814d7ff8daf99ee1fd2569ed5bc4c Mon Sep 17 00:00:00 2001 From: vyunev Date: Thu, 10 May 2018 12:01:10 +0300 Subject: [PATCH 02/52] Fix AKS creation command There is no need in DNS parameter for AKS creation command as gen-k8s-env-aks.ps1 does not have it. --- k8s/README.k8s.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/README.k8s.md b/k8s/README.k8s.md index 77acdf236..c9e32f5f4 100644 --- a/k8s/README.k8s.md +++ b/k8s/README.k8s.md @@ -13,7 +13,7 @@ The k8s directory contains Kubernetes configuration for the eShopOnContainers ap >``` or using AKS instead of ACS >``` ->./gen-k8s-env-aks -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -dnsName k8s-dns -serviceName k8s-cluster -createAcr true -nodeCount 3 -nodeVMSize Standard_D2_v2 +>./gen-k8s-env-aks -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -serviceName k8s-cluster -createAcr true -nodeCount 3 -nodeVMSize Standard_D2_v2 >``` * A Docker development environment with `docker` and `docker-compose`. From 8a602a1dd8c7536fa5de86aee86045569585d358 Mon Sep 17 00:00:00 2001 From: Matt M Date: Thu, 7 Feb 2019 10:18:41 -0700 Subject: [PATCH 03/52] Added ApiGateways to solution mimicking eShopOnContainers-ServicesAndWebApps solution structure --- eShopOnContainers.sln | 390 ++++++++++++++++++++---------------------- 1 file changed, 183 insertions(+), 207 deletions(-) diff --git a/eShopOnContainers.sln b/eShopOnContainers.sln index 999203557..8e08a05fa 100644 --- a/eShopOnContainers.sln +++ b/eShopOnContainers.sln @@ -55,20 +55,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBusRabbitMQ", "src\Bui EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IntegrationEventLogEF", "src\BuildingBlocks\EventBus\IntegrationEventLogEF\IntegrationEventLogEF.csproj", "{9EE28E45-1533-472B-8267-56C48855BA0E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HealthChecks", "HealthChecks", "{A81ECBC2-6B00-4DCD-8388-469174033379}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.HealthChecks", "src\BuildingBlocks\HealthChecks\src\Microsoft.Extensions.HealthChecks\Microsoft.Extensions.HealthChecks.csproj", "{942ED6E8-0050-495F-A0EA-01E97F63760C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebStatus", "src\Web\WebStatus\WebStatus.csproj", "{C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Payment", "Payment", "{022E145D-1593-47EE-9608-8E323D3C63F5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Payment.API", "src\Services\Payment\Payment.API\Payment.API.csproj", "{1A01AF82-6FCB-464C-B39C-F127AEBD315D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.HealthChecks", "src\BuildingBlocks\HealthChecks\src\Microsoft.AspNetCore.HealthChecks\Microsoft.AspNetCore.HealthChecks.csproj", "{22A0F9C1-2D4A-4107-95B7-8459E6688BC5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.HealthChecks.SqlServer", "src\BuildingBlocks\HealthChecks\src\Microsoft.Extensions.HealthChecks.SqlServer\Microsoft.Extensions.HealthChecks.SqlServer.csproj", "{4BD76717-3102-4969-8C2C-BAAA3F0263B6}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Location", "Location", "{41139F64-4046-4F16-96B7-D941D96FA9C6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Locations.API", "src\Services\Location\Locations.API\Locations.API.csproj", "{E7581357-FC34-474C-B8F5-307EE3CE05EF}" @@ -79,8 +71,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marketing.API", "src\Servic EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBusServiceBus", "src\BuildingBlocks\EventBus\EventBusServiceBus\EventBusServiceBus.csproj", "{69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.HealthChecks.AzureStorage", "src\BuildingBlocks\HealthChecks\src\Microsoft.Extensions.HealthChecks.AzureStorage\Microsoft.Extensions.HealthChecks.AzureStorage.csproj", "{768C887F-C229-4B94-ACD8-0C7F65686524}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebHost", "WebHost", "{1815B651-941C-466B-AE33-D1D7EEB8F77F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHost.Customization", "src\BuildingBlocks\WebHostCustomization\WebHost.Customization\WebHost.Customization.csproj", "{15F4B3AA-89B6-4A0D-9051-414305974781}" @@ -141,6 +131,36 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{DA1786E4 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{30308DE0-8128-4613-BCAD-B0BEFFB20E38}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGateways", "ApiGateways", "{79C64C7A-ED74-4F01-921F-92F4F9FC1E1D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGw-Base", "ApiGw-Base", "{56AD1FCA-6E16-4798-BF29-941C5B3277D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile.Bff.Marketing", "Mobile.Bff.Marketing", "{34ED3311-2B30-4C8B-823B-312B50FFC32A}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Mobile.Bff.Marketing\apigw\configuration.json = src\ApiGateways\Mobile.Bff.Marketing\apigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile.Bff.Shopping", "Mobile.Bff.Shopping", "{A32A5254-BA36-46FC-8C75-F7B8FFE8FCD0}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Mobile.Bff.Shopping\apigw\configuration.json = src\ApiGateways\Mobile.Bff.Shopping\apigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web.Bff.Marketing", "Web.Bff.Marketing", "{696D2B7E-6B75-401D-964A-BFE6F4D7AF73}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Web.Bff.Marketing\apigw\configuration.json = src\ApiGateways\Web.Bff.Marketing\apigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web.Bff.Shopping", "Web.Bff.Shopping", "{424BC53E-17EA-4E12-BC07-64BAA927ABCB}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Web.Bff.Shopping\apigw\configuration.json = src\ApiGateways\Web.Bff.Shopping\apigw\configuration.json + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OcelotApiGw", "src\ApiGateways\ApiGw-Base\OcelotApiGw.csproj", "{0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\ApiGateways\Mobile.Bff.Shopping\aggregator\Mobile.Shopping.HttpAggregator.csproj", "{98E0B3BA-6601-4C59-A9AA-24A00A17D835}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web.Shopping.HttpAggregator", "src\ApiGateways\Web.Bff.Shopping\aggregator\Web.Shopping.HttpAggregator.csproj", "{E39BD762-BC86-459D-B818-B6BF2D9F1352}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -635,54 +655,6 @@ Global {9EE28E45-1533-472B-8267-56C48855BA0E}.Release|x64.Build.0 = Release|Any CPU {9EE28E45-1533-472B-8267-56C48855BA0E}.Release|x86.ActiveCfg = Release|Any CPU {9EE28E45-1533-472B-8267-56C48855BA0E}.Release|x86.Build.0 = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|ARM.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|iPhone.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|x64.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|x64.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|x86.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.AppStore|x86.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|ARM.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|ARM.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|iPhone.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|x64.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|x64.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|x86.ActiveCfg = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Debug|x86.Build.0 = Debug|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|Any CPU.Build.0 = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|ARM.ActiveCfg = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|ARM.Build.0 = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|iPhone.ActiveCfg = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|iPhone.Build.0 = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|x64.ActiveCfg = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|x64.Build.0 = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|x86.ActiveCfg = Release|Any CPU - {942ED6E8-0050-495F-A0EA-01E97F63760C}.Release|x86.Build.0 = Release|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU @@ -779,102 +751,6 @@ Global {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Release|x64.Build.0 = Release|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Release|x86.ActiveCfg = Release|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Release|x86.Build.0 = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|ARM.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|iPhone.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|x64.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|x64.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|x86.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.AppStore|x86.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|ARM.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|ARM.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|iPhone.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|x64.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|x64.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|x86.ActiveCfg = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Debug|x86.Build.0 = Debug|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|Any CPU.Build.0 = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|ARM.ActiveCfg = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|ARM.Build.0 = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|iPhone.ActiveCfg = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|iPhone.Build.0 = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|x64.ActiveCfg = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|x64.Build.0 = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|x86.ActiveCfg = Release|Any CPU - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5}.Release|x86.Build.0 = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|ARM.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|iPhone.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|x64.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|x64.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|x86.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.AppStore|x86.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|ARM.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|ARM.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|iPhone.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|x64.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|x64.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Debug|x86.Build.0 = Debug|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|Any CPU.Build.0 = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|ARM.ActiveCfg = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|ARM.Build.0 = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|iPhone.ActiveCfg = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|iPhone.Build.0 = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|x64.ActiveCfg = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|x64.Build.0 = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|x86.ActiveCfg = Release|Any CPU - {4BD76717-3102-4969-8C2C-BAAA3F0263B6}.Release|x86.Build.0 = Release|Any CPU {E7581357-FC34-474C-B8F5-307EE3CE05EF}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU {E7581357-FC34-474C-B8F5-307EE3CE05EF}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU {E7581357-FC34-474C-B8F5-307EE3CE05EF}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU @@ -1019,54 +895,6 @@ Global {69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8}.Release|x64.Build.0 = Release|Any CPU {69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8}.Release|x86.ActiveCfg = Release|Any CPU {69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8}.Release|x86.Build.0 = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|ARM.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|iPhone.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|x64.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|x64.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|x86.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.AppStore|x86.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|Any CPU.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|ARM.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|ARM.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|iPhone.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|x64.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|x64.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|x86.ActiveCfg = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Debug|x86.Build.0 = Debug|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|Any CPU.ActiveCfg = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|Any CPU.Build.0 = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|ARM.ActiveCfg = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|ARM.Build.0 = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|iPhone.ActiveCfg = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|iPhone.Build.0 = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|x64.ActiveCfg = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|x64.Build.0 = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|x86.ActiveCfg = Release|Any CPU - {768C887F-C229-4B94-ACD8-0C7F65686524}.Release|x86.Build.0 = Release|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU @@ -2067,6 +1895,150 @@ Global {3572B4E2-4399-4797-B5C2-3720D870E0C3}.Release|x64.Build.0 = Release|Any CPU {3572B4E2-4399-4797-B5C2-3720D870E0C3}.Release|x86.ActiveCfg = Release|Any CPU {3572B4E2-4399-4797-B5C2-3720D870E0C3}.Release|x86.Build.0 = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|ARM.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|iPhone.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|x64.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|x64.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|x86.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.AppStore|x86.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|ARM.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|iPhone.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|x64.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|x64.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|x86.ActiveCfg = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Debug|x86.Build.0 = Debug|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|Any CPU.Build.0 = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|ARM.ActiveCfg = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|ARM.Build.0 = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|iPhone.ActiveCfg = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|iPhone.Build.0 = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|x64.ActiveCfg = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|x64.Build.0 = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|x86.ActiveCfg = Release|Any CPU + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC}.Release|x86.Build.0 = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|ARM.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|iPhone.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|x64.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|x64.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|x86.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.AppStore|x86.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|ARM.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|ARM.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|iPhone.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|x64.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|x64.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|x86.ActiveCfg = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Debug|x86.Build.0 = Debug|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|Any CPU.Build.0 = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|ARM.ActiveCfg = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|ARM.Build.0 = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|iPhone.ActiveCfg = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|iPhone.Build.0 = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|x64.ActiveCfg = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|x64.Build.0 = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|x86.ActiveCfg = Release|Any CPU + {98E0B3BA-6601-4C59-A9AA-24A00A17D835}.Release|x86.Build.0 = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|ARM.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|iPhone.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|x64.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|x64.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|x86.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.AppStore|x86.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|ARM.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|ARM.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|iPhone.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|x64.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|x64.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|x86.ActiveCfg = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Debug|x86.Build.0 = Debug|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|Any CPU.Build.0 = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|ARM.ActiveCfg = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|ARM.Build.0 = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|iPhone.ActiveCfg = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|iPhone.Build.0 = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|x64.ActiveCfg = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|x64.Build.0 = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|x86.ActiveCfg = Release|Any CPU + {E39BD762-BC86-459D-B818-B6BF2D9F1352}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2092,19 +2064,14 @@ Global {0044B293-1DCC-4224-B948-00CF6DC7F510} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F} {8088F3FC-6787-45FA-A924-816EC81CBFAC} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F} {9EE28E45-1533-472B-8267-56C48855BA0E} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F} - {A81ECBC2-6B00-4DCD-8388-469174033379} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} - {942ED6E8-0050-495F-A0EA-01E97F63760C} = {A81ECBC2-6B00-4DCD-8388-469174033379} {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04} {022E145D-1593-47EE-9608-8E323D3C63F5} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} {1A01AF82-6FCB-464C-B39C-F127AEBD315D} = {022E145D-1593-47EE-9608-8E323D3C63F5} - {22A0F9C1-2D4A-4107-95B7-8459E6688BC5} = {A81ECBC2-6B00-4DCD-8388-469174033379} - {4BD76717-3102-4969-8C2C-BAAA3F0263B6} = {A81ECBC2-6B00-4DCD-8388-469174033379} {41139F64-4046-4F16-96B7-D941D96FA9C6} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} {E7581357-FC34-474C-B8F5-307EE3CE05EF} = {41139F64-4046-4F16-96B7-D941D96FA9C6} {A5260DE0-1FDD-467E-9CC1-A028AB081CEE} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} {DF395F85-B010-465D-857A-7EBCC512C0C2} = {A5260DE0-1FDD-467E-9CC1-A028AB081CEE} {69AF10D3-AA76-4FF7-B187-EC7E8CC5F5B8} = {807BB76E-B2BB-47A2-A57B-3D1B20FF5E7F} - {768C887F-C229-4B94-ACD8-0C7F65686524} = {A81ECBC2-6B00-4DCD-8388-469174033379} {1815B651-941C-466B-AE33-D1D7EEB8F77F} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} {15F4B3AA-89B6-4A0D-9051-414305974781} = {1815B651-941C-466B-AE33-D1D7EEB8F77F} {EF3EDC78-E864-43FF-8E80-CF33DD9508A3} = {932D8224-11F6-4D07-B109-DA28AD288A63} @@ -2135,6 +2102,15 @@ Global {2B26A7AA-6D61-42FA-8AB7-C0F05AAE7F1C} = {41139F64-4046-4F16-96B7-D941D96FA9C6} {DA1786E4-30AB-434E-A827-92896390B79D} = {A5260DE0-1FDD-467E-9CC1-A028AB081CEE} {30308DE0-8128-4613-BCAD-B0BEFFB20E38} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} + {79C64C7A-ED74-4F01-921F-92F4F9FC1E1D} = {932D8224-11F6-4D07-B109-DA28AD288A63} + {56AD1FCA-6E16-4798-BF29-941C5B3277D2} = {79C64C7A-ED74-4F01-921F-92F4F9FC1E1D} + {34ED3311-2B30-4C8B-823B-312B50FFC32A} = {79C64C7A-ED74-4F01-921F-92F4F9FC1E1D} + {A32A5254-BA36-46FC-8C75-F7B8FFE8FCD0} = {79C64C7A-ED74-4F01-921F-92F4F9FC1E1D} + {696D2B7E-6B75-401D-964A-BFE6F4D7AF73} = {79C64C7A-ED74-4F01-921F-92F4F9FC1E1D} + {424BC53E-17EA-4E12-BC07-64BAA927ABCB} = {79C64C7A-ED74-4F01-921F-92F4F9FC1E1D} + {0A328C44-4C4E-49BE-9FB4-9D851CEC28AC} = {56AD1FCA-6E16-4798-BF29-941C5B3277D2} + {98E0B3BA-6601-4C59-A9AA-24A00A17D835} = {A32A5254-BA36-46FC-8C75-F7B8FFE8FCD0} + {E39BD762-BC86-459D-B818-B6BF2D9F1352} = {424BC53E-17EA-4E12-BC07-64BAA927ABCB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} From abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Corral?= Date: Wed, 6 Mar 2019 16:11:40 +0100 Subject: [PATCH 04/52] Enabling istio on local kubernetes and first pod configuration, needs more work, unstable --- k8s/istio/JourneyToIstio.md | 73 +++++++++++++++++++++++ k8s/istio/deploy-istio-helm.ps1 | 3 + k8s/istio/install-istio-local.ps1 | 16 +++++ k8s/istio/kiali/secrets.yml | 11 ++++ k8s/istio/kiali/set-kiali-credentials.ps1 | 36 +++++++++++ 5 files changed, 139 insertions(+) create mode 100644 k8s/istio/JourneyToIstio.md create mode 100644 k8s/istio/deploy-istio-helm.ps1 create mode 100644 k8s/istio/install-istio-local.ps1 create mode 100644 k8s/istio/kiali/secrets.yml create mode 100644 k8s/istio/kiali/set-kiali-credentials.ps1 diff --git a/k8s/istio/JourneyToIstio.md b/k8s/istio/JourneyToIstio.md new file mode 100644 index 000000000..6e44cf526 --- /dev/null +++ b/k8s/istio/JourneyToIstio.md @@ -0,0 +1,73 @@ +# ISTIO on Local +## Prerequisites on local +You need the eshopsOnContainers configured on your local, with this +in a powershell console, we need to enter in /k8s/istio and execute +``` +>kubectl get pods +NAME READY STATUS RESTARTS AGE +eshop-apigwmm-54ccc6c589-557fn 0/1 Running 26 3h +eshop-apigwms-7d5f86cf7c-2j2zp 0/1 CrashLoopBackOff 30 3h +eshop-apigwwm-7794b6d879-7j4mt 0/1 CrashLoopBackOff 39 3h +eshop-apigwws-8585f6899f-7kkg2 0/1 Running 11 3h +eshop-basket-api-8bfc5c5f6-8xxcv 0/1 Running 41 3h +eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 0 3h +eshop-catalog-api-c77747b76-4gp6c 0/1 CrashLoopBackOff 40 3h +eshop-identity-api-7574f6b458-4rbp6 0/1 CrashLoopBackOff 44 3h +eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 0 3h +eshop-locations-api-64847646d-5wv52 0/1 CrashLoopBackOff 36 3h +eshop-marketing-api-745f9546b8-krjqq 0/1 Running 33 3h +eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 22 3h +eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 0 3h +eshop-ordering-api-5c55bd5464-7hnjx 0/1 CrashLoopBackOff 38 3h +eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 1/1 Running 22 3h +eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 0 3h +eshop-payment-api-7988db5f76-z76tc 1/1 Running 17 3h +eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 0 3h +eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 0 3h +eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 0 3h +eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 0 3h +eshop-webmvc-55c596544b-9fqsj 1/1 Running 0 3h +eshop-webshoppingagg-f8547f45b-4mjvp 0/1 CrashLoopBackOff 16 3h +eshop-webspa-84fd54466d-hzrlb 1/1 Running 0 3h +eshop-webstatus-775b487d4d-tbfbn 1/1 Running 0 3h +``` + +```ps1 +> ./install-istio-local.ps1 + +``` +This will install the cli utility and register to the path, you can test this phase launching + +```ps1 +> istioctl +``` + +Afterthat you can install Istio on your cluster executing +```ps1 +> ./deploy-istio-helm.ps1 +``` + +the result should be like: +``` +NAME READY STATUS RESTARTS AGE +grafana-774bf8cb47-clqkp 1/1 Running 0 2h +istio-citadel-548f4cdd9-dbrbn 1/1 Running 0 2h +istio-egressgateway-5f77f6c979-8922g 1/1 Running 0 2h +istio-galley-8f6585898-7c7wq 1/1 Running 0 2h +istio-ingressgateway-8484579cdb-7tw8n 1/1 Running 0 2h +istio-pilot-7c5c5778fb-r987v 2/2 Running 0 2h +istio-policy-7d67d47c65-rdqwj 2/2 Running 15 2h +istio-sidecar-injector-6fb6845cdd-nnhks 1/1 Running 0 2h +istio-telemetry-8b9fc7769-pwx5m 2/2 Running 24 2h +istio-tracing-ff94688bb-xnhnd 1/1 Running 4 2h +kiali-8644dbcdbc-pb627 0/1 CrashLoopBackOff 7 2h +prometheus-f556886b8-mr6wb 1/1 Running 13 2h +``` + +Is a common error that kiali-pod have errors, because it needs a credentials for working. +enter in k8s/istio/kiali and execute: +``` +> ./set-kiali-credentials.ps1 +``` +this script will prompt for a valid account/password and setups the secret in kubernetes +(at the moment account/password will be admin/admin we need to modify the yml) diff --git a/k8s/istio/deploy-istio-helm.ps1 b/k8s/istio/deploy-istio-helm.ps1 new file mode 100644 index 000000000..704813121 --- /dev/null +++ b/k8s/istio/deploy-istio-helm.ps1 @@ -0,0 +1,3 @@ +$ISTIO_VERSION="1.0.6" +cd istio-$ISTIO_VERSION +helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true \ No newline at end of file diff --git a/k8s/istio/install-istio-local.ps1 b/k8s/istio/install-istio-local.ps1 new file mode 100644 index 000000000..fcf0a6d34 --- /dev/null +++ b/k8s/istio/install-istio-local.ps1 @@ -0,0 +1,16 @@ +# Specify the Istio version that will be leveraged throughout these instructions +$ISTIO_VERSION="1.0.6" + +# Windows + +$ProgressPreference = 'SilentlyContinue'; +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Invoke-WebRequest -URI "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-win.zip" -OutFile "istio-$ISTIO_VERSION.zip" +Expand-Archive -Path "istio-$ISTIO_VERSION.zip" -DestinationPath . + +cd istio-$ISTIO_VERSION +New-Item -ItemType Directory -Force -Path "C:\Program Files\Istio" +mv ./bin/istioctl.exe "C:\Program Files/Istio/" +$PATH = [environment]::GetEnvironmentVariable("PATH", "User") +[environment]::SetEnvironmentVariable("PATH", $PATH + "; C:\Program Files\Istio", "User") + diff --git a/k8s/istio/kiali/secrets.yml b/k8s/istio/kiali/secrets.yml new file mode 100644 index 000000000..7185f1383 --- /dev/null +++ b/k8s/istio/kiali/secrets.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Secret +metadata: + name: kiali + namespace: istio-system + labels: + app: kiali +type: Opaque +data: + username: YQBkAG0AaQBuAA== + passphrase: YQBkAG0AaQBuAA== \ No newline at end of file diff --git a/k8s/istio/kiali/set-kiali-credentials.ps1 b/k8s/istio/kiali/set-kiali-credentials.ps1 new file mode 100644 index 000000000..bd778b647 --- /dev/null +++ b/k8s/istio/kiali/set-kiali-credentials.ps1 @@ -0,0 +1,36 @@ +Param([parameter(Mandatory,HelpMessage="Enter a valid username for Kiali Administration")][string]$username, + [parameter(Mandatory,HelpMessage="Enter your super secret password")][securestring]$password, + [parameter(Mandatory=$false)][string]$NAMESPACE="istio-system" +) + +function Get-PlainText() +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory = $true)] + [securestring]$SecureString + ) + BEGIN { } + PROCESS + { + $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString); + + try + { + return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr); + } + finally + { + [Runtime.InteropServices.Marshal]::FreeBSTR($bstr); + } + } + END { } +} + +$KIALIUSERNAME = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($username)) +$plainpassword = Get-PlainText $password; +$KIALIPASSWORD = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($plainpassword)) + +Write-Host "setting username [$KIALIUSERNAME] and password [$KIALIPASSWORD]" -ForegroundColor Blue +kubectl apply -f secrets.yml \ No newline at end of file From 6926bbe54b3f2e355014e545c7154ac787f152d7 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 6 Mar 2019 16:14:58 +0100 Subject: [PATCH 05/52] Enabling istio on local kubernetes and first pod configuration, needs more work, unstable --- k8s/istio/JourneyToIstio.md | 73 +++++++++++++++++++++++ k8s/istio/deploy-istio-helm.ps1 | 3 + k8s/istio/install-istio-local.ps1 | 16 +++++ k8s/istio/kiali/secrets.yml | 11 ++++ k8s/istio/kiali/set-kiali-credentials.ps1 | 36 +++++++++++ 5 files changed, 139 insertions(+) create mode 100644 k8s/istio/JourneyToIstio.md create mode 100644 k8s/istio/deploy-istio-helm.ps1 create mode 100644 k8s/istio/install-istio-local.ps1 create mode 100644 k8s/istio/kiali/secrets.yml create mode 100644 k8s/istio/kiali/set-kiali-credentials.ps1 diff --git a/k8s/istio/JourneyToIstio.md b/k8s/istio/JourneyToIstio.md new file mode 100644 index 000000000..6e44cf526 --- /dev/null +++ b/k8s/istio/JourneyToIstio.md @@ -0,0 +1,73 @@ +# ISTIO on Local +## Prerequisites on local +You need the eshopsOnContainers configured on your local, with this +in a powershell console, we need to enter in /k8s/istio and execute +``` +>kubectl get pods +NAME READY STATUS RESTARTS AGE +eshop-apigwmm-54ccc6c589-557fn 0/1 Running 26 3h +eshop-apigwms-7d5f86cf7c-2j2zp 0/1 CrashLoopBackOff 30 3h +eshop-apigwwm-7794b6d879-7j4mt 0/1 CrashLoopBackOff 39 3h +eshop-apigwws-8585f6899f-7kkg2 0/1 Running 11 3h +eshop-basket-api-8bfc5c5f6-8xxcv 0/1 Running 41 3h +eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 0 3h +eshop-catalog-api-c77747b76-4gp6c 0/1 CrashLoopBackOff 40 3h +eshop-identity-api-7574f6b458-4rbp6 0/1 CrashLoopBackOff 44 3h +eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 0 3h +eshop-locations-api-64847646d-5wv52 0/1 CrashLoopBackOff 36 3h +eshop-marketing-api-745f9546b8-krjqq 0/1 Running 33 3h +eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 22 3h +eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 0 3h +eshop-ordering-api-5c55bd5464-7hnjx 0/1 CrashLoopBackOff 38 3h +eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 1/1 Running 22 3h +eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 0 3h +eshop-payment-api-7988db5f76-z76tc 1/1 Running 17 3h +eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 0 3h +eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 0 3h +eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 0 3h +eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 0 3h +eshop-webmvc-55c596544b-9fqsj 1/1 Running 0 3h +eshop-webshoppingagg-f8547f45b-4mjvp 0/1 CrashLoopBackOff 16 3h +eshop-webspa-84fd54466d-hzrlb 1/1 Running 0 3h +eshop-webstatus-775b487d4d-tbfbn 1/1 Running 0 3h +``` + +```ps1 +> ./install-istio-local.ps1 + +``` +This will install the cli utility and register to the path, you can test this phase launching + +```ps1 +> istioctl +``` + +Afterthat you can install Istio on your cluster executing +```ps1 +> ./deploy-istio-helm.ps1 +``` + +the result should be like: +``` +NAME READY STATUS RESTARTS AGE +grafana-774bf8cb47-clqkp 1/1 Running 0 2h +istio-citadel-548f4cdd9-dbrbn 1/1 Running 0 2h +istio-egressgateway-5f77f6c979-8922g 1/1 Running 0 2h +istio-galley-8f6585898-7c7wq 1/1 Running 0 2h +istio-ingressgateway-8484579cdb-7tw8n 1/1 Running 0 2h +istio-pilot-7c5c5778fb-r987v 2/2 Running 0 2h +istio-policy-7d67d47c65-rdqwj 2/2 Running 15 2h +istio-sidecar-injector-6fb6845cdd-nnhks 1/1 Running 0 2h +istio-telemetry-8b9fc7769-pwx5m 2/2 Running 24 2h +istio-tracing-ff94688bb-xnhnd 1/1 Running 4 2h +kiali-8644dbcdbc-pb627 0/1 CrashLoopBackOff 7 2h +prometheus-f556886b8-mr6wb 1/1 Running 13 2h +``` + +Is a common error that kiali-pod have errors, because it needs a credentials for working. +enter in k8s/istio/kiali and execute: +``` +> ./set-kiali-credentials.ps1 +``` +this script will prompt for a valid account/password and setups the secret in kubernetes +(at the moment account/password will be admin/admin we need to modify the yml) diff --git a/k8s/istio/deploy-istio-helm.ps1 b/k8s/istio/deploy-istio-helm.ps1 new file mode 100644 index 000000000..704813121 --- /dev/null +++ b/k8s/istio/deploy-istio-helm.ps1 @@ -0,0 +1,3 @@ +$ISTIO_VERSION="1.0.6" +cd istio-$ISTIO_VERSION +helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true \ No newline at end of file diff --git a/k8s/istio/install-istio-local.ps1 b/k8s/istio/install-istio-local.ps1 new file mode 100644 index 000000000..fcf0a6d34 --- /dev/null +++ b/k8s/istio/install-istio-local.ps1 @@ -0,0 +1,16 @@ +# Specify the Istio version that will be leveraged throughout these instructions +$ISTIO_VERSION="1.0.6" + +# Windows + +$ProgressPreference = 'SilentlyContinue'; +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Invoke-WebRequest -URI "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-win.zip" -OutFile "istio-$ISTIO_VERSION.zip" +Expand-Archive -Path "istio-$ISTIO_VERSION.zip" -DestinationPath . + +cd istio-$ISTIO_VERSION +New-Item -ItemType Directory -Force -Path "C:\Program Files\Istio" +mv ./bin/istioctl.exe "C:\Program Files/Istio/" +$PATH = [environment]::GetEnvironmentVariable("PATH", "User") +[environment]::SetEnvironmentVariable("PATH", $PATH + "; C:\Program Files\Istio", "User") + diff --git a/k8s/istio/kiali/secrets.yml b/k8s/istio/kiali/secrets.yml new file mode 100644 index 000000000..7185f1383 --- /dev/null +++ b/k8s/istio/kiali/secrets.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Secret +metadata: + name: kiali + namespace: istio-system + labels: + app: kiali +type: Opaque +data: + username: YQBkAG0AaQBuAA== + passphrase: YQBkAG0AaQBuAA== \ No newline at end of file diff --git a/k8s/istio/kiali/set-kiali-credentials.ps1 b/k8s/istio/kiali/set-kiali-credentials.ps1 new file mode 100644 index 000000000..bd778b647 --- /dev/null +++ b/k8s/istio/kiali/set-kiali-credentials.ps1 @@ -0,0 +1,36 @@ +Param([parameter(Mandatory,HelpMessage="Enter a valid username for Kiali Administration")][string]$username, + [parameter(Mandatory,HelpMessage="Enter your super secret password")][securestring]$password, + [parameter(Mandatory=$false)][string]$NAMESPACE="istio-system" +) + +function Get-PlainText() +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory = $true)] + [securestring]$SecureString + ) + BEGIN { } + PROCESS + { + $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString); + + try + { + return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr); + } + finally + { + [Runtime.InteropServices.Marshal]::FreeBSTR($bstr); + } + } + END { } +} + +$KIALIUSERNAME = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($username)) +$plainpassword = Get-PlainText $password; +$KIALIPASSWORD = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($plainpassword)) + +Write-Host "setting username [$KIALIUSERNAME] and password [$KIALIPASSWORD]" -ForegroundColor Blue +kubectl apply -f secrets.yml \ No newline at end of file From 3e7f93020886f6a2d7169c85b6531add383f7c67 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Thu, 7 Mar 2019 16:26:03 +0100 Subject: [PATCH 06/52] Added support to istio with nginx-ingress --- k8s/istio/JourneyToIstio.md | 64 +++-- k8s/istio/apply-injection.ps1 | 2 + k8s/istio/delete-istio.ps1 | 2 + k8s/istio/deploy-istio-helm.ps1 | 3 +- k8s/istio/kiali/secrets.yml | 4 +- k8s/istio/kiali/set-kiali-credentials.ps1 | 4 +- k8s/istio/nginx-ingress/cloud-generic.yaml | 21 ++ k8s/istio/nginx-ingress/cm.yaml | Bin 0 -> 526 bytes .../local-dockerk8s/identityapi-cm-fix.yaml | 3 + .../local-dockerk8s/mvc-cm-fix.yaml | 3 + .../local-dockerk8s/mvc-fix.yaml | 39 +++ k8s/istio/nginx-ingress/mandatory.yaml | 239 ++++++++++++++++++ k8s/istio/nginx-ingress/service-nodeport.yaml | 22 ++ .../nginx-ingress/update-nginx-ingress.ps1 | 1 + k8s/nginx-ingress/mandatory-istio.yaml | 238 +++++++++++++++++ 15 files changed, 614 insertions(+), 31 deletions(-) create mode 100644 k8s/istio/apply-injection.ps1 create mode 100644 k8s/istio/delete-istio.ps1 create mode 100644 k8s/istio/nginx-ingress/cloud-generic.yaml create mode 100644 k8s/istio/nginx-ingress/cm.yaml create mode 100644 k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml create mode 100644 k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml create mode 100644 k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml create mode 100644 k8s/istio/nginx-ingress/mandatory.yaml create mode 100644 k8s/istio/nginx-ingress/service-nodeport.yaml create mode 100644 k8s/istio/nginx-ingress/update-nginx-ingress.ps1 create mode 100644 k8s/nginx-ingress/mandatory-istio.yaml diff --git a/k8s/istio/JourneyToIstio.md b/k8s/istio/JourneyToIstio.md index 6e44cf526..a12f6740a 100644 --- a/k8s/istio/JourneyToIstio.md +++ b/k8s/istio/JourneyToIstio.md @@ -4,32 +4,32 @@ You need the eshopsOnContainers configured on your local, with this in a powershell console, we need to enter in /k8s/istio and execute ``` >kubectl get pods -NAME READY STATUS RESTARTS AGE -eshop-apigwmm-54ccc6c589-557fn 0/1 Running 26 3h -eshop-apigwms-7d5f86cf7c-2j2zp 0/1 CrashLoopBackOff 30 3h -eshop-apigwwm-7794b6d879-7j4mt 0/1 CrashLoopBackOff 39 3h -eshop-apigwws-8585f6899f-7kkg2 0/1 Running 11 3h -eshop-basket-api-8bfc5c5f6-8xxcv 0/1 Running 41 3h -eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 0 3h -eshop-catalog-api-c77747b76-4gp6c 0/1 CrashLoopBackOff 40 3h -eshop-identity-api-7574f6b458-4rbp6 0/1 CrashLoopBackOff 44 3h -eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 0 3h -eshop-locations-api-64847646d-5wv52 0/1 CrashLoopBackOff 36 3h -eshop-marketing-api-745f9546b8-krjqq 0/1 Running 33 3h -eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 22 3h -eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 0 3h -eshop-ordering-api-5c55bd5464-7hnjx 0/1 CrashLoopBackOff 38 3h -eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 1/1 Running 22 3h -eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 0 3h -eshop-payment-api-7988db5f76-z76tc 1/1 Running 17 3h -eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 0 3h -eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 0 3h -eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 0 3h -eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 0 3h -eshop-webmvc-55c596544b-9fqsj 1/1 Running 0 3h -eshop-webshoppingagg-f8547f45b-4mjvp 0/1 CrashLoopBackOff 16 3h -eshop-webspa-84fd54466d-hzrlb 1/1 Running 0 3h -eshop-webstatus-775b487d4d-tbfbn 1/1 Running 0 3h +NAME READY STATUS RESTARTS AGE +eshop-apigwmm-54ccc6c589-557fn 0/1 Running 31 4h +eshop-apigwms-7d5f86cf7c-2j2zp 0/1 Running 32 4h +eshop-apigwwm-7794b6d879-7j4mt 0/1 Running 44 4h +eshop-apigwws-8585f6899f-7kkg2 0/1 Running 13 4h +eshop-basket-api-8bfc5c5f6-8xxcv 1/1 Running 47 4h +eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 1 4h +eshop-catalog-api-c77747b76-4gp6c 0/1 Running 48 4h +eshop-identity-api-7574f6b458-4rbp6 0/1 Running 55 4h +eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 1 4h +eshop-locations-api-64847646d-5wv52 1/1 Running 42 4h +eshop-marketing-api-745f9546b8-krjqq 1/1 Running 40 4h +eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 24 4h +eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 1 4h +eshop-ordering-api-5c55bd5464-7hnjx 0/1 Running 46 4h +eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 0/1 Running 24 4h +eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 1 4h +eshop-payment-api-7988db5f76-z76tc 0/1 Running 19 4h +eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 1 4h +eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 1 4h +eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 2 4h +eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 1 4h +eshop-webmvc-55c596544b-9fqsj 1/1 Running 2 4h +eshop-webshoppingagg-f8547f45b-4mjvp 0/1 Running 21 4h +eshop-webspa-84fd54466d-hzrlb 1/1 Running 2 4h +eshop-webstatus-775b487d4d-tbfbn 1/1 Running 1 4h ``` ```ps1 @@ -71,3 +71,15 @@ enter in k8s/istio/kiali and execute: ``` this script will prompt for a valid account/password and setups the secret in kubernetes (at the moment account/password will be admin/admin we need to modify the yml) + +After enter in /k8s/istio/nginx-ingress that execute, we need to apply the istio integration with nginx-ingress for service-upstream. + +``` +> ./update-nginx-ingress.ps1 +``` + +And After that, we only need to activate the sidecar injection in the default namespace for the eshops deployments, for doing that you must go the folder /k8s/istio +and run: +``` +> ./apply-injection.ps1 +```` \ No newline at end of file diff --git a/k8s/istio/apply-injection.ps1 b/k8s/istio/apply-injection.ps1 new file mode 100644 index 000000000..294eb880f --- /dev/null +++ b/k8s/istio/apply-injection.ps1 @@ -0,0 +1,2 @@ +kubectl label namespace default istio-injection=enabled +kubectl get namespace -L istio-injection diff --git a/k8s/istio/delete-istio.ps1 b/k8s/istio/delete-istio.ps1 new file mode 100644 index 000000000..b1fa99e86 --- /dev/null +++ b/k8s/istio/delete-istio.ps1 @@ -0,0 +1,2 @@ +helm delete --purge istio +kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system \ No newline at end of file diff --git a/k8s/istio/deploy-istio-helm.ps1 b/k8s/istio/deploy-istio-helm.ps1 index 704813121..5bfcbc1e7 100644 --- a/k8s/istio/deploy-istio-helm.ps1 +++ b/k8s/istio/deploy-istio-helm.ps1 @@ -1,3 +1,4 @@ $ISTIO_VERSION="1.0.6" cd istio-$ISTIO_VERSION -helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true \ No newline at end of file +helm install install/kubernetes/helm/istio --wait --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true --set ingress.enabled=false --set gateways.istio-ingressgateway.enabled=false +cd .. \ No newline at end of file diff --git a/k8s/istio/kiali/secrets.yml b/k8s/istio/kiali/secrets.yml index 7185f1383..fb6155d54 100644 --- a/k8s/istio/kiali/secrets.yml +++ b/k8s/istio/kiali/secrets.yml @@ -7,5 +7,5 @@ metadata: app: kiali type: Opaque data: - username: YQBkAG0AaQBuAA== - passphrase: YQBkAG0AaQBuAA== \ No newline at end of file + username: YWRtaW4= + passphrase: MWYyZDFlMmU2N2Rm \ No newline at end of file diff --git a/k8s/istio/kiali/set-kiali-credentials.ps1 b/k8s/istio/kiali/set-kiali-credentials.ps1 index bd778b647..dad0f5754 100644 --- a/k8s/istio/kiali/set-kiali-credentials.ps1 +++ b/k8s/istio/kiali/set-kiali-credentials.ps1 @@ -32,5 +32,5 @@ $KIALIUSERNAME = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($us $plainpassword = Get-PlainText $password; $KIALIPASSWORD = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($plainpassword)) -Write-Host "setting username [$KIALIUSERNAME] and password [$KIALIPASSWORD]" -ForegroundColor Blue -kubectl apply -f secrets.yml \ No newline at end of file +Write-Host "Creating Kiali Secret in namespace [$NAMESPACE]" -ForegroundColor Blue +kubectl -n $NAMESPACE create secret generic kiali --from-literal=username=$KIALIUSERNAME --from-literal=passphrase=$KIALIPASSWORD \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/cloud-generic.yaml b/k8s/istio/nginx-ingress/cloud-generic.yaml new file mode 100644 index 000000000..945441ab8 --- /dev/null +++ b/k8s/istio/nginx-ingress/cloud-generic.yaml @@ -0,0 +1,21 @@ +kind: Service +apiVersion: v1 +metadata: + name: ingress-nginx + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +spec: + externalTrafficPolicy: Local + type: LoadBalancer + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + ports: + - name: http + port: 80 + targetPort: http + - name: https + port: 443 + targetPort: https \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/cm.yaml b/k8s/istio/nginx-ingress/cm.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7818fd15b5c6ea138c70f6b77083b47fcde28e09 GIT binary patch literal 526 zcma)3O$&lh5S(++e-Q7_NGif>=dRr~Kaflxno<4uYIZFXA`;Q(o86tAoqgOxSmf9t zL5+rg6-oqfaK;={OmHApB35jp(UeGrEu>O1j;uZL7W0)eP}Ctu!CS;=LFNxC5vjHC z$lhv3%^t#%Fw;{NGa{jKiyG08QK7^e7`+L0>3fZ3wPdZ?$#9lbr~1!5R3bXM&IbE| zA1zsB{?0-1MHIa&8%`TCKN->S+eb_8inCs+I-+AKAK90o7ddV(R+k&|v8JbP@5--A P*@wft1;0L)SZUQ0cZpZ^ literal 0 HcmV?d00001 diff --git a/k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml b/k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml new file mode 100644 index 000000000..3a3fcf5a5 --- /dev/null +++ b/k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml @@ -0,0 +1,3 @@ +data: + mvc_e: http://10.0.75.1/webmvc + \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml b/k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml new file mode 100644 index 000000000..1475deec1 --- /dev/null +++ b/k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml @@ -0,0 +1,3 @@ +data: + urls__IdentityUrl: http://10.0.75.1/identity + urls__mvc: http://10.0.75.1/webmvc diff --git a/k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml b/k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml new file mode 100644 index 000000000..b9ecd4cba --- /dev/null +++ b/k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml @@ -0,0 +1,39 @@ +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + annotations: + ingress.kubernetes.io/ssl-redirect: "false" + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/ssl-redirect: "false" + labels: + app: webmvc + name: eshop-webmvc-loopback + namespace: default +spec: + rules: + - http: + paths: + - backend: + serviceName: webmvc + servicePort: http + path: /webmvc +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + annotations: + ingress.kubernetes.io/ssl-redirect: "false" + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/ssl-redirect: "false" + labels: + app: identity-api + name: eshop-identity-api-loopback + namespace: default +spec: + rules: + - http: + paths: + - backend: + serviceName: identity + servicePort: http + path: /identity \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/mandatory.yaml b/k8s/istio/nginx-ingress/mandatory.yaml new file mode 100644 index 000000000..0b9ea035e --- /dev/null +++ b/k8s/istio/nginx-ingress/mandatory.yaml @@ -0,0 +1,239 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: ingress-nginx + +--- + +kind: ConfigMap +apiVersion: v1 +metadata: + name: nginx-configuration + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: nginx-ingress-clusterrole + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +rules: + - apiGroups: + - "" + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - nodes + verbs: + - get + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - "extensions" + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "extensions" + resources: + - ingresses/status + verbs: + - update + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: Role +metadata: + name: nginx-ingress-role + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +rules: + - apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + resourceNames: + # Defaults to "-" + # Here: "-" + # This has to be adapted if you change either parameter + # when launching the nginx-ingress-controller. + - "ingress-controller-leader-nginx" + verbs: + - get + - update + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: RoleBinding +metadata: + name: nginx-ingress-role-nisa-binding + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: nginx-ingress-role +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: nginx-ingress-clusterrole-nisa-binding + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-ingress-clusterrole +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + +--- + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nginx-ingress-controller + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + template: + metadata: + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + annotations: + prometheus.io/port: "10254" + prometheus.io/scrape: "true" + service-upstream: "true" + spec: + serviceAccountName: nginx-ingress-serviceaccount + containers: + - name: nginx-ingress-controller + image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0 + args: + - /nginx-ingress-controller + - --configmap=$(POD_NAMESPACE)/nginx-configuration + - --publish-service=$(POD_NAMESPACE)/ingress-nginx + - --annotations-prefix=nginx.ingress.kubernetes.io + securityContext: + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + # www-data -> 33 + runAsUser: 33 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + ports: + - name: http + containerPort: 80 + - name: https + containerPort: 443 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 diff --git a/k8s/istio/nginx-ingress/service-nodeport.yaml b/k8s/istio/nginx-ingress/service-nodeport.yaml new file mode 100644 index 000000000..dd82ed3ed --- /dev/null +++ b/k8s/istio/nginx-ingress/service-nodeport.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Service +metadata: + name: ingress-nginx + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +spec: + type: NodePort + ports: + - name: http + port: 80 + targetPort: 80 + protocol: TCP + - name: https + port: 443 + targetPort: 443 + protocol: TCP + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx diff --git a/k8s/istio/nginx-ingress/update-nginx-ingress.ps1 b/k8s/istio/nginx-ingress/update-nginx-ingress.ps1 new file mode 100644 index 000000000..656bd9fe8 --- /dev/null +++ b/k8s/istio/nginx-ingress/update-nginx-ingress.ps1 @@ -0,0 +1 @@ +kubectl apply -f mandatory.yml \ No newline at end of file diff --git a/k8s/nginx-ingress/mandatory-istio.yaml b/k8s/nginx-ingress/mandatory-istio.yaml new file mode 100644 index 000000000..56b1cc3b5 --- /dev/null +++ b/k8s/nginx-ingress/mandatory-istio.yaml @@ -0,0 +1,238 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: ingress-nginx + +--- + +kind: ConfigMap +apiVersion: v1 +metadata: + name: nginx-configuration + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: nginx-ingress-clusterrole + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +rules: + - apiGroups: + - "" + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - nodes + verbs: + - get + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - "extensions" + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "extensions" + resources: + - ingresses/status + verbs: + - update + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: Role +metadata: + name: nginx-ingress-role + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +rules: + - apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + resourceNames: + # Defaults to "-" + # Here: "-" + # This has to be adapted if you change either parameter + # when launching the nginx-ingress-controller. + - "ingress-controller-leader-nginx" + verbs: + - get + - update + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: RoleBinding +metadata: + name: nginx-ingress-role-nisa-binding + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: nginx-ingress-role +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: nginx-ingress-clusterrole-nisa-binding + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-ingress-clusterrole +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + +--- + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nginx-ingress-controller + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + template: + metadata: + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + annotations: + prometheus.io/port: "10254" + prometheus.io/scrape: "true" + spec: + serviceAccountName: nginx-ingress-serviceaccount + containers: + - name: nginx-ingress-controller + image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0 + args: + - /nginx-ingress-controller + - --configmap=$(POD_NAMESPACE)/nginx-configuration + - --publish-service=$(POD_NAMESPACE)/ingress-nginx + - --annotations-prefix=nginx.ingress.kubernetes.io + securityContext: + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + # www-data -> 33 + runAsUser: 33 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + ports: + - name: http + containerPort: 80 + - name: https + containerPort: 443 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 From b19d4f2fc8f2d5c9a54c126e215642f823b7351a Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Thu, 7 Mar 2019 16:29:14 +0100 Subject: [PATCH 07/52] Fix errors on las commit --- k8s/istio/JourneyToIstio.md | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/k8s/istio/JourneyToIstio.md b/k8s/istio/JourneyToIstio.md index 0594bcc73..f34aa88fb 100644 --- a/k8s/istio/JourneyToIstio.md +++ b/k8s/istio/JourneyToIstio.md @@ -4,7 +4,6 @@ You need the eshopsOnContainers configured on your local, with this in a powershell console, we need to enter in /k8s/istio and execute ``` >kubectl get pods -<<<<<<< HEAD NAME READY STATUS RESTARTS AGE eshop-apigwmm-54ccc6c589-557fn 0/1 Running 31 4h eshop-apigwms-7d5f86cf7c-2j2zp 0/1 Running 32 4h @@ -31,34 +30,6 @@ eshop-webmvc-55c596544b-9fqsj 1/1 Running 2 eshop-webshoppingagg-f8547f45b-4mjvp 0/1 Running 21 4h eshop-webspa-84fd54466d-hzrlb 1/1 Running 2 4h eshop-webstatus-775b487d4d-tbfbn 1/1 Running 1 4h -======= -NAME READY STATUS RESTARTS AGE -eshop-apigwmm-54ccc6c589-557fn 0/1 Running 26 3h -eshop-apigwms-7d5f86cf7c-2j2zp 0/1 CrashLoopBackOff 30 3h -eshop-apigwwm-7794b6d879-7j4mt 0/1 CrashLoopBackOff 39 3h -eshop-apigwws-8585f6899f-7kkg2 0/1 Running 11 3h -eshop-basket-api-8bfc5c5f6-8xxcv 0/1 Running 41 3h -eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 0 3h -eshop-catalog-api-c77747b76-4gp6c 0/1 CrashLoopBackOff 40 3h -eshop-identity-api-7574f6b458-4rbp6 0/1 CrashLoopBackOff 44 3h -eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 0 3h -eshop-locations-api-64847646d-5wv52 0/1 CrashLoopBackOff 36 3h -eshop-marketing-api-745f9546b8-krjqq 0/1 Running 33 3h -eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 22 3h -eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 0 3h -eshop-ordering-api-5c55bd5464-7hnjx 0/1 CrashLoopBackOff 38 3h -eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 1/1 Running 22 3h -eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 0 3h -eshop-payment-api-7988db5f76-z76tc 1/1 Running 17 3h -eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 0 3h -eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 0 3h -eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 0 3h -eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 0 3h -eshop-webmvc-55c596544b-9fqsj 1/1 Running 0 3h -eshop-webshoppingagg-f8547f45b-4mjvp 0/1 CrashLoopBackOff 16 3h -eshop-webspa-84fd54466d-hzrlb 1/1 Running 0 3h -eshop-webstatus-775b487d4d-tbfbn 1/1 Running 0 3h ->>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e ``` ```ps1 @@ -100,7 +71,6 @@ enter in k8s/istio/kiali and execute: ``` this script will prompt for a valid account/password and setups the secret in kubernetes (at the moment account/password will be admin/admin we need to modify the yml) -<<<<<<< HEAD After enter in /k8s/istio/nginx-ingress that execute, we need to apply the istio integration with nginx-ingress for service-upstream. @@ -113,5 +83,3 @@ and run: ``` > ./apply-injection.ps1 ```` -======= ->>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e From 047322f1a56ee033bbf5af1724ccab4fa1eb4efd Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 8 Mar 2019 11:56:07 +0100 Subject: [PATCH 08/52] Added bash version of the Helm deploy script --- k8s/helm/deploy-all.sh | 208 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100755 k8s/helm/deploy-all.sh diff --git a/k8s/helm/deploy-all.sh b/k8s/helm/deploy-all.sh new file mode 100755 index 000000000..adfb111f3 --- /dev/null +++ b/k8s/helm/deploy-all.sh @@ -0,0 +1,208 @@ +#!/usr/bin/env bash + +# http://redsymbol.net/articles/unofficial-bash-strict-mode +set -euo pipefail + +usage() +{ + cat < + The name of the AKS cluster. Required when the registry (using the -r parameter) is set to "aks". + --aks-rg + The resource group for the AKS cluster. Required when the registry (using the -r parameter) is set to "aks". + -b | --build-solution + Force a solution build before deployment (default: false). + -d | --dns + Specifies the external DNS/ IP address of the Kubernetes cluster. + When --use-local-k8s is specified the external DNS is automatically set to localhost. + -h | --help + Displays this help text and exits the script. + -n | --app-name + Specifies the name of the application (default: eshop). + -p | --docker-password + The Docker password used to logon to the custom registry, supplied using the -r parameter. + -r | --registry + Specifies the container registry to use (required), e.g. myregistry.azurecr.io. + --skip-clean + Do not clean the Kubernetes cluster (default is to clean the cluster). + --skip-image-build + Do not build images (default is to build all images). + --skip-image-push + Do not upload images to the container registry (just run the Kubernetes deployment portion). + Default is to push the images to the container registry. + --skip-infrastructure + Do not deploy infrastructure resources (like sql-data, no-sql or redis). + This is useful for production environments where infrastructure is hosted outside the Kubernetes cluster. + -t | --tag + The tag used for the newly created docker images. Default: newly created, date-based timestamp, with 1-minute resolution. + -u | --docker-user + The Docker username used to logon to the custom registry, supplied using the -r parameter. + --use-local-k8s + Deploy to a locally installed Kubernetes (default: false). + +It is assumed that the Kubernetes cluster has been granted access to the container registry. +If using AKS and ACR see link for more info: +https://docs.microsoft.com/en-us/azure/container-registry/container-registry-auth-aks + +WARNING! THE SCRIPT WILL COMPLETELY DESTROY ALL DEPLOYMENTS AND SERVICES VISIBLE +FROM THE CURRENT CONFIGURATION CONTEXT. +It is recommended that you create a separate namespace and confguration context +for the $app_name application, to isolate it from other applications on the cluster. +For more information see https://kubernetes.io/docs/tasks/administer-cluster/namespaces/ +You can use namespace.yaml file (in the same directory) to create the namespace. + +END +} + +app_name='eshop' +aks_name='' +aks_rg='' +build_images='yes' +clean='yes' +build_solution='' +container_registry='' +docker_password='' +docker_username='' +dns='' +image_tag=$(date '+%Y%m%d%H%M') +push_images='yes' +skip_infrastructure='' +use_local_k8s='' + +while [[ $# -gt 0 ]]; do + case "$1" in + --aks-name ) + aks_name="$2"; shift 2;; + --aks-rg ) + aks_rg="$2"; shift 2;; + -b | --build-solution ) + build_solution='yes'; shift ;; + -d | --dns ) + dns="$2"; shift 2;; + -h | --help ) + usage; exit 1 ;; + -n | --app-name ) + app_name="$2"; shift 2;; + -p | --docker-password ) + docker_password="$2"; shift;; + -r | --registry ) + container_registry="$2"; shift 2;; + --skip-clean ) + clean=''; shift ;; + --skip-image-build ) + build_images=''; shift ;; + --skip-image-push ) + push_images=''; shift ;; + --skip-infrastructure ) + skip_infrastructure='yes'; shift ;; + -t | --tag ) + image_tag="$2"; shift 2;; + -u | --docker-username ) + docker_username="$2"; shift 2;; + --use-local-k8s ) + use_local_k8s=''; shift ;; + *) + echo "Unknown option $1" + usage; exit 2 ;; + esac +done + +if [[ $build_solution ]]; then + echo "#################### Building $app_name solution ####################" + dotnet publish -o obj/Docker/publish ../../winnersworkout-backend.sln +fi + +export TAG=$image_tag + +if [[ $build_images ]]; then + echo "#################### Building the $app_name Docker images ####################" + docker-compose -p .. -f ../../docker-compose.yml build + + # Remove temporary images + docker rmi $(docker images -qf "dangling=true") +fi + +if [[ $push_images ]]; then + echo "#################### Pushing images to the container registry ####################" + services=(basket.api catalog.api identity.api ordering.api marketing.api payment.api locations.api webmvc webspa webstatus) + + for service in "${services[@]}" + do + echo "Pushing image for service $service..." + docker tag "eshop/$service:$image_tag" "$container_registry/$service:$image_tag" + docker push "$container_registry/$service:$image_tag" + done +fi + +ingress_values_file="ingress_values.yaml" + +if [[ $use_local_k8s ]]; then + ingress_values_file="ingress_values_dockerk8s.yaml" + dns="localhost" +fi + +if [[ $dns == "aks" ]]; then + echo "#################### Begin AKS discovery based on the --dns aks setting. ####################" + if [[ -z $aks_name ]] || [[ -z $aks_rg ]]; then + echo "Error: When using -dns aks, MUST set -aksName and -aksRg too." + echo '' + usage + exit 1 + fi + + echo "Getting DNS of AKS of AKS $aks_name (in resource group $aks_rg)" + dns="$(az aks show -n $aks_name -g $aks_rg --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName)" + if [[ -z dns ]]; then + echo "Error: when getting DNS of AKS $aks_name (in resource group $aks_rg). Please ensure AKS has httpRouting enabled AND Azure CLI is logged in and is of version 2.0.37 or higher." + exit 1 + fi + $dns=${dns//[\"]/""} + echo "DNS base found is $dns. Will use $aks_name.$dns for the app!" +fi + +# Initialization & check commands +if [[ -z $dns ]]; then + echo "No DNS specified. Ingress resources will be bound to public IP." +fi + +if [[ $clean ]]; then + echo "Cleaning previous helm releases..." + helm delete --purge $(helm ls -q) + echo "Previous releases deleted" +fi + +use_custom_registry='yes' + +if [[ -n $container_registry ]]; then + use_custom_registry='yes' + if [[ -z $docker_user ]] || [[ -z $docker_password ]]; then + echo "Error: Must use -u (--docker-username) AND -p (--docker-password) if specifying custom registry" + exit 1 + fi +fi + +echo "#################### Begin $app_name installation using Helm ####################" +infras=(sql-data nosql-data rabbitmq keystore-data basket-data) +charts=(eshop-common apigwmm apigwms apigwwm apigwws basket-api catalog-api identity-api locations-api marketing-api mobileshoppingagg ordering-api ordering-backgroundtasks ordering-signalrhub payment-api webmvc webshoppingagg webspa webstatus webhooks-api webhooks-web) + +if [[ !$skip_infrastructure ]]; then + for infra in "${infras[@]}" + do + echo "Installing infrastructure: $infra" + helm install --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name=$app_name --set inf.k8s.dns=$dns --name="$app_name-$infra" $infra + done +fi + +for chart in "${charts[@]}" +do + echo "Installing: $chart" + if [[ $use_custom_registry ]]; then + helm install --set inf.registry.server=$container_registry --set inf.registry.login=$docker_username --set inf.registry.pwd=$docker_password --set inf.registry.secretName=eshop-docker-scret --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name=$app_name --set inf.k8s.dns=$dns --set image.tag=$image_tag --set image.pullPolicy=Always --name="$app_name-$chart" $chart + elif [[ $chart != "eshop-common" ]]; then # eshop-common is ignored when no secret must be deployed + helm install --values app.yaml --values inf.yaml --values $ingress_values_file --set app.name=$app_name --set inf.k8s.dns=$dns --set image.tag=$image_tag --set image.pullPolicy=Always --name="$app_name-$chart" $chart + fi +done + +echo "FINISHED: Helm charts installed." \ No newline at end of file From 46590874a76225dea7414655e96423cffc8dadda Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 8 Mar 2019 14:03:14 +0100 Subject: [PATCH 09/52] Build correct solution --- k8s/helm/deploy-all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/helm/deploy-all.sh b/k8s/helm/deploy-all.sh index adfb111f3..f331c8ece 100755 --- a/k8s/helm/deploy-all.sh +++ b/k8s/helm/deploy-all.sh @@ -111,7 +111,7 @@ done if [[ $build_solution ]]; then echo "#################### Building $app_name solution ####################" - dotnet publish -o obj/Docker/publish ../../winnersworkout-backend.sln + dotnet publish -o obj/Docker/publish ../../eShopOnContainers-ServicesAndWebApps.sln fi export TAG=$image_tag From 45755aff0b1b9e7125b2da71fc6b663bf431acc8 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Fri, 8 Mar 2019 16:16:50 +0100 Subject: [PATCH 10/52] Fix path error in docker-compose command --- k8s/helm/deploy-all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/helm/deploy-all.sh b/k8s/helm/deploy-all.sh index f331c8ece..1698a11a8 100755 --- a/k8s/helm/deploy-all.sh +++ b/k8s/helm/deploy-all.sh @@ -118,7 +118,7 @@ export TAG=$image_tag if [[ $build_images ]]; then echo "#################### Building the $app_name Docker images ####################" - docker-compose -p .. -f ../../docker-compose.yml build + docker-compose -p ../.. -f ../../docker-compose.yml build # Remove temporary images docker rmi $(docker images -qf "dangling=true") From 12dd2859f1913656977fc210901acccbdf5eb89f Mon Sep 17 00:00:00 2001 From: Igor_Sychev Date: Sun, 10 Mar 2019 10:15:46 +0300 Subject: [PATCH 11/52] host don't need anymore --- hosts | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 hosts diff --git a/hosts b/hosts deleted file mode 100644 index 19e812a15..000000000 --- a/hosts +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 1993-2009 Microsoft Corp. -# -# This is a sample HOSTS file used by Microsoft TCP/IP for Windows. -# -# This file contains the mappings of IP addresses to host names. Each -# entry should be kept on an individual line. The IP address should -# be placed in the first column followed by the corresponding host name. -# The IP address and the host name should be separated by at least one -# space. -# -# Additionally, comments (such as these) may be inserted on individual -# lines or following the machine name denoted by a '#' symbol. -# -# For example: -# -# 102.54.94.97 rhino.acme.com # source server -# 38.25.63.10 x.acme.com # x client host - -# localhost name resolution is handled within DNS itself. -# 127.0.0.1 localhost -# ::1 localhost - - 10.0.75.1 identity.service \ No newline at end of file From e5ee6d735c7f71907128cc8f030d77eaefee06aa Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Mon, 11 Mar 2019 13:20:40 +0100 Subject: [PATCH 12/52] Fix initialization of the use_custom_registry boolean --- k8s/helm/deploy-all.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/k8s/helm/deploy-all.sh b/k8s/helm/deploy-all.sh index 1698a11a8..3ec209aa1 100755 --- a/k8s/helm/deploy-all.sh +++ b/k8s/helm/deploy-all.sh @@ -173,7 +173,7 @@ if [[ $clean ]]; then echo "Previous releases deleted" fi -use_custom_registry='yes' +use_custom_registry='' if [[ -n $container_registry ]]; then use_custom_registry='yes' @@ -205,4 +205,4 @@ do fi done -echo "FINISHED: Helm charts installed." \ No newline at end of file +echo "FINISHED: Helm charts installed." From 9c37df1d7572fd7c0790d136da31c010e330c520 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Tue, 12 Mar 2019 08:55:16 +0000 Subject: [PATCH 13/52] Critical vulnerabilities solved --- src/Web/WebSPA/package-lock.json | 1409 +++++++++++++++--------------- src/Web/WebSPA/package.json | 4 +- 2 files changed, 704 insertions(+), 709 deletions(-) diff --git a/src/Web/WebSPA/package-lock.json b/src/Web/WebSPA/package-lock.json index 9c3e3a021..fd95455e6 100644 --- a/src/Web/WebSPA/package-lock.json +++ b/src/Web/WebSPA/package-lock.json @@ -1073,7 +1073,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -1145,28 +1144,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -1218,8 +1195,7 @@ "ansi-colors": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.0.5.tgz", - "integrity": "sha512-VVjWpkfaphxUBFarydrQ3n26zX5nIK7hcbT3/ielrvwDDyBBjuh2vuSw1P9zkPq0cfqvdw7lkYHnu+OLSfIBsg==", - "dev": true + "integrity": "sha512-VVjWpkfaphxUBFarydrQ3n26zX5nIK7hcbT3/ielrvwDDyBBjuh2vuSw1P9zkPq0cfqvdw7lkYHnu+OLSfIBsg==" }, "ansi-escapes": { "version": "1.4.0", @@ -1230,14 +1206,12 @@ "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", @@ -1270,6 +1244,7 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, + "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -1314,16 +1289,14 @@ "dev": true }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -1331,8 +1304,7 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", @@ -1408,8 +1380,7 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "async-each": { "version": "1.0.1", @@ -1636,8 +1607,7 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -1697,43 +1667,37 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } } } }, @@ -1741,7 +1705,6 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, "requires": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -1982,8 +1945,7 @@ "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, "buffer-xor": { "version": "1.0.3", @@ -2010,8 +1972,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { "version": "10.0.4", @@ -2077,14 +2038,14 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, + "optional": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" @@ -2094,7 +2055,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -2116,17 +2078,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -2260,23 +2211,41 @@ "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } } } }, @@ -2318,8 +2287,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { "version": "4.4.4", @@ -2384,19 +2352,24 @@ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", - "dev": true, + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", + "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", "requires": { - "mime-db": ">= 1.34.0 < 2" + "mime-db": ">= 1.38.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" + } } }, "compression": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "dev": true, "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -2411,7 +2384,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -2449,10 +2421,9 @@ } }, "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "console-browserify": { "version": "1.1.0", @@ -2466,7 +2437,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "constants-browserify": { "version": "1.0.0", @@ -2476,14 +2448,12 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "version": "1.5.1", @@ -2494,14 +2464,12 @@ "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-concurrently": { "version": "1.0.5", @@ -2770,7 +2738,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "optional": true }, "decode-uri-component": { "version": "0.2.0", @@ -2780,8 +2749,7 @@ "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deep-extend": { "version": "0.6.0", @@ -2795,6 +2763,43 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2874,13 +2879,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "dev": true, + "optional": true }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { "version": "1.0.0", @@ -2894,8 +2899,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", @@ -2907,10 +2911,9 @@ } }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", - "dev": true + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, "diff": { "version": "3.5.0", @@ -2941,14 +2944,12 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -2958,7 +2959,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, "requires": { "buffer-indexof": "^1.0.0" } @@ -3078,8 +3078,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { "version": "2.6.1", @@ -3115,8 +3114,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -3280,8 +3278,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -3437,8 +3434,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { "version": "0.3.5", @@ -3453,8 +3449,7 @@ "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" }, "events": { "version": "1.1.1", @@ -3462,12 +3457,11 @@ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "requires": { - "original": ">=0.0.5" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -3611,14 +3605,13 @@ } }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", "content-type": "~1.0.4", "cookie": "0.3.1", @@ -3635,10 +3628,10 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", @@ -3651,29 +3644,15 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true } } }, @@ -3793,7 +3772,6 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, "requires": { "websocket-driver": ">=0.5.1" } @@ -3858,7 +3836,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -3873,7 +3850,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -3920,12 +3896,26 @@ } }, "follow-redirects": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.7.tgz", - "integrity": "sha512-NONJVIFiX7Z8k2WxfqBjtwqMifx7X42ORLFrOZ2LTKGj71G3C0kfdyTqGqr8fx5zSX6Foo/D95dgGWbPUiwnew==", - "dev": true, + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "requires": { - "debug": "^3.1.0" + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "font-awesome": { @@ -3967,8 +3957,7 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fragment-cache": { "version": "0.2.1", @@ -3981,8 +3970,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from2": { "version": "2.3.0", @@ -4046,7 +4034,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4064,11 +4053,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4081,15 +4072,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4192,7 +4186,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4202,6 +4197,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4214,17 +4210,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4241,6 +4240,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4313,7 +4313,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4323,6 +4324,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4398,7 +4400,8 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4428,6 +4431,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4445,6 +4449,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4483,11 +4488,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.2", - "bundled": true + "bundled": true, + "optional": true } } }, @@ -4496,6 +4503,7 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4514,6 +4522,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, + "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4553,20 +4562,19 @@ "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "dev": true, + "optional": true }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", @@ -4740,51 +4748,59 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.13.tgz", + "integrity": "sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ==", "dev": true, "requires": { - "async": "^1.4.0", + "async": "^2.5.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "lodash": "^4.17.11" } }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } + "commander": "~2.17.1", + "source-map": "~0.6.1" } } } @@ -4852,14 +4868,14 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "optional": true }, "has-value": { "version": "1.0.0", @@ -4940,7 +4956,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -4951,8 +4966,7 @@ "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { "version": "3.5.20", @@ -5072,14 +5086,12 @@ "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -5088,16 +5100,14 @@ } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", - "dev": true + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" }, "http-proxy": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, "requires": { "eventemitter3": "^3.0.0", "follow-redirects": "^1.0.0", @@ -5108,7 +5118,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "dev": true, "requires": { "http-proxy": "^1.16.2", "is-glob": "^4.0.0", @@ -5218,21 +5227,68 @@ "dev": true }, "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "requires": { - "pkg-dir": "^2.0.0", + "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "in-publish": { + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", @@ -5244,6 +5300,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, + "optional": true, "requires": { "repeating": "^2.0.0" } @@ -5295,12 +5352,12 @@ } }, "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", "requires": { - "meow": "^3.3.0" + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" } }, "interpret": { @@ -5322,19 +5379,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "dev": true, + "optional": true }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -5482,7 +5543,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5557,14 +5617,12 @@ "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" }, "is-path-in-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, "requires": { "is-path-inside": "^1.0.0" } @@ -5573,7 +5631,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "^1.0.1" } @@ -5652,7 +5709,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "dev": true, + "optional": true }, "is-windows": { "version": "1.0.2", @@ -5662,8 +5720,7 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", @@ -5673,8 +5730,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -5941,8 +5997,7 @@ "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { "version": "0.5.1", @@ -6045,10 +6100,9 @@ } }, "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" }, "kind-of": { "version": "6.0.2", @@ -6070,18 +6124,12 @@ "package-json": "^4.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, + "optional": true, "requires": { "invert-kv": "^1.0.0" } @@ -6169,6 +6217,7 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -6181,7 +6230,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -6212,8 +6262,7 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "lodash.assign": { "version": "4.2.0", @@ -6261,20 +6310,13 @@ "loglevel": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" }, "long": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6334,6 +6376,14 @@ "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -6343,7 +6393,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "dev": true, + "optional": true }, "map-visit": { "version": "1.0.0", @@ -6377,16 +6428,16 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" } }, "memory-fs": { @@ -6403,6 +6454,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, + "optional": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -6420,7 +6472,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "dev": true, + "optional": true } } }, @@ -6433,14 +6486,12 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "3.1.10", @@ -6474,20 +6525,17 @@ "mime": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", - "dev": true + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" }, "mime-db": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" }, "mime-types": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, "requires": { "mime-db": "~1.36.0" } @@ -6495,8 +6543,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mini-css-extract-plugin": { "version": "0.4.2", @@ -6616,7 +6663,6 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, "requires": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" @@ -6625,8 +6671,7 @@ "multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { "version": "0.0.5", @@ -6661,8 +6706,7 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { "version": "2.5.2", @@ -6683,6 +6727,11 @@ "tslib": "^1.9.0" } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -6704,8 +6753,7 @@ "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", - "dev": true + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" }, "node-gyp": { "version": "3.8.0", @@ -7000,7 +7048,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "^2.0.0" } @@ -7020,6 +7067,7 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, + "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -7045,8 +7093,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.9.0", @@ -7057,8 +7104,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -7133,23 +7179,20 @@ "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", @@ -7169,7 +7212,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, "requires": { "is-wsl": "^1.1.0" } @@ -7210,7 +7252,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, "requires": { "url-parse": "^1.4.3" } @@ -7252,11 +7293,20 @@ "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" }, "p-limit": { "version": "1.3.0", @@ -7277,8 +7327,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" }, "p-try": { "version": "1.0.0", @@ -7367,6 +7416,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, + "optional": true, "requires": { "error-ex": "^1.2.0" } @@ -7380,8 +7430,7 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "pascalcase": { "version": "0.1.1", @@ -7411,14 +7460,12 @@ "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", @@ -7429,8 +7476,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "3.0.0", @@ -7467,14 +7513,12 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -7502,7 +7546,6 @@ "version": "1.0.17", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz", "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", - "dev": true, "requires": { "async": "^1.5.2", "debug": "^2.2.0", @@ -7513,7 +7556,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -7780,7 +7822,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" @@ -7853,8 +7894,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -7867,10 +7907,9 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" }, "randomatic": { "version": "3.1.0", @@ -7911,50 +7950,26 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" }, "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true } } }, @@ -8012,6 +8027,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, + "optional": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -8023,6 +8039,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -8033,7 +8050,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -8042,6 +8060,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, + "optional": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -8052,6 +8071,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, + "optional": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -8062,6 +8082,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, + "optional": true, "requires": { "pinkie-promise": "^2.0.0" } @@ -8118,6 +8139,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, + "optional": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -8286,8 +8308,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -8298,8 +8319,7 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "require-uncached": { "version": "1.0.3", @@ -8314,8 +8334,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { "version": "1.8.1", @@ -8330,7 +8349,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, "requires": { "resolve-from": "^3.0.0" }, @@ -8338,8 +8356,7 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, @@ -8375,16 +8392,6 @@ "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -8468,7 +8475,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true + "dev": true, + "optional": true }, "cliui": { "version": "3.2.0", @@ -8609,8 +8617,7 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selenium-webdriver": { "version": "3.6.0", @@ -8625,10 +8632,9 @@ } }, "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", - "dev": true, + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", "requires": { "node-forge": "0.7.5" } @@ -8636,8 +8642,7 @@ "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" }, "semver-diff": { "version": "2.1.0", @@ -8670,7 +8675,6 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -8691,7 +8695,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -8699,8 +8702,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" } } }, @@ -8713,7 +8715,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -8728,7 +8729,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -8739,7 +8739,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -8750,8 +8749,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", @@ -8787,8 +8785,7 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.11", @@ -8822,7 +8819,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -8830,8 +8826,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { "version": "0.6.1", @@ -8842,8 +8837,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", @@ -8972,43 +8966,44 @@ "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" } }, "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", "json3": "^3.3.2", - "url-parse": "^1.1.8" + "url-parse": "^1.4.3" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "faye-websocket": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, "requires": { "websocket-driver": ">=0.5.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -9111,52 +9106,66 @@ "dev": true }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "readable-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", + "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -9231,8 +9240,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, "stdout-stream": { "version": "1.4.1", @@ -9283,7 +9291,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -9302,7 +9309,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -9312,6 +9318,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, + "optional": true, "requires": { "is-utf8": "^0.2.0" } @@ -9319,14 +9326,14 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, + "optional": true, "requires": { "get-stdin": "^4.0.1" } @@ -9538,10 +9545,9 @@ } }, "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" }, "timed-out": { "version": "4.0.1", @@ -9669,7 +9675,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "dev": true, + "optional": true }, "trim-right": { "version": "1.0.1", @@ -9843,7 +9850,6 @@ "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -9952,13 +9958,6 @@ } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, "uglifyjs-webpack-plugin": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", @@ -10076,8 +10075,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "version": "1.0.0", @@ -10228,10 +10226,9 @@ } }, "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", - "dev": true, + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" @@ -10292,14 +10289,12 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -10323,8 +10318,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "verror": { "version": "1.10.0", @@ -10359,7 +10353,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, "requires": { "minimalistic-assert": "^1.0.0" } @@ -10561,10 +10554,9 @@ } }, "webpack-dev-server": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.6.tgz", - "integrity": "sha512-uc6YP0DzzW4870TDKoK73uONytLgu27h+x6XfgSvERRChkpd5Ils7US6d5k22LBoh0sDkmPZ6ERHSsrkwtkFFQ==", - "dev": true, + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -10576,67 +10568,32 @@ "express": "^4.16.2", "html-entities": "^1.2.0", "http-proxy-middleware": "~0.18.0", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", "ip": "^1.1.5", "killable": "^1.0.0", "loglevel": "^1.4.1", "opn": "^5.1.0", "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", "selfsigned": "^1.9.1", + "semver": "^5.6.0", "serve-index": "^1.7.2", "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^3.4.1", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", "strip-ansi": "^3.0.0", "supports-color": "^5.1.0", - "webpack-dev-middleware": "3.2.0", + "url": "^0.11.0", + "webpack-dev-middleware": "3.4.0", "webpack-log": "^2.0.0", - "yargs": "12.0.1" + "yargs": "12.0.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, "requires": { "globby": "^6.1.0", "is-path-cwd": "^1.0.0", @@ -10646,20 +10603,10 @@ "rimraf": "^2.2.8" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, "requires": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -10671,116 +10618,32 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", - "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", - "dev": true, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" } } } @@ -10789,7 +10652,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -10833,7 +10695,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, "requires": { "http-parser-js": ">=0.4.0", "websocket-extensions": ">=0.1.1" @@ -10842,8 +10703,7 @@ "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "whatwg-fetch": { "version": "2.0.4", @@ -10860,7 +10720,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -10877,6 +10736,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "optional": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -10923,13 +10783,6 @@ } } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -10948,7 +10801,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -11004,8 +10856,7 @@ "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" }, "xtend": { "version": "4.0.1", @@ -11032,24 +10883,167 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "requires": { + "xregexp": "4.0.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" } } }, @@ -11057,7 +11051,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, "requires": { "camelcase": "^4.1.0" } diff --git a/src/Web/WebSPA/package.json b/src/Web/WebSPA/package.json index 1c2b54af9..f36be5595 100644 --- a/src/Web/WebSPA/package.json +++ b/src/Web/WebSPA/package.json @@ -50,10 +50,11 @@ "preboot": "6.0.0-beta.5", "rxjs": "6.2.2", "webpack": "^4.17.1", + "webpack-dev-server": "3.1.14", "zone.js": "^0.8.26" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.7.0", + "@angular-devkit/build-angular": "~0.7.5", "@angular/cli": "^6.1.5", "@angular/compiler-cli": "6.1.4", "@types/core-js": "2.5.0", @@ -63,6 +64,7 @@ "@types/protractor": "4.0.0", "@types/selenium-webdriver": "3.0.10", "codelyzer": "~4.4.4", + "handlebars": "~4.0.13", "sass-lint": "1.12.1", "ts-helpers": "1.1.2", "ts-node": "~7.0.1", From 9720b4c41544f5650936b96e1f6206998ea13cf2 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Tue, 12 Mar 2019 10:00:11 +0000 Subject: [PATCH 14/52] Update JS packages to new versions without know vulnerabilities; Add HealthChecks to appsettings so SPA can run from VS using services in containers --- src/Web/WebSPA/appsettings.json | 3 +++ src/Web/WebSPA/package-lock.json | 12 ++++++------ src/Web/WebSPA/package.json | 2 ++ src/Web/WebSPA/web.config | 10 +++++----- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Web/WebSPA/appsettings.json b/src/Web/WebSPA/appsettings.json index 66271c217..4f7694ea2 100644 --- a/src/Web/WebSPA/appsettings.json +++ b/src/Web/WebSPA/appsettings.json @@ -3,6 +3,9 @@ "MarketingUrl": "http://localhost:5110", "CallBackUrl": "http://localhost:5104/", "PurchaseUrl": "http://localhost:5200", + "PurchaseUrlHC": "http://localhost:5202/hc", + "MarketingUrlHC": "http://localhost:5203/hc", + "IdentityUrlHC": "http://localhost:5105/hc", "UseCustomizationData": true, "IsClusterEnv": "False", "ActivateCampaignDetailFunction": false, diff --git a/src/Web/WebSPA/package-lock.json b/src/Web/WebSPA/package-lock.json index fd95455e6..3e795603f 100644 --- a/src/Web/WebSPA/package-lock.json +++ b/src/Web/WebSPA/package-lock.json @@ -6260,9 +6260,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.assign": { "version": "4.2.0", @@ -6478,9 +6478,9 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, "merge-descriptors": { diff --git a/src/Web/WebSPA/package.json b/src/Web/WebSPA/package.json index f36be5595..0096004a6 100644 --- a/src/Web/WebSPA/package.json +++ b/src/Web/WebSPA/package.json @@ -65,6 +65,8 @@ "@types/selenium-webdriver": "3.0.10", "codelyzer": "~4.4.4", "handlebars": "~4.0.13", + "lodash": "4.17.11", + "merge": "1.2.1", "sass-lint": "1.12.1", "ts-helpers": "1.1.2", "ts-node": "~7.0.1", diff --git a/src/Web/WebSPA/web.config b/src/Web/WebSPA/web.config index b70ce7e43..5e31866e3 100644 --- a/src/Web/WebSPA/web.config +++ b/src/Web/WebSPA/web.config @@ -1,14 +1,14 @@  - - - + - + + + - + \ No newline at end of file From 954dd4893a0413281c510dbb9d527a452d3039df Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 12 Mar 2019 11:47:24 +0100 Subject: [PATCH 15/52] Correctly set the backing field for the use-local-k8s parameter --- k8s/helm/deploy-all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/helm/deploy-all.sh b/k8s/helm/deploy-all.sh index 3ec209aa1..705b172f5 100755 --- a/k8s/helm/deploy-all.sh +++ b/k8s/helm/deploy-all.sh @@ -102,7 +102,7 @@ while [[ $# -gt 0 ]]; do -u | --docker-username ) docker_username="$2"; shift 2;; --use-local-k8s ) - use_local_k8s=''; shift ;; + use_local_k8s='yes'; shift ;; *) echo "Unknown option $1" usage; exit 2 ;; From d70ea8974358aa34d3d6990de3e3c9db5f1e7017 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 13 Mar 2019 16:41:49 +0100 Subject: [PATCH 16/52] Tested on AKS --- k8s/helm/deploy-all-istio.ps1 | 115 +++++++ k8s/helm/deploy-all.ps1 | 8 +- k8s/helm/istio/doc.md | 325 ++++++++++++++++++ k8s/helm/istio/gateway.yml | 15 + k8s/helm/istio/virtualservices.yml | 59 ++++ k8s/istio/JourneyToIstio.md | 85 ----- k8s/istio/apply-injection.ps1 | 2 - k8s/istio/delete-istio.ps1 | 2 - k8s/istio/deploy-istio-helm.ps1 | 8 - k8s/istio/install-istio-local.ps1 | 16 - k8s/istio/kiali/secrets.yml | 16 - k8s/istio/kiali/set-kiali-credentials.ps1 | 41 --- k8s/istio/nginx-ingress/cloud-generic.yaml | 21 -- k8s/istio/nginx-ingress/cm.yaml | Bin 526 -> 0 bytes .../local-dockerk8s/identityapi-cm-fix.yaml | 3 - .../local-dockerk8s/mvc-cm-fix.yaml | 3 - .../local-dockerk8s/mvc-fix.yaml | 39 --- k8s/istio/nginx-ingress/mandatory.yaml | 239 ------------- k8s/istio/nginx-ingress/service-nodeport.yaml | 22 -- .../nginx-ingress/update-nginx-ingress.ps1 | 1 - src/Web/WebMVC/package-lock.json | 2 +- 21 files changed, 520 insertions(+), 502 deletions(-) create mode 100644 k8s/helm/deploy-all-istio.ps1 create mode 100644 k8s/helm/istio/doc.md create mode 100644 k8s/helm/istio/gateway.yml create mode 100644 k8s/helm/istio/virtualservices.yml delete mode 100644 k8s/istio/JourneyToIstio.md delete mode 100644 k8s/istio/apply-injection.ps1 delete mode 100644 k8s/istio/delete-istio.ps1 delete mode 100644 k8s/istio/deploy-istio-helm.ps1 delete mode 100644 k8s/istio/install-istio-local.ps1 delete mode 100644 k8s/istio/kiali/secrets.yml delete mode 100644 k8s/istio/kiali/set-kiali-credentials.ps1 delete mode 100644 k8s/istio/nginx-ingress/cloud-generic.yaml delete mode 100644 k8s/istio/nginx-ingress/cm.yaml delete mode 100644 k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml delete mode 100644 k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml delete mode 100644 k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml delete mode 100644 k8s/istio/nginx-ingress/mandatory.yaml delete mode 100644 k8s/istio/nginx-ingress/service-nodeport.yaml delete mode 100644 k8s/istio/nginx-ingress/update-nginx-ingress.ps1 diff --git a/k8s/helm/deploy-all-istio.ps1 b/k8s/helm/deploy-all-istio.ps1 new file mode 100644 index 000000000..6ee8a9572 --- /dev/null +++ b/k8s/helm/deploy-all-istio.ps1 @@ -0,0 +1,115 @@ +Param( + [parameter(Mandatory=$false)][string]$registry, + [parameter(Mandatory=$false)][bool]$installIstioOnSystem=$false, + [parameter(Mandatory=$false)][string]$dockerUser, + [parameter(Mandatory=$false)][string]$dockerPassword, + [parameter(Mandatory=$false)][string]$externalDns="aks", + [parameter(Mandatory=$false)][string]$dnsname="eshoptestistio", + [parameter(Mandatory=$false)][string]$appName="eshop", + [parameter(Mandatory=$false)][bool]$deployInfrastructure=$true, + [parameter(Mandatory=$false)][string]$kialiuser="admin", + [parameter(Mandatory=$false)][string]$kialipasswrd="admin", + [parameter(Mandatory=$false)][bool]$clean=$true, + [parameter(Mandatory=$false)][string]$aksName="", + [parameter(Mandatory=$false)][string]$aksRg="", + [parameter(Mandatory=$false)][string]$imageTag="latest", + [parameter(Mandatory=$false)][bool]$useLocalk8s=$false + ) + +$dns = $externalDns + +# Instalamos Istio +# Specify the Istio version that will be leveraged throughout these instructions +$ISTIO_VERSION="1.0.6" + +# Windows +$ProgressPreference = 'SilentlyContinue'; +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Invoke-WebRequest -URI "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-win.zip" -OutFile "istio-$ISTIO_VERSION.zip" +Remove-Item istio-$ISTIO_VERSION -Recurse -ErrorAction Ignore +Expand-Archive -Path "istio-$ISTIO_VERSION.zip" -DestinationPath . + +if($installIstioOnSystem -eq $true) { + New-Item -ItemType Directory -Force -Path "C:\Program Files\Istio" + mv ./istio-$ISTIO_VERSION/bin/istioctl.exe "C:\Program Files/Istio/" + $PATH = [environment]::GetEnvironmentVariable("PATH", "User") + [environment]::SetEnvironmentVariable("PATH", $PATH + "; C:\Program Files\Istio", "User") +} +# Primero Desinstalamos cualquier cosa que haya en el cluster +if ($clean -eq $true) { + Write-Host "Cleaning previous helm releases..." -ForegroundColor Green + helm delete --purge $(helm ls -q) + kubectl delete -f istio-$ISTIO_VERSION/install/kubernetes/helm/istio/templates/crds.yaml -n istio-system + Write-Host "Previous releases deleted" -ForegroundColor Green +} + +Write-Host "Generating Kiali Credentials" -ForegroundColor Green +#generamos la credenciales para que kiali arranque sin problemas +kubectl -n istio-system create secret generic kiali --from-literal=username=$kialiuser --from-literal=passphrase=$kialipasswrd + + +Write-Host "Deploying Istio in the cluster" -ForegroundColor Green +helm install istio-$ISTIO_VERSION/install/kubernetes/helm/istio --wait --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true + +Write-Host "Setting Up Gateway" +kubectl delete gateway istio-autogenerated-k8s-ingress -n istio-system +kubectl apply -f ./istio/gateway.yml + +if ($useLocalk8s -eq $true) { + $dns="localhost" +} +else { + Write-Host "Resolving DNS to Gateway public IP" -ForegroundColor Green + $ipaddress = $(kubectl get service istio-ingressgateway -n istio-system)[1] | %{ $_.Split(' ')[9];} + $query = "[?ipAddress!=null]|[?contains([ipAddress], '$ipaddress')].[id]" + $resid = az network public-ip list --query $query --output tsv + $jsonresponse = az network public-ip update --ids $resid --dns-name $dnsname + $externalDns = ($jsonresponse | ConvertFrom-Json).dnsSettings.fqdn + Write-Host "$externalDns is pointing to Cluster public ip $ipaddress" +} + +$useCustomRegistry=$false +if (-not [string]::IsNullOrEmpty($registry)) { + $useCustomRegistry=$true + if ([string]::IsNullOrEmpty($dockerUser) -or [string]::IsNullOrEmpty($dockerPassword)) { + Write-Host "Error: Must use -dockerUser AND -dockerPassword if specifying custom registry" -ForegroundColor Red + exit 1 + } +} +Write-Host "Begin eShopOnContainers installation using Helm" -ForegroundColor Green + +$infras = ("sql-data", "nosql-data", "rabbitmq", "keystore-data", "basket-data") +$charts = ("eshop-common", "apigwmm", "apigwms", "apigwwm", "apigwws", "basket-api","catalog-api", "identity-api", "locations-api", "marketing-api", "mobileshoppingagg","ordering-api","ordering-backgroundtasks","ordering-signalrhub", "payment-api", "webmvc", "webshoppingagg", "webspa", "webstatus", "webhooks-api", "webhooks-web") + +if ($deployInfrastructure) { + foreach ($infra in $infras) { + Write-Host "Installing infrastructure: $infra" -ForegroundColor Green + helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$externalDns --name="$appName-$infra" $infra + } +} + +foreach ($chart in $charts) { + Write-Host "Installing: $chart" -ForegroundColor Green + if ($useCustomRegistry) { + helm install --set inf.registry.server=$registry --set inf.registry.login=$dockerUser --set inf.registry.pwd=$dockerPassword --set inf.registry.secretName=eshop-docker-scret --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart + } + else { + if ($chart -ne "eshop-common") { # eshop-common is ignored when no secret must be deployed + helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$externalDns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart + } + } +} + +Write-Host "helm charts installed." -ForegroundColor Green +Write-Host "Appling Virtual Services for routing." -ForegroundColor Green +kubectl apply -f ./istio/virtualservices.yml + +Remove-Item istio-$ISTIO_VERSION -Recurse -ErrorAction Ignore +Remove-Item istio-$ISTIO_VERSION.zip -Recurse -ErrorAction Ignore + + + + + + + diff --git a/k8s/helm/deploy-all.ps1 b/k8s/helm/deploy-all.ps1 index 1819c9a67..9e046363a 100644 --- a/k8s/helm/deploy-all.ps1 +++ b/k8s/helm/deploy-all.ps1 @@ -2,7 +2,7 @@ Param( [parameter(Mandatory=$false)][string]$registry, [parameter(Mandatory=$false)][string]$dockerUser, [parameter(Mandatory=$false)][string]$dockerPassword, - [parameter(Mandatory=$false)][string]$externalDns, + [parameter(Mandatory=$false)][string]$externalDns="eshoptestistio.westus.cloudapp.azure.com", [parameter(Mandatory=$false)][string]$appName="eshop", [parameter(Mandatory=$false)][bool]$deployInfrastructure=$true, [parameter(Mandatory=$false)][bool]$clean=$true, @@ -66,7 +66,8 @@ $charts = ("eshop-common", "apigwmm", "apigwms", "apigwwm", "apigwws", "basket-a if ($deployInfrastructure) { foreach ($infra in $infras) { Write-Host "Installing infrastructure: $infra" -ForegroundColor Green - helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra + #helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra + helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra } } @@ -77,7 +78,8 @@ foreach ($chart in $charts) { } else { if ($chart -ne "eshop-common") { # eshop-common is ignored when no secret must be deployed - helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart + #helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart + helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart } } } diff --git a/k8s/helm/istio/doc.md b/k8s/helm/istio/doc.md new file mode 100644 index 000000000..6d0782a59 --- /dev/null +++ b/k8s/helm/istio/doc.md @@ -0,0 +1,325 @@ +# Using Helm Charts to deploy eShopOnContainers to AKS with ISTIO + +It is possible to deploy eShopOnContainers on a AKS using [Helm](https://helm.sh/) instead of custom scripts (that will be deprecated soon). + +## Create Kubernetes cluster in AKS +You can create the AKS cluster by using two ways: + +- A. Use Azure CLI: Follow a procedure suing [Azure CLI like here](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough), but make sure you **enable RBAC** with `--enable-rbac` in `az aks create` command. + +- B. Use Azure's portal + +The following steps are using the Azure portal to create the AKS cluster: + +- Start the process by providing the general data, like in the following screenshot: + +![image](https://user-images.githubusercontent.com/1712635/45787360-c59ecd80-bc29-11e8-9565-c989ad6ad57b.png) + +- Then, very important, in the next step, enable RBAC: + +![image](https://user-images.githubusercontent.com/1712635/45780917-8bc2cc80-bc13-11e8-87ac-2942b3c7496d.png) + + You can use **basic network** settings since for a test you don't need integration into any existing VNET. + +![image](https://user-images.githubusercontent.com/1712635/45780991-b745b700-bc13-11e8-926b-afac57229d0a.png) + +- You can also enable monitoring: + +![image](https://user-images.githubusercontent.com/1712635/45781148-1277a980-bc14-11e8-8614-f7a239731bec.png) + +- Finally, create the cluster. It'll take a few minutes for it to be ready. + +### Configure RBAC security for K8s dashboard service-account + +In order NOT to get errors in the Kubernetes dashboard, you'll need to set the following service-account steps. + +Here you can see the errors you might see: +![image](https://user-images.githubusercontent.com/1712635/45784384-5622e100-bc1d-11e8-8d33-e22fd955150a.png) + +Now, just run the Azure CLI command to browse the Kubernetes Dashboard: + +`az aks browse --resource-group pro-eshop-aks-helm-linux-resgrp --name pro-eshop-aks-helm-linux` + +![image](https://user-images.githubusercontent.com/1712635/45786406-2d9ee500-bc25-11e8-83e9-bdfc302e80f1.png) + + +## Additional pre-requisites + +In addition to having an AKS cluster created in Azure and having kubectl and Azure CLI installed in your local machine and configured to use your Azure subscription, you also need the following pre-requisites: + +### Install Helm + +You need to have helm installed on your machine, and Tiller must be installed on the AKS. Follow these instructions on how to ['Install applications with Helm in Azure Kubernetes Service (AKS)'](https://docs.microsoft.com/en-us/azure/aks/kubernetes-helm) to setup Helm and Tiller for AKS. + +**Note**: If your ASK cluster is not RBAC-enabled (default option in portal) you may receive following error when running a helm command: + +``` +Error: Get http://localhost:8080/api/v1/namespaces/kube-system/configmaps?labelSelector=OWNER%!D(MISSING)TILLER: dial tcp [::1]:8080: connect: connection refused +``` + +If so, type: + +``` +kubectl --namespace=kube-system edit deployment/tiller-deploy +``` + +Your default text editor will popup with the YAML definition of the tiller deploy. Search for: + +``` +automountServiceAccountToken: false +``` + +And change it to: + +``` +automountServiceAccountToken: true +``` + +Save the file and close the editor. This should reapply the deployment in the cluster. Now Helm commands should work. + +## Install eShopOnContainers with Istio using Helm + +All steps need to be performed on `/k8s/helm` folder. The easiest way is to use the `deploy-all-istio.ps1` script from a Powershell window: + +``` +.\deploy-all-istio.ps1 -dnsname eshoptestistio -externalDns aks -aksName eshoptest -aksRg eshoptest -imageTag dev +``` + +This will install all the [eShopOnContainers public images](https://hub.docker.com/u/eshop/) with tag `dev` on the AKS named `eshoptest` in the resource group `eshoptest` and with the dns url: http://**eshoptest**.westus.cloudapp.azure.com/ . By default all infrastructure (sql, mongo, rabbit and redis) is installed also in the cluster. + +Once the script is run, you should see following output when using `kubectl get deployment`: + +``` +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +eshop-apigwmm 1 1 1 1 4d +eshop-apigwms 1 1 1 1 4d +eshop-apigwwm 1 1 1 1 4d +eshop-apigwws 1 1 1 1 4d +eshop-basket-api 1 1 1 1 4d +eshop-basket-data 1 1 1 1 4d +eshop-catalog-api 1 1 1 1 4d +eshop-identity-api 1 1 1 1 4d +eshop-keystore-data 1 1 1 1 4d +eshop-locations-api 1 1 1 1 4d +eshop-marketing-api 1 1 1 1 4d +eshop-mobileshoppingagg 1 1 1 1 4d +eshop-nosql-data 1 1 1 1 4d +eshop-ordering-api 1 1 1 1 4d +eshop-ordering-backgroundtasks 1 1 1 1 4d +eshop-ordering-signalrhub 1 1 1 1 4d +eshop-payment-api 1 1 1 1 4d +eshop-rabbitmq 1 1 1 1 4d +eshop-sql-data 1 1 1 1 4d +eshop-webmvc 1 1 1 1 4d +eshop-webshoppingagg 1 1 1 1 4d +eshop-webspa 1 1 1 1 4d +eshop-webstatus 1 1 1 1 4d +``` + +Every public service is exposed through the istio ingress gateway. +Yo can see the ingress gateway public ip doing `kubectl get services -n istio-system` +``` +grafana ClusterIP 10.0.204.87 3000/TCP 1h +istio-citadel ClusterIP 10.0.23.86 8060/TCP,9093/TCP 1h +istio-egressgateway ClusterIP 10.0.136.169 80/TCP,443/TCP 1h +istio-galley ClusterIP 10.0.113.51 443/TCP,9093/TCP 1h +istio-ingressgateway LoadBalancer 10.0.76.80 40.118.189.161 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31276/TCP,8060:30519/TCP,853:31698/TCP,15030:31453/TCP,15031:32362/TCP 1h +istio-pilot ClusterIP 10.0.164.253 15010/TCP,15011/TCP,8080/TCP,9093/TCP 1h +istio-policy ClusterIP 10.0.170.49 9091/TCP,15004/TCP,9093/TCP 1h +istio-sidecar-injector ClusterIP 10.0.251.12 443/TCP 1h +istio-telemetry ClusterIP 10.0.195.112 9091/TCP,15004/TCP,9093/TCP,42422/TCP 1h +jaeger-agent ClusterIP None 5775/UDP,6831/UDP,6832/UDP 1h +jaeger-collector ClusterIP 10.0.123.98 14267/TCP,14268/TCP 1h +jaeger-query ClusterIP 10.0.244.146 16686/TCP 1h +kiali ClusterIP 10.0.182.12 20001/TCP 1h +prometheus ClusterIP 10.0.136.223 9090/TCP 1h +tracing ClusterIP 10.0.57.236 80/TCP 1h +zipkin ClusterIP 10.0.30.57 9411/TCP 1h +``` + +You can view the MVC client at http://[dns]/ + +## Customizing the deployment + +### Using your own images + +To use your own images instead of the public ones, you have to pass following additional parameters to the `deploy-all-istio.ps1` script: + +* `registry`: Login server for the Docker registry +* `dockerUser`: User login for the Docker registry +* `dockerPassword`: User password for the Docker registry + +This will deploy a secret on the cluster to connect to the specified server, and all image names deployed will be prepended with `registry/` value. + +### Not deploying infrastructure containers + +If you want to use external resources, use `-deployInfrastructure $false` to not deploy infrastructure containers. However **you still have to manually update the scripts to provide your own configuration** (see next section). + +### Providing your own configuration + +The file `inf.yaml` contains the description of the infrastructure used. File is docummented so take a look on it to understand all of its entries. If using external resources you need to edit this file according to your needs. You'll need to edit: + +* `inf.sql.host` with the host name of the SQL Server +* `inf.sql.common` entries to provide your SQL user, password. `Pid` is not used when using external resources (it is used to set specific product id for the SQL Server container). +* `inf.sql.catalog`, `inf.sql.ordering`, `inf.sql.identity`: To provide the database names for catalog, ordering and identity services +* `mongo.host`: With the host name of the Mongo DB +* `mongo.locations`, `mongo.marketing` with the database names for locations and marketing services +* `redis.basket.constr` with the connection string to Redis for Basket Service. Note that `redis.basket.svc` is not used when using external services +* `redis.keystore.constr` with the connection string to Redis for Keystore Service. Note that `redis.keystore.svc` is not used when using external services +* `eventbus.constr` with the connection string to Azure Service Bus and `eventbus.useAzure` to `true` to use Azure service bus. Note that `eventbus.svc` is not used when using external services + +### Using Azure storage for Catalog Photos + +Using Azure storage for catalog (and marketing) photos is not directly supported, but you can accomplish it by editing the file `k8s/helm/catalog-api/templates/configmap.yaml`. Search for lines: + +``` +catalog__PicBaseUrl: http://{{ $webshoppingapigw }}/api/v1/c/catalog/items/[0]/pic/ +``` + +And replace it for: + +``` +catalog__PicBaseUrl: http:/// +``` + +In the same way, to use Azure storage for the marketing service, have to edit the file `k8s/helm/marketing-api/templates/configmap.yaml` and replacing the line: + +``` +marketing__PicBaseUrl: http://{{ $webshoppingapigw }}/api/v1/c/catalog/items/[0]/pic/ +``` + +by: + +``` +marketing__PicBaseUrl: http:/// +``` + +# Using Helm Charts to deploy eShopOnContainers to a local Kubernetes in Windows with 'Docker for Windows' + +## Additional pre-requisites + +In addition to having Docker for Windows/Mac with Kubernetes enabled and having kubectl ayou also need the following pre-requisites: + +### Install Helm + +You need to have helm installed on your machine, and Tiller must be installed on the local Docker Kubernetes cluster. Once you have [Helm downloaded](https://helm.sh/) and installed on your machine you must: + +1. Create the tiller service account, by running `kubectl apply -f helm-rbac.yaml` from `/k8s` folder +2. Install tiller and configure it to use the tiller service account by typing `helm init --service-account tiller` + +## Install eShopOnContainers with Istio using Helm + +All steps need to be performed on `/k8s/helm` folder. The easiest way is to use the `deploy-all-istio.ps1` script from a Powershell window: + +``` +.\deploy-all-istio.ps1 -imageTag dev -useLocalk8s $true +``` + +The parameter `useLocalk8s` to $true, forces the script to use `localhost` as the DNS for all Helm charts. + +This will install all the [eShopOnContainers public images](https://hub.docker.com/u/eshop/) with tag `dev` on the Docker local Kubernetes cluster. By default all infrastructure (sql, mongo, rabbit and redis) is installed also in the cluster. + +Once the script is run, you should see following output when using `kubectl get deployment`: + +``` +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +eshop-apigwmm 1 1 1 1 2h +eshop-apigwms 1 1 1 1 2h +eshop-apigwwm 1 1 1 1 2h +eshop-apigwws 1 1 1 1 2h +eshop-basket-api 1 1 1 1 2h +eshop-basket-data 1 1 1 1 2h +eshop-catalog-api 1 1 1 1 2h +eshop-identity-api 1 1 1 1 2h +eshop-keystore-data 1 1 1 1 2h +eshop-locations-api 1 1 1 1 2h +eshop-marketing-api 1 1 1 1 2h +eshop-mobileshoppingagg 1 1 1 1 2h +eshop-nosql-data 1 1 1 1 2h +eshop-ordering-api 1 1 1 1 2h +eshop-ordering-backgroundtasks 1 1 1 1 2h +eshop-ordering-signalrhub 1 1 1 1 2h +eshop-payment-api 1 1 1 1 2h +eshop-rabbitmq 1 1 1 1 2h +eshop-sql-data 1 1 1 1 2h +eshop-webmvc 1 1 1 1 2h +eshop-webshoppingagg 1 1 1 1 2h +eshop-webspa 1 1 1 1 2h +eshop-webstatus 1 1 1 1 2h +``` + +Note that istio ingress gateway is bound to DNS localhost and the host is also "localhost". So, you can access the webspa by typing `http://localhost` and the MVC by typing `http://localhost/` + +As this is the Docker local K8s cluster, you can see also the containers running on your machine. If you type `docker ps` you'll see all them: + +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +fec1e3499416 a3f21ec4bd11 "/entrypoint.sh /ngi…" 9 minutes ago Up 9 minutes k8s_nginx-ingress-controller_nginx-ingress-controller-f88c75bc6-5xs2n_ingress-nginx_f1cc7094-e68f-11e8-b4b6-00155d016146_0 +76485867f032 eshop/payment.api "dotnet Payment.API.…" 2 hours ago Up 2 hours k8s_payment-api_eshop-payment-api-75d5f9bdf6-6zx2v_default_4a3cdab4-e67f-11e8-b4b6-00155d016146_1 +c2c4640ed610 eshop/marketing.api "dotnet Marketing.AP…" 2 hours ago Up 2 hours k8s_marketing-api_eshop-marketing-api-6b8c5989fd-jpxqv_default_45780626-e67f-11e8-b4b6-00155d016146_1 +85301d538574 eshop/ordering.signalrhub "dotnet Ordering.Sig…" 2 hours ago Up 2 hours k8s_ordering-signalrhub_eshop-ordering-signalrhub-58cf5ff6-cnlm8_default_4932c344-e67f-11e8-b4b6-00155d016146_1 +7a408a98000e eshop/ordering.backgroundtasks "dotnet Ordering.Bac…" 2 hours ago Up 2 hours k8s_ordering-backgroundtasks_eshop-ordering-backgroundtasks-cc8f6d4d8-ztfk7_default_47f9cf10-e67f-11e8-b4b6-00155d016146_1 +12c64b3a13e0 eshop/basket.api "dotnet Basket.API.d…" 2 hours ago Up 2 hours k8s_basket-api_eshop-basket-api-658546684d-6hlvd_default_4262d022-e67f-11e8-b4b6-00155d016146_1 +133fccfeeff3 eshop/webstatus "dotnet WebStatus.dll" 2 hours ago Up 2 hours k8s_webstatus_eshop-webstatus-7f46479dc4-bqnq7_default_4dc13eb2-e67f-11e8-b4b6-00155d016146_0 +00c6e4c52135 eshop/webspa "dotnet WebSPA.dll" 2 hours ago Up 2 hours k8s_webspa_eshop-webspa-64cb8df9cb-dcbwg_default_4cd47376-e67f-11e8-b4b6-00155d016146_0 +d4507f1f6b1a eshop/webshoppingagg "dotnet Web.Shopping…" 2 hours ago Up 2 hours k8s_webshoppingagg_eshop-webshoppingagg-cc94fc86-sxd2v_default_4be6cdb9-e67f-11e8-b4b6-00155d016146_0 +9178e26703da eshop/webmvc "dotnet WebMVC.dll" 2 hours ago Up 2 hours k8s_webmvc_eshop-webmvc-985779684-4br5z_default_4addd4d6-e67f-11e8-b4b6-00155d016146_0 +1088c281c710 eshop/ordering.api "dotnet Ordering.API…" 2 hours ago Up 2 hours k8s_ordering-api_eshop-ordering-api-fb8c548cb-k68x9_default_4740958a-e67f-11e8-b4b6-00155d016146_0 +12424156d5c9 eshop/mobileshoppingagg "dotnet Mobile.Shopp…" 2 hours ago Up 2 hours k8s_mobileshoppingagg_eshop-mobileshoppingagg-b54645d7b-rlrgh_default_46c00017-e67f-11e8-b4b6-00155d016146_0 +65463ffd437d eshop/locations.api "dotnet Locations.AP…" 2 hours ago Up 2 hours k8s_locations-api_eshop-locations-api-577fc94696-dfhq8_default_44929c4b-e67f-11e8-b4b6-00155d016146_0 +5b3431873763 eshop/identity.api "dotnet Identity.API…" 2 hours ago Up 2 hours k8s_identity-api_eshop-identity-api-85d9b79f4-s5ks7_default_43d6eb7c-e67f-11e8-b4b6-00155d016146_0 +7c8e77252459 eshop/catalog.api "dotnet Catalog.API.…" 2 hours ago Up 2 hours k8s_catalog-api_eshop-catalog-api-59fd444fb-ztvhz_default_4356705a-e67f-11e8-b4b6-00155d016146_0 +94d95d0d3653 eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwws_eshop-apigwws-65474b979d-n99jw_default_41395473-e67f-11e8-b4b6-00155d016146_0 +bc4bbce71d5f eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwwm_eshop-apigwwm-857c549dd8-8w5gv_default_4098d770-e67f-11e8-b4b6-00155d016146_0 +840aabcceaa9 eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwms_eshop-apigwms-5b94dfb54b-dnmr9_default_401fc611-e67f-11e8-b4b6-00155d016146_0 +aabed7646f5b eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwmm_eshop-apigwmm-85f96cbdb4-dhfwr_default_3ed7967a-e67f-11e8-b4b6-00155d016146_0 +49c5700def5a f06a5773f01e "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_basket-data_eshop-basket-data-66fbc788cc-csnlw_default_3e0c45fe-e67f-11e8-b4b6-00155d016146_0 +a5db4c521807 f06a5773f01e "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_keystore-data_eshop-keystore-data-5c9c85cb99-8k56s_default_3ce1a273-e67f-11e8-b4b6-00155d016146_0 +aae88fd2d810 d69a5113ceae "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_rabbitmq_eshop-rabbitmq-6b68647bc4-gr565_default_3c37ee6a-e67f-11e8-b4b6-00155d016146_0 +65d49ca9589d bbed8d0e01c1 "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_nosql-data_eshop-nosql-data-579c9d89f8-mtt95_default_3b9c1f89-e67f-11e8-b4b6-00155d016146_0 +090e0dde2ec4 bbe2822dfe38 "/opt/mssql/bin/sqls…" 2 hours ago Up 2 hours k8s_sql-data_eshop-sql-data-5c4fdcccf4-bscdb_default_3afd29b8-e67f-11e8-b4b6-00155d016146_0 +``` + +## Known issues + +Login from the webmvc results in following error: HttpRequestException: Response status code does not indicate success: 404 (Not Found). + +The reason is because MVC needs to access the Identity Server from both outside the container (browser) and inside the container (C# code). Thus, the configuration uses always the *external url* of the Identity Server, which in this case is just `http://localhost/identity-api`. But this external url is incorrect when used from C# code, and the web mvc can't access the identity api. This is the only case when this issue happens (and is the reason why we use 10.0.75.1 for local address in web mvc in local development mode) + +Solving this requires some manual steps: + +Update the configmap of Web MVC by typing (**line breaks are mandatory**) and your cluster dns name has to be the same of your environment: + +``` +kubectl patch cm cfg-eshop-webmvc --type strategic --patch @' +data: + urls__IdentityUrl: http://**eshoptest**.westus.cloudapp.azure.com/identity + urls__mvc: http://**eshoptest**.westus.cloudapp.azure.com/webmvc +'@ +``` + +Update the configmap of Identity API by typing (**line breaks are mandatory**): + +``` +kubectl patch cm cfg-eshop-identity-api --type strategic --patch @' +data: + mvc_e: http://**eshoptest**.westus.cloudapp.azure.com/webmvc +'@ +``` + +Restart the SQL Server pod to ensure the database is recreated again: + +``` +kubectl delete pod --selector app=sql-data +``` + +Wait until SQL Server pod is ready to accept connections and then restart all other pods: + +``` +kubectl delete pod --selector="app!=sql-data" +``` + +**Note:** Pods are deleted to ensure the databases are recreated again, as identity api stores its client names and urls in the database. + +Now, you can access the MVC app using: `http://**eshoptest**.westus.cloudapp.azure.com/`. + diff --git a/k8s/helm/istio/gateway.yml b/k8s/helm/istio/gateway.yml new file mode 100644 index 000000000..fbc61dadd --- /dev/null +++ b/k8s/helm/istio/gateway.yml @@ -0,0 +1,15 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: Gateway +metadata: + name: istio-ingressgateway + #namespace: istio-system +spec: + selector: + istio: ingressgateway # use Istio default gateway implementation + servers: + - port: + number: 80 + name: http + protocol: HTTP + hosts: + - "*" \ No newline at end of file diff --git a/k8s/helm/istio/virtualservices.yml b/k8s/helm/istio/virtualservices.yml new file mode 100644 index 000000000..e01f4678f --- /dev/null +++ b/k8s/helm/istio/virtualservices.yml @@ -0,0 +1,59 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: webmvcvs + namespace: default +spec: + hosts: + - "*" + gateways: + - istio-ingressgateway + http: + - match: + - uri: + prefix: / + route: + - destination: + port: + number: 80 + host: webmvc +--- +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: webshoppingapigwvs + namespace: default +spec: + hosts: + - "*" + gateways: + - istio-ingressgateway + http: + - match: + - uri: + prefix: /webshoppingapigw + route: + - destination: + port: + number: 80 + host: webshoppingapigw +--- +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: identityvs + namespace: default +spec: + hosts: + - "*" + gateways: + - istio-ingressgateway + http: + - match: + - uri: + prefix: /identity + route: + - destination: + port: + number: 80 + host: identity \ No newline at end of file diff --git a/k8s/istio/JourneyToIstio.md b/k8s/istio/JourneyToIstio.md deleted file mode 100644 index f34aa88fb..000000000 --- a/k8s/istio/JourneyToIstio.md +++ /dev/null @@ -1,85 +0,0 @@ -# ISTIO on Local -## Prerequisites on local -You need the eshopsOnContainers configured on your local, with this -in a powershell console, we need to enter in /k8s/istio and execute -``` ->kubectl get pods -NAME READY STATUS RESTARTS AGE -eshop-apigwmm-54ccc6c589-557fn 0/1 Running 31 4h -eshop-apigwms-7d5f86cf7c-2j2zp 0/1 Running 32 4h -eshop-apigwwm-7794b6d879-7j4mt 0/1 Running 44 4h -eshop-apigwws-8585f6899f-7kkg2 0/1 Running 13 4h -eshop-basket-api-8bfc5c5f6-8xxcv 1/1 Running 47 4h -eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 1 4h -eshop-catalog-api-c77747b76-4gp6c 0/1 Running 48 4h -eshop-identity-api-7574f6b458-4rbp6 0/1 Running 55 4h -eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 1 4h -eshop-locations-api-64847646d-5wv52 1/1 Running 42 4h -eshop-marketing-api-745f9546b8-krjqq 1/1 Running 40 4h -eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 24 4h -eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 1 4h -eshop-ordering-api-5c55bd5464-7hnjx 0/1 Running 46 4h -eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 0/1 Running 24 4h -eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 1 4h -eshop-payment-api-7988db5f76-z76tc 0/1 Running 19 4h -eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 1 4h -eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 1 4h -eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 2 4h -eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 1 4h -eshop-webmvc-55c596544b-9fqsj 1/1 Running 2 4h -eshop-webshoppingagg-f8547f45b-4mjvp 0/1 Running 21 4h -eshop-webspa-84fd54466d-hzrlb 1/1 Running 2 4h -eshop-webstatus-775b487d4d-tbfbn 1/1 Running 1 4h -``` - -```ps1 -> ./install-istio-local.ps1 - -``` -This will install the cli utility and register to the path, you can test this phase launching - -```ps1 -> istioctl -``` - -Afterthat you can install Istio on your cluster executing -```ps1 -> ./deploy-istio-helm.ps1 -``` - -the result should be like: -``` -NAME READY STATUS RESTARTS AGE -grafana-774bf8cb47-clqkp 1/1 Running 0 2h -istio-citadel-548f4cdd9-dbrbn 1/1 Running 0 2h -istio-egressgateway-5f77f6c979-8922g 1/1 Running 0 2h -istio-galley-8f6585898-7c7wq 1/1 Running 0 2h -istio-ingressgateway-8484579cdb-7tw8n 1/1 Running 0 2h -istio-pilot-7c5c5778fb-r987v 2/2 Running 0 2h -istio-policy-7d67d47c65-rdqwj 2/2 Running 15 2h -istio-sidecar-injector-6fb6845cdd-nnhks 1/1 Running 0 2h -istio-telemetry-8b9fc7769-pwx5m 2/2 Running 24 2h -istio-tracing-ff94688bb-xnhnd 1/1 Running 4 2h -kiali-8644dbcdbc-pb627 0/1 CrashLoopBackOff 7 2h -prometheus-f556886b8-mr6wb 1/1 Running 13 2h -``` - -Is a common error that kiali-pod have errors, because it needs a credentials for working. -enter in k8s/istio/kiali and execute: -``` -> ./set-kiali-credentials.ps1 -``` -this script will prompt for a valid account/password and setups the secret in kubernetes -(at the moment account/password will be admin/admin we need to modify the yml) - -After enter in /k8s/istio/nginx-ingress that execute, we need to apply the istio integration with nginx-ingress for service-upstream. - -``` -> ./update-nginx-ingress.ps1 -``` - -And After that, we only need to activate the sidecar injection in the default namespace for the eshops deployments, for doing that you must go the folder /k8s/istio -and run: -``` -> ./apply-injection.ps1 -```` diff --git a/k8s/istio/apply-injection.ps1 b/k8s/istio/apply-injection.ps1 deleted file mode 100644 index 294eb880f..000000000 --- a/k8s/istio/apply-injection.ps1 +++ /dev/null @@ -1,2 +0,0 @@ -kubectl label namespace default istio-injection=enabled -kubectl get namespace -L istio-injection diff --git a/k8s/istio/delete-istio.ps1 b/k8s/istio/delete-istio.ps1 deleted file mode 100644 index b1fa99e86..000000000 --- a/k8s/istio/delete-istio.ps1 +++ /dev/null @@ -1,2 +0,0 @@ -helm delete --purge istio -kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system \ No newline at end of file diff --git a/k8s/istio/deploy-istio-helm.ps1 b/k8s/istio/deploy-istio-helm.ps1 deleted file mode 100644 index 86488db11..000000000 --- a/k8s/istio/deploy-istio-helm.ps1 +++ /dev/null @@ -1,8 +0,0 @@ -$ISTIO_VERSION="1.0.6" -cd istio-$ISTIO_VERSION -<<<<<<< HEAD -helm install install/kubernetes/helm/istio --wait --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true --set ingress.enabled=false --set gateways.istio-ingressgateway.enabled=false -cd .. -======= -helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true ->>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e diff --git a/k8s/istio/install-istio-local.ps1 b/k8s/istio/install-istio-local.ps1 deleted file mode 100644 index fcf0a6d34..000000000 --- a/k8s/istio/install-istio-local.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -# Specify the Istio version that will be leveraged throughout these instructions -$ISTIO_VERSION="1.0.6" - -# Windows - -$ProgressPreference = 'SilentlyContinue'; -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -Invoke-WebRequest -URI "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-win.zip" -OutFile "istio-$ISTIO_VERSION.zip" -Expand-Archive -Path "istio-$ISTIO_VERSION.zip" -DestinationPath . - -cd istio-$ISTIO_VERSION -New-Item -ItemType Directory -Force -Path "C:\Program Files\Istio" -mv ./bin/istioctl.exe "C:\Program Files/Istio/" -$PATH = [environment]::GetEnvironmentVariable("PATH", "User") -[environment]::SetEnvironmentVariable("PATH", $PATH + "; C:\Program Files\Istio", "User") - diff --git a/k8s/istio/kiali/secrets.yml b/k8s/istio/kiali/secrets.yml deleted file mode 100644 index 93bf050d7..000000000 --- a/k8s/istio/kiali/secrets.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: kiali - namespace: istio-system - labels: - app: kiali -type: Opaque -data: -<<<<<<< HEAD - username: YWRtaW4= - passphrase: MWYyZDFlMmU2N2Rm -======= - username: YQBkAG0AaQBuAA== - passphrase: YQBkAG0AaQBuAA== ->>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e diff --git a/k8s/istio/kiali/set-kiali-credentials.ps1 b/k8s/istio/kiali/set-kiali-credentials.ps1 deleted file mode 100644 index e7519c61d..000000000 --- a/k8s/istio/kiali/set-kiali-credentials.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -Param([parameter(Mandatory,HelpMessage="Enter a valid username for Kiali Administration")][string]$username, - [parameter(Mandatory,HelpMessage="Enter your super secret password")][securestring]$password, - [parameter(Mandatory=$false)][string]$NAMESPACE="istio-system" -) - -function Get-PlainText() -{ - [CmdletBinding()] - param - ( - [parameter(Mandatory = $true)] - [securestring]$SecureString - ) - BEGIN { } - PROCESS - { - $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString); - - try - { - return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr); - } - finally - { - [Runtime.InteropServices.Marshal]::FreeBSTR($bstr); - } - } - END { } -} - -$KIALIUSERNAME = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($username)) -$plainpassword = Get-PlainText $password; -$KIALIPASSWORD = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($plainpassword)) - -<<<<<<< HEAD -Write-Host "Creating Kiali Secret in namespace [$NAMESPACE]" -ForegroundColor Blue -kubectl -n $NAMESPACE create secret generic kiali --from-literal=username=$KIALIUSERNAME --from-literal=passphrase=$KIALIPASSWORD -======= -Write-Host "setting username [$KIALIUSERNAME] and password [$KIALIPASSWORD]" -ForegroundColor Blue -kubectl apply -f secrets.yml ->>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e diff --git a/k8s/istio/nginx-ingress/cloud-generic.yaml b/k8s/istio/nginx-ingress/cloud-generic.yaml deleted file mode 100644 index 945441ab8..000000000 --- a/k8s/istio/nginx-ingress/cloud-generic.yaml +++ /dev/null @@ -1,21 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: ingress-nginx - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -spec: - externalTrafficPolicy: Local - type: LoadBalancer - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - ports: - - name: http - port: 80 - targetPort: http - - name: https - port: 443 - targetPort: https \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/cm.yaml b/k8s/istio/nginx-ingress/cm.yaml deleted file mode 100644 index 7818fd15b5c6ea138c70f6b77083b47fcde28e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcma)3O$&lh5S(++e-Q7_NGif>=dRr~Kaflxno<4uYIZFXA`;Q(o86tAoqgOxSmf9t zL5+rg6-oqfaK;={OmHApB35jp(UeGrEu>O1j;uZL7W0)eP}Ctu!CS;=LFNxC5vjHC z$lhv3%^t#%Fw;{NGa{jKiyG08QK7^e7`+L0>3fZ3wPdZ?$#9lbr~1!5R3bXM&IbE| zA1zsB{?0-1MHIa&8%`TCKN->S+eb_8inCs+I-+AKAK90o7ddV(R+k&|v8JbP@5--A P*@wft1;0L)SZUQ0cZpZ^ diff --git a/k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml b/k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml deleted file mode 100644 index 3a3fcf5a5..000000000 --- a/k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml +++ /dev/null @@ -1,3 +0,0 @@ -data: - mvc_e: http://10.0.75.1/webmvc - \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml b/k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml deleted file mode 100644 index 1475deec1..000000000 --- a/k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml +++ /dev/null @@ -1,3 +0,0 @@ -data: - urls__IdentityUrl: http://10.0.75.1/identity - urls__mvc: http://10.0.75.1/webmvc diff --git a/k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml b/k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml deleted file mode 100644 index b9ecd4cba..000000000 --- a/k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml +++ /dev/null @@ -1,39 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - annotations: - ingress.kubernetes.io/ssl-redirect: "false" - kubernetes.io/ingress.class: nginx - nginx.ingress.kubernetes.io/ssl-redirect: "false" - labels: - app: webmvc - name: eshop-webmvc-loopback - namespace: default -spec: - rules: - - http: - paths: - - backend: - serviceName: webmvc - servicePort: http - path: /webmvc ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - annotations: - ingress.kubernetes.io/ssl-redirect: "false" - kubernetes.io/ingress.class: nginx - nginx.ingress.kubernetes.io/ssl-redirect: "false" - labels: - app: identity-api - name: eshop-identity-api-loopback - namespace: default -spec: - rules: - - http: - paths: - - backend: - serviceName: identity - servicePort: http - path: /identity \ No newline at end of file diff --git a/k8s/istio/nginx-ingress/mandatory.yaml b/k8s/istio/nginx-ingress/mandatory.yaml deleted file mode 100644 index 0b9ea035e..000000000 --- a/k8s/istio/nginx-ingress/mandatory.yaml +++ /dev/null @@ -1,239 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: ingress-nginx - ---- - -kind: ConfigMap -apiVersion: v1 -metadata: - name: nginx-configuration - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - ---- - -apiVersion: v1 -kind: ServiceAccount -metadata: - name: nginx-ingress-serviceaccount - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - name: nginx-ingress-clusterrole - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -rules: - - apiGroups: - - "" - resources: - - configmaps - - endpoints - - nodes - - pods - - secrets - verbs: - - list - - watch - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - "extensions" - resources: - - ingresses - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - - apiGroups: - - "extensions" - resources: - - ingresses/status - verbs: - - update - ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: Role -metadata: - name: nginx-ingress-role - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -rules: - - apiGroups: - - "" - resources: - - configmaps - - pods - - secrets - - namespaces - verbs: - - get - - apiGroups: - - "" - resources: - - configmaps - resourceNames: - # Defaults to "-" - # Here: "-" - # This has to be adapted if you change either parameter - # when launching the nginx-ingress-controller. - - "ingress-controller-leader-nginx" - verbs: - - get - - update - - apiGroups: - - "" - resources: - - configmaps - verbs: - - create - - apiGroups: - - "" - resources: - - endpoints - verbs: - - get - ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: RoleBinding -metadata: - name: nginx-ingress-role-nisa-binding - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: nginx-ingress-role -subjects: - - kind: ServiceAccount - name: nginx-ingress-serviceaccount - namespace: ingress-nginx - ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - name: nginx-ingress-clusterrole-nisa-binding - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: nginx-ingress-clusterrole -subjects: - - kind: ServiceAccount - name: nginx-ingress-serviceaccount - namespace: ingress-nginx - ---- - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: nginx-ingress-controller - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - template: - metadata: - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - annotations: - prometheus.io/port: "10254" - prometheus.io/scrape: "true" - service-upstream: "true" - spec: - serviceAccountName: nginx-ingress-serviceaccount - containers: - - name: nginx-ingress-controller - image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0 - args: - - /nginx-ingress-controller - - --configmap=$(POD_NAMESPACE)/nginx-configuration - - --publish-service=$(POD_NAMESPACE)/ingress-nginx - - --annotations-prefix=nginx.ingress.kubernetes.io - securityContext: - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - # www-data -> 33 - runAsUser: 33 - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - ports: - - name: http - containerPort: 80 - - name: https - containerPort: 443 - livenessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - readinessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 diff --git a/k8s/istio/nginx-ingress/service-nodeport.yaml b/k8s/istio/nginx-ingress/service-nodeport.yaml deleted file mode 100644 index dd82ed3ed..000000000 --- a/k8s/istio/nginx-ingress/service-nodeport.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: ingress-nginx - namespace: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -spec: - type: NodePort - ports: - - name: http - port: 80 - targetPort: 80 - protocol: TCP - - name: https - port: 443 - targetPort: 443 - protocol: TCP - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx diff --git a/k8s/istio/nginx-ingress/update-nginx-ingress.ps1 b/k8s/istio/nginx-ingress/update-nginx-ingress.ps1 deleted file mode 100644 index 656bd9fe8..000000000 --- a/k8s/istio/nginx-ingress/update-nginx-ingress.ps1 +++ /dev/null @@ -1 +0,0 @@ -kubectl apply -f mandatory.yml \ No newline at end of file diff --git a/src/Web/WebMVC/package-lock.json b/src/Web/WebMVC/package-lock.json index a94ca154f..785fd8273 100644 --- a/src/Web/WebMVC/package-lock.json +++ b/src/Web/WebMVC/package-lock.json @@ -19,7 +19,7 @@ "resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", "integrity": "sha1-i0O+ZPudDEFIcURvLbjoyk6V8YE=", "requires": { - "jquery": "3.3.1" + "jquery": ">=1.12.0" } } } From 26d4de4a3b7bcd1d314620f971d84238b178439f Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 13 Mar 2019 16:44:33 +0100 Subject: [PATCH 17/52] Fixed changes on deploy-all.ps1 on AKS --- k8s/helm/deploy-all.ps1 | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/k8s/helm/deploy-all.ps1 b/k8s/helm/deploy-all.ps1 index 9e046363a..42ba3ab27 100644 --- a/k8s/helm/deploy-all.ps1 +++ b/k8s/helm/deploy-all.ps1 @@ -2,7 +2,7 @@ Param( [parameter(Mandatory=$false)][string]$registry, [parameter(Mandatory=$false)][string]$dockerUser, [parameter(Mandatory=$false)][string]$dockerPassword, - [parameter(Mandatory=$false)][string]$externalDns="eshoptestistio.westus.cloudapp.azure.com", + [parameter(Mandatory=$false)][string]$externalDns, [parameter(Mandatory=$false)][string]$appName="eshop", [parameter(Mandatory=$false)][bool]$deployInfrastructure=$true, [parameter(Mandatory=$false)][bool]$clean=$true, @@ -66,8 +66,7 @@ $charts = ("eshop-common", "apigwmm", "apigwms", "apigwwm", "apigwws", "basket-a if ($deployInfrastructure) { foreach ($infra in $infras) { Write-Host "Installing infrastructure: $infra" -ForegroundColor Green - #helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra - helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra + helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra } } @@ -78,14 +77,9 @@ foreach ($chart in $charts) { } else { if ($chart -ne "eshop-common") { # eshop-common is ignored when no secret must be deployed - #helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart - helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart + helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart } } } -Write-Host "helm charts installed." -ForegroundColor Green - - - - +Write-Host "helm charts installed." -ForegroundColor Green \ No newline at end of file From 7fcb625efae68a847229d4eaea67e6244a173659 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 13 Mar 2019 16:46:56 +0100 Subject: [PATCH 18/52] Fixed documentation errors --- k8s/helm/istio/doc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/helm/istio/doc.md b/k8s/helm/istio/doc.md index 6d0782a59..b8c0a0257 100644 --- a/k8s/helm/istio/doc.md +++ b/k8s/helm/istio/doc.md @@ -85,7 +85,7 @@ All steps need to be performed on `/k8s/helm` folder. The easiest way is to use .\deploy-all-istio.ps1 -dnsname eshoptestistio -externalDns aks -aksName eshoptest -aksRg eshoptest -imageTag dev ``` -This will install all the [eShopOnContainers public images](https://hub.docker.com/u/eshop/) with tag `dev` on the AKS named `eshoptest` in the resource group `eshoptest` and with the dns url: http://**eshoptest**.westus.cloudapp.azure.com/ . By default all infrastructure (sql, mongo, rabbit and redis) is installed also in the cluster. +This will install all the [eShopOnContainers public images](https://hub.docker.com/u/eshop/) with tag `dev` on the AKS named `eshoptest` in the resource group `eshoptest` and with the dns url: http://**eshoptestistio**.westus.cloudapp.azure.com/ . By default all infrastructure (sql, mongo, rabbit and redis) is installed also in the cluster. Once the script is run, you should see following output when using `kubectl get deployment`: From 5c2b145ec2463bd4f8cd3affa5b6dd6f40043b08 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Thu, 14 Mar 2019 16:50:44 +0000 Subject: [PATCH 19/52] Commented out local configuration, to avoid exception --- src/Web/WebStatus/Program.cs | 42 ++++++++++++++++++++++++++++-- src/Web/WebStatus/WebStatus.csproj | 6 ++--- src/Web/WebStatus/appsettings.json | 10 +------ 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/Web/WebStatus/Program.cs b/src/Web/WebStatus/Program.cs index d2de3ceae..91d004ae2 100644 --- a/src/Web/WebStatus/Program.cs +++ b/src/Web/WebStatus/Program.cs @@ -1,17 +1,19 @@ using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using Serilog; using System; +using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Reflection; namespace WebStatus { public class Program { - public static readonly string Namespace = typeof(Program).Namespace; public static readonly string AppName = Namespace; + public static readonly string Namespace = typeof(Program).Namespace; public static int Main(string[] args) { @@ -24,6 +26,8 @@ namespace WebStatus Log.Information("Configuring web host ({ApplicationContext})...", AppName); var host = BuildWebHost(configuration, args); + LogPackagesVersionInfo(); + Log.Information("Starting web host ({ApplicationContext})...", AppName); host.Run(); @@ -83,5 +87,39 @@ namespace WebStatus return builder.Build(); } + + private static string GetVersion(Assembly assembly) + { + try + { + return $"{assembly.GetCustomAttribute()?.Version} ({assembly.GetCustomAttribute()?.InformationalVersion.Split()[0]})"; + } + catch + { + return string.Empty; + } + } + + private static void LogPackagesVersionInfo() + { + var assemblies = new List(); + + foreach (var dependencyName in typeof(Program).Assembly.GetReferencedAssemblies()) + { + try + { + // Try to load the referenced assembly... + assemblies.Add(Assembly.Load(dependencyName)); + } + catch + { + // Failed to load assembly. Skip it. + } + } + + var versionList = assemblies.Select(a => $"-{a.GetName().Name} - {GetVersion(a)}").OrderBy(value => value); + + Log.Logger.ForContext("PackageVersions", string.Join("\n", versionList)).Information("Package versions ({ApplicationContext})", AppName); + } } } \ No newline at end of file diff --git a/src/Web/WebStatus/WebStatus.csproj b/src/Web/WebStatus/WebStatus.csproj index e898a3a2e..ea2cfb711 100644 --- a/src/Web/WebStatus/WebStatus.csproj +++ b/src/Web/WebStatus/WebStatus.csproj @@ -11,9 +11,9 @@ - + - + @@ -24,7 +24,7 @@ - + diff --git a/src/Web/WebStatus/appsettings.json b/src/Web/WebStatus/appsettings.json index 9ff359423..25b82f721 100644 --- a/src/Web/WebStatus/appsettings.json +++ b/src/Web/WebStatus/appsettings.json @@ -1,5 +1,5 @@ { - "HealthChecks-UI": { + "HealthChecks-UI-commented-out": { "HealthChecks": [ { "Name": "Ordering HTTP Check", @@ -70,14 +70,6 @@ "Uri": "http://localhost:5121/hc" } ], - "Webhooks": [ - { - "Name": "", - "Uri": "", - "Payload": "", - "RestoredPayload": "" - } - ], "EvaluationTimeOnSeconds": 10, "MinimumSecondsBetweenFailureNotifications": 60 }, From a92383e123b9e2abb7971442dc708ffc60514552 Mon Sep 17 00:00:00 2001 From: liubaishui Date: Fri, 15 Mar 2019 21:03:42 +0800 Subject: [PATCH 20/52] Split RabbitMQ channel create and consumer create. Because when channel create the Subscribe is not register, so the previously stored message may lose. This fix split the channel create and consumer create, when Subscribe registered then call the consumer create function. --- .../EventBusRabbitMQ/EventBusRabbitMQ.cs | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.cs b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.cs index ac379d50a..9044a4283 100644 --- a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.cs +++ b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.cs @@ -98,7 +98,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ channel.BasicPublish(exchange: BROKER_NAME, routingKey: eventName, - mandatory:true, + mandatory: true, basicProperties: properties, body: body); }); @@ -112,6 +112,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ DoInternalSubscription(eventName); _subsManager.AddDynamicSubscription(eventName); + StartBasicConsume(); } public void Subscribe() @@ -124,6 +125,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ _logger.LogInformation("Subscribing to event {EventName} with {EventHandler}", eventName, typeof(TH).GetGenericTypeName()); _subsManager.AddSubscription(); + StartBasicConsume(); } private void DoInternalSubscription(string eventName) @@ -172,6 +174,31 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ _subsManager.Clear(); } + private void StartBasicConsume() + { + if (_consumerChannel != null) + { + var consumer = new EventingBasicConsumer(_consumerChannel); + consumer.Received += async (model, ea) => + { + var eventName = ea.RoutingKey; + var message = Encoding.UTF8.GetString(ea.Body); + + await ProcessEvent(eventName, message); + + _consumerChannel.BasicAck(ea.DeliveryTag, multiple: false); + }; + + _consumerChannel.BasicConsume(queue: _queueName, + autoAck: false, + consumer: consumer); + } + else + { + _logger.LogError("StartBasicConsume can not call on _consumerChannelCreated == false"); + } + } + private IModel CreateConsumerChannel() { if (!_persistentConnection.IsConnected) @@ -190,26 +217,11 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ autoDelete: false, arguments: null); - - var consumer = new EventingBasicConsumer(channel); - consumer.Received += async (model, ea) => - { - var eventName = ea.RoutingKey; - var message = Encoding.UTF8.GetString(ea.Body); - - await ProcessEvent(eventName, message); - - channel.BasicAck(ea.DeliveryTag,multiple:false); - }; - - channel.BasicConsume(queue: _queueName, - autoAck: false, - consumer: consumer); - channel.CallbackException += (sender, ea) => { _consumerChannel.Dispose(); _consumerChannel = CreateConsumerChannel(); + StartBasicConsume(); }; return channel; From d5adb5f723544ae1423025d771153230ad0c6e91 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Mon, 18 Mar 2019 16:53:34 +0000 Subject: [PATCH 21/52] Update HealthChecks UI libraries to properly handle missing services. --- docker-compose.override.yml | 2 +- src/Web/WebStatus/Program.cs | 2 +- src/Web/WebStatus/WebStatus.csproj | 12 ++- .../WebStatus/appsettings.Development.json | 89 +++++++++++++++++-- src/Web/WebStatus/appsettings.json | 72 +-------------- 5 files changed, 96 insertions(+), 81 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 7353c744c..e59a9a2e6 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -324,7 +324,7 @@ services: webstatus: environment: - - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_URLS=http://0.0.0.0:80 - HealthChecks-UI__HealthChecks__1__Name=WebMVC HTTP Check - HealthChecks-UI__HealthChecks__1__Uri=http://webmvc/hc diff --git a/src/Web/WebStatus/Program.cs b/src/Web/WebStatus/Program.cs index 91d004ae2..d97ca289f 100644 --- a/src/Web/WebStatus/Program.cs +++ b/src/Web/WebStatus/Program.cs @@ -12,8 +12,8 @@ namespace WebStatus { public class Program { - public static readonly string AppName = Namespace; public static readonly string Namespace = typeof(Program).Namespace; + public static readonly string AppName = Namespace; public static int Main(string[] args) { diff --git a/src/Web/WebStatus/WebStatus.csproj b/src/Web/WebStatus/WebStatus.csproj index ea2cfb711..320780ffa 100644 --- a/src/Web/WebStatus/WebStatus.csproj +++ b/src/Web/WebStatus/WebStatus.csproj @@ -11,8 +11,8 @@ - - + + @@ -29,5 +29,13 @@ + + + Always + + + Always + + diff --git a/src/Web/WebStatus/appsettings.Development.json b/src/Web/WebStatus/appsettings.Development.json index fa8ce71a9..39aa0f472 100644 --- a/src/Web/WebStatus/appsettings.Development.json +++ b/src/Web/WebStatus/appsettings.Development.json @@ -1,10 +1,87 @@ { - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" + "HealthChecks-UI": { + "HealthChecks": [ + { + "Name": "Ordering HTTP Check", + "Uri": "http://localhost:5102/hc" + }, + { + "Name": "Ordering HTTP Background Check", + "Uri": "http://localhost:5111/hc" + }, + { + "Name": "Basket HTTP Check", + "Uri": "http://localhost:5103/hc" + }, + { + "Name": "Catalog HTTP Check", + "Uri": "http://localhost:5101/hc" + }, + { + "Name": "Identity HTTP Check", + "Uri": "http://localhost:5105/hc" + }, + { + "Name": "Marketing HTTP Check", + "Uri": "http://localhost:5110/hc" + }, + { + "Name": "Locations HTTP Check", + "Uri": "http://localhost:5109/hc" + }, + { + "Name": "Payments HTTP Check", + "Uri": "http://localhost:5108/hc" + }, + { + "Name": "WebMVC HTTP Check", + "Uri": "http://localhost:5100/hc" + }, + { + "Name": "WebSPA HTTP Check", + "Uri": "http://localhost:5104/hc" + }, + { + "Name": "SignalR HTTP Check", + "Uri": "http://localhost:5112/hc" + }, + { + "Name": "Mobile Shopping API GW HTTP Check", + "Uri": "http://localhost:5200/hc" + }, + { + "Name": "Mobile Marketing API GW HTTP Check", + "Uri": "http://localhost:5201/hc" + }, + { + "Name": "Web Shopping API GW HTTP Check", + "Uri": "http://localhost:5202/hc" + }, + { + "Name": "Web Marketing API GW HTTP Check", + "Uri": "http://localhost:5203/hc" + }, + { + "Name": "Mobile Shopping Aggregator HTTP Check", + "Uri": "http://localhost:5120/hc" + }, + { + "Name": "Web Shopping Aggregator HTTP Check", + "Uri": "http://localhost:5121/hc" + } + ], + "EvaluationTimeOnSeconds": 10, + "MinimumSecondsBetweenFailureNotifications": 60 + }, + "Serilog": { + "SeqServerUrl": "http://localhost:5341/", + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.eShopOnContainers": "Information", + "System": "Warning" + } } } } diff --git a/src/Web/WebStatus/appsettings.json b/src/Web/WebStatus/appsettings.json index 25b82f721..d5589cc5a 100644 --- a/src/Web/WebStatus/appsettings.json +++ b/src/Web/WebStatus/appsettings.json @@ -1,75 +1,5 @@ { - "HealthChecks-UI-commented-out": { - "HealthChecks": [ - { - "Name": "Ordering HTTP Check", - "Uri": "http://localhost:5102/hc" - }, - { - "Name": "Ordering HTTP Background Check", - "Uri": "http://localhost:5111/hc" - }, - { - "Name": "Basket HTTP Check", - "Uri": "http://localhost:5103/hc" - }, - { - "Name": "Catalog HTTP Check", - "Uri": "http://localhost:5101/hc" - }, - { - "Name": "Identity HTTP Check", - "Uri": "http://localhost:5105/hc" - }, - { - "Name": "Marketing HTTP Check", - "Uri": "http://localhost:5110/hc" - }, - { - "Name": "Locations HTTP Check", - "Uri": "http://localhost:5109/hc" - }, - { - "Name": "Payments HTTP Check", - "Uri": "http://localhost:5108/hc" - }, - { - "Name": "WebMVC HTTP Check", - "Uri": "http://localhost:5100/hc" - }, - { - "Name": "WebSPA HTTP Check", - "Uri": "http://localhost:5104/hc" - }, - { - "Name": "SignalR HTTP Check", - "Uri": "http://localhost:5112/hc" - }, - { - "Name": "Mobile Shopping API GW HTTP Check", - "Uri": "http://localhost:5200/hc" - }, - { - "Name": "Mobile Marketing API GW HTTP Check", - "Uri": "http://localhost:5201/hc" - }, - { - "Name": "Web Shopping API GW HTTP Check", - "Uri": "http://localhost:5202/hc" - }, - { - "Name": "Web Marketing API GW HTTP Check", - "Uri": "http://localhost:5203/hc" - }, - { - "Name": "Mobile Shopping Aggregator HTTP Check", - "Uri": "http://localhost:5120/hc" - }, - { - "Name": "Web Shopping Aggregator HTTP Check", - "Uri": "http://localhost:5121/hc" - } - ], + "HealthChecks-UI": { "EvaluationTimeOnSeconds": 10, "MinimumSecondsBetweenFailureNotifications": 60 }, From a30d80aa5e0e2c9a3a4887314c0f7f09cc064bed Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 19 Mar 2019 14:00:18 +0100 Subject: [PATCH 22/52] scripts fot catalog --- .../catalog-api/azure-pipelines.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 build/azure-devops/catalog-api/azure-pipelines.yml diff --git a/build/azure-devops/catalog-api/azure-pipelines.yml b/build/azure-devops/catalog-api/azure-pipelines.yml new file mode 100644 index 000000000..6f6113a3c --- /dev/null +++ b/build/azure-devops/catalog-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build catalog + inputs: + dockerComposeCommand: 'build catalog.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: src/docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push catalog + inputs: + dockerComposeCommand: 'build catalog.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: src/docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm From 8b3815018f9cf51a065a85fa658a389c057a4237 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 19 Mar 2019 15:47:05 +0100 Subject: [PATCH 23/52] updated build catalog --- build/azure-devops/catalog-api/azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-devops/catalog-api/azure-pipelines.yml b/build/azure-devops/catalog-api/azure-pipelines.yml index 6f6113a3c..49edcf8b8 100644 --- a/build/azure-devops/catalog-api/azure-pipelines.yml +++ b/build/azure-devops/catalog-api/azure-pipelines.yml @@ -9,7 +9,7 @@ steps: dockerComposeCommand: 'build catalog.api' containerregistrytype: Container Registry dockerRegistryEndpoint: $(registryEndpoint) - dockerComposeFile: src/docker-compose.yml + dockerComposeFile: /docker-compose.yml qualifyImageNames: true projectName: "" additionalImageTags: | @@ -21,7 +21,7 @@ steps: dockerComposeCommand: 'build catalog.api' containerregistrytype: Container Registry dockerRegistryEndpoint: $(registryEndpoint) - dockerComposeFile: src/docker-compose.yml + dockerComposeFile: /docker-compose.yml qualifyImageNames: true projectName: "" additionalImageTags: | From 06e07914e17cc1ac97770d8661f08faf286a70d2 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Tue, 19 Mar 2019 15:57:47 +0100 Subject: [PATCH 24/52] First version with Kibana/ElasticSearch & Logstash, needs refactor --- docker-compose.elk.yml | 48 +++++++++++++++++++ docker-compose.yml | 35 ++++++++++++++ elk/elasticsearch/Dockerfile | 5 ++ elk/elasticsearch/config/elasticsearch.yml | 16 +++++++ elk/kibana/Dockerfile | 5 ++ elk/kibana/config/kibana.yml | 7 +++ elk/logstash/Dockerfile | 6 +++ elk/logstash/config/logstash.yml | 6 +++ elk/logstash/pipeline/logstash.conf | 22 +++++++++ k8s/helm/deploy-all-istio.ps1 | 1 + k8s/helm/elk/installelk.ps1 | 1 + .../Basket/Basket.API/Basket.API.csproj | 1 + src/Services/Basket/Basket.API/Program.cs | 3 +- .../Basket/Basket.API/appsettings.json | 1 + .../Catalog/Catalog.API/Catalog.API.csproj | 1 + src/Services/Catalog/Catalog.API/Program.cs | 3 +- .../Properties/launchSettings.json | 3 +- .../Catalog/Catalog.API/appsettings.json | 1 + .../Identity/Identity.API/Identity.API.csproj | 1 + src/Services/Identity/Identity.API/Program.cs | 3 +- .../Identity/Identity.API/appsettings.json | 1 + .../Locations.API/Locations.API.csproj | 1 + .../Location/Locations.API/Program.cs | 3 +- .../Location/Locations.API/appsettings.json | 1 + .../Marketing.API/Marketing.API.csproj | 1 + .../Marketing/Marketing.API/Program.cs | 3 +- .../Marketing/Marketing.API/appsettings.json | 1 + .../Ordering/Ordering.API/Ordering.API.csproj | 1 + src/Services/Ordering/Ordering.API/Program.cs | 5 +- .../Ordering/Ordering.API/appsettings.json | 1 + .../Ordering.BackgroundTasks.csproj | 1 + .../Ordering.BackgroundTasks/Program.cs | 3 +- .../Ordering.BackgroundTasks/appsettings.json | 1 + .../Ordering.SignalrHub.csproj | 1 + .../Ordering/Ordering.SignalrHub/Program.cs | 3 +- .../Ordering.SignalrHub/appsettings.json | 1 + .../Payment/Payment.API/Payment.API.csproj | 1 + src/Services/Payment/Payment.API/Program.cs | 3 +- .../Payment/Payment.API/appsettings.json | 1 + src/Web/WebMVC/Program.cs | 5 +- src/Web/WebMVC/WebMVC.csproj | 1 + src/Web/WebMVC/appsettings.json | 1 + src/Web/WebStatus/Program.cs | 5 +- src/Web/WebStatus/WebStatus.csproj | 1 + src/Web/WebStatus/appsettings.json | 4 +- 45 files changed, 203 insertions(+), 16 deletions(-) create mode 100644 docker-compose.elk.yml create mode 100644 elk/elasticsearch/Dockerfile create mode 100644 elk/elasticsearch/config/elasticsearch.yml create mode 100644 elk/kibana/Dockerfile create mode 100644 elk/kibana/config/kibana.yml create mode 100644 elk/logstash/Dockerfile create mode 100644 elk/logstash/config/logstash.yml create mode 100644 elk/logstash/pipeline/logstash.conf create mode 100644 k8s/helm/elk/installelk.ps1 diff --git a/docker-compose.elk.yml b/docker-compose.elk.yml new file mode 100644 index 000000000..a1112b0e2 --- /dev/null +++ b/docker-compose.elk.yml @@ -0,0 +1,48 @@ +version: '3.4' + +services: + + elasticsearch: + build: + context: elk/elasticsearch/ + volumes: + - ./elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro + ports: + - "9200:9200" + - "9300:9300" + environment: + ES_JAVA_OPTS: "-Xmx256m -Xms256m" + networks: + - elk + + logstash: + build: + context: elk/logstash/ + volumes: + - ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro + - ./elk/logstash/pipeline:/usr/share/logstash/pipeline:ro + ports: + - "8080:8080" + environment: + LS_JAVA_OPTS: "-Xmx256m -Xms256m" + networks: + - elk + depends_on: + - elasticsearch + + kibana: + build: + context: elk/kibana/ + volumes: + - ./elk/kibana/config/:/usr/share/kibana/config:ro + ports: + - "5601:5601" + networks: + - elk + depends_on: + - elasticsearch + +networks: + + elk: + driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml index 55d5b10e6..d0cda5b7a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,41 @@ version: '3.4' services: + + elasticsearch: + build: + context: elk/elasticsearch/ + volumes: + - ./elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro + ports: + - "9200:9200" + - "9300:9300" + environment: + ES_JAVA_OPTS: "-Xmx256m -Xms256m" + + logstash: + build: + context: elk/logstash/ + volumes: + - ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro + - ./elk/logstash/pipeline:/usr/share/logstash/pipeline:ro + ports: + - "8080:8080" + environment: + LS_JAVA_OPTS: "-Xmx256m -Xms256m" + depends_on: + - elasticsearch + + kibana: + build: + context: elk/kibana/ + volumes: + - ./elk/kibana/config/:/usr/share/kibana/config:ro + ports: + - "5601:5601" + depends_on: + - elasticsearch + seq: image: datalust/seq:latest diff --git a/elk/elasticsearch/Dockerfile b/elk/elasticsearch/Dockerfile new file mode 100644 index 000000000..0ad46d887 --- /dev/null +++ b/elk/elasticsearch/Dockerfile @@ -0,0 +1,5 @@ +# https://github.com/elastic/elasticsearch-docker +FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.0.0 + +# Add your elasticsearch plugins setup here +# Example: RUN elasticsearch-plugin install analysis-icu diff --git a/elk/elasticsearch/config/elasticsearch.yml b/elk/elasticsearch/config/elasticsearch.yml new file mode 100644 index 000000000..e97577084 --- /dev/null +++ b/elk/elasticsearch/config/elasticsearch.yml @@ -0,0 +1,16 @@ +--- +## Default Elasticsearch configuration from elasticsearch-docker. +## from https://github.com/elastic/elasticsearch-docker/blob/master/build/elasticsearch/elasticsearch.yml +# +cluster.name: "docker-cluster" +network.host: 0.0.0.0 + +# minimum_master_nodes need to be explicitly set when bound on a public IP +# set to 1 to allow single node clusters +# Details: https://github.com/elastic/elasticsearch/pull/17288 +discovery.zen.minimum_master_nodes: 1 + +## Use single node discovery in order to disable production mode and avoid bootstrap checks +## see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html +# +discovery.type: single-node diff --git a/elk/kibana/Dockerfile b/elk/kibana/Dockerfile new file mode 100644 index 000000000..1785734aa --- /dev/null +++ b/elk/kibana/Dockerfile @@ -0,0 +1,5 @@ +# https://github.com/elastic/kibana-docker +FROM docker.elastic.co/kibana/kibana-oss:6.0.0 + +# Add your kibana plugins setup here +# Example: RUN kibana-plugin install diff --git a/elk/kibana/config/kibana.yml b/elk/kibana/config/kibana.yml new file mode 100644 index 000000000..4b34a1606 --- /dev/null +++ b/elk/kibana/config/kibana.yml @@ -0,0 +1,7 @@ +--- +## Default Kibana configuration from kibana-docker. +## from https://github.com/elastic/kibana-docker/blob/master/build/kibana/config/kibana.yml +# +server.name: kibana +server.host: "0" +elasticsearch.url: http://elasticsearch:9200 diff --git a/elk/logstash/Dockerfile b/elk/logstash/Dockerfile new file mode 100644 index 000000000..d8bb475a5 --- /dev/null +++ b/elk/logstash/Dockerfile @@ -0,0 +1,6 @@ +# https://github.com/elastic/logstash-docker +FROM docker.elastic.co/logstash/logstash-oss:6.0.0 + +# Add your logstash plugins setup here +# Example: RUN logstash-plugin install logstash-filter-json +RUN logstash-plugin install logstash-input-http \ No newline at end of file diff --git a/elk/logstash/config/logstash.yml b/elk/logstash/config/logstash.yml new file mode 100644 index 000000000..d4f28f778 --- /dev/null +++ b/elk/logstash/config/logstash.yml @@ -0,0 +1,6 @@ +--- +## Default Logstash configuration from logstash-docker. +## from https://github.com/elastic/logstash-docker/blob/master/build/logstash/config/logstash-oss.yml +# +http.host: "0.0.0.0" +path.config: /usr/share/logstash/pipeline \ No newline at end of file diff --git a/elk/logstash/pipeline/logstash.conf b/elk/logstash/pipeline/logstash.conf new file mode 100644 index 000000000..b38a681d7 --- /dev/null +++ b/elk/logstash/pipeline/logstash.conf @@ -0,0 +1,22 @@ +input { + http { + #default host 0.0.0.0:8080 + codec => json + } +} + +## Add your filters / logstash plugins configuration here +filter { + split { + field => "events" + target => "e" + remove_field => "events" + } +} + +output { + elasticsearch { + hosts => "elasticsearch:9200" + index=>"eshops-%{+xxxx.ww}" + } +} diff --git a/k8s/helm/deploy-all-istio.ps1 b/k8s/helm/deploy-all-istio.ps1 index 6ee8a9572..5e05c6dbb 100644 --- a/k8s/helm/deploy-all-istio.ps1 +++ b/k8s/helm/deploy-all-istio.ps1 @@ -57,6 +57,7 @@ kubectl apply -f ./istio/gateway.yml if ($useLocalk8s -eq $true) { $dns="localhost" + $externalDns="localhost" } else { Write-Host "Resolving DNS to Gateway public IP" -ForegroundColor Green diff --git a/k8s/helm/elk/installelk.ps1 b/k8s/helm/elk/installelk.ps1 new file mode 100644 index 000000000..3a77dae59 --- /dev/null +++ b/k8s/helm/elk/installelk.ps1 @@ -0,0 +1 @@ +helm install --name elk stable/elastic-stack --namespace elk \ No newline at end of file diff --git a/src/Services/Basket/Basket.API/Basket.API.csproj b/src/Services/Basket/Basket.API/Basket.API.csproj index 087fdca66..826ac6697 100644 --- a/src/Services/Basket/Basket.API/Basket.API.csproj +++ b/src/Services/Basket/Basket.API/Basket.API.csproj @@ -33,6 +33,7 @@ + diff --git a/src/Services/Basket/Basket.API/Program.cs b/src/Services/Basket/Basket.API/Program.cs index 893a52400..40cc0eebc 100644 --- a/src/Services/Basket/Basket.API/Program.cs +++ b/src/Services/Basket/Basket.API/Program.cs @@ -57,13 +57,14 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Basket/Basket.API/appsettings.json b/src/Services/Basket/Basket.API/appsettings.json index 33f1c299f..babea8454 100644 --- a/src/Services/Basket/Basket.API/appsettings.json +++ b/src/Services/Basket/Basket.API/appsettings.json @@ -1,6 +1,7 @@ { "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Catalog/Catalog.API/Catalog.API.csproj b/src/Services/Catalog/Catalog.API/Catalog.API.csproj index 983cc291a..4737af7e3 100644 --- a/src/Services/Catalog/Catalog.API/Catalog.API.csproj +++ b/src/Services/Catalog/Catalog.API/Catalog.API.csproj @@ -53,6 +53,7 @@ + diff --git a/src/Services/Catalog/Catalog.API/Program.cs b/src/Services/Catalog/Catalog.API/Program.cs index c75b56c39..39b071c46 100644 --- a/src/Services/Catalog/Catalog.API/Program.cs +++ b/src/Services/Catalog/Catalog.API/Program.cs @@ -71,13 +71,14 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json index 8f2cde4db..3aaed933a 100644 --- a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json +++ b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json @@ -16,7 +16,8 @@ "ConnectionString": "server=localhost,5433;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word", "ASPNETCORE_ENVIRONMENT": "Development", "EventBusConnection": "localhost", - "Serilog:SeqServerUrl": "http://locahost:5340" + "Serilog:SeqServerUrl": "http://locahost:5340", + "Serilog:LogstashgUrl":"http://locahost:8080", } }, "Microsoft.eShopOnContainers.Services.Catalog.API": { diff --git a/src/Services/Catalog/Catalog.API/appsettings.json b/src/Services/Catalog/Catalog.API/appsettings.json index b26f63bff..ede3744dc 100644 --- a/src/Services/Catalog/Catalog.API/appsettings.json +++ b/src/Services/Catalog/Catalog.API/appsettings.json @@ -4,6 +4,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index fd5f1474e..43922d948 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -34,6 +34,7 @@ + diff --git a/src/Services/Identity/Identity.API/Program.cs b/src/Services/Identity/Identity.API/Program.cs index 8204a1ebf..784f63a1e 100644 --- a/src/Services/Identity/Identity.API/Program.cs +++ b/src/Services/Identity/Identity.API/Program.cs @@ -76,13 +76,14 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://localhost:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Identity/Identity.API/appsettings.json b/src/Services/Identity/Identity.API/appsettings.json index 74d8e826c..bcb9ce3f7 100644 --- a/src/Services/Identity/Identity.API/appsettings.json +++ b/src/Services/Identity/Identity.API/appsettings.json @@ -7,6 +7,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Location/Locations.API/Locations.API.csproj b/src/Services/Location/Locations.API/Locations.API.csproj index 9784c1f4d..090ee7c1d 100644 --- a/src/Services/Location/Locations.API/Locations.API.csproj +++ b/src/Services/Location/Locations.API/Locations.API.csproj @@ -29,6 +29,7 @@ + diff --git a/src/Services/Location/Locations.API/Program.cs b/src/Services/Location/Locations.API/Program.cs index c13df985f..acadf4a39 100644 --- a/src/Services/Location/Locations.API/Program.cs +++ b/src/Services/Location/Locations.API/Program.cs @@ -54,13 +54,14 @@ namespace Microsoft.eShopOnContainers.Services.Locations.API private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Location/Locations.API/appsettings.json b/src/Services/Location/Locations.API/appsettings.json index 43fe53873..8cca61af2 100644 --- a/src/Services/Location/Locations.API/appsettings.json +++ b/src/Services/Location/Locations.API/appsettings.json @@ -4,6 +4,7 @@ "IdentityUrl": "http://localhost:5105", "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Marketing/Marketing.API/Marketing.API.csproj b/src/Services/Marketing/Marketing.API/Marketing.API.csproj index 373bcb0a6..2c64d84d9 100644 --- a/src/Services/Marketing/Marketing.API/Marketing.API.csproj +++ b/src/Services/Marketing/Marketing.API/Marketing.API.csproj @@ -45,6 +45,7 @@ + diff --git a/src/Services/Marketing/Marketing.API/Program.cs b/src/Services/Marketing/Marketing.API/Program.cs index ae26c9786..4d07e7e0f 100644 --- a/src/Services/Marketing/Marketing.API/Program.cs +++ b/src/Services/Marketing/Marketing.API/Program.cs @@ -66,13 +66,14 @@ private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Marketing/Marketing.API/appsettings.json b/src/Services/Marketing/Marketing.API/appsettings.json index c16978dce..7c015a8ca 100644 --- a/src/Services/Marketing/Marketing.API/appsettings.json +++ b/src/Services/Marketing/Marketing.API/appsettings.json @@ -1,6 +1,7 @@ { "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.API/Ordering.API.csproj b/src/Services/Ordering/Ordering.API/Ordering.API.csproj index b3fa6797e..6342e3585 100644 --- a/src/Services/Ordering/Ordering.API/Ordering.API.csproj +++ b/src/Services/Ordering/Ordering.API/Ordering.API.csproj @@ -52,6 +52,7 @@ + diff --git a/src/Services/Ordering/Ordering.API/Program.cs b/src/Services/Ordering/Ordering.API/Program.cs index 8fc18c8bb..a0b7dc40e 100644 --- a/src/Services/Ordering/Ordering.API/Program.cs +++ b/src/Services/Ordering/Ordering.API/Program.cs @@ -68,16 +68,17 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API .UseSerilog() .Build(); - private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) + private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Ordering/Ordering.API/appsettings.json b/src/Services/Ordering/Ordering.API/appsettings.json index 64b24a354..ea87d5b07 100644 --- a/src/Services/Ordering/Ordering.API/appsettings.json +++ b/src/Services/Ordering/Ordering.API/appsettings.json @@ -4,6 +4,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj index f0fc00b04..4e3b62de5 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj @@ -28,6 +28,7 @@ + diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Program.cs b/src/Services/Ordering/Ordering.BackgroundTasks/Program.cs index 8f8cf41e1..7a429742e 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Program.cs +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Program.cs @@ -51,13 +51,14 @@ namespace Ordering.BackgroundTasks private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json b/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json index 3697c53a5..6f1e21d06 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json +++ b/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json @@ -2,6 +2,7 @@ "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj index a4dd8cc9d..1dae53261 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj +++ b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj @@ -30,6 +30,7 @@ + diff --git a/src/Services/Ordering/Ordering.SignalrHub/Program.cs b/src/Services/Ordering/Ordering.SignalrHub/Program.cs index fdb3f5f3a..76f131caa 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Program.cs +++ b/src/Services/Ordering/Ordering.SignalrHub/Program.cs @@ -54,13 +54,14 @@ namespace Ordering.SignalrHub private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Ordering/Ordering.SignalrHub/appsettings.json b/src/Services/Ordering/Ordering.SignalrHub/appsettings.json index bd752de48..8360223cf 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/appsettings.json +++ b/src/Services/Ordering/Ordering.SignalrHub/appsettings.json @@ -2,6 +2,7 @@ "IdentityUrl": "http://localhost:5105", "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Payment/Payment.API/Payment.API.csproj b/src/Services/Payment/Payment.API/Payment.API.csproj index e912727e8..a62834170 100644 --- a/src/Services/Payment/Payment.API/Payment.API.csproj +++ b/src/Services/Payment/Payment.API/Payment.API.csproj @@ -24,6 +24,7 @@ + diff --git a/src/Services/Payment/Payment.API/Program.cs b/src/Services/Payment/Payment.API/Program.cs index 9b0aded5c..b03bee3da 100644 --- a/src/Services/Payment/Payment.API/Program.cs +++ b/src/Services/Payment/Payment.API/Program.cs @@ -54,13 +54,14 @@ namespace Payment.API private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Services/Payment/Payment.API/appsettings.json b/src/Services/Payment/Payment.API/appsettings.json index bf6157648..d7ec8301d 100644 --- a/src/Services/Payment/Payment.API/appsettings.json +++ b/src/Services/Payment/Payment.API/appsettings.json @@ -1,6 +1,7 @@ { "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Web/WebMVC/Program.cs b/src/Web/WebMVC/Program.cs index c329237ce..a80d0514b 100644 --- a/src/Web/WebMVC/Program.cs +++ b/src/Web/WebMVC/Program.cs @@ -49,16 +49,17 @@ namespace Microsoft.eShopOnContainers.WebMVC .UseSerilog() .Build(); - private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) + private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index 20ddc085b..3bfd9d0c8 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -41,6 +41,7 @@ + diff --git a/src/Web/WebMVC/appsettings.json b/src/Web/WebMVC/appsettings.json index 591964725..077fda891 100644 --- a/src/Web/WebMVC/appsettings.json +++ b/src/Web/WebMVC/appsettings.json @@ -13,6 +13,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Web/WebStatus/Program.cs b/src/Web/WebStatus/Program.cs index d2de3ceae..45e802116 100644 --- a/src/Web/WebStatus/Program.cs +++ b/src/Web/WebStatus/Program.cs @@ -50,16 +50,17 @@ namespace WebStatus .UseSerilog() .Build(); - private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) + private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) { var seqServerUrl = configuration["Serilog:SeqServerUrl"]; - + var logstashUrl = configuration["Serilog:LogstashgUrl"]; return new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.WithProperty("ApplicationContext", AppName) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) .ReadFrom.Configuration(configuration) .CreateLogger(); } diff --git a/src/Web/WebStatus/WebStatus.csproj b/src/Web/WebStatus/WebStatus.csproj index e898a3a2e..0cd8328de 100644 --- a/src/Web/WebStatus/WebStatus.csproj +++ b/src/Web/WebStatus/WebStatus.csproj @@ -28,6 +28,7 @@ + diff --git a/src/Web/WebStatus/appsettings.json b/src/Web/WebStatus/appsettings.json index e2aadbc9e..82331d00b 100644 --- a/src/Web/WebStatus/appsettings.json +++ b/src/Web/WebStatus/appsettings.json @@ -72,6 +72,7 @@ ], "Serilog": { "SeqServerUrl": null, + "LogstashgUrl":null, "MinimumLevel": { "Default": "Information", "Override": { @@ -79,7 +80,7 @@ "Microsoft.eShopOnContainers": "Information", "System": "Warning" } - } + }, "Webhooks": [ { "Name": "", @@ -92,3 +93,4 @@ "MinimumSecondsBetweenFailureNotifications": 60 } } +} From b075a4d4ad8a7918cb1089204ea8a71b58ebdc76 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 19 Mar 2019 16:00:17 +0100 Subject: [PATCH 25/52] updated build catalog 2 --- build/azure-devops/catalog-api/azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-devops/catalog-api/azure-pipelines.yml b/build/azure-devops/catalog-api/azure-pipelines.yml index 49edcf8b8..2cbe83e1e 100644 --- a/build/azure-devops/catalog-api/azure-pipelines.yml +++ b/build/azure-devops/catalog-api/azure-pipelines.yml @@ -9,7 +9,7 @@ steps: dockerComposeCommand: 'build catalog.api' containerregistrytype: Container Registry dockerRegistryEndpoint: $(registryEndpoint) - dockerComposeFile: /docker-compose.yml + dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" additionalImageTags: | @@ -21,7 +21,7 @@ steps: dockerComposeCommand: 'build catalog.api' containerregistrytype: Container Registry dockerRegistryEndpoint: $(registryEndpoint) - dockerComposeFile: /docker-compose.yml + dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" additionalImageTags: | From c81ae16fc3c1c671237f9aa4d4896b383b5688a8 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 19 Mar 2019 16:41:03 +0100 Subject: [PATCH 26/52] new yaml files --- build/azure-devops/apigws/azure-pipelines.yml | 37 +++++++++++++++++++ .../basket-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../catalog-api/azure-pipelines.yml | 2 +- .../identity-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../location-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../marketing-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../mobile-shopping-agg/azure-pipelines.yml | 37 +++++++++++++++++++ .../ordering-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../payment-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../web-shopping-agg/azure-pipelines.yml | 37 +++++++++++++++++++ .../webhooks-api/azure-pipelines.yml | 37 +++++++++++++++++++ .../webhooks-client/azure-pipelines.yml | 37 +++++++++++++++++++ build/azure-devops/webmvc/azure-pipelines.yml | 37 +++++++++++++++++++ build/azure-devops/webspa/azure-pipelines.yml | 37 +++++++++++++++++++ .../webstatus/azure-pipelines.yml | 37 +++++++++++++++++++ 15 files changed, 519 insertions(+), 1 deletion(-) create mode 100644 build/azure-devops/apigws/azure-pipelines.yml create mode 100644 build/azure-devops/basket-api/azure-pipelines.yml create mode 100644 build/azure-devops/identity-api/azure-pipelines.yml create mode 100644 build/azure-devops/location-api/azure-pipelines.yml create mode 100644 build/azure-devops/marketing-api/azure-pipelines.yml create mode 100644 build/azure-devops/mobile-shopping-agg/azure-pipelines.yml create mode 100644 build/azure-devops/ordering-api/azure-pipelines.yml create mode 100644 build/azure-devops/payment-api/azure-pipelines.yml create mode 100644 build/azure-devops/web-shopping-agg/azure-pipelines.yml create mode 100644 build/azure-devops/webhooks-api/azure-pipelines.yml create mode 100644 build/azure-devops/webhooks-client/azure-pipelines.yml create mode 100644 build/azure-devops/webmvc/azure-pipelines.yml create mode 100644 build/azure-devops/webspa/azure-pipelines.yml create mode 100644 build/azure-devops/webstatus/azure-pipelines.yml diff --git a/build/azure-devops/apigws/azure-pipelines.yml b/build/azure-devops/apigws/azure-pipelines.yml new file mode 100644 index 000000000..b0d6f7e9d --- /dev/null +++ b/build/azure-devops/apigws/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build apigws + inputs: + dockerComposeCommand: 'build mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push basket + inputs: + dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/basket-api/azure-pipelines.yml b/build/azure-devops/basket-api/azure-pipelines.yml new file mode 100644 index 000000000..a461e83fe --- /dev/null +++ b/build/azure-devops/basket-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build basket + inputs: + dockerComposeCommand: 'build basket.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push basket + inputs: + dockerComposeCommand: 'push basket.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/catalog-api/azure-pipelines.yml b/build/azure-devops/catalog-api/azure-pipelines.yml index 2cbe83e1e..c406a2f5f 100644 --- a/build/azure-devops/catalog-api/azure-pipelines.yml +++ b/build/azure-devops/catalog-api/azure-pipelines.yml @@ -18,7 +18,7 @@ steps: - task: DockerCompose@0 displayName: Compose push catalog inputs: - dockerComposeCommand: 'build catalog.api' + dockerComposeCommand: 'push catalog.api' containerregistrytype: Container Registry dockerRegistryEndpoint: $(registryEndpoint) dockerComposeFile: docker-compose.yml diff --git a/build/azure-devops/identity-api/azure-pipelines.yml b/build/azure-devops/identity-api/azure-pipelines.yml new file mode 100644 index 000000000..2a9425010 --- /dev/null +++ b/build/azure-devops/identity-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build identity + inputs: + dockerComposeCommand: 'build identity.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push identity + inputs: + dockerComposeCommand: 'push identity.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/location-api/azure-pipelines.yml b/build/azure-devops/location-api/azure-pipelines.yml new file mode 100644 index 000000000..568a104d5 --- /dev/null +++ b/build/azure-devops/location-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build locations + inputs: + dockerComposeCommand: 'build locations.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push locations + inputs: + dockerComposeCommand: 'push locations.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/marketing-api/azure-pipelines.yml b/build/azure-devops/marketing-api/azure-pipelines.yml new file mode 100644 index 000000000..31da6c177 --- /dev/null +++ b/build/azure-devops/marketing-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build marketing + inputs: + dockerComposeCommand: 'build marketing.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push marketing + inputs: + dockerComposeCommand: 'push marketing.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml b/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml new file mode 100644 index 000000000..e8ee50d74 --- /dev/null +++ b/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build mobileshoppingagg + inputs: + dockerComposeCommand: 'build mobileshoppingagg' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push mobileshoppingagg + inputs: + dockerComposeCommand: 'push mobileshoppingagg' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/ordering-api/azure-pipelines.yml b/build/azure-devops/ordering-api/azure-pipelines.yml new file mode 100644 index 000000000..f4c4257fb --- /dev/null +++ b/build/azure-devops/ordering-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build ordering + inputs: + dockerComposeCommand: 'build ordering.api ordering.backgroundtasks ordering.signalrhub' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push ordering + inputs: + dockerComposeCommand: 'push ordering.api ordering.backgroundtasks ordering.signalrhub' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/payment-api/azure-pipelines.yml b/build/azure-devops/payment-api/azure-pipelines.yml new file mode 100644 index 000000000..99945b830 --- /dev/null +++ b/build/azure-devops/payment-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build payment + inputs: + dockerComposeCommand: 'build payment.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push payment + inputs: + dockerComposeCommand: 'push payment.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/web-shopping-agg/azure-pipelines.yml b/build/azure-devops/web-shopping-agg/azure-pipelines.yml new file mode 100644 index 000000000..7a9eaa62f --- /dev/null +++ b/build/azure-devops/web-shopping-agg/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build webshoppingagg + inputs: + dockerComposeCommand: 'build webshoppingagg' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push webshoppingagg + inputs: + dockerComposeCommand: 'push webshoppingagg' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/webhooks-api/azure-pipelines.yml b/build/azure-devops/webhooks-api/azure-pipelines.yml new file mode 100644 index 000000000..84cf42e99 --- /dev/null +++ b/build/azure-devops/webhooks-api/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build webhooks + inputs: + dockerComposeCommand: 'build webhooks.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push webhooks + inputs: + dockerComposeCommand: 'push webhooks.api' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/webhooks-client/azure-pipelines.yml b/build/azure-devops/webhooks-client/azure-pipelines.yml new file mode 100644 index 000000000..f89ea6228 --- /dev/null +++ b/build/azure-devops/webhooks-client/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build webhooks.client + inputs: + dockerComposeCommand: 'build webhooks.client' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push webhooks.client + inputs: + dockerComposeCommand: 'push webhooks.client' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/webmvc/azure-pipelines.yml b/build/azure-devops/webmvc/azure-pipelines.yml new file mode 100644 index 000000000..4f3b95b90 --- /dev/null +++ b/build/azure-devops/webmvc/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build webmvc + inputs: + dockerComposeCommand: 'build webmvc' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push webmvc + inputs: + dockerComposeCommand: 'push webmvc' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/webspa/azure-pipelines.yml b/build/azure-devops/webspa/azure-pipelines.yml new file mode 100644 index 000000000..b3379dada --- /dev/null +++ b/build/azure-devops/webspa/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build webspa + inputs: + dockerComposeCommand: 'build webspa' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push webspa + inputs: + dockerComposeCommand: 'push webspa' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm diff --git a/build/azure-devops/webstatus/azure-pipelines.yml b/build/azure-devops/webstatus/azure-pipelines.yml new file mode 100644 index 000000000..9eaea61e6 --- /dev/null +++ b/build/azure-devops/webstatus/azure-pipelines.yml @@ -0,0 +1,37 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +steps: +- task: DockerCompose@0 + displayName: Compose build webstatus + inputs: + dockerComposeCommand: 'build webstatus' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: DockerCompose@0 + displayName: Compose push webstatus + inputs: + dockerComposeCommand: 'push webstatus' + containerregistrytype: Container Registry + dockerRegistryEndpoint: $(registryEndpoint) + dockerComposeFile: docker-compose.yml + qualifyImageNames: true + projectName: "" + additionalImageTags: | + $(Build.BuildId) + dev +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm From c978bf3ac6c806d558edfff0cd79e277c8bf1210 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 19 Mar 2019 17:55:07 +0100 Subject: [PATCH 27/52] builds readme --- build/azure-devops/readme.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 build/azure-devops/readme.md diff --git a/build/azure-devops/readme.md b/build/azure-devops/readme.md new file mode 100644 index 000000000..b7216d4de --- /dev/null +++ b/build/azure-devops/readme.md @@ -0,0 +1,5 @@ +# Azure Devops build definitions + +This folder contains the Azure Devops build definitions in YAML format. Each folder contains one `azure-pipelines.yml` that contains the build definition for one microservice (usually a Docker image, but some microservices generates more than one Docker image). + +For more information about YAML builds read the [Azure DevOps documentation](https://docs.microsoft.com/en-us/azure/devops/pipelines/get-started-yaml?view=azure-devops). \ No newline at end of file From 9d4128867cd639c017b22d27ba5934ecda3c7d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Tue, 19 Mar 2019 18:49:19 +0100 Subject: [PATCH 28/52] Update azure-pipelines.yml for Azure Pipelines --- build/azure-devops/apigws/azure-pipelines.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/build/azure-devops/apigws/azure-pipelines.yml b/build/azure-devops/apigws/azure-pipelines.yml index b0d6f7e9d..6466e2f7e 100644 --- a/build/azure-devops/apigws/azure-pipelines.yml +++ b/build/azure-devops/apigws/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push basket inputs: @@ -24,9 +23,7 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + additionalImageTags: - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm From 97c4efc42e93bef74f0ace26928d68789350e1ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Tue, 19 Mar 2019 18:56:34 +0100 Subject: [PATCH 29/52] Update azure-pipelines.yml for Azure Pipelines --- build/azure-devops/apigws/azure-pipelines.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/azure-devops/apigws/azure-pipelines.yml b/build/azure-devops/apigws/azure-pipelines.yml index 6466e2f7e..a9432c672 100644 --- a/build/azure-devops/apigws/azure-pipelines.yml +++ b/build/azure-devops/apigws/azure-pipelines.yml @@ -15,7 +15,7 @@ steps: dockerComposeFileArgs: | TAG=dev - task: DockerCompose@0 - displayName: Compose push basket + displayName: Compose push apigws inputs: dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw' containerregistrytype: Container Registry @@ -24,6 +24,8 @@ steps: qualifyImageNames: true projectName: "" additionalImageTags: + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm From 57fd8ac528dec6f49b05b07a1a45eba2a3c90ffd Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 19 Mar 2019 19:02:54 +0100 Subject: [PATCH 30/52] builds updated --- build/azure-devops/apigws/azure-pipelines.yml | 13 ++++++------- build/azure-devops/basket-api/azure-pipelines.yml | 10 ++++------ build/azure-devops/catalog-api/azure-pipelines.yml | 10 ++++------ build/azure-devops/identity-api/azure-pipelines.yml | 10 ++++------ build/azure-devops/location-api/azure-pipelines.yml | 10 ++++------ .../azure-devops/marketing-api/azure-pipelines.yml | 10 ++++------ .../mobile-shopping-agg/azure-pipelines.yml | 10 ++++------ build/azure-devops/ordering-api/azure-pipelines.yml | 10 ++++------ build/azure-devops/payment-api/azure-pipelines.yml | 10 ++++------ .../web-shopping-agg/azure-pipelines.yml | 10 ++++------ build/azure-devops/webhooks-api/azure-pipelines.yml | 10 ++++------ .../webhooks-client/azure-pipelines.yml | 10 ++++------ build/azure-devops/webmvc/azure-pipelines.yml | 10 ++++------ build/azure-devops/webspa/azure-pipelines.yml | 10 ++++------ build/azure-devops/webstatus/azure-pipelines.yml | 10 ++++------ 15 files changed, 62 insertions(+), 91 deletions(-) diff --git a/build/azure-devops/apigws/azure-pipelines.yml b/build/azure-devops/apigws/azure-pipelines.yml index b0d6f7e9d..a9432c672 100644 --- a/build/azure-devops/apigws/azure-pipelines.yml +++ b/build/azure-devops/apigws/azure-pipelines.yml @@ -12,11 +12,10 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 - displayName: Compose push basket + displayName: Compose push apigws inputs: dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw' containerregistrytype: Container Registry @@ -24,9 +23,9 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + additionalImageTags: + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/basket-api/azure-pipelines.yml b/build/azure-devops/basket-api/azure-pipelines.yml index a461e83fe..ce0a7b670 100644 --- a/build/azure-devops/basket-api/azure-pipelines.yml +++ b/build/azure-devops/basket-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push basket inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/catalog-api/azure-pipelines.yml b/build/azure-devops/catalog-api/azure-pipelines.yml index c406a2f5f..90a0d2136 100644 --- a/build/azure-devops/catalog-api/azure-pipelines.yml +++ b/build/azure-devops/catalog-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push catalog inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/identity-api/azure-pipelines.yml b/build/azure-devops/identity-api/azure-pipelines.yml index 2a9425010..2002ed576 100644 --- a/build/azure-devops/identity-api/azure-pipelines.yml +++ b/build/azure-devops/identity-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push identity inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/location-api/azure-pipelines.yml b/build/azure-devops/location-api/azure-pipelines.yml index 568a104d5..97c1c4ca7 100644 --- a/build/azure-devops/location-api/azure-pipelines.yml +++ b/build/azure-devops/location-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push locations inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/marketing-api/azure-pipelines.yml b/build/azure-devops/marketing-api/azure-pipelines.yml index 31da6c177..bb56e315d 100644 --- a/build/azure-devops/marketing-api/azure-pipelines.yml +++ b/build/azure-devops/marketing-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push marketing inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml b/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml index e8ee50d74..b79a30055 100644 --- a/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml +++ b/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push mobileshoppingagg inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/ordering-api/azure-pipelines.yml b/build/azure-devops/ordering-api/azure-pipelines.yml index f4c4257fb..5aebfec75 100644 --- a/build/azure-devops/ordering-api/azure-pipelines.yml +++ b/build/azure-devops/ordering-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push ordering inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/payment-api/azure-pipelines.yml b/build/azure-devops/payment-api/azure-pipelines.yml index 99945b830..b5c53fafa 100644 --- a/build/azure-devops/payment-api/azure-pipelines.yml +++ b/build/azure-devops/payment-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push payment inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/web-shopping-agg/azure-pipelines.yml b/build/azure-devops/web-shopping-agg/azure-pipelines.yml index 7a9eaa62f..8f2bb1143 100644 --- a/build/azure-devops/web-shopping-agg/azure-pipelines.yml +++ b/build/azure-devops/web-shopping-agg/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push webshoppingagg inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webhooks-api/azure-pipelines.yml b/build/azure-devops/webhooks-api/azure-pipelines.yml index 84cf42e99..58fbf0c7a 100644 --- a/build/azure-devops/webhooks-api/azure-pipelines.yml +++ b/build/azure-devops/webhooks-api/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push webhooks inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webhooks-client/azure-pipelines.yml b/build/azure-devops/webhooks-client/azure-pipelines.yml index f89ea6228..8d429559f 100644 --- a/build/azure-devops/webhooks-client/azure-pipelines.yml +++ b/build/azure-devops/webhooks-client/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push webhooks.client inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webmvc/azure-pipelines.yml b/build/azure-devops/webmvc/azure-pipelines.yml index 4f3b95b90..63cd13030 100644 --- a/build/azure-devops/webmvc/azure-pipelines.yml +++ b/build/azure-devops/webmvc/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push webmvc inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webspa/azure-pipelines.yml b/build/azure-devops/webspa/azure-pipelines.yml index b3379dada..b9074da21 100644 --- a/build/azure-devops/webspa/azure-pipelines.yml +++ b/build/azure-devops/webspa/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push webspa inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webstatus/azure-pipelines.yml b/build/azure-devops/webstatus/azure-pipelines.yml index 9eaea61e6..3daadf3a6 100644 --- a/build/azure-devops/webstatus/azure-pipelines.yml +++ b/build/azure-devops/webstatus/azure-pipelines.yml @@ -12,9 +12,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: DockerCompose@0 displayName: Compose push webstatus inputs: @@ -24,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: | - $(Build.BuildId) - dev + dockerComposeFileArgs: | + TAG=dev - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm From 56c659776e37bc4e661a19ca3b0c2c013a8cc868 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 20 Mar 2019 06:50:28 +0100 Subject: [PATCH 31/52] Finished --- docker-compose.elk.yml | 13 +------------ docker-compose.yml | 34 ---------------------------------- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/docker-compose.elk.yml b/docker-compose.elk.yml index a1112b0e2..04e6c8a05 100644 --- a/docker-compose.elk.yml +++ b/docker-compose.elk.yml @@ -12,8 +12,6 @@ services: - "9300:9300" environment: ES_JAVA_OPTS: "-Xmx256m -Xms256m" - networks: - - elk logstash: build: @@ -25,8 +23,6 @@ services: - "8080:8080" environment: LS_JAVA_OPTS: "-Xmx256m -Xms256m" - networks: - - elk depends_on: - elasticsearch @@ -37,12 +33,5 @@ services: - ./elk/kibana/config/:/usr/share/kibana/config:ro ports: - "5601:5601" - networks: - - elk depends_on: - - elasticsearch - -networks: - - elk: - driver: bridge + - elasticsearch \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index d0cda5b7a..2a0448bad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,40 +2,6 @@ version: '3.4' services: - elasticsearch: - build: - context: elk/elasticsearch/ - volumes: - - ./elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro - ports: - - "9200:9200" - - "9300:9300" - environment: - ES_JAVA_OPTS: "-Xmx256m -Xms256m" - - logstash: - build: - context: elk/logstash/ - volumes: - - ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro - - ./elk/logstash/pipeline:/usr/share/logstash/pipeline:ro - ports: - - "8080:8080" - environment: - LS_JAVA_OPTS: "-Xmx256m -Xms256m" - depends_on: - - elasticsearch - - kibana: - build: - context: elk/kibana/ - volumes: - - ./elk/kibana/config/:/usr/share/kibana/config:ro - ports: - - "5601:5601" - depends_on: - - elasticsearch - seq: image: datalust/seq:latest From c7b4fe4298d7ab868b560520aee80da61c34ef92 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 20 Mar 2019 09:48:37 +0100 Subject: [PATCH 32/52] updated builds to use git branch name --- build/azure-devops/apigws/azure-pipelines.yml | 5 ++--- build/azure-devops/basket-api/azure-pipelines.yml | 4 ++-- build/azure-devops/catalog-api/azure-pipelines.yml | 4 ++-- build/azure-devops/identity-api/azure-pipelines.yml | 4 ++-- build/azure-devops/location-api/azure-pipelines.yml | 4 ++-- build/azure-devops/marketing-api/azure-pipelines.yml | 4 ++-- build/azure-devops/mobile-shopping-agg/azure-pipelines.yml | 4 ++-- build/azure-devops/ordering-api/azure-pipelines.yml | 4 ++-- build/azure-devops/payment-api/azure-pipelines.yml | 4 ++-- build/azure-devops/web-shopping-agg/azure-pipelines.yml | 4 ++-- build/azure-devops/webhooks-api/azure-pipelines.yml | 4 ++-- build/azure-devops/webhooks-client/azure-pipelines.yml | 4 ++-- build/azure-devops/webmvc/azure-pipelines.yml | 4 ++-- build/azure-devops/webspa/azure-pipelines.yml | 4 ++-- build/azure-devops/webstatus/azure-pipelines.yml | 4 ++-- 15 files changed, 30 insertions(+), 31 deletions(-) diff --git a/build/azure-devops/apigws/azure-pipelines.yml b/build/azure-devops/apigws/azure-pipelines.yml index a9432c672..2487e7bce 100644 --- a/build/azure-devops/apigws/azure-pipelines.yml +++ b/build/azure-devops/apigws/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push apigws inputs: @@ -23,9 +23,8 @@ steps: dockerComposeFile: docker-compose.yml qualifyImageNames: true projectName: "" - additionalImageTags: dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/basket-api/azure-pipelines.yml b/build/azure-devops/basket-api/azure-pipelines.yml index ce0a7b670..5655c1a12 100644 --- a/build/azure-devops/basket-api/azure-pipelines.yml +++ b/build/azure-devops/basket-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push basket inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/catalog-api/azure-pipelines.yml b/build/azure-devops/catalog-api/azure-pipelines.yml index 90a0d2136..f1881f096 100644 --- a/build/azure-devops/catalog-api/azure-pipelines.yml +++ b/build/azure-devops/catalog-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push catalog inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/identity-api/azure-pipelines.yml b/build/azure-devops/identity-api/azure-pipelines.yml index 2002ed576..7fc628e1a 100644 --- a/build/azure-devops/identity-api/azure-pipelines.yml +++ b/build/azure-devops/identity-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push identity inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/location-api/azure-pipelines.yml b/build/azure-devops/location-api/azure-pipelines.yml index 97c1c4ca7..b0868c17c 100644 --- a/build/azure-devops/location-api/azure-pipelines.yml +++ b/build/azure-devops/location-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push locations inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/marketing-api/azure-pipelines.yml b/build/azure-devops/marketing-api/azure-pipelines.yml index bb56e315d..d979f51cb 100644 --- a/build/azure-devops/marketing-api/azure-pipelines.yml +++ b/build/azure-devops/marketing-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push marketing inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml b/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml index b79a30055..635a7e13c 100644 --- a/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml +++ b/build/azure-devops/mobile-shopping-agg/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push mobileshoppingagg inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/ordering-api/azure-pipelines.yml b/build/azure-devops/ordering-api/azure-pipelines.yml index 5aebfec75..48b1995c6 100644 --- a/build/azure-devops/ordering-api/azure-pipelines.yml +++ b/build/azure-devops/ordering-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push ordering inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/payment-api/azure-pipelines.yml b/build/azure-devops/payment-api/azure-pipelines.yml index b5c53fafa..b33187ee2 100644 --- a/build/azure-devops/payment-api/azure-pipelines.yml +++ b/build/azure-devops/payment-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push payment inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/web-shopping-agg/azure-pipelines.yml b/build/azure-devops/web-shopping-agg/azure-pipelines.yml index 8f2bb1143..7ff3f56a5 100644 --- a/build/azure-devops/web-shopping-agg/azure-pipelines.yml +++ b/build/azure-devops/web-shopping-agg/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push webshoppingagg inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webhooks-api/azure-pipelines.yml b/build/azure-devops/webhooks-api/azure-pipelines.yml index 58fbf0c7a..90429da3d 100644 --- a/build/azure-devops/webhooks-api/azure-pipelines.yml +++ b/build/azure-devops/webhooks-api/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push webhooks inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webhooks-client/azure-pipelines.yml b/build/azure-devops/webhooks-client/azure-pipelines.yml index 8d429559f..607fcd8cf 100644 --- a/build/azure-devops/webhooks-client/azure-pipelines.yml +++ b/build/azure-devops/webhooks-client/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push webhooks.client inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webmvc/azure-pipelines.yml b/build/azure-devops/webmvc/azure-pipelines.yml index 63cd13030..76762fcc5 100644 --- a/build/azure-devops/webmvc/azure-pipelines.yml +++ b/build/azure-devops/webmvc/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push webmvc inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webspa/azure-pipelines.yml b/build/azure-devops/webspa/azure-pipelines.yml index b9074da21..2e00d422a 100644 --- a/build/azure-devops/webspa/azure-pipelines.yml +++ b/build/azure-devops/webspa/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push webspa inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm diff --git a/build/azure-devops/webstatus/azure-pipelines.yml b/build/azure-devops/webstatus/azure-pipelines.yml index 3daadf3a6..4dd4b425e 100644 --- a/build/azure-devops/webstatus/azure-pipelines.yml +++ b/build/azure-devops/webstatus/azure-pipelines.yml @@ -13,7 +13,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: DockerCompose@0 displayName: Compose push webstatus inputs: @@ -24,7 +24,7 @@ steps: qualifyImageNames: true projectName: "" dockerComposeFileArgs: | - TAG=dev + TAG=$(Build.SourceBranchName) - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)/k8s/helm From 8d7d27cc9186ab0340fe28929c537b170fc29dcd Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 20 Mar 2019 12:41:24 +0100 Subject: [PATCH 33/52] Added Documentation --- elk/Readme.md | 28 ++++++++++++++++++++++++++++ img/elk/kibana_eshops_index.png | Bin 0 -> 37628 bytes img/elk/kibana_result.png | Bin 0 -> 73100 bytes img/elk/kibana_startup.png | Bin 0 -> 58651 bytes img/elk/kibana_working.png | Bin 0 -> 79471 bytes k8s/helm/elk/installelk.ps1 | 1 - 6 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 elk/Readme.md create mode 100644 img/elk/kibana_eshops_index.png create mode 100644 img/elk/kibana_result.png create mode 100644 img/elk/kibana_startup.png create mode 100644 img/elk/kibana_working.png delete mode 100644 k8s/helm/elk/installelk.ps1 diff --git a/elk/Readme.md b/elk/Readme.md new file mode 100644 index 000000000..a012e1c5c --- /dev/null +++ b/elk/Readme.md @@ -0,0 +1,28 @@ +This article contains a brief introduction to centralized structured logging with [Serilog](https://serilog.net/) and event viewing with [ELK](https://www.elastic.co/elk-stack) in eShopOnContainers. ELK is an acronym of ElasticSearch, LogStash and Kibana. This is one of the most used tools in the industry standards. + +![](img/elk/kibana-working.png) + +## Wiring eshopOnContainers with ELK + +eshopOnContainers is ready for work with ELK, you only need to setup the configuration parameter **LogstashgUrl**, in **Serilog** Section, for achieve this, you can do it modifing this parameter in every appsettings.json in every service, or via Environment Variable **Serilog:LogstashUrl**. + +There is another option, a zero-configuration environment for testing the integration launching via ```docker-compose``` command, on the root directory of eshopOnContainers: + +```sh +docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.elk.yml +``` + +### Configuring Logstash index on Kibana + +Once time you have started and configured your application, you only need to configure the logstash index on kibana. +You can address to Kibana, with docker-compose setup is at [http://localhost:5601](http://localhost:5601) + +If you have accessed to kibana too early, you can see this error. It's normal, depending of your machine the kibana stack needs a bit of time to startup. +![](img/elk/kibana_startup.png) + +You can wait a bit and refresh the page, the first time you enter, you need to configure and index pattern, in the ```docker-compose``` configuration, the index pattern name is **eshops-\***. +![](img/elk/kibana_eshops_index.png) + +With the index pattern configured, you can enter in the discover section and start viewing how the tool is recollecting the logging information. + +![](img/elk/kibana_result.png) \ No newline at end of file diff --git a/img/elk/kibana_eshops_index.png b/img/elk/kibana_eshops_index.png new file mode 100644 index 0000000000000000000000000000000000000000..5a4be8ec33574c848a8b5220ce005ccc70584d20 GIT binary patch literal 37628 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 R)Q-PDMLD%+B{FY5{vQ}2lPLfI literal 0 HcmV?d00001 diff --git a/img/elk/kibana_result.png b/img/elk/kibana_result.png new file mode 100644 index 0000000000000000000000000000000000000000..55b7fd3ff0f6e7f7101429c4a00ab7cf433b7751 GIT binary patch literal 73100 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 z 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%0AXGu+~mVGrp(XD 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 z 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 literal 0 HcmV?d00001 diff --git a/k8s/helm/elk/installelk.ps1 b/k8s/helm/elk/installelk.ps1 deleted file mode 100644 index 3a77dae59..000000000 --- a/k8s/helm/elk/installelk.ps1 +++ /dev/null @@ -1 +0,0 @@ -helm install --name elk stable/elastic-stack --namespace elk \ No newline at end of file From 94ff3fa8c2b1cd48d87979b6e8dca0851430c6e4 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 20 Mar 2019 12:52:34 +0100 Subject: [PATCH 34/52] Updated readme.md for builds info --- README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ffdf6450a..ac5b5f401 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,69 @@ # eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible) Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. -[![Build status (Linux images)](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/All%20Microservices%20Linux)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=184) +## Linux Build Status for 'dev' branch + +Dev branch contains the latest "stable" code, and their images are tagged with `:dev` in our [Docker Hub](https://cloud.docker.com/u/eshop/repository/list): + +Api Gateways base image + +[![Api Gateways base image](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/apigws?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=201&branchName=dev) + +Basket API + +[![Basket API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/basket?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=199&branchName=dev) + +Catalog API + +[![Catalog API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/catalog?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=197&branchName=dev) + +Identity API + +[![Identity API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/identity?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=200&branchName=dev) + +Location API + +[![Location API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/location?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=202&branchName=dev) + +Marketing API + +[![Marketing API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/marketing?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=203&branchName=dev) + +Ordering API + +[![Ordering API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/ordering?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=198&branchName=dev) + +Payment API + +[![Payment API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/payment?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=205&branchName=dev) + +Webhooks API + +[![Webhooks API](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webhooks?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=207&branchName=dev) + +Web Shopping Aggregator + +[![Web Shopping Aggregator](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/web-shopping-agg?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=206&branchName=dev) + +Mobile Shopping Aggregator + +[![Mobile Shopping Aggregator](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/mobile-shopping-agg?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=204&branchName=dev) + +Webbhooks demo client + +[![Webhooks demo client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webhooks-client?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=208&branchName=dev) + +WebMVC Client + +[![WebMVC Client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webmvc?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=209&branchName=dev) + +WebSPA Client + +[![WebSPA Client](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webspa?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=210&branchName=dev) + +Web Status + +[![Web Status](https://msftdevtools.visualstudio.com/eShopOnContainers/_apis/build/status/microservices/webstatus?branchName=dev)](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=211&branchName=dev) ## IMPORTANT NOTES! From 0dcc46caf4ad351834a90ed3aa91078385129166 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Thu, 21 Mar 2019 10:06:03 +0100 Subject: [PATCH 35/52] Corrected a Typo --- elk/Readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/elk/Readme.md b/elk/Readme.md index a012e1c5c..16c2bbcbe 100644 --- a/elk/Readme.md +++ b/elk/Readme.md @@ -9,7 +9,9 @@ eshopOnContainers is ready for work with ELK, you only need to setup the configu There is another option, a zero-configuration environment for testing the integration launching via ```docker-compose``` command, on the root directory of eshopOnContainers: ```sh -docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.elk.yml +docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.elk.yml build + +docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.elk.yml up ``` ### Configuring Logstash index on Kibana From 3d0aae896189d5b53e897b9da8a8529eb53a565b Mon Sep 17 00:00:00 2001 From: eiximenis Date: Thu, 21 Mar 2019 11:12:07 +0100 Subject: [PATCH 36/52] webhooks.client rebranded --- src/Web/WebhookClient/Pages/Index.cshtml | 16 ++++++++++++---- .../WebhookClient/Pages/RegisterWebhook.cshtml | 7 ++++--- .../Pages/RegisterWebhook.cshtml.cs | 4 +++- .../WebhookClient/Pages/Shared/_Layout.cshtml | 6 +++--- src/Web/WebhookClient/wwwroot/css/site.css | 12 ++++++++++++ src/Web/WebhookClient/wwwroot/images/brand.png | Bin 0 -> 4023 bytes .../wwwroot/images/main_banner.png | Bin 0 -> 871336 bytes 7 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 src/Web/WebhookClient/wwwroot/images/brand.png create mode 100644 src/Web/WebhookClient/wwwroot/images/main_banner.png diff --git a/src/Web/WebhookClient/Pages/Index.cshtml b/src/Web/WebhookClient/Pages/Index.cshtml index 26338b19f..70eaed6ee 100644 --- a/src/Web/WebhookClient/Pages/Index.cshtml +++ b/src/Web/WebhookClient/Pages/Index.cshtml @@ -4,9 +4,17 @@ ViewData["Title"] = "Home page"; } +
+
+
-

Current webhooks received

-

(Data since last time web started up)

+

Current webhooks received (orders paid)

+

(Data since last time web started up). Note: Must manually refresh this page.

@foreach (var webhook in Model.WebHooksReceived) { diff --git a/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml b/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml index c0e76b208..15157ee99 100644 --- a/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml +++ b/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml @@ -4,9 +4,9 @@ ViewData["Title"] = "RegisterWebhook"; } -

Register webhook

+

Register a new webhook

-

This page registers the "OrderPaid" Webhook by sending a POST to webhooks.

+

This page registers the "OrderPaid" Webhook by sending a POST to the WebHooks API. Once the Webhook is set, you will be able to see new paid orders from the Index page.

Token:

@@ -15,5 +15,6 @@ @if (Model.ResponseCode != (int)System.Net.HttpStatusCode.OK) { -

Error @Model.ResponseCode (@Model.ResponseMessage) when calling the Webhooks API (@Model.RequestUrl) with GrantUrl: @Model.GrantUrl):(

+

Error @Model.ResponseCode (@Model.ResponseMessage) when calling the Webhooks API (@Model.RequestUrl) with GrantUrl: @Model.GrantUrl)

+

Data sent to the webhooks API was @Model.RequestBodyJson

} \ No newline at end of file diff --git a/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs b/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs index f97693449..3e52cda27 100644 --- a/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs +++ b/src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Options; +using Newtonsoft.Json; using WebhookClient.Models; namespace WebhookClient.Pages @@ -27,7 +28,7 @@ namespace WebhookClient.Pages public string RequestUrl { get; set; } public string GrantUrl { get; set; } public string ResponseMessage { get; set; } - + public string RequestBodyJson { get; set; } public RegisterWebhookModel(IOptions settings, IHttpClientFactory httpClientFactory) { @@ -69,6 +70,7 @@ namespace WebhookClient.Pages } else { + RequestBodyJson = JsonConvert.SerializeObject(payload); ResponseCode = (int)response.StatusCode; ResponseMessage = response.ReasonPhrase; GrantUrl = granturl; diff --git a/src/Web/WebhookClient/Pages/Shared/_Layout.cshtml b/src/Web/WebhookClient/Pages/Shared/_Layout.cshtml index e7269f656..600c82841 100644 --- a/src/Web/WebhookClient/Pages/Shared/_Layout.cshtml +++ b/src/Web/WebhookClient/Pages/Shared/_Layout.cshtml @@ -3,7 +3,7 @@ - @ViewData["Title"] - WebhookClient + @ViewData["Title"] - Order Management @@ -21,7 +21,7 @@
IQNNT4sCTA6jc8EW9PL-;BGmAyX{An`Js@9R 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 ABme*a literal 0 HcmV?d00001 diff --git a/img/elk/create-vm-elk-azure-summary.png b/img/elk/create-vm-elk-azure-summary.png new file mode 100644 index 0000000000000000000000000000000000000000..b56ae5af31421331a1294471946ccd2544fd5115 GIT binary patch literal 81931 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Û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 z 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

|39nehMbK^YhJz1Mtx7AXyI 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 DhHR>Q literal 0 HcmV?d00001 diff --git a/img/elk/discover-kibana.png b/img/elk/discover-kibana.png new file mode 100644 index 0000000000000000000000000000000000000000..3977042c7e14e0cedc00a52b86d41d2279c25b92 GIT binary patch literal 62954 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 BH-G>D literal 0 HcmV?d00001 diff --git a/src/Services/Basket/Basket.API/appsettings.json b/src/Services/Basket/Basket.API/appsettings.json index babea8454..fb215cf56 100644 --- a/src/Services/Basket/Basket.API/appsettings.json +++ b/src/Services/Basket/Basket.API/appsettings.json @@ -1,7 +1,7 @@ { "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Catalog/Catalog.API/appsettings.json b/src/Services/Catalog/Catalog.API/appsettings.json index ede3744dc..f56f4f3a8 100644 --- a/src/Services/Catalog/Catalog.API/appsettings.json +++ b/src/Services/Catalog/Catalog.API/appsettings.json @@ -4,7 +4,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Identity/Identity.API/appsettings.json b/src/Services/Identity/Identity.API/appsettings.json index bcb9ce3f7..80dc3a50a 100644 --- a/src/Services/Identity/Identity.API/appsettings.json +++ b/src/Services/Identity/Identity.API/appsettings.json @@ -7,7 +7,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Location/Locations.API/appsettings.json b/src/Services/Location/Locations.API/appsettings.json index 8cca61af2..619668c77 100644 --- a/src/Services/Location/Locations.API/appsettings.json +++ b/src/Services/Location/Locations.API/appsettings.json @@ -4,7 +4,7 @@ "IdentityUrl": "http://localhost:5105", "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Marketing/Marketing.API/appsettings.json b/src/Services/Marketing/Marketing.API/appsettings.json index 7c015a8ca..6abeb89b9 100644 --- a/src/Services/Marketing/Marketing.API/appsettings.json +++ b/src/Services/Marketing/Marketing.API/appsettings.json @@ -1,7 +1,7 @@ { "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.API/appsettings.json b/src/Services/Ordering/Ordering.API/appsettings.json index ea87d5b07..4865d62b1 100644 --- a/src/Services/Ordering/Ordering.API/appsettings.json +++ b/src/Services/Ordering/Ordering.API/appsettings.json @@ -4,7 +4,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json b/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json index 6f1e21d06..3f6239256 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json +++ b/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json @@ -2,7 +2,7 @@ "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.SignalrHub/appsettings.json b/src/Services/Ordering/Ordering.SignalrHub/appsettings.json index 8360223cf..68efc2800 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/appsettings.json +++ b/src/Services/Ordering/Ordering.SignalrHub/appsettings.json @@ -2,7 +2,7 @@ "IdentityUrl": "http://localhost:5105", "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Payment/Payment.API/appsettings.json b/src/Services/Payment/Payment.API/appsettings.json index d7ec8301d..e47377a06 100644 --- a/src/Services/Payment/Payment.API/appsettings.json +++ b/src/Services/Payment/Payment.API/appsettings.json @@ -1,7 +1,7 @@ { "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Web/WebMVC/appsettings.json b/src/Web/WebMVC/appsettings.json index 077fda891..ee80b8b9e 100644 --- a/src/Web/WebMVC/appsettings.json +++ b/src/Web/WebMVC/appsettings.json @@ -13,7 +13,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Web/WebStatus/appsettings.json b/src/Web/WebStatus/appsettings.json index 82331d00b..efb2893ca 100644 --- a/src/Web/WebStatus/appsettings.json +++ b/src/Web/WebStatus/appsettings.json @@ -72,7 +72,7 @@ ], "Serilog": { "SeqServerUrl": null, - "LogstashgUrl":null, + "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", "MinimumLevel": { "Default": "Information", "Override": { From b449dd20120347a30be679015ada4084ecf12b4c Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Fri, 22 Mar 2019 13:46:27 +0100 Subject: [PATCH 42/52] Updated pointing to ELK external service for testing and demo purposes, documentation update --- elk/Readme.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/elk/Readme.md b/elk/Readme.md index a393e4a29..dddeab3fd 100644 --- a/elk/Readme.md +++ b/elk/Readme.md @@ -38,5 +38,51 @@ This options it have a certified preconfigured options (Network, VirtualMachine ![](img/elk/create-vm-elk-azure-summary.png) -When you have configured the main aspects of your virtual machine, you will have a review&create last step like this: -![](img/elk/create-vm-elk-azure-last-step.png) \ No newline at end of file +When you have configured the main aspects of your virtual machine, you will have a "review & create" last step like this: +![](img/elk/create-vm-elk-azure-last-step.png) + +### Configuring the bitnami environment + + This virtual machine has a lot of configuration pipeing done. If you want to change something of the default configuration you can address this documentation: + [https://docs.bitnami.com/virtual-machine/apps/elk/get-started/](https://docs.bitnami.com/virtual-machine/apps/elk/get-started/) + + The only thing you have to change is the logstash configuration inside the machine. This configuration is at the file ```/opt/bitnami/logstash/conf/logstash.conf``` + You must edit the file and overwrite with this configuration: + ```conf + input { + http { + #default host 0.0.0.0:8080 + codec => json + } +} + +## Add your filters / logstash plugins configuration here +filter { + split { + field => "events" + target => "e" + remove_field => "events" + } +} + +output { + elasticsearch { + hosts => "elasticsearch:9200" + index=>"eshops-%{+xxxx.ww}" + } +} +``` + +For doing this you can connect via ssh to the vm and edit the file using the vi editor for example. +When the file will be edited, check there are Inbound Port Rules created for the logstash service. You can do it going to Networking Menu on your ELK Virtual Machine Resource in Azure. + +![](img/elk/azure-nsg-inboundportsConfig.png) + +The only thing that remains is to connect to your vm vía browser. And check the bitnami splash page is showing. + +![](img/elk/bitnami_splash.png) + +You can get the password for accessing going to your virtual machine in azure and check the boot diagnostics, theres a message that shows to you which is your password. + +When you have the user and password you can access to the kibana tool, and create the ```eshops-*``` index pattern that is well documented at the beggining of this documentation and then start to discover. +![](img/elk/) \ No newline at end of file From a28ec949fca8e9b1a180ca6586dc2c496bdb18e2 Mon Sep 17 00:00:00 2001 From: Savorboard Date: Tue, 26 Mar 2019 09:07:44 +0800 Subject: [PATCH 43/52] Update EventBus notes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 19c548887..6fceb20ee 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ The architecture proposes a microservice oriented architecture implementation wi >

However, in a real production environment it is recommended to have your databases (SQL Server, Redis, and the NO-SQL database, in this case) in HA (High Available) services like Azure SQL Database, Redis as a service and Azure CosmosDB instead the MongoDB container (as both systems share the same access protocol). If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in an HA cloud or on-premises. > ### Important Note on EventBus -> In this solution's current EventBus is mainly used for learning purposes (development and testing), it is good but very incomplete, such as error handling and transactional consistency.

+> In this solution's current EventBus is a simplified implementation, mainly used for learning purposes (development and testing), so it doesn't handle all production scenarios, most notably on error handling.

> The following forks provide production environment level implementation examples with eShopOnContainers : > * Implementation with [CAP](https://github.com/dotnetcore/CAP) : https://github.com/yang-xiaodong/eShopOnContainers > * Implementation with [NServiceBus](https://github.com/Particular/NServiceBus) : https://github.com/Particular/eShopOnContainers From 0706c724ad1990d1b8d59c18a1ef1ad618ec4010 Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 27 Mar 2019 15:58:57 +0100 Subject: [PATCH 44/52] Changed default logstashUrl to null --- src/Services/Basket/Basket.API/appsettings.json | 2 +- src/Services/Catalog/Catalog.API/appsettings.json | 2 +- src/Services/Identity/Identity.API/appsettings.json | 2 +- src/Services/Location/Locations.API/appsettings.json | 2 +- src/Services/Marketing/Marketing.API/appsettings.json | 2 +- src/Services/Ordering/Ordering.API/appsettings.json | 2 +- src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json | 2 +- src/Services/Ordering/Ordering.SignalrHub/appsettings.json | 2 +- src/Services/Payment/Payment.API/appsettings.json | 2 +- src/Web/WebMVC/appsettings.json | 2 +- src/Web/WebStatus/appsettings.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Services/Basket/Basket.API/appsettings.json b/src/Services/Basket/Basket.API/appsettings.json index fb215cf56..fc8fc544a 100644 --- a/src/Services/Basket/Basket.API/appsettings.json +++ b/src/Services/Basket/Basket.API/appsettings.json @@ -1,7 +1,7 @@ { "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Catalog/Catalog.API/appsettings.json b/src/Services/Catalog/Catalog.API/appsettings.json index f56f4f3a8..cc7b1b1fb 100644 --- a/src/Services/Catalog/Catalog.API/appsettings.json +++ b/src/Services/Catalog/Catalog.API/appsettings.json @@ -4,7 +4,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Identity/Identity.API/appsettings.json b/src/Services/Identity/Identity.API/appsettings.json index 80dc3a50a..2f05c2d1c 100644 --- a/src/Services/Identity/Identity.API/appsettings.json +++ b/src/Services/Identity/Identity.API/appsettings.json @@ -7,7 +7,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Location/Locations.API/appsettings.json b/src/Services/Location/Locations.API/appsettings.json index 619668c77..7fbe98b3e 100644 --- a/src/Services/Location/Locations.API/appsettings.json +++ b/src/Services/Location/Locations.API/appsettings.json @@ -4,7 +4,7 @@ "IdentityUrl": "http://localhost:5105", "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Marketing/Marketing.API/appsettings.json b/src/Services/Marketing/Marketing.API/appsettings.json index 6abeb89b9..d4a58cc8e 100644 --- a/src/Services/Marketing/Marketing.API/appsettings.json +++ b/src/Services/Marketing/Marketing.API/appsettings.json @@ -1,7 +1,7 @@ { "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.API/appsettings.json b/src/Services/Ordering/Ordering.API/appsettings.json index 4865d62b1..f74c312b1 100644 --- a/src/Services/Ordering/Ordering.API/appsettings.json +++ b/src/Services/Ordering/Ordering.API/appsettings.json @@ -4,7 +4,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json b/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json index 3f6239256..51250be9d 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json +++ b/src/Services/Ordering/Ordering.BackgroundTasks/appsettings.json @@ -2,7 +2,7 @@ "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Ordering/Ordering.SignalrHub/appsettings.json b/src/Services/Ordering/Ordering.SignalrHub/appsettings.json index 68efc2800..e43c354a3 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/appsettings.json +++ b/src/Services/Ordering/Ordering.SignalrHub/appsettings.json @@ -2,7 +2,7 @@ "IdentityUrl": "http://localhost:5105", "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Services/Payment/Payment.API/appsettings.json b/src/Services/Payment/Payment.API/appsettings.json index e47377a06..a73471214 100644 --- a/src/Services/Payment/Payment.API/appsettings.json +++ b/src/Services/Payment/Payment.API/appsettings.json @@ -1,7 +1,7 @@ { "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Web/WebMVC/appsettings.json b/src/Web/WebMVC/appsettings.json index ee80b8b9e..96c75b932 100644 --- a/src/Web/WebMVC/appsettings.json +++ b/src/Web/WebMVC/appsettings.json @@ -13,7 +13,7 @@ "UseCustomizationData": false, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { diff --git a/src/Web/WebStatus/appsettings.json b/src/Web/WebStatus/appsettings.json index d98f24c26..da478fe30 100644 --- a/src/Web/WebStatus/appsettings.json +++ b/src/Web/WebStatus/appsettings.json @@ -5,7 +5,7 @@ }, "Serilog": { "SeqServerUrl": null, - "LogstashgUrl": "http://elk-dev.northeurope.cloudapp.azure.com:8080", + "LogstashgUrl": null, "MinimumLevel": { "Default": "Information", "Override": { From 1255e5f6044168f55c94e7c224c3f11ad192c0bb Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 27 Mar 2019 16:08:27 +0100 Subject: [PATCH 45/52] Updated Bootstrap to 4.3.1 to fix security issues --- src/Web/WebSPA/package-lock.json | 6 +++--- src/Web/WebSPA/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Web/WebSPA/package-lock.json b/src/Web/WebSPA/package-lock.json index 8386a6cf9..ea4aac4fd 100644 --- a/src/Web/WebSPA/package-lock.json +++ b/src/Web/WebSPA/package-lock.json @@ -2887,9 +2887,9 @@ } }, "bootstrap": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.3.tgz", - "integrity": "sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" }, "boxen": { "version": "1.3.0", diff --git a/src/Web/WebSPA/package.json b/src/Web/WebSPA/package.json index 2adfb5d84..11cb0b882 100644 --- a/src/Web/WebSPA/package.json +++ b/src/Web/WebSPA/package.json @@ -39,7 +39,7 @@ "@angular/router": "^7.2.10", "@aspnet/signalr": "1.0.3", "@ng-bootstrap/ng-bootstrap": "3.3.0", - "bootstrap": "4.1.3", + "bootstrap": "4.3.1", "core-js": "^2.5.0", "file-loader": "2.0.0", "font-awesome": "4.7.0", From 9192046f71b3fc48ae57cea835d70175b7af178b Mon Sep 17 00:00:00 2001 From: jmanuelcorral Date: Wed, 27 Mar 2019 16:50:49 +0100 Subject: [PATCH 46/52] Fixed some security issues with npm audit --- src/Web/WebSPA/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Web/WebSPA/package-lock.json b/src/Web/WebSPA/package-lock.json index ea4aac4fd..9a1e9af96 100644 --- a/src/Web/WebSPA/package-lock.json +++ b/src/Web/WebSPA/package-lock.json @@ -6959,9 +6959,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "dev": true, "requires": { "argparse": "^1.0.7", From e5630a322ab6fc15b5d557556cd7dd0fa1f25ded Mon Sep 17 00:00:00 2001 From: eiximenis Date: Thu, 28 Mar 2019 10:11:53 +0100 Subject: [PATCH 47/52] infrastructure build --- .../infrastructure/azure-pipelines.yml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 build/azure-devops/infrastructure/azure-pipelines.yml diff --git a/build/azure-devops/infrastructure/azure-pipelines.yml b/build/azure-devops/infrastructure/azure-pipelines.yml new file mode 100644 index 000000000..50296d457 --- /dev/null +++ b/build/azure-devops/infrastructure/azure-pipelines.yml @@ -0,0 +1,25 @@ +pool: + vmImage: 'ubuntu-16.04' +variables: + registryEndpoint: eshop-registry +trigger: + branches: + include: + - master + - dev + paths: + include: + - k8s/helm/basket-data/* + - k8s/helm/keystore-data/* + - k8s/helm/nosql-data/* + - k8s/helm/rabbitmq/* + - k8s/helm/sql-data/* +steps: +- task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)/k8s/helm + targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm +- task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm + artifactName: helm From a7c76f97a250f4fe54febbb8bac4ddc7c893aa16 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Thu, 28 Mar 2019 16:43:59 +0000 Subject: [PATCH 48/52] Simplify Enumeration and CardType classes as proposed in PR #704 --- .../BuyerAggregate/CardType.cs | 24 +++---------------- .../OrderAggregate/OrderStatus.cs | 4 ---- .../Ordering.Domain/SeedWork/Enumeration.cs | 3 --- 3 files changed, 3 insertions(+), 28 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.cs index d6a92892c..3053cb678 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/CardType.cs @@ -9,31 +9,13 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.B public class CardType : Enumeration { - public static CardType Amex = new AmexCardType(); - public static CardType Visa = new VisaCardType(); - public static CardType MasterCard = new MasterCardType(); + public static CardType Amex = new CardType(1, "Amex"); + public static CardType Visa = new CardType(2, "Visa"); + public static CardType MasterCard = new CardType(3, "MasterCard"); public CardType(int id, string name) : base(id, name) { } - - private class AmexCardType : CardType - { - public AmexCardType() : base(1, "Amex") - { } - } - - private class VisaCardType : CardType - { - public VisaCardType() : base(2, "Visa") - { } - } - - private class MasterCardType : CardType - { - public MasterCardType() : base(3, "MasterCard") - { } - } } } diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs index 1716cc32d..19e62311a 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs @@ -16,10 +16,6 @@ public static OrderStatus Shipped = new OrderStatus(5, nameof(Shipped).ToLowerInvariant()); public static OrderStatus Cancelled = new OrderStatus(6, nameof(Cancelled).ToLowerInvariant()); - protected OrderStatus() - { - } - public OrderStatus(int id, string name) : base(id, name) { diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.cs index a1e4c4c7e..d3e415df2 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/Enumeration.cs @@ -11,9 +11,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork public int Id { get; private set; } - protected Enumeration() - { } - protected Enumeration(int id, string name) { Id = id; From 468f117df53f849dafebf513d94b7486e8905293 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Thu, 28 Mar 2019 18:22:15 +0000 Subject: [PATCH 49/52] Remove test class for MVC project --- .../Application/OrderControllerTest.cs | 86 ------------------- .../Ordering.UnitTests.csproj | 1 - 2 files changed, 87 deletions(-) delete mode 100644 src/Services/Ordering/Ordering.UnitTests/Application/OrderControllerTest.cs diff --git a/src/Services/Ordering/Ordering.UnitTests/Application/OrderControllerTest.cs b/src/Services/Ordering/Ordering.UnitTests/Application/OrderControllerTest.cs deleted file mode 100644 index a60ce3bb3..000000000 --- a/src/Services/Ordering/Ordering.UnitTests/Application/OrderControllerTest.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.eShopOnContainers.WebMVC.Controllers; -using Microsoft.eShopOnContainers.WebMVC.Services; -using Microsoft.eShopOnContainers.WebMVC.ViewModels; -using Moq; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Xunit; -using BasketModel = Microsoft.eShopOnContainers.WebMVC.ViewModels.Basket; - -namespace UnitTest.Ordering.Application -{ - public class OrderControllerTest - { - private readonly Mock _orderServiceMock; - private readonly Mock _basketServiceMock; - private readonly Mock> _identityParserMock; - private readonly Mock _contextMock; - - public OrderControllerTest() - { - _orderServiceMock = new Mock(); - _basketServiceMock = new Mock(); - _identityParserMock = new Mock>(); - _contextMock = new Mock(); - } - - [Fact] - public async Task Get_order_list_success() - { - //Arrange - var expectedTotalResults = 1; - var fakeOrder = GetFakeOrder(); - - _orderServiceMock.Setup(x => x.GetMyOrders(It.IsAny())) - .Returns(Task.FromResult(new List() { fakeOrder })); - - //Act - var orderController = new OrderController(_orderServiceMock.Object, _basketServiceMock.Object, _identityParserMock.Object); - orderController.ControllerContext.HttpContext = _contextMock.Object; - var actionResult = await orderController.Index(fakeOrder); - - //Assert - var viewResult = Assert.IsType(actionResult); - var model = Assert.IsAssignableFrom>(viewResult.ViewData.Model); - Assert.Equal(model.Count, expectedTotalResults); - } - - [Fact] - public async Task Get_order_detail_success() - { - //Arrange - var fakeOrderId = "12"; - var fakeOrder = GetFakeOrder(); - - _orderServiceMock.Setup(x => x.GetOrder(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(fakeOrder)); - - //Act - var orderController = new OrderController(_orderServiceMock.Object, _basketServiceMock.Object, _identityParserMock.Object); - orderController.ControllerContext.HttpContext = _contextMock.Object; - var actionResult = await orderController.Detail(fakeOrderId); - - //Assert - var viewResult = Assert.IsType(actionResult); - Assert.IsAssignableFrom(viewResult.ViewData.Model); - } - - - - private Order GetFakeOrder() - { - return new Order() - { - OrderNumber = "1", - CardNumber = "12", - CardSecurityNumber = "1212", - Status = "Pending", - RequestId = Guid.NewGuid(), - CardExpiration = DateTime.Now.AddYears(1), - }; - } - } -} diff --git a/src/Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj b/src/Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj index 6a3d3c284..e94aae4f1 100644 --- a/src/Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj +++ b/src/Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj @@ -19,7 +19,6 @@ - From a962ac4c224cbaa899d0e61a6d975c91d984f354 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Fri, 29 Mar 2019 10:58:13 +0100 Subject: [PATCH 50/52] removing uneeded files --- docker-scripts/linux/install-node.sh | 8 -------- docker-scripts/win/install-node.cmd | 4 ---- 2 files changed, 12 deletions(-) delete mode 100644 docker-scripts/linux/install-node.sh delete mode 100644 docker-scripts/win/install-node.cmd diff --git a/docker-scripts/linux/install-node.sh b/docker-scripts/linux/install-node.sh deleted file mode 100644 index 73407aae9..000000000 --- a/docker-scripts/linux/install-node.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -export NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60 -curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \ - && echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \ - && tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \ - && rm nodejs.tar.gz \ - && ln -s /usr/local/bin/node /usr/local/bin/nodejs diff --git a/docker-scripts/win/install-node.cmd b/docker-scripts/win/install-node.cmd deleted file mode 100644 index eaa4e356c..000000000 --- a/docker-scripts/win/install-node.cmd +++ /dev/null @@ -1,4 +0,0 @@ -set NODE_VERSION=8.11.1 -curl -SL "https://nodejs.org/dist/v%NODE_VERSION%/node-v%NODE_VERSION%-win-x64.zip" --output nodejs.zip -tar -xf nodejs.zip -C c:\ -setx PATH "%PATH%;c:\node-v%NODE_VERSION%-win-x64" \ No newline at end of file From 7166773a7e3e962a22f97275a9b7c9c30bd567e8 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Fri, 29 Mar 2019 12:26:54 +0100 Subject: [PATCH 51/52] compose for put linux and win in tag --- docker-compose.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2a0448bad..8c523e122 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,7 +18,7 @@ services: image: rabbitmq:3-management-alpine identity.api: - image: ${REGISTRY:-eshop}/identity.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/identity.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Identity/Identity.API/Dockerfile @@ -26,7 +26,7 @@ services: - sql.data basket.api: - image: ${REGISTRY:-eshop}/basket.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/basket.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Basket/Basket.API/Dockerfile @@ -36,7 +36,7 @@ services: - rabbitmq catalog.api: - image: ${REGISTRY:-eshop}/catalog.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/catalog.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Catalog/Catalog.API/Dockerfile @@ -45,7 +45,7 @@ services: - rabbitmq ordering.api: - image: ${REGISTRY:-eshop}/ordering.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/ordering.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Ordering/Ordering.API/Dockerfile @@ -54,7 +54,7 @@ services: - rabbitmq ordering.backgroundtasks: - image: ${REGISTRY:-eshop}/ordering.backgroundtasks:${TAG:-latest} + image: ${REGISTRY:-eshop}/ordering.backgroundtasks:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile @@ -63,7 +63,7 @@ services: - rabbitmq marketing.api: - image: ${REGISTRY:-eshop}/marketing.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/marketing.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Marketing/Marketing.API/Dockerfile @@ -74,7 +74,7 @@ services: - rabbitmq payment.api: - image: ${REGISTRY:-eshop}/payment.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/payment.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Payment/Payment.API/Dockerfile @@ -82,7 +82,7 @@ services: - rabbitmq locations.api: - image: ${REGISTRY:-eshop}/locations.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/locations.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Location/Locations.API/Dockerfile @@ -91,7 +91,7 @@ services: - rabbitmq webhooks.api: - image: ${REGISTRY:-eshop}/webhooks.api:${TAG:-latest} + image: ${REGISTRY:-eshop}/webhooks.api:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Webhooks/Webhooks.API/Dockerfile @@ -99,7 +99,7 @@ services: - sql.data mobileshoppingapigw: - image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest} + image: ${REGISTRY:-eshop}/ocelotapigw:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile @@ -114,7 +114,7 @@ services: - basket.api mobilemarketingapigw: - image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest} + image: ${REGISTRY:-eshop}/ocelotapigw:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile @@ -129,7 +129,7 @@ services: - basket.api webshoppingapigw: - image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest} + image: ${REGISTRY:-eshop}/ocelotapigw:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile @@ -144,7 +144,7 @@ services: - basket.api webmarketingapigw: - image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest} + image: ${REGISTRY:-eshop}/ocelotapigw:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile @@ -159,7 +159,7 @@ services: - basket.api mobileshoppingagg: - image: ${REGISTRY:-eshop}/mobileshoppingagg:${TAG:-latest} + image: ${REGISTRY:-eshop}/mobileshoppingagg:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile @@ -174,7 +174,7 @@ services: - basket.api webshoppingagg: - image: ${REGISTRY:-eshop}/webshoppingagg:${TAG:-latest} + image: ${REGISTRY:-eshop}/webshoppingagg:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile @@ -189,7 +189,7 @@ services: - basket.api ordering.signalrhub: - image: ${REGISTRY:-eshop}/ordering.signalrhub:${TAG:-latest} + image: ${REGISTRY:-eshop}/ordering.signalrhub:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Services/Ordering/Ordering.SignalrHub/Dockerfile @@ -204,13 +204,13 @@ services: - basket.api webstatus: - image: ${REGISTRY:-eshop}/webstatus:${TAG:-latest} + image: ${REGISTRY:-eshop}/webstatus:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Web/WebStatus/Dockerfile webspa: - image: ${REGISTRY:-eshop}/webspa:${TAG:-latest} + image: ${REGISTRY:-eshop}/webspa:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Web/WebSPA/Dockerfile @@ -220,7 +220,7 @@ services: # - webmarketingapigw webmvc: - image: ${REGISTRY:-eshop}/webmvc:${TAG:-latest} + image: ${REGISTRY:-eshop}/webmvc:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Web/WebMVC/Dockerfile @@ -230,7 +230,7 @@ services: - webmarketingapigw webhooks.client: - image: ${REGISTRY:-eshop}/webhooks.client:${TAG:-latest} + image: ${REGISTRY:-eshop}/webhooks.client:${PLATFORM:-linux}-${TAG:-latest} build: context: . dockerfile: src/Web/WebhookClient/Dockerfile From 8ef234a9608c0d93f51e468af52a6aa2a9f34139 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Fri, 29 Mar 2019 13:54:20 +0100 Subject: [PATCH 52/52] PS1 for creating multiarch manifests --- .../multiarch-manifests/create-manifests.ps1 | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 build/multiarch-manifests/create-manifests.ps1 diff --git a/build/multiarch-manifests/create-manifests.ps1 b/build/multiarch-manifests/create-manifests.ps1 new file mode 100644 index 000000000..cc7f05194 --- /dev/null +++ b/build/multiarch-manifests/create-manifests.ps1 @@ -0,0 +1,26 @@ +Param( + [parameter(Mandatory=$true)][string]$registry +) + +if ([String]::IsNullOrEmpty($registry)) { + Write-Host "Registry must be set to docker registry to use" -ForegroundColor Red + exit 1 +} + +Write-Host "This script creates the local manifests, for pushing the multi-arch manifests" -ForegroundColor Yellow +Write-Host "Tags used are linux-master, win-master, linux-dev, win-dev, linux-latest, win-latest" -ForegroundColor Yellow +Write-Host "Multiarch images tags will be master, dev, latest" -ForegroundColor Yellow + + +$services = "identity.api", "basket.api", "catalog.api", "ordering.api", "ordering.backgroundtasks", "marketing.api", "payment.api", "locations.api", "webhooks.api", "ocelotapigw", "mobileshoppingagg", "webshoppingagg", "ordering.signalrhub", "webstatus", "webspa", "webmvc", "webhooks.client" + +foreach ($svc in $services) { + Write-Host "Creating manifest for $svc and tags :latest, :master, and :dev" + docker manifest create $registry/${svc}:master $registry/${svc}:linux-master $registry/${svc}:win-master + docker manifest create $registry/${svc}:dev $registry/${svc}:linux-dev $registry/${svc}:win-dev + docker manifest create $registry/${svc}:latest $registry/${svc}:linux-latest $registry/${svc}:win-latest + Write-Host "Pushing manifest for $svc and tags :latest, :master, and :dev" + docker manifest push $registry/${svc}:latest + docker manifest push $registry/${svc}:dev + docker manifest push $registry/${svc}:master +} \ No newline at end of file

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 z≪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