Uh oh!
There was an error while loading. Please reload this page.
') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })();
There was an error while loading. Please reload this page.
Description of Documentation Need
fast/stages-aw/README.mddescribes the networking stage as:That sentence makes four claims about what the stage ships. Three of them are wrong, and they are wrong in the same direction — each describes a capability the reader would plan around.
1. Neither option implements VPN connectivity to on-premises
Verified across every
.tffile in both stages: there is no VPN gateway, Cloud Router, Interconnect attachment or Network Connectivity Center hub in either one.2-networking-a-fedramp(FedRAMP High / Moderate) —main.tf,net-vdss.tf,branch-net-envs.tf,nva.tf,psc.tf,connectivity-tests.tf,log-metric-alerts.tf,outputs.tf,variables.tf: no hybrid-connectivity resource of any kind.2-networking-b-il5-ngfw(IL5/IL4) — same result.The only peering present is VPC peering between the hub and the environment spokes (
module.peering-envs,branch-net-envs.tf), which is internal to the landing zone and is not on-premises connectivity. The one hybrid-shaped resource in the tree,google_network_connectivity_internal_range(branch-net-envs.tf, ~lines 117-133), is commented out.2. VPC-level firewall rules are not a YAML factory — they come from tfvars
Every
net-vpc-firewallcall in both networking options passes its rules from thefirewall_rulesTerraform variable, and not one of them setsfactories_config.2-networking-a-fedramp— three calls:net-vdss.tf:76module "dmz-firewall"→:84-85ingress_rules = try(var.firewall_rules.dmz.ingress, {}),egress_rules = try(var.firewall_rules.dmz.egress, {})net-vdss.tf:108module "vdss-firewall"→:116-117, againstvar.firewall_rules.vdssbranch-net-envs.tf:138module "env-spoke-firewall"→:148-149, againstvar.firewall_rules[lower(each.key)]2-networking-b-il5-ngfw— four calls, the same pattern plus the management VPC that option adds:net-vdss.tf:72module "dmz-firewall"→:80-81net-vdss.tf:104module "vdss-firewall"→:112-113net-vdss.tf:135module "mgmt-firewall"→:143-144, againstvar.firewall_rules.mgmtbranch-net-envs.tf:138module "env-spoke-firewall"→:148-149firewall_rulesis declared as an ordinary variable in each stage'svariables.tf(variables.tf:303in the FedRAMP option — "Firewall rules for each VPC / environment spoke"), so these rules are written interraform.tfvars, not in YAML files.The hierarchical half of the claim is correct and is worth keeping:
main.tf:44-50buildsmodule "firewall-policy-default"fromnet-firewall-policywithcidr_file_path = "${var.factories_config.data_dir}/cidrs.yaml"andingress_rules_file_path = "${var.factories_config.data_dir}/hierarchical-ingress-rules.yaml". That is a genuine YAML factory, and it is present in both options (main.tf:44-49in the IL5/IL4 one).3. Subnets are not a YAML factory either — same pattern, both options
2-networking-a-fedramp:net-vdss.tf:73—subnets = try(var.subnets.dmz, [])net-vdss.tf:96—subnets = try(var.subnets.landing, [])branch-net-envs.tf:104—subnets = try(var.subnets[lower(each.key)], [])2-networking-b-il5-ngfw:net-vdss.tf:69(dmz),:92(landing),:123(mgmt) andbranch-net-envs.tf:104(spokes) — alltry(var.subnets.<key>, [])Every subnet in both options comes from the
subnetsvariable, i.e. fromterraform.tfvars.Net: of the three things the sentence calls "YAML-based factories", exactly one is — and this is not specific to one regime. Both networking options are affected identically, so the sentence is wrong for FedRAMP High, FedRAMP Moderate, IL4 and IL5 alike. The VPN clause looks inherited from the generic upstream FAST
2-networkingstage, where hybrid connectivity genuinely is part of the design. Neither clause describes thestages-awvariants as built.Target Audience
Operators and partner architects planning a landing-zone deployment — the people most likely to read this README while scoping how an existing data center will connect and how the network will be maintained day to day. Both errors cost them the same way. A partner sizing a FedRAMP High engagement can reasonably read the current text as "hybrid connectivity ships with the stage" and plan an architecture, a statement of work or a customer commitment around it; the same partner can promise a customer that firewall rules and subnets are managed as reviewable YAML data files, which is how a network team is usually persuaded to adopt a factory pattern in the first place, and then discover at implementation time that both are Terraform variables in
terraform.tfvars.Proposed Location
fast/stages-aw/README.md, the networking-stage paragraph quoted above. Optionally also a one-line note in each stage README (2-networking-a-fedramp/README.md,2-networking-b-il5-ngfw/README.md) stating that hybrid connectivity is not included and which inputs are factory-driven.Content Outline / Draft
Correct both clauses, and point at what an operator would actually use:
On the factory clause, the fix belongs in the README rather than in the code. Both networking options are consistently tfvars-driven for these two inputs — every VPC firewall rule and every subnet in both.
Compliance Context (if applicable)
Applies equally to FedRAMP High, FedRAMP Moderate, IL4 and IL5, since both networking options are affected. No NIST control is misstated — this is a scoping and expectation-setting problem rather than a control gap. The VPN clause matters most during boundary definition, where an architect is deciding whether on-premises systems fall inside the authorization boundary and how traffic will reach them. The factory clause matters to change management rather than to any control text: how firewall rules are stored and reviewed is something assessors ask about, and "YAML files in a data directory" and "variables in a tfvars file" are different answers.