1 write to Spec
Aspire.Hosting (1)
Dcp\Model\ModelCommon.cs (1)
150Spec = spec;
248 references to Spec
Aspire.Hosting (71)
Dcp\DcpExecutor.cs (46)
191.Where(sr => !sr.HasCompleteAddress && sr.Spec.AddressAllocationMode != AddressAllocationModes.Proxyless); 623if (container.Spec.Start == false && (container.Status?.State == null || container.Status?.State == ContainerState.Pending)) 921var containerNetworkName = (ctp.DcpResource as ContainerNetworkTunnelProxy)?.Spec.ContainerNetworkName; 1044if (appResource.DcpResource is Container ctr && ctr.Spec.Networks is not null) 1047var containerNetwork = ctr.Spec.Networks.FirstOrDefault(n => n.Name == KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value); 1153network.Spec.Persistent = true; 1156network.Spec.NetworkName = $"{DefaultAspirePersistentNetworkName}-{_nameGenerator.GetProjectHashSuffix()}"; 1160network.Spec.NetworkName = $"{DefaultAspireNetworkName}-{DcpNameGenerator.GetRandomNameSuffix()}"; 1166network.Spec.NetworkName += $"-{shortApplicationName}"; // Limit to 32 characters to avoid exceeding resource name length limits. 1212svc.Spec.Port = port; 1213svc.Spec.Protocol = PortProtocol.FromProtocolType(endpoint.Protocol); 1216svc.Spec.Address = KnownHostNames.Localhost; 1220svc.Spec.Address = endpoint.TargetHost; 1225svc.Spec.AddressAllocationMode = AddressAllocationModes.Proxyless; 1278tunnelProxy.Spec.ContainerNetworkName = KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value; 1279tunnelProxy.Spec.Aliases = [ContainerHostName]; 1280tunnelProxy.Spec.Tunnels = []; 1314svc.Spec.AddressAllocationMode = AddressAllocationModes.Proxyless; 1315svc.Spec.Protocol = PortProtocol.TCP; 1340tunnelProxy?.Spec?.Tunnels?.Add(tunnelConfig); 1345svc.Annotate(CustomResource.ContainerNetworkAnnotation, tunnelProxy?.Spec?.ContainerNetworkName ?? KnownNetworkIdentifiers.DefaultAspireContainerNetwork.Value); 1412exe.Spec.WorkingDirectory = executable.WorkingDirectory; 1419exe.Spec.ExecutionType = ExecutionType.IDE; 1420exe.Spec.FallbackExecutionTypes = [ExecutionType.Process]; 1425exe.Spec.ExecutionType = ExecutionType.Process; 1455exe.Spec.WorkingDirectory = Path.GetDirectoryName(projectMetadata.ProjectPath); 1472exe.Spec.ExecutionType = ExecutionType.IDE; 1473exe.Spec.FallbackExecutionTypes = [ExecutionType.Process]; 1484exe.Spec.ExecutionType = ExecutionType.Process; 1691var spec = containerExe.Spec; 1715var spec = exe.Spec; 1786exe.Spec.PemCertificates = pemCertificates; 1927ctr.Spec.ContainerName = containerObjectInstance.Name; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name. 1931ctr.Spec.Persistent = true; 1936ctr.Spec.PullPolicy = pullPolicy switch 1957ctr.Spec.Networks = new List<ContainerNetworkConnection> 2047container.Spec.Start = false; 2082var spec = dcpContainerResource.Spec; 2304dcpContainerResource.Spec.Build = new() 2345dcpContainerResource.Spec.Build = new() 2486patch = CreatePatch(c, obj => obj.Spec.Stop = true); 2501patch = CreatePatch(e, obj => obj.Spec.Stop = true); 2564c.Spec.Start = true; 3020var persistentTunnelDependent = tunnelDependent.Where(td => td.DcpResource is Container c && c.Spec.Persistent is true); 3031.Where(ar => ar.DcpResource is ContainerExec ce && regular.Any(td => td.DcpResource is Container c && c.Metadata.Name == ce.Spec.ContainerName)), 3033.Where(ar => ar.DcpResource is ContainerExec ce && tunnelDependent.Any(td => td.DcpResource is Container c && c.Metadata.Name == ce.Spec.ContainerName))
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 (18)
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), 267e.Value.Spec.ServiceName == serviceName 299var isActive = _resourceState.EndpointsMap.Any(e => e.Value.Spec.ServiceName == endpointOwnerEndpoint?.Metadata.Name); 328return container.Spec.VolumeMounts?.Select(v => new VolumeSnapshot(v.Source, v.Target ?? "", v.Type, v.IsReadOnly)).ToImmutableArray() ?? [];
Aspire.Hosting.Containers.Tests (12)
WithDockerfileTests.cs (12)
213Assert.Equal(tempContextPath, container!.Spec!.Build!.Context); 214Assert.Equal(tempDockerfilePath, container!.Spec!.Build!.Dockerfile); 245Assert.Equal(tempContextPath, container!.Spec!.Build!.Context); 246Assert.Equal(tempDockerfilePath, container!.Spec!.Build!.Dockerfile); 473Assert.Equal(tempContextPath, container!.Spec!.Build!.Context); 474Assert.Equal(tempDockerfilePath, container!.Spec!.Build!.Dockerfile); 475Assert.Null(container!.Spec!.Build!.Stage); 477container!.Spec!.Build!.Args!, 543Assert.Equal(tempContextPath, container!.Spec!.Build!.Context); 544Assert.Equal(tempDockerfilePath, container!.Spec!.Build!.Dockerfile); 545Assert.Null(container!.Spec!.Build!.Stage); 547container!.Spec!.Build!.Args!,
Aspire.Hosting.Tests (165)
Dcp\DcpExecutorTests.cs (80)
162var callArgs = executionType == ExecutionType.IDE ? exe.Spec.Args : exe.Spec.Args![^(expectedArgs?.Length ?? 0)..]; 199Assert.Equal(callArgs, exe.Spec.Args); 239var callCount1 = exe1.Spec.Env!.Single(e => e.Name == "CALL_COUNT"); 242Assert.Single(exe1.Spec.Args!, a => a == "--no-build"); 243Assert.Single(exe1.Spec.Args!, a => a == "--test"); 257var callCount2 = exe2.Spec.Env!.Single(e => e.Name == "CALL_COUNT"); 260Assert.Single(exe2.Spec.Args!, a => a == "--no-build"); 261Assert.Single(exe2.Spec.Args!, a => a == "--test"); 288Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 292var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value; 320Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 324var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value; 352Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 356var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value; 385Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 389var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value; 441Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 445var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value; 475Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 479var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value; 509Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 513var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value; 914Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 918var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "NO_PORT_NO_TARGET_PORT").Value; 923var aspnetCoreUrls = dcpExe.Spec.Env?.Single(v => v.Name == "ASPNETCORE_URLS").Value; 959Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 963var envVarVal = dcpExe.Spec.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value; 992Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 994Assert.NotNull(dcpCtr.Spec.Ports); 995Assert.Contains(dcpCtr.Spec.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort); 998var envVarVal = dcpCtr.Spec.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value; 1027Assert.Equal(AddressAllocationModes.Localhost, svc.Spec.AddressAllocationMode); 1029Assert.NotNull(dcpCtr.Spec.Ports); 1030Assert.Contains(dcpCtr.Spec.Ports!, p => p.HostPort is null && p.ContainerPort == desiredTargetPort); 1033var envVarVal = dcpCtr.Spec.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value; 1107Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 1109Assert.NotNull(dcpCtr.Spec.Ports); 1110Assert.Contains(dcpCtr.Spec.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredPort); 1113var envVarVal = dcpCtr.Spec.Env?.Single(v => v.Name == "PORT_SET_NO_TARGET_PORT").Value; 1143Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 1145Assert.NotNull(dcpCtr.Spec.Ports); 1146Assert.Contains(dcpCtr.Spec.Ports!, p => p.HostPort == desiredTargetPort && p.ContainerPort == desiredTargetPort); 1149var envVarVal = dcpCtr.Spec.Env?.Single(v => v.Name == "NO_PORT_TARGET_PORT_SET").Value; 1180Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 1182Assert.NotNull(dcpCtr.Spec.Ports); 1183Assert.Contains(dcpCtr.Spec.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort); 1186var envVarVal = dcpCtr.Spec.Env?.Single(v => v.Name == "PORT_AND_TARGET_PORT_SET").Value; 1217Assert.Equal(AddressAllocationModes.Proxyless, svc.Spec.AddressAllocationMode); 1219Assert.NotNull(dcpCtr.Spec.Ports); 1220Assert.Contains(dcpCtr.Spec.Ports!, p => p.HostPort == desiredPort && p.ContainerPort == desiredTargetPort && p.Protocol == "UDP"); 1223var envVarVal = dcpCtr.Spec.Env?.Single(v => v.Name == "PORT_AND_PROTOCOL_SET").Value; 1306Assert.Null(implicitDefaultContainer.Spec.PullPolicy); 1309Assert.Null(explicitDefaultContainer.Spec.PullPolicy); 1312Assert.Equal(ContainerPullPolicy.Always, explicitAlwaysContainer.Spec.PullPolicy); 1315Assert.Equal(ContainerPullPolicy.Missing, explicitMissingContainer.Spec.PullPolicy); 1318Assert.Equal(ContainerPullPolicy.Never, explicitNeverContainer.Spec.PullPolicy); 1496Assert.NotNull(exe.Spec.Env); 1497var effectiveLaunchProfileEnv = exe.Spec.Env.SingleOrDefault(v => v.Name == "DOTNET_LAUNCH_PROFILE")?.Value; 1528var envVal = exe.Spec.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value; 1559var envVal = exe.Spec.Env!.SingleOrDefault(e => e.Name == "DOTNET_LAUNCH_PROFILE")?.Value; 1590Assert.DoesNotContain(exe.Spec.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE"); 1620Assert.DoesNotContain(exe.Spec.Env ?? [], e => e.Name == "DOTNET_LAUNCH_PROFILE"); 1695Assert.Equal(ExecutionType.IDE, debuggableExe.Spec.ExecutionType); 1702Assert.Equal(ExecutionType.Process, nonDebuggableExe.Spec.ExecutionType); 1739Assert.Equal(ExecutionType.Process, exe.Spec.ExecutionType); 1776Assert.Equal(ExecutionType.Process, debuggableExe.Spec.ExecutionType); 1780Assert.Equal(ExecutionType.Process, nonDebuggableExe.Spec.ExecutionType); 1817Assert.Equal(ExecutionType.Process, exe.Spec.ExecutionType); 1853Assert.Equal(ExecutionType.Process, exe.Spec.ExecutionType); 1895Assert.Equal(ExecutionType.Process, exe.Spec.ExecutionType); 1937Assert.Equal(ExecutionType.Process, exe.Spec.ExecutionType); 1979Assert.Equal(ExecutionType.IDE, exe.Spec.ExecutionType); 2016Assert.Equal(ExecutionType.IDE, exe.Spec.ExecutionType); 2053Assert.Equal(ExecutionType.IDE, exe.Spec.ExecutionType); 2096Assert.Equal(ExecutionType.IDE, exe.Spec.ExecutionType); 2124Assert.NotNull(container.Spec.Networks); 2125var network = Assert.Single(container.Spec.Networks); 2176Assert.Equal(ExecutionType.Process, exe.Spec.ExecutionType); 2251var exePortEnvVal = dcpContainer.Spec?.Env?.Where(e => e.Name == $"EXE_{endpointName.ToUpper()}_PORT").Single().Value;
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 (79)
694Assert.Equal(RedisImageSource, item.Spec.Image); 695Assert.Equal(["redis-cli", "-h", "host.docker.internal", "-p", "9999", "MONITOR"], item.Spec.Args); 696Assert.Equal(["--add-host", "testlocalhost:127.0.0.1"], item.Spec.RunArgs); 751Assert.Equal(RedisImageSource, item.Spec.Image); 761item.Spec.CreateFiles); 794Assert.NotNull(redisContainer.Spec.Args); 795Assert.Equal(2, redisContainer.Spec.Args.Count); 797Assert.Equal("-c", redisContainer.Spec.Args[0]); 798Assert.Contains("--tls-cert-file", redisContainer.Spec.Args[1]); 799Assert.Contains("--tls-key-file", redisContainer.Spec.Args[1]); 800Assert.Contains("--tls-auth-clients", redisContainer.Spec.Args[1]); 801Assert.Contains("--tls-port", redisContainer.Spec.Args[1]); 802Assert.Contains("--port", redisContainer.Spec.Args[1]); 805Assert.NotNull(redisContainer.Spec.Ports); 806Assert.Contains(redisContainer.Spec.Ports, p => p.ContainerPort == 6380); 807Assert.Contains(redisContainer.Spec.Ports, p => p.ContainerPort == 6379); 870Assert.Equal(RedisImageSource, item.Spec.Image); 874Assert.NotNull(item.Spec.Env); 877Assert.DoesNotContain(item.Spec.Env, e => e.Name == "SSL_CERT_FILE"); 881Assert.Collection(item.Spec.Env.Where(e => e.Name == "SSL_CERT_FILE"), 889Assert.Collection(item.Spec.Env.Where(e => e.Name == "SSL_CERT_DIR"), 907Assert.Empty(item.Spec?.PemCertificates?.Certificates ?? []); 913var foundCert = Assert.Single(item.Spec?.PemCertificates?.Certificates ?? [], c => string.Equals(c.Thumbprint, cert.Thumbprint, StringComparison.Ordinal)); 922Assert.Equal(expectedDefaultBundleFiles.Count, item.Spec?.PemCertificates?.OverwriteBundlePaths?.Count ?? 0); 925Assert.Contains(bundlePath, item.Spec?.PemCertificates?.OverwriteBundlePaths ?? []); 931Assert.Empty(item.Spec?.PemCertificates?.Certificates ?? []); 1000r => r.Spec.Env != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout); 1003Assert.NotNull(redisContainer.Spec.Env); 1006Assert.Single(redisContainer.Spec.Env, e => e.Name == "INITIAL_ENV_VAR" && e.Value == "InitialValue"); 1007Assert.Single(redisContainer.Spec.Env, e => e.Name == "CALLBACK_ADDED_VAR" && e.Value == "CallbackValue"); 1008Assert.Single(redisContainer.Spec.Env, e => e.Name == "INITIAL_REFERENCE_EXPRESSION" && e.Value == $"{value}_AppendedInCallback"); 1040r => r.Spec.Env != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout); 1043Assert.NotNull(redisContainer.Spec.Env); 1046Assert.Single(redisContainer.Spec.Env, e => e.Name == "INITIAL_ENV_VAR" && e.Value == "InitialValue"); 1047Assert.Single(redisContainer.Spec.Env, e => e.Name == "INITIAL_REFERENCE_EXPRESSION" && e.Value == $"{value}"); 1169Assert.Equal(RedisImageSource, redisContainer.Spec.Image); 1170Assert.Equal("6379", GetEnv(redisContainer.Spec.Env, "REDIS_PORT")); 1173Assert.Equal($"{{{{- portForServing \"{testName}-servicea-http0-{suffix}\" -}}}}", GetEnv(serviceA.Spec.Env, "PORT0")); 1178Assert.Equal($"{{{{- portForServing \"{testName}-nodeapp-{suffix}\" -}}}}", GetEnv(nodeApp.Spec.Env, "PORT")); 1244Assert.Equal("BrowserToken", GetEnv(aspireDashboard.Spec.Env, "DASHBOARD__FRONTEND__AUTHMODE")); 1245Assert.Equal("ThisIsATestToken", GetEnv(aspireDashboard.Spec.Env, "DASHBOARD__FRONTEND__BROWSERTOKEN")); 1247Assert.Equal("ApiKey", GetEnv(aspireDashboard.Spec.Env, "DASHBOARD__OTLP__AUTHMODE")); 1248var keyBytes = Convert.FromHexString(GetEnv(aspireDashboard.Spec.Env, "DASHBOARD__OTLP__PRIMARYAPIKEY")!); 1281Assert.Equal("Unsecured", GetEnv(aspireDashboard.Spec.Env, "DASHBOARD__FRONTEND__AUTHMODE")); 1282Assert.Equal("Unsecured", GetEnv(aspireDashboard.Spec.Env, "DASHBOARD__OTLP__AUTHMODE")); 1314Assert.Equal(RedisImageSource, redisContainer.Spec.Image); 1315Assert.Equal("bob", redisContainer.Spec.Command); 1340$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.Spec.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout); 1342Assert.NotNull(redisContainer.Spec.VolumeMounts); 1343Assert.NotEmpty(redisContainer.Spec.VolumeMounts); 1344Assert.Equal(sourcePath, redisContainer.Spec.VolumeMounts[0].Source); 1368$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.Spec.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout); 1370Assert.NotNull(redisContainer.Spec.VolumeMounts); 1371Assert.NotEmpty(redisContainer.Spec.VolumeMounts); 1372Assert.NotEqual("etc/path-here", redisContainer.Spec.VolumeMounts[0].Source); 1373Assert.True(Path.IsPathRooted(redisContainer.Spec.VolumeMounts[0].Source)); 1397$"{testName}-redis-{ReplicaIdRegex}-{suffix}", r => r.Spec.VolumeMounts != null).DefaultTimeout(TestConstants.DefaultOrchestratorTestLongTimeout); 1399Assert.NotNull(redisContainer.Spec.VolumeMounts); 1400Assert.NotEmpty(redisContainer.Spec.VolumeMounts); 1401Assert.Equal($"{testName}-volume", redisContainer.Spec.VolumeMounts[0].Source); 1642var env = Assert.Single(service.Spec.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis"); 1652Assert.Equal(2, redisContainer.Spec.Ports!.Count); 1653Assert.Contains(redisContainer.Spec.Ports!, p => p.HostPort == port); 1657Assert.Equal(port, Assert.Single(redisContainer.Spec.Ports!).HostPort); 1660var otherRedisEnv = Assert.Single(service.Spec.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort"); 1668Assert.Equal(2, otherRedisContainer.Spec.Ports!.Count); 1669Assert.Contains(otherRedisContainer.Spec.Ports!, p => p.HostPort == 6379); 1673Assert.Equal(6379, Assert.Single(otherRedisContainer.Spec.Ports!).HostPort); 1710Assert.All(serviceList.Where(s => s.Metadata.Name.Contains("redis")), s => Assert.Equal(AddressAllocationModes.Proxyless, s.Spec.AddressAllocationMode)); 1715var env = Assert.Single(service.Spec.Env!, e => e.Name == $"ConnectionStrings__{testName}-redis"); 1725Assert.Equal(2, redisContainer.Spec.Ports!.Count); 1726Assert.Contains(redisContainer.Spec.Ports!, p => p.HostPort == port); 1730Assert.Equal(port, Assert.Single(redisContainer.Spec.Ports!).HostPort); 1733var otherRedisEnv = Assert.Single(service.Spec.Env!, e => e.Name == $"ConnectionStrings__{testName}-redisNoPort"); 1742Assert.Equal(2, otherRedisContainer.Spec.Ports!.Count); 1743Assert.Contains(otherRedisContainer.Spec.Ports!, p => p.HostPort == 6379); 1747Assert.Equal(6379, Assert.Single(otherRedisContainer.Spec.Ports!).HostPort); 1797Assert.Single(networks, n => n.Spec.Persistent == true); 1801Assert.Single(networks, n => n.Spec.Persistent.GetValueOrDefault(false) == false);