1 write to Spec
Aspire.Hosting (1)
Dcp\Model\ModelCommon.cs (1)
142
Spec
= spec;
180 references to Spec
Aspire.Hosting (55)
Dcp\DcpExecutor.cs (31)
497
if (container.
Spec
.Start == false && (container.Status?.State == null || container.Status?.State == ContainerState.Pending))
723
.Where(sr => !sr.Service.HasCompleteAddress && sr.Service.
Spec
.AddressAllocationMode != AddressAllocationModes.Proxyless)
886
svc.
Spec
.Port = port;
887
svc.
Spec
.Protocol = PortProtocol.FromProtocolType(endpoint.Protocol);
890
svc.
Spec
.Address = "localhost";
894
svc.
Spec
.Address = endpoint.TargetHost;
899
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
960
exe.
Spec
.WorkingDirectory = executable.WorkingDirectory;
961
exe.
Spec
.ExecutionType = ExecutionType.Process;
972
exe.
Spec
.ExecutionType = ExecutionType.IDE;
977
exe.
Spec
.ExecutionType = ExecutionType.Process;
1007
exeSpec.
Spec
.WorkingDirectory = Path.GetDirectoryName(projectMetadata.ProjectPath);
1026
exeSpec.
Spec
.ExecutionType = ExecutionType.IDE;
1037
exeSpec.
Spec
.ExecutionType = ExecutionType.Process;
1195
var spec = containerExe.
Spec
;
1214
var spec = exe.
Spec
;
1327
ctr.
Spec
.ContainerName = containerObjectInstance.Name; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name.
1331
ctr.
Spec
.Persistent = true;
1336
ctr.
Spec
.PullPolicy = pullPolicy switch
1350
ctr.
Spec
.Networks = new List<ContainerNetworkConnection>
1423
network.
Spec
.Persistent = true;
1426
network.
Spec
.NetworkName = $"{DefaultAspirePersistentNetworkName}-{_nameGenerator.GetProjectHashSuffix()}";
1430
network.
Spec
.NetworkName = $"{DefaultAspireNetworkName}-{DcpNameGenerator.GetRandomNameSuffix()}";
1436
network.
Spec
.NetworkName += $"-{shortApplicationName}"; // Limit to 32 characters to avoid exceeding resource name length limits.
1452
container.
Spec
.Start = false;
1477
var spec = dcpContainerResource.
Spec
;
1553
dcpContainerResource.
Spec
.Build = new()
1594
dcpContainerResource.
Spec
.Build = new()
1756
patch = CreatePatch(c, obj => obj.
Spec
.Stop = true);
1771
patch = CreatePatch(e, obj => obj.
Spec
.Stop = true);
1827
c.
Spec
.Start = true;
Dcp\Model\ExecutableReplicaSet.cs (1)
109
ers.
Spec
.Template.Spec.ExecutablePath = executablePath;
Dcp\Model\Service.cs (6)
87
public int? AllocatedPort =>
Spec
.Port ?? Status?.EffectivePort;
88
public string? AllocatedAddress =>
Spec
.Address ?? Status?.EffectiveAddress;
95
Spec
.Port = other.
Spec
.Port;
96
Spec
.Address = other.
Spec
.Address;
Dcp\ResourceSnapshotBuilder.cs (17)
26
var environment = GetEnvironmentVariables(container.Status?.EffectiveEnv ?? container.
Spec
.Env, container.
Spec
.Env);
29
if (container.
Spec
.Start is false && (state == null || state == ContainerState.Pending))
52
new(KnownProperties.Container.Image, container.
Spec
.Image),
54
new(KnownProperties.Container.Command, container.
Spec
.Command),
72
if (container.
Spec
.Ports is null)
78
foreach (var port in container.
Spec
.Ports)
90
return (container.
Spec
.Persistent ?? false) ? ContainerLifetime.Persistent : ContainerLifetime.Session;
100
var environment = GetEnvironmentVariables(executable.Status?.EffectiveEnv, executable.
Spec
.Env);
115
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
148
var environment = GetEnvironmentVariables(executable.Status?.EffectiveEnv, executable.
Spec
.Env);
166
new(KnownProperties.Executable.Path, executable.
Spec
.ExecutablePath),
167
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
190
new(KnownProperties.Executable.Path, executable.
Spec
.ExecutablePath),
191
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
255
var activeEndpoint = _resourceState.EndpointsMap.SingleOrDefault(e => e.Value.
Spec
.ServiceName == serviceName && e.Value.Metadata.OwnerReferences?.Any(or => or.Kind == resource.Kind && or.Name == name) == true).Value;
277
return container.
Spec
.VolumeMounts?.Select(v => new VolumeSnapshot(v.Source, v.Target ?? "", v.Type, v.IsReadOnly)).ToImmutableArray() ?? [];
Aspire.Hosting.Containers.Tests (12)
WithDockerfileTests.cs (12)
195
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
196
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
228
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
229
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
457
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
458
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
459
Assert.Null(container!.
Spec
!.Build!.Stage);
461
container!.
Spec
!.Build!.Args!,
528
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
529
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
530
Assert.Null(container!.
Spec
!.Build!.Stage);
532
container!.
Spec
!.Build!.Args!,
Aspire.Hosting.Tests (113)
Dcp\DcpExecutorTests.cs (66)
160
var callArgs = executionType == ExecutionType.IDE ? exe.
Spec
.Args : exe.
Spec
.Args![^(expectedArgs?.Length ?? 0)..];
201
var callCount1 = exe1.
Spec
.Env!.Single(e => e.Name == "CALL_COUNT");
204
Assert.Single(exe1.
Spec
.Args!, a => a == "--no-build");
205
Assert.Single(exe1.
Spec
.Args!, a => a == "--test");
219
var callCount2 = exe2.
Spec
.Env!.Single(e => e.Name == "CALL_COUNT");
222
Assert.Single(exe2.
Spec
.Args!, a => a == "--no-build");
223
Assert.Single(exe2.
Spec
.Args!, a => a == "--test");
250
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
254
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value;
282
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
286
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
314
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
318
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
347
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
351
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
403
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
407
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
437
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
441
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
471
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
475
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
802
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
806
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value;
811
var aspnetCoreUrls = dcpExe.
Spec
.Env?.Single(v => v.Name == "ASPNETCORE_URLS").Value;
847
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
851
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
880
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
882
Assert.NotNull(dcpCtr.
Spec
.Ports);
883
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort);
886
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
915
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
917
Assert.NotNull(dcpCtr.
Spec
.Ports);
918
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort);
921
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
995
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
997
Assert.NotNull(dcpCtr.
Spec
.Ports);
998
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredPort);
1001
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
1031
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1033
Assert.NotNull(dcpCtr.
Spec
.Ports);
1034
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredTargetPort && p.ContainerPort == desiredTargetPort);
1037
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
1068
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1070
Assert.NotNull(dcpCtr.
Spec
.Ports);
1071
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort);
1074
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
1105
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1107
Assert.NotNull(dcpCtr.
Spec
.Ports);
1108
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort && p.Protocol == "UDP");
1111
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_PROTOCOL_SET").Value;
1193
Assert.Null(implicitDefaultContainer.
Spec
.PullPolicy);
1196
Assert.Null(explicitDefaultContainer.
Spec
.PullPolicy);
1199
Assert.Equal(ContainerPullPolicy.Always, explicitAlwaysContainer.
Spec
.PullPolicy);
1202
Assert.Equal(ContainerPullPolicy.Missing, explicitMissingContainer.
Spec
.PullPolicy);
1380
Assert.NotNull(exe.
Spec
.Env);
1381
var effectiveLaunchProfileEnv = exe.
Spec
.Env.SingleOrDefault(v => v.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1412
var envVal = exe.
Spec
.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1443
var envVal = exe.
Spec
.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1474
Assert.DoesNotContain(exe.
Spec
.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE");
1504
Assert.DoesNotContain(exe.
Spec
.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE");
1574
Assert.Equal(ExecutionType.IDE, debuggableExe.
Spec
.ExecutionType);
1581
Assert.Equal(ExecutionType.Process, nonDebuggableExe.
Spec
.ExecutionType);
1618
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1656
Assert.Equal(ExecutionType.Process, debuggableExe.
Spec
.ExecutionType);
1660
Assert.Equal(ExecutionType.Process, nonDebuggableExe.
Spec
.ExecutionType);
Dcp\TestKubernetesService.cs (6)
77
svc.Status.EffectiveAddress = svc.
Spec
.Address ?? "localhost";
78
svc.Status.EffectivePort = svc.
Spec
.Port ?? Interlocked.Increment(ref _nextPort);
202
if (eu.
Spec
.Stop == true)
204
exe.
Spec
.Stop = true;
215
if (cu.
Spec
.Stop == true)
217
ctr.
Spec
.Stop = true;
DistributedApplicationTests.cs (41)
552
Assert.Equal(RedisImageSource, item.
Spec
.Image);
553
Assert.Equal(["redis-cli", "-h", "host.docker.internal", "-p", "9999", "MONITOR"], item.
Spec
.Args);
554
Assert.Equal(["--add-host", "testlocalhost:127.0.0.1"], item.
Spec
.RunArgs);
610
Assert.Equal(RedisImageSource, item.
Spec
.Image);
620
item.
Spec
.CreateFiles);
748
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
749
Assert.Equal("6379", GetEnv(redisContainer.
Spec
.Env, "REDIS_PORT"));
752
Assert.Equal($"{{{{- portForServing \"{testName}-servicea-http0-{suffix}\" -}}}}", GetEnv(serviceA.
Spec
.Env, "PORT0"));
757
Assert.Equal($"{{{{- portForServing \"{testName}-nodeapp-{suffix}\" -}}}}", GetEnv(nodeApp.
Spec
.Env, "PORT"));
827
Assert.Equal("BrowserToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
828
Assert.Equal("ThisIsATestToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__BROWSERTOKEN"));
830
Assert.Equal("ApiKey", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
831
var keyBytes = Convert.FromHexString(GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__PRIMARYAPIKEY")!);
867
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
868
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
901
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
902
Assert.Equal("bob", redisContainer.
Spec
.Command);
928
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
930
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
931
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
932
Assert.Equal(sourcePath, redisContainer.
Spec
.VolumeMounts[0].Source);
957
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
959
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
960
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
961
Assert.NotEqual("etc/path-here", redisContainer.
Spec
.VolumeMounts[0].Source);
962
Assert.True(Path.IsPathRooted(redisContainer.
Spec
.VolumeMounts[0].Source));
987
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
989
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
990
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
991
Assert.Equal($"{testName}-volume", redisContainer.
Spec
.VolumeMounts[0].Source);
1233
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1240
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1242
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1248
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1286
Assert.All(serviceList.Where(s => s.Metadata.Name.Contains("redis")), s => Assert.Equal(AddressAllocationModes.Proxyless, s.
Spec
.AddressAllocationMode));
1291
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1298
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1300
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1306
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1355
Assert.Single(networks, n => n.
Spec
.Persistent == true);
1359
Assert.Single(networks, n => n.
Spec
.Persistent.GetValueOrDefault(false) == false);