1 write to Spec
Aspire.Hosting (1)
Dcp\Model\ModelCommon.cs (1)
142
Spec
= spec;
164 references to Spec
Aspire.Hosting (50)
Dcp\DcpExecutor.cs (28)
489
if (container.
Spec
.Start == false && (container.Status?.State == null || container.Status?.State == ContainerState.Pending))
700
.Where(sr => !sr.Service.HasCompleteAddress && sr.Service.
Spec
.AddressAllocationMode != AddressAllocationModes.Proxyless)
855
svc.
Spec
.Port = port;
856
svc.
Spec
.Protocol = PortProtocol.FromProtocolType(endpoint.Protocol);
859
svc.
Spec
.Address = "localhost";
863
svc.
Spec
.Address = endpoint.TargetHost;
868
svc.
Spec
.AddressAllocationMode = AddressAllocationModes.Proxyless;
899
exe.
Spec
.WorkingDirectory = executable.WorkingDirectory;
900
exe.
Spec
.ExecutionType = ExecutionType.Process;
931
exeSpec.
Spec
.WorkingDirectory = Path.GetDirectoryName(projectMetadata.ProjectPath);
948
exeSpec.
Spec
.ExecutionType = ExecutionType.IDE;
958
exeSpec.
Spec
.ExecutionType = ExecutionType.Process;
1104
var spec = exe.
Spec
;
1209
ctr.
Spec
.ContainerName = containerObjectInstance.Name; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name.
1213
ctr.
Spec
.Persistent = true;
1218
ctr.
Spec
.PullPolicy = pullPolicy switch
1232
ctr.
Spec
.Networks = new List<ContainerNetworkConnection>
1305
network.
Spec
.Persistent = true;
1308
network.
Spec
.NetworkName = $"{DefaultAspirePersistentNetworkName}-{_nameGenerator.GetProjectHashSuffix()}";
1312
network.
Spec
.NetworkName = $"{DefaultAspireNetworkName}-{DcpNameGenerator.GetRandomNameSuffix()}";
1318
network.
Spec
.NetworkName += $"-{shortApplicationName}"; // Limit to 32 characters to avoid exceeding resource name length limits.
1334
container.
Spec
.Start = false;
1358
var spec = dcpContainerResource.
Spec
;
1421
dcpContainerResource.
Spec
.Build = new()
1462
dcpContainerResource.
Spec
.Build = new()
1649
patch = CreatePatch(c, obj => obj.
Spec
.Stop = true);
1664
patch = CreatePatch(e, obj => obj.
Spec
.Stop = true);
1720
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 (15)
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;
109
var environment = GetEnvironmentVariables(executable.Status?.EffectiveEnv, executable.
Spec
.Env);
127
new(KnownProperties.Executable.Path, executable.
Spec
.ExecutablePath),
128
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
150
new(KnownProperties.Executable.Path, executable.
Spec
.ExecutablePath),
151
new(KnownProperties.Executable.WorkDir, executable.
Spec
.WorkingDirectory),
215
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;
237
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)
193
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
194
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
225
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
226
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
453
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
454
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
455
Assert.Null(container!.
Spec
!.Build!.Stage);
457
container!.
Spec
!.Build!.Args!,
523
Assert.Equal(tempContextPath, container!.
Spec
!.Build!.Context);
524
Assert.Equal(tempDockerfilePath, container!.
Spec
!.Build!.Dockerfile);
525
Assert.Null(container!.
Spec
!.Build!.Stage);
527
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)
535
Assert.Equal(RedisImageSource, item.
Spec
.Image);
536
Assert.Equal(["redis-cli", "-h", "host.docker.internal", "-p", "9999", "MONITOR"], item.
Spec
.Args);
537
Assert.Equal(["--add-host", "testlocalhost:127.0.0.1"], item.
Spec
.RunArgs);
588
Assert.Equal(RedisImageSource, item.
Spec
.Image);
598
item.
Spec
.CreateFiles);
726
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
727
Assert.Equal("6379", GetEnv(redisContainer.
Spec
.Env, "REDIS_PORT"));
730
Assert.Equal($"{{{{- portForServing \"{testName}-servicea-http0-{suffix}\" -}}}}", GetEnv(serviceA.
Spec
.Env, "PORT0"));
735
Assert.Equal($"{{{{- portForServing \"{testName}-nodeapp-{suffix}\" -}}}}", GetEnv(nodeApp.
Spec
.Env, "PORT"));
775
Assert.Equal("BrowserToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
776
Assert.Equal("ThisIsATestToken", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__BROWSERTOKEN"));
778
Assert.Equal("ApiKey", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
779
var keyBytes = Convert.FromHexString(GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__PRIMARYAPIKEY")!);
815
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__FRONTEND__AUTHMODE"));
816
Assert.Equal("Unsecured", GetEnv(aspireDashboard.
Spec
.Env, "DASHBOARD__OTLP__AUTHMODE"));
849
Assert.Equal(RedisImageSource, redisContainer.
Spec
.Image);
850
Assert.Equal("bob", redisContainer.
Spec
.Command);
876
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
878
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
879
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
880
Assert.Equal(sourcePath, redisContainer.
Spec
.VolumeMounts[0].Source);
905
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
907
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
908
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
909
Assert.NotEqual("etc/path-here", redisContainer.
Spec
.VolumeMounts[0].Source);
910
Assert.True(Path.IsPathRooted(redisContainer.
Spec
.VolumeMounts[0].Source));
935
$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.
Spec
.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout);
937
Assert.NotNull(redisContainer.
Spec
.VolumeMounts);
938
Assert.NotEmpty(redisContainer.
Spec
.VolumeMounts);
939
Assert.Equal($"{testName}-volume", redisContainer.
Spec
.VolumeMounts[0].Source);
1181
var env = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis");
1186
Assert.Equal(1234, Assert.Single(redisContainer.
Spec
.Ports!).HostPort);
1188
var otherRedisEnv = Assert.Single(service.
Spec
.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort");
1192
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1230
Assert.All(serviceList.Where(s => s.Metadata.Name.Contains("redis")), s => Assert.Equal(AddressAllocationModes.Proxyless, s.
Spec
.AddressAllocationMode));
1235
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");
1246
Assert.Equal(6379, Assert.Single(otherRedisContainer.
Spec
.Ports!).HostPort);
1295
Assert.Single(networks, n => n.
Spec
.Persistent == true);
1299
Assert.Single(networks, n => n.
Spec
.Persistent.GetValueOrDefault(false) == false);