Browse Source

Merge branch 'main' into philliphoff-arm64

philliphoff-arm64
Phillip Hoff 5 years ago
parent
commit
b6f28746b4
  1. 15
      docs/getting_started.md
  2. 4
      docs/tutorials/hello-tye/00_run_locally.md
  3. 12
      docs/tutorials/hello-tye/01_deploy.md
  4. 20
      eng/Version.Details.xml
  5. 2
      eng/common/dotnet-install.sh
  6. 6
      eng/common/internal-feed-operations.ps1
  7. 2
      eng/common/internal-feed-operations.sh
  8. 4
      eng/common/sdk-task.ps1
  9. 2
      eng/common/sdl/execute-all-sdl-tools.ps1
  10. 2
      eng/common/sdl/init-sdl.ps1
  11. 2
      eng/common/sdl/run-sdl.ps1
  12. 8
      eng/common/templates/job/onelocbuild.yml
  13. 6
      eng/common/templates/job/source-index-stage1.yml
  14. 99
      eng/common/tools.ps1
  15. 9
      eng/common/tools.sh
  16. 2
      global.json
  17. 111
      samples/apps-with-core-angular/MoviesApp/package-lock.json
  18. 2
      samples/dapr/pub-sub/tye.yaml
  19. 7
      src/Microsoft.Tye.Hosting/DockerRunner.cs
  20. 7
      src/Microsoft.Tye.Hosting/Model/Application.cs
  21. 15
      src/Microsoft.Tye.Hosting/Model/V1/V1Application.cs
  22. 5
      src/Microsoft.Tye.Hosting/ProxyService.cs
  23. 21
      src/Microsoft.Tye.Hosting/TyeDashboardApi.cs
  24. 2
      src/tye/ApplicationBuilderExtensions.cs
  25. 4
      test/Test.Infrastructure/TestHelpers.cs

15
docs/getting_started.md

@ -2,10 +2,10 @@
Tye is a tool that makes developing, testing, and deploying microservices and distributed applications easier. Project Tye includes a local orchestrator to make developing microservices easier and the ability to deploy microservices to Kubernetes with minimal configuration. Tye is a tool that makes developing, testing, and deploying microservices and distributed applications easier. Project Tye includes a local orchestrator to make developing microservices easier and the ability to deploy microservices to Kubernetes with minimal configuration.
## Installing tye ## Installing Tye
1. Install [.NET Core 3.1](<http://dot.net>). 1. Install [.NET Core 3.1](<http://dot.net>).
2. Install tye via the following command: 1. Install tye via the following command:
```text ```text
dotnet tool install -g Microsoft.Tye --version "0.7.0-alpha.21279.2" dotnet tool install -g Microsoft.Tye --version "0.7.0-alpha.21279.2"
@ -17,10 +17,19 @@ Tye is a tool that makes developing, testing, and deploying microservices and di
dotnet tool update -g Microsoft.Tye --version "0.7.0-alpha.21279.2" dotnet tool update -g Microsoft.Tye --version "0.7.0-alpha.21279.2"
``` ```
> If using Mac and, if getting "command not found" errors when running `tye`, you may need to ensure that the `$HOME/.dotnet/tools` directory has been added to `PATH`.
>
> For example, add the following to the end of your `~/.zshrc` or `~/.zprofile`:
>
> ```
> # Add .NET global tools (like Tye) to PATH.
> export PATH=$HOME/.dotnet/tools:$PATH
> ```
## Next steps ## Next steps
1. Once tye is installed, continue to the [Basic Tutorial](/docs/tutorials/hello-tye/00_run_locally.md). 1. Once tye is installed, continue to the [Basic Tutorial](/docs/tutorials/hello-tye/00_run_locally.md).
2. Check out additional samples for more advanced concepts, such as using redis, rabbitmq, and service discovery. 1. Check out additional samples for more advanced concepts, such as using redis, rabbitmq, and service discovery.
## Working with CI builds ## Working with CI builds

4
docs/tutorials/hello-tye/00_run_locally.md

@ -1,6 +1,6 @@
# Frontend Backend sample with tye run # Frontend Backend sample with tye run
This tutorial will demonstrate how to use [`tye run`](/docs/reference/commandline/tye-run.md) to run a multi-project application. If you haven't so already, follow the [Getting Started Instructions](/docs/getting_started.md) to install tye. This tutorial will demonstrate how to use [`tye run`](/docs/reference/commandline/tye-run.md) to run a multi-project application. If you haven't done so already, follow the [Getting Started Instructions](/docs/getting_started.md) to install tye.
## Running a single application with tye run ## Running a single application with tye run
@ -28,7 +28,7 @@ This tutorial will demonstrate how to use [`tye run`](/docs/reference/commandlin
The dashboard should show the `frontend` application running. The dashboard should show the `frontend` application running.
- The `Logs` column has a link to view the streaming logs for the service. - The `Logs` column has a link to view the streaming logs for the service.
- the `Bindings` column has links to the listening URLs of the service. - The `Bindings` column has links to the listening URLs of the service.
Navigate to the `frontend` service using one of the urls on the dashboard in the *Bindings* column. It should be in the form of <http://localhost:[port]> or <https://localhost:[port]>. Navigate to the `frontend` service using one of the urls on the dashboard in the *Bindings* column. It should be in the form of <http://localhost:[port]> or <https://localhost:[port]>.

12
docs/tutorials/hello-tye/01_deploy.md

@ -34,9 +34,9 @@ Now that we have our application running locally, let's deploy the application.
You will be prompted to enter your container registry. This is needed to tag images, and to push them to a location accessible by kubernetes. You will be prompted to enter your container registry. This is needed to tag images, and to push them to a location accessible by kubernetes.
> :bulb: Under the hood `tye` uses `kubectl` and to execute deployments. In cases if you don't have `kubectl` installed or it's current context is invalid `tye deploy` will fail with the following error: "Drats! 'deploy' failed: Cannot apply manifests because kubectl is not installed." > :bulb: Under the hood `tye` uses `kubectl` to execute deployments. In cases where you don't have `kubectl` installed or it's current context is invalid `tye deploy` will fail with the following error: "Drats! 'deploy' failed: Cannot apply manifests because kubectl is not installed."
If you are using dockerhub, the registry name will your dockerhub username. If you are a standalone container registry (for instance from your cloud provider), the registry name will look like a hostname, eg: `example.azurecr.io`. If you are using dockerhub, the registry name will be your dockerhub username. If you use a standalone container registry (for instance from your cloud provider), the registry name will look like a hostname, eg: `example.azurecr.io`.
`tye deploy` does many different things to deploy an application to Kubernetes. It will: `tye deploy` does many different things to deploy an application to Kubernetes. It will:
- Create a docker image for each project in your application. - Create a docker image for each project in your application.
@ -77,9 +77,9 @@ Now that we have our application running locally, let's deploy the application.
kubectl port-forward svc/frontend 5000:80 kubectl port-forward svc/frontend 5000:80
``` ```
Now navigate to <http://localhost:5000> to view the frontend application working on Kubernetes. You should see the list of weather forecasts just like when you were running locally. Now navigate to <http://localhost:5000> to view the frontend application running on Kubernetes. You should see the list of weather forecasts just like when you were running locally.
> :bulb: Currently `tye` does not provide a way to expose pods/services created to the public internet. We'll add features related to `Ingress` in future releases. > :bulb: Currently `tye` does not provide a way to expose pods/services to the public internet. We'll add features related to `Ingress` in future releases.
> :warning: Currently `tye` does not automatically enable TLS within the cluster, and so communication takes place over HTTP instead of HTTPS. This is typical way to deploy services in kubernetes - we may look to enable TLS as an option or by default in the future. > :warning: Currently `tye` does not automatically enable TLS within the cluster, and so communication takes place over HTTP instead of HTTPS. This is typical way to deploy services in kubernetes - we may look to enable TLS as an option or by default in the future.
@ -128,11 +128,11 @@ Tye has a optional configuration file (`tye.yaml`) to allow customizing settings
registry: <registry_name> registry: <registry_name>
``` ```
If you are using dockerhub, the registry_name will your dockerhub username. If you are a standalone container registry (for instance from your cloud provider), the registry_name will look like a hostname, eg: `example.azurecr.io`. If you are using dockerhub, the registry_name will your dockerhub username. If you use a standalone container registry (for instance from your cloud provider), the registry_name will look like a hostname, eg: `example.azurecr.io`.
Now it's possible to use `tye deploy` without `--interactive` since the registry is stored as part of configuration. Now it's possible to use `tye deploy` without `--interactive` since the registry is stored as part of configuration.
> :question: This step may not make much sense if you're using `tye.yaml` to store a personal Dockerhub username. A more typical use case would storing the name of a private registry for use in a CI/CD system. > :question: This step may not make much sense if you're using `tye.yaml` to store a personal Dockerhub username. A more typical use case would be storing the name of a private registry for use in a CI/CD system.
## Undeploying the application ## Undeploying the application

20
eng/Version.Details.xml

@ -3,25 +3,25 @@
<ProductDependencies> <ProductDependencies>
</ProductDependencies> </ProductDependencies>
<ToolsetDependencies> <ToolsetDependencies>
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="6.0.0-beta.21303.2"> <Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="6.0.0-beta.21317.1">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>78da7776965b428ff31da8f1ff2cb073506212b7</Sha> <Sha>5619c32997ab2d6a5ddf6d2e488c572b882f891b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.Build.Tasks.Feed" Version="6.0.0-beta.21303.2"> <Dependency Name="Microsoft.DotNet.Build.Tasks.Feed" Version="6.0.0-beta.21317.1">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>78da7776965b428ff31da8f1ff2cb073506212b7</Sha> <Sha>5619c32997ab2d6a5ddf6d2e488c572b882f891b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.SignTool" Version="6.0.0-beta.21303.2"> <Dependency Name="Microsoft.DotNet.SignTool" Version="6.0.0-beta.21317.1">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>78da7776965b428ff31da8f1ff2cb073506212b7</Sha> <Sha>5619c32997ab2d6a5ddf6d2e488c572b882f891b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="6.0.0-beta.21303.2"> <Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="6.0.0-beta.21317.1">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>78da7776965b428ff31da8f1ff2cb073506212b7</Sha> <Sha>5619c32997ab2d6a5ddf6d2e488c572b882f891b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.SwaggerGenerator.MSBuild" Version="6.0.0-beta.21303.2"> <Dependency Name="Microsoft.DotNet.SwaggerGenerator.MSBuild" Version="6.0.0-beta.21317.1">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>78da7776965b428ff31da8f1ff2cb073506212b7</Sha> <Sha>5619c32997ab2d6a5ddf6d2e488c572b882f891b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.Maestro.Client" Version="1.1.0-beta.19556.4"> <Dependency Name="Microsoft.DotNet.Maestro.Client" Version="1.1.0-beta.19556.4">
<Uri>https://github.com/dotnet/arcade-services</Uri> <Uri>https://github.com/dotnet/arcade-services</Uri>

2
eng/common/dotnet-install.sh

@ -70,7 +70,7 @@ case $cpuname in
;; ;;
esac esac
dotnetRoot="$repo_root/.dotnet" dotnetRoot="${repo_root}.dotnet"
if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then
dotnetRoot="$dotnetRoot/$architecture" dotnetRoot="$dotnetRoot/$architecture"
fi fi

6
eng/common/internal-feed-operations.ps1

@ -45,11 +45,11 @@ function SetupCredProvider {
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable # Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
# feeds successfully # feeds successfully
$nugetConfigPath = "$RepoRoot\NuGet.config" $nugetConfigPath = Join-Path $RepoRoot "NuGet.config"
if (-Not (Test-Path -Path $nugetConfigPath)) { if (-Not (Test-Path -Path $nugetConfigPath)) {
Write-PipelineTelemetryError -Category 'Build' -Message 'NuGet.config file not found in repo root!' Write-PipelineTelemetryError -Category 'Build' -Message 'NuGet.config file not found in repo root!'
ExitWithExitCode 1 ExitWithExitCode 1
} }
$endpoints = New-Object System.Collections.ArrayList $endpoints = New-Object System.Collections.ArrayList
@ -85,7 +85,7 @@ function SetupCredProvider {
#Workaround for https://github.com/microsoft/msbuild/issues/4430 #Workaround for https://github.com/microsoft/msbuild/issues/4430
function InstallDotNetSdkAndRestoreArcade { function InstallDotNetSdkAndRestoreArcade {
$dotnetTempDir = "$RepoRoot\dotnet" $dotnetTempDir = Join-Path $RepoRoot "dotnet"
$dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*) $dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*)
$dotnet = "$dotnetTempDir\dotnet.exe" $dotnet = "$dotnetTempDir\dotnet.exe"
$restoreProjPath = "$PSScriptRoot\restore.proj" $restoreProjPath = "$PSScriptRoot\restore.proj"

2
eng/common/internal-feed-operations.sh

@ -39,7 +39,7 @@ function SetupCredProvider {
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable # Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
# feeds successfully # feeds successfully
local nugetConfigPath="$repo_root/NuGet.config" local nugetConfigPath="{$repo_root}NuGet.config"
if [ ! "$nugetConfigPath" ]; then if [ ! "$nugetConfigPath" ]; then
Write-PipelineTelemetryError -category 'Build' "NuGet.config file not found in repo's root!" Write-PipelineTelemetryError -category 'Build' "NuGet.config file not found in repo's root!"

4
eng/common/sdk-task.ps1

@ -34,7 +34,7 @@ function Print-Usage() {
function Build([string]$target) { function Build([string]$target) {
$logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" } $logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" }
$log = Join-Path $LogDir "$task$logSuffix.binlog" $log = Join-Path $LogDir "$task$logSuffix.binlog"
$outputPath = Join-Path $ToolsetDir "$task\\" $outputPath = Join-Path $ToolsetDir "$task\"
MSBuild $taskProject ` MSBuild $taskProject `
/bl:$log ` /bl:$log `
@ -64,7 +64,7 @@ try {
$GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty $GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty
} }
if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) { if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) {
$GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.8.0-preview3" -MemberType NoteProperty $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.10.0-preview2" -MemberType NoteProperty
} }
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") { if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true $xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true

2
eng/common/sdl/execute-all-sdl-tools.ps1

@ -32,7 +32,7 @@ try {
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
Set-StrictMode -Version 2.0 Set-StrictMode -Version 2.0
$disableConfigureToolsetImport = $true $disableConfigureToolsetImport = $true
$LASTEXITCODE = 0 $global:LASTEXITCODE = 0
# `tools.ps1` checks $ci to perform some actions. Since the SDL # `tools.ps1` checks $ci to perform some actions. Since the SDL
# scripts don't necessarily execute in the same agent that run the # scripts don't necessarily execute in the same agent that run the

2
eng/common/sdl/init-sdl.ps1

@ -10,7 +10,7 @@ Param(
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
Set-StrictMode -Version 2.0 Set-StrictMode -Version 2.0
$disableConfigureToolsetImport = $true $disableConfigureToolsetImport = $true
$LASTEXITCODE = 0 $global:LASTEXITCODE = 0
# `tools.ps1` checks $ci to perform some actions. Since the SDL # `tools.ps1` checks $ci to perform some actions. Since the SDL
# scripts don't necessarily execute in the same agent that run the # scripts don't necessarily execute in the same agent that run the

2
eng/common/sdl/run-sdl.ps1

@ -13,7 +13,7 @@ Param(
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
Set-StrictMode -Version 2.0 Set-StrictMode -Version 2.0
$disableConfigureToolsetImport = $true $disableConfigureToolsetImport = $true
$LASTEXITCODE = 0 $global:LASTEXITCODE = 0
try { try {
# `tools.ps1` checks $ci to perform some actions. Since the SDL # `tools.ps1` checks $ci to perform some actions. Since the SDL

8
eng/common/templates/job/onelocbuild.yml

@ -18,6 +18,9 @@ parameters:
LclSource: lclFilesInRepo LclSource: lclFilesInRepo
LclPackageId: '' LclPackageId: ''
RepoType: gitHub RepoType: gitHub
GitHubOrg: dotnet
MirrorRepo: ''
MirrorBranch: main
condition: '' condition: ''
jobs: jobs:
@ -66,6 +69,11 @@ jobs:
${{ if eq(parameters.RepoType, 'gitHub') }}: ${{ if eq(parameters.RepoType, 'gitHub') }}:
repoType: ${{ parameters.RepoType }} repoType: ${{ parameters.RepoType }}
gitHubPatVariable: "${{ parameters.GithubPat }}" gitHubPatVariable: "${{ parameters.GithubPat }}"
${{ if ne(parameters.MirrorRepo, '') }}:
isMirrorRepoSelected: true
gitHubOrganization: ${{ parameters.GitHubOrg }}
mirrorRepo: ${{ parameters.MirrorRepo }}
mirrorBranch: ${{ parameters.MirrorBranch }}
condition: ${{ parameters.condition }} condition: ${{ parameters.condition }}
- task: PublishBuildArtifacts@1 - task: PublishBuildArtifacts@1

6
eng/common/templates/job/source-index-stage1.yml

@ -1,15 +1,19 @@
parameters: parameters:
runAsPublic: false runAsPublic: false
sourceIndexPackageVersion: 1.0.1-20210421.1 sourceIndexPackageVersion: 1.0.1-20210614.1
sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json
sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci" sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci"
preSteps: [] preSteps: []
binlogPath: artifacts/log/Debug/Build.binlog binlogPath: artifacts/log/Debug/Build.binlog
pool: pool:
vmImage: vs2017-win2016 vmImage: vs2017-win2016
condition: ''
dependsOn: ''
jobs: jobs:
- job: SourceIndexStage1 - job: SourceIndexStage1
dependsOn: ${{ parameters.dependsOn }}
condition: ${{ parameters.condition }}
variables: variables:
- name: SourceIndexPackageVersion - name: SourceIndexPackageVersion
value: ${{ parameters.sourceIndexPackageVersion }} value: ${{ parameters.sourceIndexPackageVersion }}

99
eng/common/tools.ps1

@ -193,38 +193,42 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) {
return $global:_DotNetInstallDir = $dotnetRoot return $global:_DotNetInstallDir = $dotnetRoot
} }
function Retry($downloadBlock, $maxRetries = 5) {
$retries = 1
while($true) {
try {
& $downloadBlock
break
}
catch {
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_
}
if (++$retries -le $maxRetries) {
$delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff
Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)."
Start-Sleep -Seconds $delayInSeconds
}
else {
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to download file in $maxRetries attempts."
break
}
}
}
function GetDotNetInstallScript([string] $dotnetRoot) { function GetDotNetInstallScript([string] $dotnetRoot) {
$installScript = Join-Path $dotnetRoot 'dotnet-install.ps1' $installScript = Join-Path $dotnetRoot 'dotnet-install.ps1'
if (!(Test-Path $installScript)) { if (!(Test-Path $installScript)) {
Create-Directory $dotnetRoot Create-Directory $dotnetRoot
$ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit
$maxRetries = 5
$retries = 1
$uri = "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1" $uri = "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1"
while($true) { Retry({
try { Write-Host "GET $uri"
Write-Host "GET $uri" Invoke-WebRequest $uri -OutFile $installScript
Invoke-WebRequest $uri -OutFile $installScript })
break
}
catch {
Write-Host "Failed to download '$uri'"
Write-Error $_.Exception.Message -ErrorAction Continue
}
if (++$retries -le $maxRetries) {
$delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff
Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)."
Start-Sleep -Seconds $delayInSeconds
}
else {
throw "Unable to download file in $maxRetries attempts."
}
}
} }
return $installScript return $installScript
@ -308,8 +312,8 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
# If the version of msbuild is going to be xcopied, # If the version of msbuild is going to be xcopied,
# use this version. Version matches a package here: # use this version. Version matches a package here:
# https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.8.0-preview3&view=overview # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.10.0-preview2&view=overview
$defaultXCopyMSBuildVersion = '16.8.0-preview3' $defaultXCopyMSBuildVersion = '16.10.0-preview2'
if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
$vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { $vsMinVersionReqdStr } $vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { $vsMinVersionReqdStr }
@ -403,9 +407,13 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) {
} }
Create-Directory $packageDir Create-Directory $packageDir
Write-Host "Downloading $packageName $packageVersion" Write-Host "Downloading $packageName $packageVersion"
$ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit
Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath Retry({
Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -OutFile $packagePath
})
Unzip $packagePath $packageDir Unzip $packagePath $packageDir
} }
@ -442,27 +450,9 @@ function LocateVisualStudio([object]$vsRequirements = $null){
if (!(Test-Path $vsWhereExe)) { if (!(Test-Path $vsWhereExe)) {
Create-Directory $vsWhereDir Create-Directory $vsWhereDir
Write-Host 'Downloading vswhere' Write-Host 'Downloading vswhere'
$maxRetries = 5 Retry({
$retries = 1 Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe
})
while($true) {
try {
Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe
break
}
catch{
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_
}
if (++$retries -le $maxRetries) {
$delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff
Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)."
Start-Sleep -Seconds $delayInSeconds
}
else {
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to download file in $maxRetries attempts."
}
}
} }
if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
@ -498,7 +488,7 @@ function InitializeBuildTool() {
if (Test-Path variable:global:_BuildTool) { if (Test-Path variable:global:_BuildTool) {
# If the requested msbuild parameters do not match, clear the cached variables. # If the requested msbuild parameters do not match, clear the cached variables.
if($global:_BuildTool.Contains('ExcludePrereleaseVS') -and $global:_BuildTool.ExcludePrereleaseVS -ne $excludePrereleaseVS) { if($global:_BuildTool.Contains('ExcludePrereleaseVS') -and $global:_BuildTool.ExcludePrereleaseVS -ne $excludePrereleaseVS) {
Remove-Item variable:global:_BuildTool Remove-Item variable:global:_BuildTool
Remove-Item variable:global:_MSBuildExe Remove-Item variable:global:_MSBuildExe
} else { } else {
return $global:_BuildTool return $global:_BuildTool
@ -555,7 +545,7 @@ function GetDefaultMSBuildEngine() {
function GetNuGetPackageCachePath() { function GetNuGetPackageCachePath() {
if ($env:NUGET_PACKAGES -eq $null) { if ($env:NUGET_PACKAGES -eq $null) {
# Use local cache on CI to ensure deterministic build. # Use local cache on CI to ensure deterministic build.
# Avoid using the http cache as workaround for https://github.com/NuGet/Home/issues/3116 # Avoid using the http cache as workaround for https://github.com/NuGet/Home/issues/3116
# use global cache in dev builds to avoid cost of downloading packages. # use global cache in dev builds to avoid cost of downloading packages.
# For directory normalization, see also: https://github.com/NuGet/Home/issues/7968 # For directory normalization, see also: https://github.com/NuGet/Home/issues/7968
@ -712,7 +702,10 @@ function MSBuild-Core() {
} }
foreach ($arg in $args) { foreach ($arg in $args) {
if ($arg -ne $null -and $arg.Trim() -ne "") { if ($null -ne $arg -and $arg.Trim() -ne "") {
if ($arg.EndsWith('\')) {
$arg = $arg + "\"
}
$cmdArgs += " `"$arg`"" $cmdArgs += " `"$arg`""
} }
} }
@ -784,7 +777,7 @@ function Get-Darc($version) {
. $PSScriptRoot\pipeline-logging-functions.ps1 . $PSScriptRoot\pipeline-logging-functions.ps1
$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..') $RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..\')
$EngRoot = Resolve-Path (Join-Path $PSScriptRoot '..') $EngRoot = Resolve-Path (Join-Path $PSScriptRoot '..')
$ArtifactsDir = Join-Path $RepoRoot 'artifacts' $ArtifactsDir = Join-Path $RepoRoot 'artifacts'
$ToolsetDir = Join-Path $ArtifactsDir 'toolset' $ToolsetDir = Join-Path $ArtifactsDir 'toolset'

9
eng/common/tools.sh

@ -485,13 +485,14 @@ _script_dir=`dirname "$_ResolvePath"`
eng_root=`cd -P "$_script_dir/.." && pwd` eng_root=`cd -P "$_script_dir/.." && pwd`
repo_root=`cd -P "$_script_dir/../.." && pwd` repo_root=`cd -P "$_script_dir/../.." && pwd`
artifacts_dir="$repo_root/artifacts" repo_root="${repo_root}/"
artifacts_dir="${repo_root}artifacts"
toolset_dir="$artifacts_dir/toolset" toolset_dir="$artifacts_dir/toolset"
tools_dir="$repo_root/.tools" tools_dir="${repo_root}.tools"
log_dir="$artifacts_dir/log/$configuration" log_dir="$artifacts_dir/log/$configuration"
temp_dir="$artifacts_dir/tmp/$configuration" temp_dir="$artifacts_dir/tmp/$configuration"
global_json_file="$repo_root/global.json" global_json_file="${repo_root}global.json"
# determine if global.json contains a "runtimes" entry # determine if global.json contains a "runtimes" entry
global_json_has_runtimes=false global_json_has_runtimes=false
if command -v jq &> /dev/null; then if command -v jq &> /dev/null; then
@ -504,7 +505,7 @@ fi
# HOME may not be defined in some scenarios, but it is required by NuGet # HOME may not be defined in some scenarios, but it is required by NuGet
if [[ -z $HOME ]]; then if [[ -z $HOME ]]; then
export HOME="$repo_root/artifacts/.home/" export HOME="${repo_root}artifacts/.home/"
mkdir -p "$HOME" mkdir -p "$HOME"
fi fi

2
global.json

@ -11,6 +11,6 @@
} }
}, },
"msbuild-sdks": { "msbuild-sdks": {
"Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21303.2" "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.21317.1"
} }
} }

111
samples/apps-with-core-angular/MoviesApp/package-lock.json

@ -2421,15 +2421,36 @@
} }
}, },
"browserslist": { "browserslist": {
"version": "4.12.0", "version": "4.16.6",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/browserslist/-/browserslist-4.12.0.tgz", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
"integrity": "sha1-BsbVcVoe3mxR/Dn/Z/1kf3QLZW0=", "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"caniuse-lite": "^1.0.30001043", "caniuse-lite": "^1.0.30001219",
"electron-to-chromium": "^1.3.413", "colorette": "^1.2.2",
"node-releases": "^1.1.53", "electron-to-chromium": "^1.3.723",
"pkg-up": "^2.0.0" "escalade": "^3.1.1",
"node-releases": "^1.1.71"
},
"dependencies": {
"caniuse-lite": {
"version": "1.0.30001230",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
"integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
"dev": true
},
"electron-to-chromium": {
"version": "1.3.739",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz",
"integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==",
"dev": true
},
"node-releases": {
"version": "1.1.72",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
"integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
"dev": true
}
} }
}, },
"browserstack": { "browserstack": {
@ -2899,6 +2920,12 @@
"simple-swizzle": "^0.2.2" "simple-swizzle": "^0.2.2"
} }
}, },
"colorette": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
"dev": true
},
"colors": { "colors": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/colors/-/colors-1.1.2.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/colors/-/colors-1.1.2.tgz",
@ -4022,12 +4049,6 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true "dev": true
}, },
"electron-to-chromium": {
"version": "1.3.434",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/electron-to-chromium/-/electron-to-chromium-1.3.434.tgz",
"integrity": "sha1-pn3LJo6Tdo4haTmZmcz/pHg/BI4=",
"dev": true
},
"elliptic": { "elliptic": {
"version": "6.5.4", "version": "6.5.4",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
@ -4293,6 +4314,12 @@
"es6-promise": "^4.0.3" "es6-promise": "^4.0.3"
} }
}, },
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/escape-html/-/escape-html-1.0.3.tgz",
@ -4833,15 +4860,6 @@
} }
} }
}, },
"find-up": {
"version": "2.1.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
"locate-path": "^2.0.0"
}
},
"flatted": { "flatted": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/flatted/-/flatted-2.0.2.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/flatted/-/flatted-2.0.2.tgz",
@ -6534,16 +6552,6 @@
"json5": "^1.0.1" "json5": "^1.0.1"
} }
}, },
"locate-path": {
"version": "2.0.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/locate-path/-/locate-path-2.0.0.tgz",
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
}
},
"lodash": { "lodash": {
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@ -7286,12 +7294,6 @@
} }
} }
}, },
"node-releases": {
"version": "1.1.55",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/node-releases/-/node-releases-1.1.55.tgz",
"integrity": "sha1-ivI7fFYdji5uNqRmN7q4RjOwfO4=",
"dev": true
},
"normalize-package-data": { "normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@ -7764,24 +7766,6 @@
"integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=", "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=",
"dev": true "dev": true
}, },
"p-limit": {
"version": "1.3.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/p-limit/-/p-limit-1.3.0.tgz",
"integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
"dev": true,
"requires": {
"p-try": "^1.0.0"
}
},
"p-locate": {
"version": "2.0.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/p-locate/-/p-locate-2.0.0.tgz",
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
"p-limit": "^1.1.0"
}
},
"p-map": { "p-map": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/p-map/-/p-map-3.0.0.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/p-map/-/p-map-3.0.0.tgz",
@ -7800,12 +7784,6 @@
"retry": "^0.12.0" "retry": "^0.12.0"
} }
}, },
"p-try": {
"version": "1.0.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
"pacote": { "pacote": {
"version": "9.5.8", "version": "9.5.8",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/pacote/-/pacote-9.5.8.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/pacote/-/pacote-9.5.8.tgz",
@ -8150,15 +8128,6 @@
} }
} }
}, },
"pkg-up": {
"version": "2.0.0",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/pkg-up/-/pkg-up-2.0.0.tgz",
"integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
"dev": true,
"requires": {
"find-up": "^2.1.0"
}
},
"portfinder": { "portfinder": {
"version": "1.0.26", "version": "1.0.26",
"resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/portfinder/-/portfinder-1.0.26.tgz", "resolved": "https://kdi.jfrog.io/kdi/api/npm/npm/portfinder/-/portfinder-1.0.26.tgz",

2
samples/dapr/pub-sub/tye.yaml

@ -21,7 +21,7 @@ extensions:
# #
# config: myconfig # config: myconfig
# components-path configures the components path of the dapr sidecard # components-path configures the components path of the dapr sidecar
components-path: "./components/" components-path: "./components/"
# You can instruct Tye to not create the Dapr placement container on your behalf. This is required if you have Dapr running and want to use that container. # You can instruct Tye to not create the Dapr placement container on your behalf. This is required if you have Dapr running and want to use that container.

7
src/Microsoft.Tye.Hosting/DockerRunner.cs

@ -79,6 +79,11 @@ namespace Microsoft.Tye.Hosting
continue; continue;
} }
if (string.Equals(binding.Protocol, "udp", StringComparison.InvariantCultureIgnoreCase))
{
throw new CommandException("Proxy does not support the udp protocol yet.");
}
var b = new ServiceBinding() var b = new ServiceBinding()
{ {
ConnectionString = binding.ConnectionString, ConnectionString = binding.ConnectionString,
@ -232,7 +237,7 @@ namespace Microsoft.Tye.Hosting
// These are the ports that the application should use for binding // These are the ports that the application should use for binding
// 1. Tell the docker container what port to bind to // 1. Tell the docker container what port to bind to
portString = docker.Private ? "" : string.Join(" ", ports.Select(p => $"-p {p.Port}:{p.ContainerPort ?? p.Port}")); portString = docker.Private ? "" : string.Join(" ", ports.Select(p => $"-p {p.Port}:{p.ContainerPort ?? p.Port}{(string.Equals(p.Protocol, "udp", StringComparison.OrdinalIgnoreCase) ? "/udp" : string.Empty)}"));
if (docker.IsAspNet) if (docker.IsAspNet)
{ {

7
src/Microsoft.Tye.Hosting/Model/Application.cs

@ -12,14 +12,19 @@ namespace Microsoft.Tye.Hosting.Model
{ {
public class Application public class Application
{ {
public Application(FileInfo source, Dictionary<string, Service> services, ContainerEngine containerEngine) public Application(string name, FileInfo source, Dictionary<string, Service> services, ContainerEngine containerEngine)
{ {
Name = name;
Source = source.FullName; Source = source.FullName;
ContextDirectory = source.DirectoryName!; ContextDirectory = source.DirectoryName!;
Services = services; Services = services;
ContainerEngine = containerEngine; ContainerEngine = containerEngine;
} }
public string Id { get; } = Guid.NewGuid().ToString();
public string Name { get; }
public string Source { get; } public string Source { get; }
public string ContextDirectory { get; } public string ContextDirectory { get; }

15
src/Microsoft.Tye.Hosting/Model/V1/V1Application.cs

@ -0,0 +1,15 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace Microsoft.Tye.Hosting.Model.V1
{
public class V1Application
{
public string? Id { get; set; }
public string? Name { get; set; }
public string? Source { get; set; }
}
}

5
src/Microsoft.Tye.Hosting/ProxyService.cs

@ -63,6 +63,11 @@ namespace Microsoft.Tye.Hosting
continue; continue;
} }
if (string.Equals(binding.Protocol, "udp", StringComparison.InvariantCultureIgnoreCase))
{
throw new CommandException("Proxy does not support the udp protocol yet.");
}
var ports = binding.ReplicaPorts; var ports = binding.ReplicaPorts;
// We need to bind to all interfaces on linux since the container -> host communication won't work // We need to bind to all interfaces on linux since the container -> host communication won't work

21
src/Microsoft.Tye.Hosting/TyeDashboardApi.cs

@ -37,6 +37,7 @@ namespace Microsoft.Tye.Hosting
public void MapRoutes(IEndpointRouteBuilder endpoints) public void MapRoutes(IEndpointRouteBuilder endpoints)
{ {
endpoints.MapGet("/api/v1", ServiceIndex); endpoints.MapGet("/api/v1", ServiceIndex);
endpoints.MapGet("/api/v1/application", ApplicationIndex);
endpoints.MapDelete("/api/v1/control", ControlPlaneShutdown); endpoints.MapDelete("/api/v1/control", ControlPlaneShutdown);
endpoints.MapGet("/api/v1/services", Services); endpoints.MapGet("/api/v1/services", Services);
endpoints.MapGet("/api/v1/services/{name}", Service); endpoints.MapGet("/api/v1/services/{name}", Service);
@ -50,15 +51,33 @@ namespace Microsoft.Tye.Hosting
context.Response.ContentType = "application/json"; context.Response.ContentType = "application/json";
return JsonSerializer.SerializeAsync(context.Response.Body, new[] return JsonSerializer.SerializeAsync(context.Response.Body, new[]
{ {
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/application",
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/control", $"{context.Request.Scheme}://{context.Request.Host}/api/v1/control",
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/services",
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/logs/{{service}}", $"{context.Request.Scheme}://{context.Request.Host}/api/v1/logs/{{service}}",
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/metrics", $"{context.Request.Scheme}://{context.Request.Host}/api/v1/metrics",
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/metrics/{{service}}", $"{context.Request.Scheme}://{context.Request.Host}/api/v1/metrics/{{service}}",
$"{context.Request.Scheme}://{context.Request.Host}/api/v1/services",
}, },
_options); _options);
} }
private Task ApplicationIndex(HttpContext context)
{
var app = context.RequestServices.GetRequiredService<Application>();
context.Response.ContentType = "application/json";
return JsonSerializer.SerializeAsync(
context.Response.Body,
new V1Application
{
Id = app.Id,
Name = app.Name,
Source = app.Source
},
_options);
}
private Task ControlPlaneShutdown(HttpContext context) private Task ControlPlaneShutdown(HttpContext context)
{ {
var lifetime = context.RequestServices.GetRequiredService<IHostApplicationLifetime>(); var lifetime = context.RequestServices.GetRequiredService<IHostApplicationLifetime>();

2
src/tye/ApplicationBuilderExtensions.cs

@ -213,7 +213,7 @@ namespace Microsoft.Tye
services.Add(ingress.Name, new Service(description)); services.Add(ingress.Name, new Service(description));
} }
return new Application(application.Source, services, application.ContainerEngine) { Network = application.Network }; return new Application(application.Name, application.Source, services, application.ContainerEngine) { Network = application.Network };
} }
public static Tye.Hosting.Model.EnvironmentVariable ToHostingEnvironmentVariable(this EnvironmentVariableBuilder builder) public static Tye.Hosting.Model.EnvironmentVariable ToHostingEnvironmentVariable(this EnvironmentVariableBuilder builder)

4
test/Test.Infrastructure/TestHelpers.cs

@ -251,8 +251,8 @@ namespace Test.Infrastructure
var processRunner = new ProcessRunner(logger, replicaRegistry, new ProcessRunnerOptions()); var processRunner = new ProcessRunner(logger, replicaRegistry, new ProcessRunnerOptions());
var dockerRunner = new DockerRunner(logger, replicaRegistry); var dockerRunner = new DockerRunner(logger, replicaRegistry);
await processRunner.StartAsync(new Application(new FileInfo(host.Application.Source), new Dictionary<string, Service>(), ContainerEngine.Default)); await processRunner.StartAsync(new Application(host.Application.Name, new FileInfo(host.Application.Source), new Dictionary<string, Service>(), ContainerEngine.Default));
await dockerRunner.StartAsync(new Application(new FileInfo(host.Application.Source), new Dictionary<string, Service>(), ContainerEngine.Default)); await dockerRunner.StartAsync(new Application(host.Application.Name, new FileInfo(host.Application.Source), new Dictionary<string, Service>(), ContainerEngine.Default));
} }
await DoOperationAndWaitForReplicasToChangeState(host, ReplicaState.Stopped, replicas.Length, replicas.ToHashSet(), new HashSet<string>(), TimeSpan.Zero, Purge); await DoOperationAndWaitForReplicasToChangeState(host, ReplicaState.Stopped, replicas.Length, replicas.ToHashSet(), new HashSet<string>(), TimeSpan.Zero, Purge);

Loading…
Cancel
Save