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