1 write to Spec
Aspire.Hosting (1)
Dcp\Model\ModelCommon.cs (1)
145
Spec
= spec;
224 references to Spec
Aspire.Hosting (63)
Dcp\DcpExecutor.cs (39)
173
.Where(sr => !sr.HasCompleteAddress && sr.
Spec
.AddressAllocationMode != AddressAllocationModes.Proxyless);
547
if (container.
Spec
.Start == false && (container.Status?.State == null || container.Status?.State == ContainerState.Pending))
832
var containerNetworkName = (ctp.DcpResource as ContainerNetworkTunnelProxy)?.
Spec
.ContainerNetworkName;
1016
network.
Spec
.Persistent = true;
1019
network.
Spec
.NetworkName = $"{DefaultAspirePersistentNetworkName}-{_nameGenerator.GetProjectHashSuffix()}";
1023
network.
Spec
.NetworkName = $"{DefaultAspireNetworkName}-{DcpNameGenerator.GetRandomNameSuffix()}";
1029
network.
Spec
.NetworkName += $"-{shortApplicationName}"; // Limit to 32 characters to avoid exceeding resource name length limits.
1061
svc.
Spec
.Port = port;
1062
svc.
Spec
.Protocol = PortProtocol.FromProtocolType(endpoint.Protocol);
1065
svc.
Spec
.Address = KnownHostNames.Localhost;
1069
svc.
Spec
.Address = endpoint.TargetHost;
1074
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
1113
tunnelProxy.
Spec
.ContainerNetworkName = KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value;
1114
tunnelProxy.
Spec
.Aliases = [ContainerHostName];
1115
tunnelProxy.
Spec
.Tunnels = [];
1155
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
1156
svc.
Spec
.Protocol = PortProtocol.TCP;
1181
tunnelProxy?.
Spec
?.Tunnels?.Add(tunnelConfig);
1186
svc.Annotate(CustomResource.ContainerNetworkAnnotation, tunnelProxy?.
Spec
?.ContainerNetworkName ?? KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value);
1253
exe.
Spec
.WorkingDirectory = executable.WorkingDirectory;
1254
exe.
Spec
.ExecutionType = ExecutionType.Process;
1266
exe.
Spec
.ExecutionType = ExecutionType.IDE;
1271
exe.
Spec
.ExecutionType = ExecutionType.Process;
1301
exeSpec.
Spec
.WorkingDirectory = Path.GetDirectoryName(projectMetadata.ProjectPath);
1320
exeSpec.
Spec
.ExecutionType = ExecutionType.IDE;
1331
exeSpec.
Spec
.ExecutionType = ExecutionType.Process;
1504
var spec = containerExe.
Spec
;
1523
var spec = exe.
Spec
;
1647
ctr.
Spec
.ContainerName = containerObjectInstance.Name; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name.
1651
ctr.
Spec
.Persistent = true;
1656
ctr.
Spec
.PullPolicy = pullPolicy switch
1670
ctr.
Spec
.Networks = new List<ContainerNetworkConnection>
1746
container.
Spec
.Start = false;
1771
var spec = dcpContainerResource.
Spec
;
1864
dcpContainerResource.
Spec
.Build = new()
1905
dcpContainerResource.
Spec
.Build = new()
2043
patch = CreatePatch(c, obj => obj.
Spec
.Stop = true);
2058
patch = CreatePatch(e, obj => obj.
Spec
.Stop = true);
2115
c.
Spec
.Start = true;
Dcp\Model\ExecutableReplicaSet.cs (1)
109
ers.
Spec
.Template.Spec.ExecutablePath = executablePath;
Dcp\Model\Service.cs (6)
89
public int? AllocatedPort =>
Spec
.Port ?? Status?.EffectivePort;
90
public string? AllocatedAddress =>
Spec
.Address ?? Status?.EffectiveAddress;
97
Spec
.Port = other.
Spec
.Port;
98
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)
216
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
217
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
249
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
250
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
478
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
479
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
480
Assert.Null(container!.
Spec
!.Build!.Stage);
482
container!.
Spec
!.Build!.Args!,
549
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
550
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
551
Assert.Null(container!.
Spec
!.Build!.Stage);
553
container!.
Spec
!.Build!.Args!,
Aspire.Hosting.Tests (149)
Dcp\DcpExecutorTests.cs (74)
161
var callArgs = executionType == ExecutionType.IDE ? exe.
Spec
.Args : exe.
Spec
.Args![^(expectedArgs?.Length ?? 0)..];
202
var callCount1 = exe1.
Spec
.Env!.Single(e => e.Name == "CALL_COUNT");
205
Assert.Single(exe1.
Spec
.Args!, a => a == "--no-build");
206
Assert.Single(exe1.
Spec
.Args!, a => a == "--test");
220
var callCount2 = exe2.
Spec
.Env!.Single(e => e.Name == "CALL_COUNT");
223
Assert.Single(exe2.
Spec
.Args!, a => a == "--no-build");
224
Assert.Single(exe2.
Spec
.Args!, a => a == "--test");
251
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
255
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value;
283
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
287
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
315
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
319
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
348
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
352
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
404
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
408
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
438
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
442
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
472
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
476
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
813
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
817
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value;
822
var aspnetCoreUrls = dcpExe.
Spec
.Env?.Single(v => v.Name == "ASPNETCORE_URLS").Value;
858
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
862
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
891
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
893
Assert.NotNull(dcpCtr.
Spec
.Ports);
894
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort);
897
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
926
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
928
Assert.NotNull(dcpCtr.
Spec
.Ports);
929
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort);
932
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
1006
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1008
Assert.NotNull(dcpCtr.
Spec
.Ports);
1009
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredPort);
1012
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
1042
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1044
Assert.NotNull(dcpCtr.
Spec
.Ports);
1045
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredTargetPort && p.ContainerPort == desiredTargetPort);
1048
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
1079
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1081
Assert.NotNull(dcpCtr.
Spec
.Ports);
1082
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort);
1085
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
1116
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1118
Assert.NotNull(dcpCtr.
Spec
.Ports);
1119
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort && p.Protocol == "UDP");
1122
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_PROTOCOL_SET").Value;
1204
Assert.Null(implicitDefaultContainer.
Spec
.PullPolicy);
1207
Assert.Null(explicitDefaultContainer.
Spec
.PullPolicy);
1210
Assert.Equal(ContainerPullPolicy.Always, explicitAlwaysContainer.
Spec
.PullPolicy);
1213
Assert.Equal(ContainerPullPolicy.Missing, explicitMissingContainer.
Spec
.PullPolicy);
1391
Assert.NotNull(exe.
Spec
.Env);
1392
var effectiveLaunchProfileEnv = exe.
Spec
.Env.SingleOrDefault(v => v.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1423
var envVal = exe.
Spec
.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1454
var envVal = exe.
Spec
.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1485
Assert.DoesNotContain(exe.
Spec
.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE");
1515
Assert.DoesNotContain(exe.
Spec
.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE");
1590
Assert.Equal(ExecutionType.IDE, debuggableExe.
Spec
.ExecutionType);
1597
Assert.Equal(ExecutionType.Process, nonDebuggableExe.
Spec
.ExecutionType);
1634
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1671
Assert.Equal(ExecutionType.Process, debuggableExe.
Spec
.ExecutionType);
1675
Assert.Equal(ExecutionType.Process, nonDebuggableExe.
Spec
.ExecutionType);
1712
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1748
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1790
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1832
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1874
Assert.Equal(ExecutionType.IDE, exe.
Spec
.ExecutionType);
1911
Assert.Equal(ExecutionType.IDE, exe.
Spec
.ExecutionType);
1948
Assert.Equal(ExecutionType.IDE, exe.
Spec
.ExecutionType);
1991
Assert.Equal(ExecutionType.IDE, exe.
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 (69)
554
Assert.Equal(RedisImageSource, item.
Spec
.Image);
555
Assert.Equal(["redis-cli", "-h", "host.docker.internal", "-p", "9999", "MONITOR"], item.
Spec
.Args);
556
Assert.Equal(["--add-host", "testlocalhost:127.0.0.1"], item.
Spec
.RunArgs);
612
Assert.Equal(RedisImageSource, item.
Spec
.Image);
622
item.
Spec
.CreateFiles);
658
Assert.NotNull(redisContainer.
Spec
.Args);
659
Assert.Equal(2, redisContainer.
Spec
.Args.Count);
661
Assert.Equal("-c", redisContainer.
Spec
.Args[0]);
662
Assert.Contains("--tls-cert-file", redisContainer.
Spec
.Args[1]);
663
Assert.Contains("--tls-key-file", redisContainer.
Spec
.Args[1]);
664
Assert.Contains("--tls-auth-clients", redisContainer.
Spec
.Args[1]);
665
Assert.Contains("--tls-port", redisContainer.
Spec
.Args[1]);
666
Assert.Contains("--port", redisContainer.
Spec
.Args[1]);
669
Assert.NotNull(redisContainer.
Spec
.Ports);
670
Assert.Contains(redisContainer.
Spec
.Ports, p => p.ContainerPort == 6380);
671
Assert.Contains(redisContainer.
Spec
.Ports, p => p.ContainerPort == 6379);
778
Assert.Equal(RedisImageSource, item.
Spec
.Image);
782
Assert.NotNull(item.
Spec
.Env);
785
Assert.DoesNotContain(item.
Spec
.Env, e => e.Name == "SSL_CERT_FILE");
789
Assert.Collection(item.
Spec
.Env.Where(e => e.Name == "SSL_CERT_FILE"),
797
Assert.Collection(item.
Spec
.Env.Where(e => e.Name == "SSL_CERT_DIR"),
813
Assert.NotNull(item.
Spec
.CreateFiles);
814
Assert.Collection(item.
Spec
.CreateFiles.Where(cf => cf.Destination == expectedDestination),
853
Assert.Collection(item.
Spec
.CreateFiles.Where(cf => cf.Destination == bundlePath.Key),
877
Assert.Empty(item.
Spec
.CreateFiles ?? []);
1036
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
1037
Assert.Equal("6379", GetEnv(redisContainer.
Spec
.Env, "REDIS_PORT"));
1040
Assert.Equal($"{{{{- portForServing \"{testName}-servicea-http0-{suffix}\" -}}}}", GetEnv(serviceA.
Spec
.Env, "PORT0"));
1045
Assert.Equal($"{{{{- portForServing \"{testName}-nodeapp-{suffix}\" -}}}}", GetEnv(nodeApp.
Spec
.Env, "PORT"));
1115
Assert.Equal("BrowserToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
1116
Assert.Equal("ThisIsATestToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__BROWSERTOKEN"));
1118
Assert.Equal("ApiKey", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
1119
var keyBytes = Convert.FromHexString(GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__PRIMARYAPIKEY")!);
1155
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
1156
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
1189
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
1190
Assert.Equal("bob", redisContainer.
Spec
.Command);
1216
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
1218
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
1219
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
1220
Assert.Equal(sourcePath, redisContainer.
Spec
.VolumeMounts[0].Source);
1245
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
1247
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
1248
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
1249
Assert.NotEqual("etc/path-here", redisContainer.
Spec
.VolumeMounts[0].Source);
1250
Assert.True(Path.IsPathRooted(redisContainer.
Spec
.VolumeMounts[0].Source));
1275
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
1277
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
1278
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
1279
Assert.Equal($"{testName}-volume", redisContainer.
Spec
.VolumeMounts[0].Source);
1521
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1531
Assert.Equal(2, redisContainer.
Spec
.Ports!.Count);
1532
Assert.Contains(redisContainer.
Spec
.Ports!, p => p.HostPort == 1234);
1536
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1539
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1547
Assert.Equal(2, otherRedisContainer.
Spec
.Ports!.Count);
1548
Assert.Contains(otherRedisContainer.
Spec
.Ports!, p => p.HostPort == 6379);
1552
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1591
Assert.All(serviceList.Where(s => s.Metadata.Name.Contains("redis")), s => Assert.Equal(AddressAllocationModes.Proxyless, s.
Spec
.AddressAllocationMode));
1596
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1606
Assert.Equal(2, redisContainer.
Spec
.Ports!.Count);
1607
Assert.Contains(redisContainer.
Spec
.Ports!, p => p.HostPort == 1234);
1611
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1614
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1623
Assert.Equal(2, otherRedisContainer.
Spec
.Ports!.Count);
1624
Assert.Contains(otherRedisContainer.
Spec
.Ports!, p => p.HostPort == 6379);
1628
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1678
Assert.Single(networks, n => n.
Spec
.Persistent == true);
1682
Assert.Single(networks, n => n.
Spec
.Persistent.GetValueOrDefault(false) == false);