1 write to Spec
Aspire.Hosting (1)
Dcp\Model\ModelCommon.cs (1)
142
Spec
= spec;
167 references to Spec
Aspire.Hosting (53)
Dcp\DcpExecutor.cs (29)
496
if (container.
Spec
.Start == false && (container.Status?.State == null || container.Status?.State == ContainerState.Pending))
722
.Where(sr => !sr.Service.HasCompleteAddress && sr.Service.
Spec
.AddressAllocationMode != AddressAllocationModes.Proxyless)
885
svc.
Spec
.Port = port;
886
svc.
Spec
.Protocol = PortProtocol.FromProtocolType(endpoint.Protocol);
889
svc.
Spec
.Address = "localhost";
893
svc.
Spec
.Address = endpoint.TargetHost;
898
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
959
exe.
Spec
.WorkingDirectory = executable.WorkingDirectory;
960
exe.
Spec
.ExecutionType = ExecutionType.Process;
991
exeSpec.
Spec
.WorkingDirectory = Path.GetDirectoryName(projectMetadata.ProjectPath);
1008
exeSpec.
Spec
.ExecutionType = ExecutionType.IDE;
1018
exeSpec.
Spec
.ExecutionType = ExecutionType.Process;
1176
var spec = containerExe.
Spec
;
1195
var spec = exe.
Spec
;
1308
ctr.
Spec
.ContainerName = containerObjectInstance.Name; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name.
1312
ctr.
Spec
.Persistent = true;
1317
ctr.
Spec
.PullPolicy = pullPolicy switch
1331
ctr.
Spec
.Networks = new List<ContainerNetworkConnection>
1404
network.
Spec
.Persistent = true;
1407
network.
Spec
.NetworkName = $"{DefaultAspirePersistentNetworkName}-{_nameGenerator.GetProjectHashSuffix()}";
1411
network.
Spec
.NetworkName = $"{DefaultAspireNetworkName}-{DcpNameGenerator.GetRandomNameSuffix()}";
1417
network.
Spec
.NetworkName += $"-{shortApplicationName}"; // Limit to 32 characters to avoid exceeding resource name length limits.
1433
container.
Spec
.Start = false;
1458
var spec = dcpContainerResource.
Spec
;
1521
dcpContainerResource.
Spec
.Build = new()
1562
dcpContainerResource.
Spec
.Build = new()
1724
patch = CreatePatch(c, obj => obj.
Spec
.Stop = true);
1739
patch = CreatePatch(e, obj => obj.
Spec
.Stop = true);
1795
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),
143
var environment = GetEnvironmentVariables(executable.Status?.EffectiveEnv, executable.
Spec
.Env);
161
new(KnownProperties.Executable.Path, executable.
Spec
.ExecutablePath),
162
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
184
new(KnownProperties.Executable.Path, executable.
Spec
.ExecutablePath),
185
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
249
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;
271
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)
192
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
193
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
224
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
225
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
452
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
453
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
454
Assert.Null(container!.
Spec
!.Build!.Stage);
456
container!.
Spec
!.Build!.Args!,
522
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
523
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
524
Assert.Null(container!.
Spec
!.Build!.Stage);
526
container!.
Spec
!.Build!.Args!,
Aspire.Hosting.Tests (102)
Dcp\DcpExecutorTests.cs (55)
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);
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)
534
Assert.Equal(RedisImageSource, item.
Spec
.Image);
535
Assert.Equal(["redis-cli", "-h", "host.docker.internal", "-p", "9999", "MONITOR"], item.
Spec
.Args);
536
Assert.Equal(["--add-host", "testlocalhost:127.0.0.1"], item.
Spec
.RunArgs);
587
Assert.Equal(RedisImageSource, item.
Spec
.Image);
597
item.
Spec
.CreateFiles);
725
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
726
Assert.Equal("6379", GetEnv(redisContainer.
Spec
.Env, "REDIS_PORT"));
729
Assert.Equal($"{{{{- portForServing \"{testName}-servicea-http0-{suffix}\" -}}}}", GetEnv(serviceA.
Spec
.Env, "PORT0"));
734
Assert.Equal($"{{{{- portForServing \"{testName}-nodeapp-{suffix}\" -}}}}", GetEnv(nodeApp.
Spec
.Env, "PORT"));
774
Assert.Equal("BrowserToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
775
Assert.Equal("ThisIsATestToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__BROWSERTOKEN"));
777
Assert.Equal("ApiKey", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
778
var keyBytes = Convert.FromHexString(GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__PRIMARYAPIKEY")!);
814
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
815
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
848
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
849
Assert.Equal("bob", redisContainer.
Spec
.Command);
875
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
877
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
878
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
879
Assert.Equal(sourcePath, redisContainer.
Spec
.VolumeMounts[0].Source);
904
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
906
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
907
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
908
Assert.NotEqual("etc/path-here", redisContainer.
Spec
.VolumeMounts[0].Source);
909
Assert.True(Path.IsPathRooted(redisContainer.
Spec
.VolumeMounts[0].Source));
934
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
936
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
937
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
938
Assert.Equal($"{testName}-volume", redisContainer.
Spec
.VolumeMounts[0].Source);
1180
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1187
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1189
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1195
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1233
Assert.All(serviceList.Where(s => s.Metadata.Name.Contains("redis")), s => Assert.Equal(AddressAllocationModes.Proxyless, s.
Spec
.AddressAllocationMode));
1238
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1245
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1247
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1253
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1302
Assert.Single(networks, n => n.
Spec
.Persistent == true);
1306
Assert.Single(networks, n => n.
Spec
.Persistent.GetValueOrDefault(false) == false);