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