1 write to Spec
Aspire.Hosting (1)
Dcp\Model\ModelCommon.cs (1)
145
Spec
= spec;
202 references to Spec
Aspire.Hosting (63)
Dcp\DcpExecutor.cs (39)
169
.Where(sr => !sr.HasCompleteAddress && sr.
Spec
.AddressAllocationMode != AddressAllocationModes.Proxyless);
543
if (container.
Spec
.Start == false && (container.Status?.State == null || container.Status?.State == ContainerState.Pending))
828
var containerNetworkName = (ctp.DcpResource as ContainerNetworkTunnelProxy)?.
Spec
.ContainerNetworkName;
1012
network.
Spec
.Persistent = true;
1015
network.
Spec
.NetworkName = $"{DefaultAspirePersistentNetworkName}-{_nameGenerator.GetProjectHashSuffix()}";
1019
network.
Spec
.NetworkName = $"{DefaultAspireNetworkName}-{DcpNameGenerator.GetRandomNameSuffix()}";
1025
network.
Spec
.NetworkName += $"-{shortApplicationName}"; // Limit to 32 characters to avoid exceeding resource name length limits.
1057
svc.
Spec
.Port = port;
1058
svc.
Spec
.Protocol = PortProtocol.FromProtocolType(endpoint.Protocol);
1061
svc.
Spec
.Address = KnownHostNames.Localhost;
1065
svc.
Spec
.Address = endpoint.TargetHost;
1070
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
1109
tunnelProxy.
Spec
.ContainerNetworkName = KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value;
1110
tunnelProxy.
Spec
.Aliases = [ContainerHostName];
1111
tunnelProxy.
Spec
.Tunnels = [];
1151
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
1152
svc.
Spec
.Protocol = PortProtocol.TCP;
1177
tunnelProxy?.
Spec
?.Tunnels?.Add(tunnelConfig);
1182
svc.Annotate(CustomResource.ContainerNetworkAnnotation, tunnelProxy?.
Spec
?.ContainerNetworkName ?? KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value);
1249
exe.
Spec
.WorkingDirectory = executable.WorkingDirectory;
1250
exe.
Spec
.ExecutionType = ExecutionType.Process;
1262
exe.
Spec
.ExecutionType = ExecutionType.IDE;
1267
exe.
Spec
.ExecutionType = ExecutionType.Process;
1297
exeSpec.
Spec
.WorkingDirectory = Path.GetDirectoryName(projectMetadata.ProjectPath);
1316
exeSpec.
Spec
.ExecutionType = ExecutionType.IDE;
1327
exeSpec.
Spec
.ExecutionType = ExecutionType.Process;
1500
var spec = containerExe.
Spec
;
1519
var spec = exe.
Spec
;
1639
ctr.
Spec
.ContainerName = containerObjectInstance.Name; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name.
1643
ctr.
Spec
.Persistent = true;
1648
ctr.
Spec
.PullPolicy = pullPolicy switch
1662
ctr.
Spec
.Networks = new List<ContainerNetworkConnection>
1738
container.
Spec
.Start = false;
1763
var spec = dcpContainerResource.
Spec
;
1843
dcpContainerResource.
Spec
.Build = new()
1884
dcpContainerResource.
Spec
.Build = new()
2022
patch = CreatePatch(c, obj => obj.
Spec
.Stop = true);
2037
patch = CreatePatch(e, obj => obj.
Spec
.Stop = true);
2094
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 (127)
Dcp\DcpExecutorTests.cs (74)
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;
812
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
816
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value;
821
var aspnetCoreUrls = dcpExe.
Spec
.Env?.Single(v => v.Name == "ASPNETCORE_URLS").Value;
857
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
861
var envVarVal = dcpExe.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
890
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
892
Assert.NotNull(dcpCtr.
Spec
.Ports);
893
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort);
896
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
925
Assert.Equal(AddressAllocationModes.Localhost, svc.
Spec
.AddressAllocationMode);
927
Assert.NotNull(dcpCtr.
Spec
.Ports);
928
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort);
931
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
1005
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1007
Assert.NotNull(dcpCtr.
Spec
.Ports);
1008
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredPort);
1011
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value;
1041
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1043
Assert.NotNull(dcpCtr.
Spec
.Ports);
1044
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredTargetPort && p.ContainerPort == desiredTargetPort);
1047
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value;
1078
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1080
Assert.NotNull(dcpCtr.
Spec
.Ports);
1081
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort);
1084
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value;
1115
Assert.Equal(AddressAllocationModes.Proxyless, svc.
Spec
.AddressAllocationMode);
1117
Assert.NotNull(dcpCtr.
Spec
.Ports);
1118
Assert.Contains(dcpCtr.
Spec
.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort && p.Protocol == "UDP");
1121
var envVarVal = dcpCtr.
Spec
.Env?.Single(v => v.Name == "PORT_AND_PROTOCOL_SET").Value;
1203
Assert.Null(implicitDefaultContainer.
Spec
.PullPolicy);
1206
Assert.Null(explicitDefaultContainer.
Spec
.PullPolicy);
1209
Assert.Equal(ContainerPullPolicy.Always, explicitAlwaysContainer.
Spec
.PullPolicy);
1212
Assert.Equal(ContainerPullPolicy.Missing, explicitMissingContainer.
Spec
.PullPolicy);
1390
Assert.NotNull(exe.
Spec
.Env);
1391
var effectiveLaunchProfileEnv = exe.
Spec
.Env.SingleOrDefault(v => v.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1422
var envVal = exe.
Spec
.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1453
var envVal = exe.
Spec
.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value;
1484
Assert.DoesNotContain(exe.
Spec
.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE");
1514
Assert.DoesNotContain(exe.
Spec
.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE");
1584
Assert.Equal(ExecutionType.IDE, debuggableExe.
Spec
.ExecutionType);
1591
Assert.Equal(ExecutionType.Process, nonDebuggableExe.
Spec
.ExecutionType);
1628
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1665
Assert.Equal(ExecutionType.Process, debuggableExe.
Spec
.ExecutionType);
1669
Assert.Equal(ExecutionType.Process, nonDebuggableExe.
Spec
.ExecutionType);
1706
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1742
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1784
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1826
Assert.Equal(ExecutionType.Process, exe.
Spec
.ExecutionType);
1868
Assert.Equal(ExecutionType.IDE, exe.
Spec
.ExecutionType);
1905
Assert.Equal(ExecutionType.IDE, exe.
Spec
.ExecutionType);
1942
Assert.Equal(ExecutionType.IDE, exe.
Spec
.ExecutionType);
1985
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 (47)
553
Assert.Equal(RedisImageSource, item.
Spec
.Image);
554
Assert.Equal(["redis-cli", "-h", "host.docker.internal", "-p", "9999", "MONITOR"], item.
Spec
.Args);
555
Assert.Equal(["--add-host", "testlocalhost:127.0.0.1"], item.
Spec
.RunArgs);
611
Assert.Equal(RedisImageSource, item.
Spec
.Image);
621
item.
Spec
.CreateFiles);
661
Assert.Equal(RedisImageSource, item.
Spec
.Image);
665
Assert.NotNull(item.
Spec
.Env);
666
Assert.Collection(item.
Spec
.Env.OrderBy(e => e.Name),
672
Assert.NotNull(item.
Spec
.CreateFiles);
673
Assert.Collection(item.
Spec
.CreateFiles,
706
Assert.Empty(item.
Spec
.CreateFiles ?? []);
865
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
866
Assert.Equal("6379", GetEnv(redisContainer.
Spec
.Env, "REDIS_PORT"));
869
Assert.Equal($"{{{{- portForServing \"{testName}-servicea-http0-{suffix}\" -}}}}", GetEnv(serviceA.
Spec
.Env, "PORT0"));
874
Assert.Equal($"{{{{- portForServing \"{testName}-nodeapp-{suffix}\" -}}}}", GetEnv(nodeApp.
Spec
.Env, "PORT"));
944
Assert.Equal("BrowserToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
945
Assert.Equal("ThisIsATestToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__BROWSERTOKEN"));
947
Assert.Equal("ApiKey", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
948
var keyBytes = Convert.FromHexString(GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__PRIMARYAPIKEY")!);
984
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
985
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
1018
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
1019
Assert.Equal("bob", redisContainer.
Spec
.Command);
1045
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
1047
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
1048
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
1049
Assert.Equal(sourcePath, redisContainer.
Spec
.VolumeMounts[0].Source);
1074
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
1076
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
1077
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
1078
Assert.NotEqual("etc/path-here", redisContainer.
Spec
.VolumeMounts[0].Source);
1079
Assert.True(Path.IsPathRooted(redisContainer.
Spec
.VolumeMounts[0].Source));
1104
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
1106
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
1107
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
1108
Assert.Equal($"{testName}-volume", redisContainer.
Spec
.VolumeMounts[0].Source);
1350
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1357
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1359
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1365
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1403
Assert.All(serviceList.Where(s => s.Metadata.Name.Contains("redis")), s => Assert.Equal(AddressAllocationModes.Proxyless, s.
Spec
.AddressAllocationMode));
1408
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1415
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1417
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1423
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1472
Assert.Single(networks, n => n.
Spec
.Persistent == true);
1476
Assert.Single(networks, n => n.
Spec
.Persistent.GetValueOrDefault(false) == false);