@intentius/chant-lexicon-gcp 0.41.20 → 0.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/composites/index.d.ts +2 -0
- package/dist/composites/index.d.ts.map +1 -1
- package/dist/composites/landing-zone.d.ts +67 -0
- package/dist/composites/landing-zone.d.ts.map +1 -0
- package/dist/deep-observe-hooks.d.ts +16 -3
- package/dist/deep-observe-hooks.d.ts.map +1 -1
- package/dist/deep-observe.d.ts +68 -139
- package/dist/deep-observe.d.ts.map +1 -1
- package/dist/describe-resources.d.ts +27 -3
- package/dist/describe-resources.d.ts.map +1 -1
- package/dist/governance.d.ts +101 -0
- package/dist/governance.d.ts.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/integrity.json +5 -2
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/post-synth/index.d.ts.map +1 -1
- package/dist/lint/post-synth/wgc501.d.ts +18 -0
- package/dist/lint/post-synth/wgc501.d.ts.map +1 -0
- package/dist/lint/post-synth/wgc502.d.ts +10 -0
- package/dist/lint/post-synth/wgc502.d.ts.map +1 -0
- package/dist/lint/post-synth/wgc503.d.ts +11 -0
- package/dist/lint/post-synth/wgc503.d.ts.map +1 -0
- package/dist/manifest.json +1 -1
- package/dist/okf/index.md +519 -0
- package/dist/okf/rules/WGC001.md +15 -0
- package/dist/okf/rules/WGC002.md +16 -0
- package/dist/okf/rules/WGC003.md +15 -0
- package/dist/okf/rules/WGC101.md +16 -0
- package/dist/okf/rules/WGC102.md +15 -0
- package/dist/okf/rules/WGC103.md +15 -0
- package/dist/okf/rules/WGC104.md +15 -0
- package/dist/okf/rules/WGC105.md +15 -0
- package/dist/okf/rules/WGC106.md +15 -0
- package/dist/okf/rules/WGC107.md +15 -0
- package/dist/okf/rules/WGC108.md +15 -0
- package/dist/okf/rules/WGC109.md +11 -0
- package/dist/okf/rules/WGC110.md +15 -0
- package/dist/okf/rules/WGC111.md +15 -0
- package/dist/okf/rules/WGC112.md +15 -0
- package/dist/okf/rules/WGC113.md +16 -0
- package/dist/okf/rules/WGC201.md +15 -0
- package/dist/okf/rules/WGC202.md +11 -0
- package/dist/okf/rules/WGC203.md +11 -0
- package/dist/okf/rules/WGC204.md +15 -0
- package/dist/okf/rules/WGC301.md +15 -0
- package/dist/okf/rules/WGC302.md +15 -0
- package/dist/okf/rules/WGC303.md +15 -0
- package/dist/okf/rules/WGC401.md +15 -0
- package/dist/okf/rules/WGC402.md +15 -0
- package/dist/okf/rules/WGC403.md +15 -0
- package/dist/okf/rules/WGC501.md +15 -0
- package/dist/okf/rules/WGC502.md +11 -0
- package/dist/okf/rules/WGC503.md +15 -0
- package/dist/okf/types/API.md +21 -0
- package/dist/okf/types/APIConfig.md +15 -0
- package/dist/okf/types/APIQuotaAdjusterSettings.md +15 -0
- package/dist/okf/types/APIQuotaPreference.md +15 -0
- package/dist/okf/types/AccessBoundaryPolicy.md +15 -0
- package/dist/okf/types/AccessLevel.md +15 -0
- package/dist/okf/types/AccessLevelCondition.md +15 -0
- package/dist/okf/types/AccessPolicy.md +15 -0
- package/dist/okf/types/AddonsConfig.md +15 -0
- package/dist/okf/types/AgentPool.md +15 -0
- package/dist/okf/types/AiplatformModel.md +15 -0
- package/dist/okf/types/AistreamsCluster.md +15 -0
- package/dist/okf/types/AlertPolicy.md +15 -0
- package/dist/okf/types/AlloydbBackup.md +15 -0
- package/dist/okf/types/AlloydbCluster.md +15 -0
- package/dist/okf/types/AlloydbInstance.md +15 -0
- package/dist/okf/types/AnalyticsAccount.md +15 -0
- package/dist/okf/types/AndroidApp.md +15 -0
- package/dist/okf/types/AnywhereCache.md +15 -0
- package/dist/okf/types/ApigatewayGateway.md +15 -0
- package/dist/okf/types/ApigeeEnvironment.md +15 -0
- package/dist/okf/types/ApigeeInstance.md +15 -0
- package/dist/okf/types/ApihubDeployment.md +15 -0
- package/dist/okf/types/ApikeysKey.md +15 -0
- package/dist/okf/types/AppConnection.md +15 -0
- package/dist/okf/types/AppConnector.md +15 -0
- package/dist/okf/types/AppGateway.md +15 -0
- package/dist/okf/types/AppProfile.md +15 -0
- package/dist/okf/types/Application.md +15 -0
- package/dist/okf/types/ArtifactRegistryRepository.md +15 -0
- package/dist/okf/types/Assignment.md +15 -0
- package/dist/okf/types/Attestor.md +15 -0
- package/dist/okf/types/AuthorizationPolicy.md +15 -0
- package/dist/okf/types/AuthorizedView.md +15 -0
- package/dist/okf/types/AutokeyConfig.md +15 -0
- package/dist/okf/types/Automation.md +15 -0
- package/dist/okf/types/Autoscaler.md +15 -0
- package/dist/okf/types/AutoscalingPolicy.md +15 -0
- package/dist/okf/types/BQJob.md +15 -0
- package/dist/okf/types/BackendBucket.md +15 -0
- package/dist/okf/types/BackendBucketSignedURLKey.md +15 -0
- package/dist/okf/types/BackendService.md +15 -0
- package/dist/okf/types/BackendServiceSignedURLKey.md +15 -0
- package/dist/okf/types/BackupPlanAssociation.md +15 -0
- package/dist/okf/types/BackupPolicy.md +15 -0
- package/dist/okf/types/BackupdrBackupPlan.md +15 -0
- package/dist/okf/types/BackupdrBackupVault.md +15 -0
- package/dist/okf/types/Batch.md +15 -0
- package/dist/okf/types/BatchJob.md +15 -0
- package/dist/okf/types/BatchTask.md +15 -0
- package/dist/okf/types/BigLakeCatalog.md +15 -0
- package/dist/okf/types/BigLakeDatabase.md +15 -0
- package/dist/okf/types/BigLakeTable.md +15 -0
- package/dist/okf/types/BigQueryDataPolicy.md +15 -0
- package/dist/okf/types/BigQueryDataset.md +15 -0
- package/dist/okf/types/BigQueryExport.md +15 -0
- package/dist/okf/types/BigQueryTable.md +15 -0
- package/dist/okf/types/BigqueryconnectionConnection.md +15 -0
- package/dist/okf/types/BigquerydatatransferConfig.md +15 -0
- package/dist/okf/types/BigqueryreservationReservation.md +15 -0
- package/dist/okf/types/BigtableInstance.md +15 -0
- package/dist/okf/types/BigtableTable.md +15 -0
- package/dist/okf/types/BillingAccount.md +15 -0
- package/dist/okf/types/BinaryauthorizationPolicy.md +15 -0
- package/dist/okf/types/Brand.md +15 -0
- package/dist/okf/types/BtBackup.md +15 -0
- package/dist/okf/types/BtCluster.md +15 -0
- package/dist/okf/types/Bucket.md +15 -0
- package/dist/okf/types/BucketAccessControl.md +15 -0
- package/dist/okf/types/Budget.md +15 -0
- package/dist/okf/types/CAPool.md +15 -0
- package/dist/okf/types/CapacityCommitment.md +15 -0
- package/dist/okf/types/CertificateAuthority.md +15 -0
- package/dist/okf/types/CertificateIssuanceConfig.md +15 -0
- package/dist/okf/types/CertificateMap.md +15 -0
- package/dist/okf/types/CertificateMapEntry.md +15 -0
- package/dist/okf/types/CertificateTemplate.md +15 -0
- package/dist/okf/types/CertificatemanagerCertificate.md +15 -0
- package/dist/okf/types/ClientConnectorService.md +15 -0
- package/dist/okf/types/ClientTLSPolicy.md +15 -0
- package/dist/okf/types/CloudBatchResourceAllowance.md +15 -0
- package/dist/okf/types/CloudFunction.md +15 -0
- package/dist/okf/types/CloudRunJob.md +15 -0
- package/dist/okf/types/CloudRunService.md +15 -0
- package/dist/okf/types/CloudbuildTrigger.md +15 -0
- package/dist/okf/types/ClouddmsPrivateConnection.md +15 -0
- package/dist/okf/types/CloudidentityGroup.md +15 -0
- package/dist/okf/types/CloudidentityMembership.md +15 -0
- package/dist/okf/types/CloudidsEndpoint.md +15 -0
- package/dist/okf/types/CloudschedulerJob.md +15 -0
- package/dist/okf/types/ComposerEnvironment.md +15 -0
- package/dist/okf/types/ComputeAddress.md +15 -0
- package/dist/okf/types/ComputeDisk.md +15 -0
- package/dist/okf/types/ComputeFirewallPolicy.md +15 -0
- package/dist/okf/types/ComputeHealthCheck.md +15 -0
- package/dist/okf/types/ComputeInstance.md +19 -0
- package/dist/okf/types/ComputeNetworkPeering.md +15 -0
- package/dist/okf/types/ComputeNodeGroup.md +15 -0
- package/dist/okf/types/ComputeReservation.md +15 -0
- package/dist/okf/types/ComputeRoute.md +15 -0
- package/dist/okf/types/ComputeSnapshot.md +15 -0
- package/dist/okf/types/ConfigcontrollerInstance.md +15 -0
- package/dist/okf/types/ConnectionProfile.md +15 -0
- package/dist/okf/types/ConnectivityTest.md +15 -0
- package/dist/okf/types/Connector.md +28 -0
- package/dist/okf/types/ConsentStore.md +15 -0
- package/dist/okf/types/ConsumerGroup.md +15 -0
- package/dist/okf/types/ConsumerQuotaOverride.md +15 -0
- package/dist/okf/types/Contact.md +15 -0
- package/dist/okf/types/ContainerattachedCluster.md +15 -0
- package/dist/okf/types/ConversionWorkspace.md +15 -0
- package/dist/okf/types/CryptoKeyVersion.md +15 -0
- package/dist/okf/types/CustomClass.md +15 -0
- package/dist/okf/types/CustomConstraint.md +15 -0
- package/dist/okf/types/CustomRole.md +15 -0
- package/dist/okf/types/CustomTargetType.md +15 -0
- package/dist/okf/types/DICOMStore.md +15 -0
- package/dist/okf/types/DNSAuthorization.md +15 -0
- package/dist/okf/types/DNSManagedZone.md +15 -0
- package/dist/okf/types/DNSRecordSet.md +15 -0
- package/dist/okf/types/Dashboard.md +15 -0
- package/dist/okf/types/DataExchange.md +15 -0
- package/dist/okf/types/DataLabelingJob.md +15 -0
- package/dist/okf/types/DataPolicy.md +15 -0
- package/dist/okf/types/DataStore.md +15 -0
- package/dist/okf/types/DataStoreTargetSite.md +15 -0
- package/dist/okf/types/Database.md +15 -0
- package/dist/okf/types/DatacatalogEntryGroup.md +15 -0
- package/dist/okf/types/DataflowJob.md +15 -0
- package/dist/okf/types/DataformRepository.md +15 -0
- package/dist/okf/types/DatafusionInstance.md +15 -0
- package/dist/okf/types/DataplexEntryGroup.md +15 -0
- package/dist/okf/types/DataplexTask.md +15 -0
- package/dist/okf/types/DataprocCluster.md +15 -0
- package/dist/okf/types/DataprocJob.md +15 -0
- package/dist/okf/types/DataprocNodeGroup.md +15 -0
- package/dist/okf/types/DataprocSession.md +15 -0
- package/dist/okf/types/DatasetAccess.md +15 -0
- package/dist/okf/types/DatastoreIndex.md +15 -0
- package/dist/okf/types/DatastreamPrivateConnection.md +15 -0
- package/dist/okf/types/DatastreamRoute.md +15 -0
- package/dist/okf/types/DefaultObjectAccessControl.md +15 -0
- package/dist/okf/types/DefaultSupportedIDPConfig.md +15 -0
- package/dist/okf/types/DeidentifyTemplate.md +15 -0
- package/dist/okf/types/DeliveryPipeline.md +15 -0
- package/dist/okf/types/DenyPolicy.md +15 -0
- package/dist/okf/types/DeployPolicy.md +15 -0
- package/dist/okf/types/DeploymentResourcePool.md +15 -0
- package/dist/okf/types/DeploymentmanagerDeployment.md +15 -0
- package/dist/okf/types/Device.md +15 -0
- package/dist/okf/types/DeviceRegistry.md +15 -0
- package/dist/okf/types/DevicestreamingSession.md +15 -0
- package/dist/okf/types/DialogflowAgent.md +15 -0
- package/dist/okf/types/DialogflowEntityType.md +15 -0
- package/dist/okf/types/DialogflowIntent.md +15 -0
- package/dist/okf/types/DialogflowcxAgent.md +15 -0
- package/dist/okf/types/DialogflowcxEntityType.md +15 -0
- package/dist/okf/types/DialogflowcxIntent.md +15 -0
- package/dist/okf/types/DiscoveredService.md +15 -0
- package/dist/okf/types/DiscoveredWorkload.md +15 -0
- package/dist/okf/types/DiskResourcePolicyAttachment.md +15 -0
- package/dist/okf/types/DnsPolicy.md +15 -0
- package/dist/okf/types/Document.md +15 -0
- package/dist/okf/types/DomainMapping.md +15 -0
- package/dist/okf/types/EdgeCacheKeyset.md +15 -0
- package/dist/okf/types/EdgeCacheOrigin.md +15 -0
- package/dist/okf/types/EdgeCacheService.md +15 -0
- package/dist/okf/types/EdgecontainerCluster.md +15 -0
- package/dist/okf/types/EdgecontainerNodePool.md +15 -0
- package/dist/okf/types/EdgenetworkNetwork.md +15 -0
- package/dist/okf/types/EndpointAttachment.md +15 -0
- package/dist/okf/types/EndpointPolicy.md +15 -0
- package/dist/okf/types/Engine.md +15 -0
- package/dist/okf/types/Enrollment.md +15 -0
- package/dist/okf/types/Entitlement.md +15 -0
- package/dist/okf/types/Entry.md +15 -0
- package/dist/okf/types/EntryType.md +15 -0
- package/dist/okf/types/Envgroup.md +15 -0
- package/dist/okf/types/EnvgroupAttachment.md +15 -0
- package/dist/okf/types/EventarcChannel.md +15 -0
- package/dist/okf/types/EventarcTrigger.md +15 -0
- package/dist/okf/types/ExampleStore.md +15 -0
- package/dist/okf/types/ExternalAccessRule.md +15 -0
- package/dist/okf/types/ExternalAddress.md +15 -0
- package/dist/okf/types/ExternalVPNGateway.md +15 -0
- package/dist/okf/types/FHIRStore.md +15 -0
- package/dist/okf/types/Feature.md +15 -0
- package/dist/okf/types/FeatureMembership.md +15 -0
- package/dist/okf/types/Featurestore.md +15 -0
- package/dist/okf/types/FeaturestoreEntityType.md +15 -0
- package/dist/okf/types/FeaturestoreEntityTypeFeature.md +15 -0
- package/dist/okf/types/Federation.md +15 -0
- package/dist/okf/types/Feed.md +15 -0
- package/dist/okf/types/Field.md +15 -0
- package/dist/okf/types/FilestoreBackup.md +15 -0
- package/dist/okf/types/FilestoreInstance.md +15 -0
- package/dist/okf/types/FilestoreSnapshot.md +15 -0
- package/dist/okf/types/FirebaseProject.md +15 -0
- package/dist/okf/types/FirebasedatabaseInstance.md +15 -0
- package/dist/okf/types/FirebasehostingChannel.md +15 -0
- package/dist/okf/types/FirestoreBackupSchedule.md +15 -0
- package/dist/okf/types/FirestoreIndex.md +15 -0
- package/dist/okf/types/Firewall.md +15 -0
- package/dist/okf/types/FirewallPolicyAssociation.md +15 -0
- package/dist/okf/types/FirewallPolicyRule.md +15 -0
- package/dist/okf/types/FirewallRule.md +15 -0
- package/dist/okf/types/FlexTemplateJob.md +15 -0
- package/dist/okf/types/FlexibleAppVersion.md +15 -0
- package/dist/okf/types/Flow.md +15 -0
- package/dist/okf/types/FolderFeed.md +15 -0
- package/dist/okf/types/ForwardingRule.md +15 -0
- package/dist/okf/types/Fulfillment.md +15 -0
- package/dist/okf/types/Function.md +15 -0
- package/dist/okf/types/FutureReservation.md +15 -0
- package/dist/okf/types/GCPServiceAccount.md +15 -0
- package/dist/okf/types/GCPUserAccessBinding.md +15 -0
- package/dist/okf/types/GCPolicy.md +15 -0
- package/dist/okf/types/GKECluster.md +15 -0
- package/dist/okf/types/GRPCRoute.md +15 -0
- package/dist/okf/types/GcsFolder.md +15 -0
- package/dist/okf/types/GkebackupBackup.md +15 -0
- package/dist/okf/types/GkebackupBackupPlan.md +15 -0
- package/dist/okf/types/GkehubMembership.md +15 -0
- package/dist/okf/types/GkehubNamespace.md +15 -0
- package/dist/okf/types/GlobalNetworkEndpoint.md +15 -0
- package/dist/okf/types/GlobalNetworkEndpointGroup.md +15 -0
- package/dist/okf/types/GoogleChannelConfig.md +15 -0
- package/dist/okf/types/GuestPolicy.md +15 -0
- package/dist/okf/types/HL7V2Store.md +15 -0
- package/dist/okf/types/HMACKey.md +15 -0
- package/dist/okf/types/HTTPHealthCheck.md +15 -0
- package/dist/okf/types/HTTPRoute.md +15 -0
- package/dist/okf/types/HTTPSHealthCheck.md +15 -0
- package/dist/okf/types/HealthcareDataset.md +15 -0
- package/dist/okf/types/Hub.md +15 -0
- package/dist/okf/types/IAMAuditConfig.md +20 -0
- package/dist/okf/types/IAMPolicy.md +15 -0
- package/dist/okf/types/IAMPolicyMember.md +15 -0
- package/dist/okf/types/IdentityAwareProxyClient.md +15 -0
- package/dist/okf/types/IdentityplatformConfig.md +15 -0
- package/dist/okf/types/Image.md +15 -0
- package/dist/okf/types/ImportJob.md +15 -0
- package/dist/okf/types/InboundSAMLConfig.md +15 -0
- package/dist/okf/types/IndexEndpoint.md +15 -0
- package/dist/okf/types/InspectTemplate.md +15 -0
- package/dist/okf/types/InstanceAttachment.md +15 -0
- package/dist/okf/types/InstanceConfig.md +15 -0
- package/dist/okf/types/InstanceEndpoint.md +15 -0
- package/dist/okf/types/InstanceGroup.md +15 -0
- package/dist/okf/types/InstanceGroupManager.md +15 -0
- package/dist/okf/types/InstanceGroupNamedPort.md +15 -0
- package/dist/okf/types/InstanceTemplate.md +15 -0
- package/dist/okf/types/InterceptDeployment.md +15 -0
- package/dist/okf/types/InterceptEndpointGroup.md +15 -0
- package/dist/okf/types/Interconnect.md +15 -0
- package/dist/okf/types/InterconnectAttachment.md +15 -0
- package/dist/okf/types/InternalRange.md +15 -0
- package/dist/okf/types/JobTrigger.md +15 -0
- package/dist/okf/types/KMSCryptoKey.md +19 -0
- package/dist/okf/types/KMSKeyRing.md +15 -0
- package/dist/okf/types/KeyHandle.md +15 -0
- package/dist/okf/types/KeyRingImportJob.md +15 -0
- package/dist/okf/types/LBRouteExtension.md +15 -0
- package/dist/okf/types/Lake.md +15 -0
- package/dist/okf/types/Lien.md +15 -0
- package/dist/okf/types/Link.md +15 -0
- package/dist/okf/types/Listing.md +15 -0
- package/dist/okf/types/LocationTagBinding.md +15 -0
- package/dist/okf/types/LogBucket.md +15 -0
- package/dist/okf/types/LogExclusion.md +15 -0
- package/dist/okf/types/LogMetric.md +15 -0
- package/dist/okf/types/LogSink.md +15 -0
- package/dist/okf/types/LogView.md +15 -0
- package/dist/okf/types/LogicalView.md +15 -0
- package/dist/okf/types/Machine.md +15 -0
- package/dist/okf/types/MachineImage.md +15 -0
- package/dist/okf/types/ManagedFolder.md +15 -0
- package/dist/okf/types/ManagedSSLCertificate.md +15 -0
- package/dist/okf/types/ManagedkafkaCluster.md +15 -0
- package/dist/okf/types/ManagedkafkaTopic.md +15 -0
- package/dist/okf/types/ManagementServer.md +15 -0
- package/dist/okf/types/MaterializedView.md +15 -0
- package/dist/okf/types/MembershipBinding.md +15 -0
- package/dist/okf/types/MemcacheInstance.md +15 -0
- package/dist/okf/types/MemorystoreInstance.md +15 -0
- package/dist/okf/types/Mesh.md +15 -0
- package/dist/okf/types/MetadataStore.md +15 -0
- package/dist/okf/types/MetastoreBackup.md +15 -0
- package/dist/okf/types/MetastoreService.md +15 -0
- package/dist/okf/types/MetricDescriptor.md +15 -0
- package/dist/okf/types/MigrationJob.md +15 -0
- package/dist/okf/types/MlengineModel.md +15 -0
- package/dist/okf/types/MonGroup.md +15 -0
- package/dist/okf/types/MonService.md +15 -0
- package/dist/okf/types/MonitoredProject.md +15 -0
- package/dist/okf/types/MuteConfig.md +15 -0
- package/dist/okf/types/NATAddress.md +15 -0
- package/dist/okf/types/NetappBackupVault.md +15 -0
- package/dist/okf/types/NetworkAttachment.md +15 -0
- package/dist/okf/types/NetworkEdgeSecurityService.md +15 -0
- package/dist/okf/types/NetworkEndpoint.md +15 -0
- package/dist/okf/types/NetworkEndpointGroup.md +15 -0
- package/dist/okf/types/NetworkFirewallPolicy.md +15 -0
- package/dist/okf/types/NetworkFirewallPolicyAssociation.md +15 -0
- package/dist/okf/types/NetworkFirewallPolicyRule.md +15 -0
- package/dist/okf/types/NetworkPeeringRoutesConfig.md +15 -0
- package/dist/okf/types/NetworkPolicy.md +15 -0
- package/dist/okf/types/NetworkservicesGateway.md +15 -0
- package/dist/okf/types/Node.md +21 -0
- package/dist/okf/types/NodePool.md +15 -0
- package/dist/okf/types/NodeTemplate.md +15 -0
- package/dist/okf/types/Note.md +15 -0
- package/dist/okf/types/NotebookInstance.md +15 -0
- package/dist/okf/types/NotebooksEnvironment.md +15 -0
- package/dist/okf/types/Notification.md +15 -0
- package/dist/okf/types/NotificationChannel.md +15 -0
- package/dist/okf/types/NotificationConfig.md +15 -0
- package/dist/okf/types/OAuthIDPConfig.md +15 -0
- package/dist/okf/types/OSPolicyAssignment.md +15 -0
- package/dist/okf/types/Occurrence.md +15 -0
- package/dist/okf/types/Organization.md +15 -0
- package/dist/okf/types/OrganizationFeed.md +15 -0
- package/dist/okf/types/OrganizationSecurityPolicy.md +15 -0
- package/dist/okf/types/OrganizationSecurityPolicyAssociation.md +15 -0
- package/dist/okf/types/OrganizationSecurityPolicyRule.md +15 -0
- package/dist/okf/types/OrgpolicyPolicy.md +15 -0
- package/dist/okf/types/PacketMirroring.md +15 -0
- package/dist/okf/types/Page.md +15 -0
- package/dist/okf/types/Parameter.md +15 -0
- package/dist/okf/types/ParameterVersion.md +15 -0
- package/dist/okf/types/PartialPolicy.md +15 -0
- package/dist/okf/types/PatchDeployment.md +15 -0
- package/dist/okf/types/PeeredDNSDomain.md +15 -0
- package/dist/okf/types/PerInstanceConfig.md +15 -0
- package/dist/okf/types/PhraseSet.md +15 -0
- package/dist/okf/types/PlatformPolicy.md +15 -0
- package/dist/okf/types/PolicyTag.md +15 -0
- package/dist/okf/types/PrivateCloud.md +15 -0
- package/dist/okf/types/PrivatecaCertificate.md +15 -0
- package/dist/okf/types/Processor.md +15 -0
- package/dist/okf/types/ProcessorDefaultVersion.md +15 -0
- package/dist/okf/types/ProcessorVersion.md +15 -0
- package/dist/okf/types/ProjectDefaultConfig.md +15 -0
- package/dist/okf/types/ProjectFeed.md +15 -0
- package/dist/okf/types/ProjectMetadata.md +15 -0
- package/dist/okf/types/PubSubSnapshot.md +15 -0
- package/dist/okf/types/PubSubSubscription.md +15 -0
- package/dist/okf/types/PubSubTopic.md +15 -0
- package/dist/okf/types/PubsubliteReservation.md +15 -0
- package/dist/okf/types/PubsubliteTopic.md +15 -0
- package/dist/okf/types/RecaptchaenterpriseFirewallPolicy.md +15 -0
- package/dist/okf/types/RecaptchaenterpriseKey.md +15 -0
- package/dist/okf/types/Recognizer.md +15 -0
- package/dist/okf/types/RedisCluster.md +15 -0
- package/dist/okf/types/RedisInstance.md +15 -0
- package/dist/okf/types/RegionAutoscaler.md +15 -0
- package/dist/okf/types/RegionDiskResourcePolicyAttachment.md +15 -0
- package/dist/okf/types/RegionNetworkEndpointGroup.md +15 -0
- package/dist/okf/types/RegionPerInstanceConfig.md +15 -0
- package/dist/okf/types/RegionSSLPolicy.md +15 -0
- package/dist/okf/types/RegionalEndpoint.md +15 -0
- package/dist/okf/types/ResourceBundle.md +15 -0
- package/dist/okf/types/ResourcePolicy.md +15 -0
- package/dist/okf/types/ResourcemanagerFolder.md +15 -0
- package/dist/okf/types/ResourcemanagerPolicy.md +15 -0
- package/dist/okf/types/ResourcemanagerProject.md +15 -0
- package/dist/okf/types/ResponsePolicy.md +15 -0
- package/dist/okf/types/ResponsePolicyRule.md +15 -0
- package/dist/okf/types/Restore.md +15 -0
- package/dist/okf/types/RestorePlan.md +15 -0
- package/dist/okf/types/Router.md +15 -0
- package/dist/okf/types/RouterInterface.md +15 -0
- package/dist/okf/types/RouterNAT.md +15 -0
- package/dist/okf/types/RouterPeer.md +15 -0
- package/dist/okf/types/Routine.md +15 -0
- package/dist/okf/types/Runtime.md +15 -0
- package/dist/okf/types/RuntimeTemplate.md +15 -0
- package/dist/okf/types/SQLDatabase.md +15 -0
- package/dist/okf/types/SQLInstance.md +21 -0
- package/dist/okf/types/SQLUser.md +15 -0
- package/dist/okf/types/SSHPublicKey.md +15 -0
- package/dist/okf/types/SSLCert.md +15 -0
- package/dist/okf/types/SSLCertificate.md +15 -0
- package/dist/okf/types/SSLPolicy.md +15 -0
- package/dist/okf/types/SavedQuery.md +15 -0
- package/dist/okf/types/Schema.md +15 -0
- package/dist/okf/types/Scope.md +15 -0
- package/dist/okf/types/ScopeRBACRoleBinding.md +15 -0
- package/dist/okf/types/SecretCiphertext.md +15 -0
- package/dist/okf/types/SecretManagerSecret.md +15 -0
- package/dist/okf/types/SecretManagerSecretVersion.md +15 -0
- package/dist/okf/types/SecuresourcemanagerInstance.md +15 -0
- package/dist/okf/types/SecuresourcemanagerRepository.md +15 -0
- package/dist/okf/types/SecurityPolicy.md +15 -0
- package/dist/okf/types/ServerTLSPolicy.md +15 -0
- package/dist/okf/types/ServiceAccountKey.md +15 -0
- package/dist/okf/types/ServiceAttachment.md +15 -0
- package/dist/okf/types/ServiceBinding.md +15 -0
- package/dist/okf/types/ServiceConnectionPolicy.md +15 -0
- package/dist/okf/types/ServiceIdentity.md +15 -0
- package/dist/okf/types/ServiceLevelObjective.md +15 -0
- package/dist/okf/types/ServicePerimeter.md +19 -0
- package/dist/okf/types/ServicePerimeterResource.md +15 -0
- package/dist/okf/types/ServiceProjectAttachment.md +15 -0
- package/dist/okf/types/ServiceSplitTraffic.md +15 -0
- package/dist/okf/types/ServicedirectoryEndpoint.md +15 -0
- package/dist/okf/types/ServicedirectoryNamespace.md +15 -0
- package/dist/okf/types/ServicedirectoryService.md +15 -0
- package/dist/okf/types/ServicenetworkingConnection.md +15 -0
- package/dist/okf/types/ServiceusageService.md +15 -0
- package/dist/okf/types/Settings.md +15 -0
- package/dist/okf/types/SharedVPCHostProject.md +15 -0
- package/dist/okf/types/SharedVPCServiceProject.md +15 -0
- package/dist/okf/types/Site.md +15 -0
- package/dist/okf/types/Source.md +15 -0
- package/dist/okf/types/SourcerepoRepository.md +15 -0
- package/dist/okf/types/SpannerBackupSchedule.md +15 -0
- package/dist/okf/types/SpannerDatabase.md +15 -0
- package/dist/okf/types/SpannerInstance.md +15 -0
- package/dist/okf/types/Spoke.md +15 -0
- package/dist/okf/types/StandardAppVersion.md +15 -0
- package/dist/okf/types/StorageBucket.md +21 -0
- package/dist/okf/types/StoragetransferJob.md +15 -0
- package/dist/okf/types/StoredInfoType.md +15 -0
- package/dist/okf/types/Stream.md +15 -0
- package/dist/okf/types/Subnet.md +15 -0
- package/dist/okf/types/Subnetwork.md +15 -0
- package/dist/okf/types/Subscription.md +15 -0
- package/dist/okf/types/SyncAuthorization.md +15 -0
- package/dist/okf/types/TCPRoute.md +15 -0
- package/dist/okf/types/TLSRoute.md +15 -0
- package/dist/okf/types/Tag.md +15 -0
- package/dist/okf/types/TagBinding.md +15 -0
- package/dist/okf/types/TagKey.md +15 -0
- package/dist/okf/types/TagTemplate.md +15 -0
- package/dist/okf/types/TagValue.md +15 -0
- package/dist/okf/types/Target.md +15 -0
- package/dist/okf/types/TargetGRPCProxy.md +15 -0
- package/dist/okf/types/TargetHTTPProxy.md +15 -0
- package/dist/okf/types/TargetHTTPSProxy.md +15 -0
- package/dist/okf/types/TargetInstance.md +15 -0
- package/dist/okf/types/TargetPool.md +15 -0
- package/dist/okf/types/TargetSSLProxy.md +15 -0
- package/dist/okf/types/TargetTCPProxy.md +15 -0
- package/dist/okf/types/TargetVPNGateway.md +15 -0
- package/dist/okf/types/TasksQueue.md +15 -0
- package/dist/okf/types/Taxonomy.md +15 -0
- package/dist/okf/types/Tenant.md +15 -0
- package/dist/okf/types/TenantDefaultSupportedIDPConfig.md +15 -0
- package/dist/okf/types/TenantInboundSAMLConfig.md +15 -0
- package/dist/okf/types/TenantOAuthIDPConfig.md +15 -0
- package/dist/okf/types/Tensorboard.md +15 -0
- package/dist/okf/types/URLMap.md +15 -0
- package/dist/okf/types/UptimeCheckConfig.md +15 -0
- package/dist/okf/types/User.md +15 -0
- package/dist/okf/types/VPCNetwork.md +15 -0
- package/dist/okf/types/VPNGateway.md +15 -0
- package/dist/okf/types/VPNTunnel.md +15 -0
- package/dist/okf/types/VertexaiDataset.md +15 -0
- package/dist/okf/types/VertexaiEndpoint.md +15 -0
- package/dist/okf/types/VertexaiIndex.md +15 -0
- package/dist/okf/types/VirtualMachine.md +15 -0
- package/dist/okf/types/VmwareengineNetwork.md +15 -0
- package/dist/okf/types/VmwareengineNetworkPeering.md +15 -0
- package/dist/okf/types/VpnConnection.md +15 -0
- package/dist/okf/types/WasmPlugin.md +15 -0
- package/dist/okf/types/WebApp.md +15 -0
- package/dist/okf/types/Webhook.md +15 -0
- package/dist/okf/types/WorkerPool.md +15 -0
- package/dist/okf/types/Workflow.md +15 -0
- package/dist/okf/types/WorkflowTemplate.md +15 -0
- package/dist/okf/types/WorkflowsExecution.md +15 -0
- package/dist/okf/types/WorkforcePool.md +15 -0
- package/dist/okf/types/WorkforcePoolProvider.md +15 -0
- package/dist/okf/types/Workload.md +15 -0
- package/dist/okf/types/WorkloadIdentityPool.md +15 -0
- package/dist/okf/types/WorkloadIdentityPoolProvider.md +15 -0
- package/dist/okf/types/Workstation.md +15 -0
- package/dist/okf/types/WorkstationCluster.md +15 -0
- package/dist/okf/types/WorkstationConfig.md +15 -0
- package/dist/okf/types/Zone.md +19 -0
- package/dist/rules/wgc501.ts +73 -0
- package/dist/rules/wgc502.ts +41 -0
- package/dist/rules/wgc503.ts +56 -0
- package/dist/serializer.d.ts +12 -0
- package/dist/serializer.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/composites/index.ts +6 -0
- package/src/composites/landing-zone.test.ts +67 -0
- package/src/composites/landing-zone.ts +173 -0
- package/src/deep-observe-hooks.ts +87 -21
- package/src/deep-observe.test.ts +158 -13
- package/src/deep-observe.ts +143 -142
- package/src/describe-resources.test.ts +46 -1
- package/src/describe-resources.ts +64 -13
- package/src/governance.test.ts +59 -0
- package/src/governance.ts +179 -0
- package/src/index.ts +10 -0
- package/src/lifecycle-integration.test.ts +3 -3
- package/src/lint/audit-catalog.ts +5 -0
- package/src/lint/post-synth/index.ts +6 -0
- package/src/lint/post-synth/wgc501.test.ts +87 -0
- package/src/lint/post-synth/wgc501.ts +73 -0
- package/src/lint/post-synth/wgc502.test.ts +64 -0
- package/src/lint/post-synth/wgc502.ts +41 -0
- package/src/lint/post-synth/wgc503.test.ts +77 -0
- package/src/lint/post-synth/wgc503.ts +56 -0
- package/src/plugin.test.ts +4 -1
- package/src/serializer.ts +6 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GCP governance authoring (#791, epic #787 C1): the desired-state config
|
|
3
|
+
* shape the GCP cloud warden reconciles, and `landingZoneConfig()` — the
|
|
4
|
+
* typed authoring layer that emits it.
|
|
5
|
+
*
|
|
6
|
+
* This is deliberately NOT a composite. The evaluability rules (EVL002/004,
|
|
7
|
+
* #916/#952) require composites to declare a fixed set of resources, so a
|
|
8
|
+
* data-driven folder tree walker cannot be one. The split mirrors the AWS
|
|
9
|
+
* slice (lexicons/aws/src/governance.ts): authoring emits config (this
|
|
10
|
+
* module, arbitrary cardinality); resources for greenfield bootstrap are the
|
|
11
|
+
* fixed-shape composites in `composites/landing-zone.ts`; the warden
|
|
12
|
+
* consumes only the config.
|
|
13
|
+
*
|
|
14
|
+
* GCP has no OrganizationRoot analog — organizations are created through
|
|
15
|
+
* Cloud Identity / Workspace, never through the resource API.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// The desired-state config shape the GCP cloud warden consumes
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
/** An org-policy definition, keyed by name in `GcpGovernanceConfig.orgPolicies`. */
|
|
23
|
+
export interface OrgPolicyConfig {
|
|
24
|
+
description?: string;
|
|
25
|
+
/** The constraint the policy binds, e.g. "iam.disableServiceAccountKeyCreation". */
|
|
26
|
+
constraint: string;
|
|
27
|
+
/** OrgPolicyPolicy `spec.rules` entries (enforce / values.allowedValues / …). */
|
|
28
|
+
rules: Array<Record<string, unknown>>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** A project declared inside a folder. */
|
|
32
|
+
export interface ProjectConfig {
|
|
33
|
+
name: string;
|
|
34
|
+
/** Defaults to `name`. */
|
|
35
|
+
projectId?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** One folder: its guardrails, projects, and child folders, keyed by display name. */
|
|
39
|
+
export interface FolderConfig {
|
|
40
|
+
/** Names of org policies (from `orgPolicies`) attached to this folder. */
|
|
41
|
+
orgPolicies?: string[];
|
|
42
|
+
projects?: ProjectConfig[];
|
|
43
|
+
children?: Record<string, FolderConfig>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The desired-state governance tree for one GCP organization. This is the
|
|
48
|
+
* shape the GCP cloud warden loads as config — the GCP counterpart of
|
|
49
|
+
* `AwsGovernanceConfig`. Cycles map onto the governance verbs (#790): the
|
|
50
|
+
* folder/project tree is `org-unit`, org policies are `policy-guardrail`,
|
|
51
|
+
* audit configuration is `audit-sink`.
|
|
52
|
+
*/
|
|
53
|
+
export interface GcpGovernanceConfig {
|
|
54
|
+
organization: {
|
|
55
|
+
/** Org-policy names enforced at the organization root. */
|
|
56
|
+
orgPolicies?: string[];
|
|
57
|
+
};
|
|
58
|
+
/** Top-level folders under the organization, keyed by display name. */
|
|
59
|
+
folders: Record<string, FolderConfig>;
|
|
60
|
+
/** Org-policy definitions, keyed by the names the tree attaches. */
|
|
61
|
+
orgPolicies: Record<string, OrgPolicyConfig>;
|
|
62
|
+
/** Where audit evidence flows. */
|
|
63
|
+
auditSinks?: {
|
|
64
|
+
auditConfig?: { service: string; logTypes: string[] };
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Baseline guardrails (shared with the bootstrap composites)
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
|
|
72
|
+
export const DISABLE_SA_KEY_CREATION: OrgPolicyConfig = {
|
|
73
|
+
description: "User-managed service account keys cannot be created.",
|
|
74
|
+
constraint: "iam.disableServiceAccountKeyCreation",
|
|
75
|
+
rules: [{ enforce: "TRUE" }],
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const SKIP_DEFAULT_NETWORK: OrgPolicyConfig = {
|
|
79
|
+
description: "New projects do not get the auto-mode default VPC.",
|
|
80
|
+
constraint: "compute.skipDefaultNetworkCreation",
|
|
81
|
+
rules: [{ enforce: "TRUE" }],
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/** Allow resource creation only in `locations` (value-group syntax like "in:us-locations" works too). */
|
|
85
|
+
export function resourceLocationRestriction(locations: readonly string[]): OrgPolicyConfig {
|
|
86
|
+
return {
|
|
87
|
+
description: `Resources may only be created in [${locations.join(", ")}].`,
|
|
88
|
+
constraint: "gcp.resourceLocations",
|
|
89
|
+
rules: [{ values: { allowedValues: [...locations] } }],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The audit-log coverage `auditAllServices` declares. */
|
|
94
|
+
export const AUDIT_ALL_SERVICES = {
|
|
95
|
+
service: "allServices",
|
|
96
|
+
logTypes: ["ADMIN_READ", "DATA_READ", "DATA_WRITE"],
|
|
97
|
+
} as const;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The recommended foundation folder structure. Exported so callers can
|
|
101
|
+
* extend it rather than restate it.
|
|
102
|
+
*/
|
|
103
|
+
export const FOUNDATION_FOLDERS: Record<string, FolderConfig> = {
|
|
104
|
+
Security: {},
|
|
105
|
+
Infrastructure: {},
|
|
106
|
+
Sandbox: {},
|
|
107
|
+
Workloads: {},
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Authoring
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
export interface LandingZoneConfigProps {
|
|
115
|
+
/**
|
|
116
|
+
* Start from the recommended foundation: Security / Infrastructure /
|
|
117
|
+
* Sandbox / Workloads folders with `disable-sa-key-creation` and
|
|
118
|
+
* `skip-default-network` enforced at the organization root. Default true;
|
|
119
|
+
* your `folders`/`orgPolicies` merge over it (same-name keys win).
|
|
120
|
+
*/
|
|
121
|
+
foundation?: boolean;
|
|
122
|
+
/** Adds a root resource-location org policy allowing only these locations. */
|
|
123
|
+
allowedLocations?: string[];
|
|
124
|
+
/** Folder tree, merged over the foundation's. Greenfield (full tree) and brownfield (partial subtree) are both just this map. */
|
|
125
|
+
folders?: Record<string, FolderConfig>;
|
|
126
|
+
/** Org-policy definitions, merged over the foundation's. */
|
|
127
|
+
orgPolicies?: Record<string, OrgPolicyConfig>;
|
|
128
|
+
/** Extra org-policy names to enforce at the organization root. */
|
|
129
|
+
rootOrgPolicies?: string[];
|
|
130
|
+
/** Declare organization-wide audit logging (allServices, all three log types). */
|
|
131
|
+
auditAllServices?: boolean;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Author the desired-state tree the GCP cloud warden reconciles. Pure.
|
|
136
|
+
* Throws when the tree attaches an org-policy name with no definition; only
|
|
137
|
+
* policies the tree actually attaches are included in the output.
|
|
138
|
+
*/
|
|
139
|
+
export function landingZoneConfig(props: LandingZoneConfigProps = {}): GcpGovernanceConfig {
|
|
140
|
+
const foundation = props.foundation ?? true;
|
|
141
|
+
const orgPolicies: Record<string, OrgPolicyConfig> = {
|
|
142
|
+
...(foundation
|
|
143
|
+
? { "disable-sa-key-creation": DISABLE_SA_KEY_CREATION, "skip-default-network": SKIP_DEFAULT_NETWORK }
|
|
144
|
+
: {}),
|
|
145
|
+
...(props.allowedLocations?.length
|
|
146
|
+
? { "resource-location-restriction": resourceLocationRestriction(props.allowedLocations) }
|
|
147
|
+
: {}),
|
|
148
|
+
...props.orgPolicies,
|
|
149
|
+
};
|
|
150
|
+
const folders = { ...(foundation ? FOUNDATION_FOLDERS : {}), ...props.folders };
|
|
151
|
+
const rootOrgPolicies = [
|
|
152
|
+
...(foundation ? ["disable-sa-key-creation", "skip-default-network"] : []),
|
|
153
|
+
...(props.allowedLocations?.length ? ["resource-location-restriction"] : []),
|
|
154
|
+
...(props.rootOrgPolicies ?? []),
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
const attached = new Set(rootOrgPolicies);
|
|
158
|
+
const collect = (tree: Record<string, FolderConfig>): void => {
|
|
159
|
+
for (const node of Object.values(tree)) {
|
|
160
|
+
for (const p of node.orgPolicies ?? []) attached.add(p);
|
|
161
|
+
if (node.children) collect(node.children);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
collect(folders);
|
|
165
|
+
for (const name of attached) {
|
|
166
|
+
if (!orgPolicies[name]) {
|
|
167
|
+
throw new Error(`landingZoneConfig: org policy "${name}" is attached but not defined in orgPolicies`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
organization: rootOrgPolicies.length ? { orgPolicies: rootOrgPolicies } : {},
|
|
173
|
+
folders,
|
|
174
|
+
orgPolicies: Object.fromEntries(Object.entries(orgPolicies).filter(([n]) => attached.has(n))),
|
|
175
|
+
...(props.auditAllServices
|
|
176
|
+
? { auditSinks: { auditConfig: { service: AUDIT_ALL_SERVICES.service, logTypes: [...AUDIT_ALL_SERVICES.logTypes] } } }
|
|
177
|
+
: {}),
|
|
178
|
+
};
|
|
179
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -23,6 +23,7 @@ export {
|
|
|
23
23
|
GkeCluster, CloudRunServiceComposite, CloudSqlInstance, GcsBucket, VpcNetwork,
|
|
24
24
|
PubSubPipeline, CloudFunctionWithTrigger, PrivateService, ManagedCertificate, SecureProject,
|
|
25
25
|
MemorystoreRedis, MultiRegionVpc, GkeCrdbRegion,
|
|
26
|
+
GovernanceFoundation, LocationRestriction, OrganizationAuditConfig,
|
|
26
27
|
} from "./composites/index";
|
|
27
28
|
export type {
|
|
28
29
|
GkeClusterProps,
|
|
@@ -38,8 +39,17 @@ export type {
|
|
|
38
39
|
MemorystoreRedisProps,
|
|
39
40
|
MultiRegionVpcConfig, MultiRegionVpcRegion,
|
|
40
41
|
GkeCrdbRegionConfig, GkeCrdbRegionNodeConfig,
|
|
42
|
+
GovernanceFoundationProps, LocationRestrictionProps, OrganizationAuditConfigProps,
|
|
41
43
|
} from "./composites/index";
|
|
42
44
|
|
|
45
|
+
// GCP governance authoring (#791): the desired-state config the GCP cloud
|
|
46
|
+
// warden reconciles, and the typed landing-zone authoring layer.
|
|
47
|
+
export {
|
|
48
|
+
landingZoneConfig, resourceLocationRestriction,
|
|
49
|
+
DISABLE_SA_KEY_CREATION, SKIP_DEFAULT_NETWORK, AUDIT_ALL_SERVICES, FOUNDATION_FOLDERS,
|
|
50
|
+
} from "./governance";
|
|
51
|
+
export type { GcpGovernanceConfig, LandingZoneConfigProps, FolderConfig, OrgPolicyConfig, ProjectConfig } from "./governance";
|
|
52
|
+
|
|
43
53
|
// IAM role constants
|
|
44
54
|
export { StorageRoles, ComputeRoles, ContainerRoles, IAMRoles, SQLRoles, RunRoles, PubSubRoles } from "./actions/index";
|
|
45
55
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Cross-lexicon lifecycle integration (#163) — GCP row.
|
|
3
3
|
*
|
|
4
4
|
* Drives the REAL gcpPlugin through core's live-import driver and the changeset
|
|
5
|
-
* path. Two edges are mocked, because
|
|
6
|
-
*
|
|
7
|
-
* `exportResources`
|
|
5
|
+
* path. Two edges are mocked, because the plugin has two transports:
|
|
6
|
+
* `describeResources` and the deep reader read GCP REST (stubbed `fetch`,
|
|
7
|
+
* #1209), while `exportResources` still goes through Config Connector
|
|
8
8
|
* (stubbed `exec`).
|
|
9
9
|
*/
|
|
10
10
|
import { describe, test, expect, vi, beforeEach } from "vitest";
|
|
@@ -30,4 +30,9 @@ export const gcpAuditCatalog: Record<string, RuleMeta> = {
|
|
|
30
30
|
WGC401: auditRule("WGC401", "merge-worthy", "guidance", "Unknown field in resource spec", "Remove the unknown spec field.", { category: "correctness" }),
|
|
31
31
|
WGC402: auditRule("WGC402", "merge-worthy", "guidance", "Missing required spec field", "Add the required spec field.", { category: "correctness" }),
|
|
32
32
|
WGC403: auditRule("WGC403", "merge-worthy", "guidance", "Spec field has wrong type/structure", "Fix the field's type/structure.", { category: "correctness" }),
|
|
33
|
+
|
|
34
|
+
// #793 — governance posture regressions (epic #787 C3).
|
|
35
|
+
WGC501: auditRule("WGC501", "merge-worthy", "guidance", "Org Policy guardrail not enforced", "Enable enforce on the rule (or remove the policy deliberately) — a disabled org policy constrains nothing.", { authority: [GCP_SEC] }),
|
|
36
|
+
WGC502: auditRule("WGC502", "merge-worthy", "guidance", "Org Policy guardrail defines no rules", "Add rules to the OrgPolicyPolicy — without them the constraint binds nothing.", { authority: [GCP_SEC] }),
|
|
37
|
+
WGC503: auditRule("WGC503", "merge-worthy", "guidance", "Audit logging dropped or scoped down", "Keep auditLogConfigs populated and remove exemptedMembers from the IAMAuditConfig.", { authority: [GCP_SEC] }),
|
|
33
38
|
};
|
|
@@ -23,6 +23,9 @@ import { wgc303 } from "./wgc303";
|
|
|
23
23
|
import { wgc401 } from "./wgc401";
|
|
24
24
|
import { wgc402 } from "./wgc402";
|
|
25
25
|
import { wgc403 } from "./wgc403";
|
|
26
|
+
import { wgc501 } from "./wgc501";
|
|
27
|
+
import { wgc502 } from "./wgc502";
|
|
28
|
+
import { wgc503 } from "./wgc503";
|
|
26
29
|
|
|
27
30
|
export const postSynthChecks: PostSynthCheck[] = [
|
|
28
31
|
wgc101,
|
|
@@ -48,4 +51,7 @@ export const postSynthChecks: PostSynthCheck[] = [
|
|
|
48
51
|
wgc401,
|
|
49
52
|
wgc402,
|
|
50
53
|
wgc403,
|
|
54
|
+
wgc501,
|
|
55
|
+
wgc502,
|
|
56
|
+
wgc503,
|
|
51
57
|
];
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
|
2
|
+
import type { PostSynthContext } from "@intentius/chant/lint/post-synth";
|
|
3
|
+
import { wgc501 } from "./wgc501";
|
|
4
|
+
|
|
5
|
+
function makeCtx(yaml: string): PostSynthContext {
|
|
6
|
+
const outputs = new Map<string, string>([["gcp", yaml]]);
|
|
7
|
+
return {
|
|
8
|
+
outputs,
|
|
9
|
+
entities: new Map(),
|
|
10
|
+
buildResult: { outputs, entities: new Map(), warnings: [], errors: [], sourceFileCount: 0 },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("WGC501: org policy guardrail not enforced", () => {
|
|
15
|
+
test("flags a rule with enforce disabled (serializer's nested spec.spec)", () => {
|
|
16
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
17
|
+
kind: OrgPolicyPolicy
|
|
18
|
+
metadata:
|
|
19
|
+
name: disable-sa-key-creation
|
|
20
|
+
spec:
|
|
21
|
+
resourceID: iam.disableServiceAccountKeyCreation
|
|
22
|
+
organizationRef:
|
|
23
|
+
external: "123456789012"
|
|
24
|
+
spec:
|
|
25
|
+
rules:
|
|
26
|
+
- enforce: "FALSE"
|
|
27
|
+
`;
|
|
28
|
+
const diags = wgc501.check(makeCtx(yaml));
|
|
29
|
+
expect(diags).toHaveLength(1);
|
|
30
|
+
expect(diags[0].checkId).toBe("WGC501");
|
|
31
|
+
expect(diags[0].severity).toBe("error");
|
|
32
|
+
expect(diags[0].entity).toBe("disable-sa-key-creation");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("flags boolean false and flat spec.rules", () => {
|
|
36
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
37
|
+
kind: OrgPolicyPolicy
|
|
38
|
+
metadata:
|
|
39
|
+
name: skip-default-network
|
|
40
|
+
spec:
|
|
41
|
+
rules:
|
|
42
|
+
- enforce: false
|
|
43
|
+
`;
|
|
44
|
+
expect(wgc501.check(makeCtx(yaml))).toHaveLength(1);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("flags a policy that resets the constraint to default", () => {
|
|
48
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
49
|
+
kind: OrgPolicyPolicy
|
|
50
|
+
metadata:
|
|
51
|
+
name: reset-policy
|
|
52
|
+
spec:
|
|
53
|
+
spec:
|
|
54
|
+
reset: true
|
|
55
|
+
`;
|
|
56
|
+
const diags = wgc501.check(makeCtx(yaml));
|
|
57
|
+
expect(diags).toHaveLength(1);
|
|
58
|
+
expect(diags[0].message).toContain("reset");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("no diagnostic for an enforced policy", () => {
|
|
62
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
63
|
+
kind: OrgPolicyPolicy
|
|
64
|
+
metadata:
|
|
65
|
+
name: disable-sa-key-creation
|
|
66
|
+
spec:
|
|
67
|
+
spec:
|
|
68
|
+
rules:
|
|
69
|
+
- enforce: "TRUE"
|
|
70
|
+
- values:
|
|
71
|
+
allowedValues:
|
|
72
|
+
- in:eu-locations
|
|
73
|
+
`;
|
|
74
|
+
expect(wgc501.check(makeCtx(yaml))).toHaveLength(0);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("ignores other kinds", () => {
|
|
78
|
+
const yaml = `apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
|
|
79
|
+
kind: ResourcemanagerFolder
|
|
80
|
+
metadata:
|
|
81
|
+
name: security
|
|
82
|
+
spec:
|
|
83
|
+
displayName: Security
|
|
84
|
+
`;
|
|
85
|
+
expect(wgc501.check(makeCtx(yaml))).toHaveLength(0);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WGC501: Org Policy Guardrail Not Enforced (#793, epic #787 C3)
|
|
3
|
+
*
|
|
4
|
+
* Flags OrgPolicyPolicy resources whose rules switch enforcement off or that
|
|
5
|
+
* reset the constraint to its default. A disabled org policy is the GCP
|
|
6
|
+
* shape of a weakened guardrail: the constraint stays visible in the tree
|
|
7
|
+
* while constraining nothing.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
|
|
11
|
+
import { parseGcpManifests, getResourceName, type GcpManifest } from "./gcp-helpers";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* OrgPolicyPolicy mirrors the API's own `spec` inside the CRD spec, so rules
|
|
15
|
+
* live at `spec.spec.rules`; accept `spec.rules` too for hand-written manifests.
|
|
16
|
+
*/
|
|
17
|
+
export function orgPolicySpec(manifest: GcpManifest): Record<string, unknown> {
|
|
18
|
+
const outer = manifest.spec ?? {};
|
|
19
|
+
const inner = outer.spec;
|
|
20
|
+
return typeof inner === "object" && inner !== null ? (inner as Record<string, unknown>) : outer;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function orgPolicyRules(manifest: GcpManifest): Array<Record<string, unknown>> {
|
|
24
|
+
const rules = orgPolicySpec(manifest).rules;
|
|
25
|
+
return Array.isArray(rules) ? (rules as Array<Record<string, unknown>>) : [];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isDisabled(rule: Record<string, unknown>): boolean {
|
|
29
|
+
return rule.enforce === false || rule.enforce === "FALSE";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const wgc501: PostSynthCheck = {
|
|
33
|
+
id: "WGC501",
|
|
34
|
+
description: "Org Policy guardrail not enforced — a disabled policy constrains nothing",
|
|
35
|
+
|
|
36
|
+
check(ctx: PostSynthContext): PostSynthDiagnostic[] {
|
|
37
|
+
const diagnostics: PostSynthDiagnostic[] = [];
|
|
38
|
+
|
|
39
|
+
for (const [, output] of ctx.outputs) {
|
|
40
|
+
if (typeof output !== "string") continue;
|
|
41
|
+
|
|
42
|
+
for (const manifest of parseGcpManifests(output)) {
|
|
43
|
+
if (manifest.kind !== "OrgPolicyPolicy") continue;
|
|
44
|
+
const name = getResourceName(manifest);
|
|
45
|
+
|
|
46
|
+
if (orgPolicySpec(manifest).reset === true) {
|
|
47
|
+
diagnostics.push({
|
|
48
|
+
checkId: "WGC501",
|
|
49
|
+
severity: "error",
|
|
50
|
+
message: `OrgPolicyPolicy "${name}" resets the constraint to its default — the guardrail is switched off`,
|
|
51
|
+
entity: name,
|
|
52
|
+
lexicon: "gcp",
|
|
53
|
+
});
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
for (const rule of orgPolicyRules(manifest)) {
|
|
58
|
+
if (isDisabled(rule)) {
|
|
59
|
+
diagnostics.push({
|
|
60
|
+
checkId: "WGC501",
|
|
61
|
+
severity: "error",
|
|
62
|
+
message: `OrgPolicyPolicy "${name}" has a rule with enforce disabled — the guardrail is declared but not enforced`,
|
|
63
|
+
entity: name,
|
|
64
|
+
lexicon: "gcp",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return diagnostics;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
|
2
|
+
import type { PostSynthContext } from "@intentius/chant/lint/post-synth";
|
|
3
|
+
import { wgc502 } from "./wgc502";
|
|
4
|
+
|
|
5
|
+
function makeCtx(yaml: string): PostSynthContext {
|
|
6
|
+
const outputs = new Map<string, string>([["gcp", yaml]]);
|
|
7
|
+
return {
|
|
8
|
+
outputs,
|
|
9
|
+
entities: new Map(),
|
|
10
|
+
buildResult: { outputs, entities: new Map(), warnings: [], errors: [], sourceFileCount: 0 },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("WGC502: org policy guardrail defines no rules", () => {
|
|
15
|
+
test("flags a policy with no rules", () => {
|
|
16
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
17
|
+
kind: OrgPolicyPolicy
|
|
18
|
+
metadata:
|
|
19
|
+
name: hollow-guardrail
|
|
20
|
+
spec:
|
|
21
|
+
resourceID: iam.disableServiceAccountKeyCreation
|
|
22
|
+
organizationRef:
|
|
23
|
+
external: "123456789012"
|
|
24
|
+
`;
|
|
25
|
+
const diags = wgc502.check(makeCtx(yaml));
|
|
26
|
+
expect(diags).toHaveLength(1);
|
|
27
|
+
expect(diags[0].checkId).toBe("WGC502");
|
|
28
|
+
expect(diags[0].severity).toBe("error");
|
|
29
|
+
expect(diags[0].entity).toBe("hollow-guardrail");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("flags an empty rules array", () => {
|
|
33
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
34
|
+
kind: OrgPolicyPolicy
|
|
35
|
+
metadata:
|
|
36
|
+
name: empty-rules
|
|
37
|
+
spec:
|
|
38
|
+
spec:
|
|
39
|
+
rules: []
|
|
40
|
+
`;
|
|
41
|
+
expect(wgc502.check(makeCtx(yaml))).toHaveLength(1);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("no diagnostic when rules exist or the policy resets to default", () => {
|
|
45
|
+
const yaml = `apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
46
|
+
kind: OrgPolicyPolicy
|
|
47
|
+
metadata:
|
|
48
|
+
name: enforced
|
|
49
|
+
spec:
|
|
50
|
+
spec:
|
|
51
|
+
rules:
|
|
52
|
+
- enforce: "TRUE"
|
|
53
|
+
---
|
|
54
|
+
apiVersion: orgpolicy.cnrm.cloud.google.com/v1beta1
|
|
55
|
+
kind: OrgPolicyPolicy
|
|
56
|
+
metadata:
|
|
57
|
+
name: reset-policy
|
|
58
|
+
spec:
|
|
59
|
+
spec:
|
|
60
|
+
reset: true
|
|
61
|
+
`;
|
|
62
|
+
expect(wgc502.check(makeCtx(yaml))).toHaveLength(0);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WGC502: Org Policy Guardrail Defines No Rules (#793, epic #787 C3)
|
|
3
|
+
*
|
|
4
|
+
* Flags OrgPolicyPolicy resources with no rules (and no reset). A rule-less
|
|
5
|
+
* org policy binds a constraint to nothing — the usual leftover of a
|
|
6
|
+
* guardrail whose rules were removed while the policy object was kept.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
|
|
10
|
+
import { parseGcpManifests, getResourceName } from "./gcp-helpers";
|
|
11
|
+
import { orgPolicyRules, orgPolicySpec } from "./wgc501";
|
|
12
|
+
|
|
13
|
+
export const wgc502: PostSynthCheck = {
|
|
14
|
+
id: "WGC502",
|
|
15
|
+
description: "Org Policy guardrail defines no rules — it binds its constraint to nothing",
|
|
16
|
+
|
|
17
|
+
check(ctx: PostSynthContext): PostSynthDiagnostic[] {
|
|
18
|
+
const diagnostics: PostSynthDiagnostic[] = [];
|
|
19
|
+
|
|
20
|
+
for (const [, output] of ctx.outputs) {
|
|
21
|
+
if (typeof output !== "string") continue;
|
|
22
|
+
|
|
23
|
+
for (const manifest of parseGcpManifests(output)) {
|
|
24
|
+
if (manifest.kind !== "OrgPolicyPolicy") continue;
|
|
25
|
+
if (orgPolicySpec(manifest).reset === true) continue; // WGC501's finding
|
|
26
|
+
if (orgPolicyRules(manifest).length > 0) continue;
|
|
27
|
+
|
|
28
|
+
const name = getResourceName(manifest);
|
|
29
|
+
diagnostics.push({
|
|
30
|
+
checkId: "WGC502",
|
|
31
|
+
severity: "error",
|
|
32
|
+
message: `OrgPolicyPolicy "${name}" defines no rules — the guardrail constrains nothing`,
|
|
33
|
+
entity: name,
|
|
34
|
+
lexicon: "gcp",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return diagnostics;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
|
2
|
+
import type { PostSynthContext } from "@intentius/chant/lint/post-synth";
|
|
3
|
+
import { wgc503 } from "./wgc503";
|
|
4
|
+
|
|
5
|
+
function makeCtx(yaml: string): PostSynthContext {
|
|
6
|
+
const outputs = new Map<string, string>([["gcp", yaml]]);
|
|
7
|
+
return {
|
|
8
|
+
outputs,
|
|
9
|
+
entities: new Map(),
|
|
10
|
+
buildResult: { outputs, entities: new Map(), warnings: [], errors: [], sourceFileCount: 0 },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("WGC503: audit logging dropped or scoped down", () => {
|
|
15
|
+
test("flags an IAMAuditConfig with no auditLogConfigs", () => {
|
|
16
|
+
const yaml = `apiVersion: iam.cnrm.cloud.google.com/v1beta1
|
|
17
|
+
kind: IAMAuditConfig
|
|
18
|
+
metadata:
|
|
19
|
+
name: audit-config
|
|
20
|
+
spec:
|
|
21
|
+
resourceRef:
|
|
22
|
+
kind: Organization
|
|
23
|
+
external: organizations/123456789012
|
|
24
|
+
service: allServices
|
|
25
|
+
`;
|
|
26
|
+
const diags = wgc503.check(makeCtx(yaml));
|
|
27
|
+
expect(diags).toHaveLength(1);
|
|
28
|
+
expect(diags[0].checkId).toBe("WGC503");
|
|
29
|
+
expect(diags[0].severity).toBe("error");
|
|
30
|
+
expect(diags[0].message).toContain("captures nothing");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("flags exempted members", () => {
|
|
34
|
+
const yaml = `apiVersion: iam.cnrm.cloud.google.com/v1beta1
|
|
35
|
+
kind: IAMAuditConfig
|
|
36
|
+
metadata:
|
|
37
|
+
name: audit-config
|
|
38
|
+
spec:
|
|
39
|
+
service: allServices
|
|
40
|
+
auditLogConfigs:
|
|
41
|
+
- logType: ADMIN_READ
|
|
42
|
+
- logType: DATA_WRITE
|
|
43
|
+
exemptedMembers:
|
|
44
|
+
- user:cto@acme.dev
|
|
45
|
+
`;
|
|
46
|
+
const diags = wgc503.check(makeCtx(yaml));
|
|
47
|
+
expect(diags).toHaveLength(1);
|
|
48
|
+
expect(diags[0].message).toContain("DATA_WRITE");
|
|
49
|
+
expect(diags[0].message).toContain("exempts");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("no diagnostic for full coverage without exemptions", () => {
|
|
53
|
+
const yaml = `apiVersion: iam.cnrm.cloud.google.com/v1beta1
|
|
54
|
+
kind: IAMAuditConfig
|
|
55
|
+
metadata:
|
|
56
|
+
name: audit-config
|
|
57
|
+
spec:
|
|
58
|
+
service: allServices
|
|
59
|
+
auditLogConfigs:
|
|
60
|
+
- logType: ADMIN_READ
|
|
61
|
+
- logType: DATA_READ
|
|
62
|
+
- logType: DATA_WRITE
|
|
63
|
+
`;
|
|
64
|
+
expect(wgc503.check(makeCtx(yaml))).toHaveLength(0);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("ignores other kinds", () => {
|
|
68
|
+
const yaml = `apiVersion: storage.cnrm.cloud.google.com/v1beta1
|
|
69
|
+
kind: StorageBucket
|
|
70
|
+
metadata:
|
|
71
|
+
name: my-bucket
|
|
72
|
+
spec:
|
|
73
|
+
location: US
|
|
74
|
+
`;
|
|
75
|
+
expect(wgc503.check(makeCtx(yaml))).toHaveLength(0);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WGC503: Audit Logging Dropped or Scoped Down (#793, epic #787 C3)
|
|
3
|
+
*
|
|
4
|
+
* Flags IAMAuditConfig resources that capture nothing (no auditLogConfigs)
|
|
5
|
+
* or that carve identities out of the audit trail via exemptedMembers.
|
|
6
|
+
* WGC301 reports the absence of any IAMAuditConfig as hygiene; this check
|
|
7
|
+
* covers the declared-but-weakened sink, which is merge-worthy.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
|
|
11
|
+
import { parseGcpManifests, getResourceName, getSpec } from "./gcp-helpers";
|
|
12
|
+
|
|
13
|
+
export const wgc503: PostSynthCheck = {
|
|
14
|
+
id: "WGC503",
|
|
15
|
+
description: "IAMAuditConfig captures nothing or exempts members — the audit sink is scoped down",
|
|
16
|
+
|
|
17
|
+
check(ctx: PostSynthContext): PostSynthDiagnostic[] {
|
|
18
|
+
const diagnostics: PostSynthDiagnostic[] = [];
|
|
19
|
+
|
|
20
|
+
for (const [, output] of ctx.outputs) {
|
|
21
|
+
if (typeof output !== "string") continue;
|
|
22
|
+
|
|
23
|
+
for (const manifest of parseGcpManifests(output)) {
|
|
24
|
+
if (manifest.kind !== "IAMAuditConfig") continue;
|
|
25
|
+
const name = getResourceName(manifest);
|
|
26
|
+
const configs = getSpec(manifest)?.auditLogConfigs;
|
|
27
|
+
|
|
28
|
+
if (!Array.isArray(configs) || configs.length === 0) {
|
|
29
|
+
diagnostics.push({
|
|
30
|
+
checkId: "WGC503",
|
|
31
|
+
severity: "error",
|
|
32
|
+
message: `IAMAuditConfig "${name}" has no auditLogConfigs — the audit sink is declared but captures nothing`,
|
|
33
|
+
entity: name,
|
|
34
|
+
lexicon: "gcp",
|
|
35
|
+
});
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for (const config of configs as Array<Record<string, unknown>>) {
|
|
40
|
+
const exempted = config.exemptedMembers;
|
|
41
|
+
if (Array.isArray(exempted) && exempted.length > 0) {
|
|
42
|
+
diagnostics.push({
|
|
43
|
+
checkId: "WGC503",
|
|
44
|
+
severity: "error",
|
|
45
|
+
message: `IAMAuditConfig "${name}" exempts members from ${String(config.logType ?? "audit")} logging — audit evidence is scoped down`,
|
|
46
|
+
entity: name,
|
|
47
|
+
lexicon: "gcp",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return diagnostics;
|
|
55
|
+
},
|
|
56
|
+
};
|
package/src/plugin.test.ts
CHANGED
|
@@ -30,7 +30,7 @@ describe("gcpPlugin", () => {
|
|
|
30
30
|
|
|
31
31
|
test("returns post-synth checks", () => {
|
|
32
32
|
const checks = gcpPlugin.postSynthChecks!();
|
|
33
|
-
expect(checks).toHaveLength(
|
|
33
|
+
expect(checks).toHaveLength(26);
|
|
34
34
|
const ids = checks.map((c) => c.id);
|
|
35
35
|
expect(ids).toContain("WGC101");
|
|
36
36
|
expect(ids).toContain("WGC102");
|
|
@@ -55,6 +55,9 @@ describe("gcpPlugin", () => {
|
|
|
55
55
|
expect(ids).toContain("WGC401");
|
|
56
56
|
expect(ids).toContain("WGC402");
|
|
57
57
|
expect(ids).toContain("WGC403");
|
|
58
|
+
expect(ids).toContain("WGC501");
|
|
59
|
+
expect(ids).toContain("WGC502");
|
|
60
|
+
expect(ids).toContain("WGC503");
|
|
58
61
|
});
|
|
59
62
|
|
|
60
63
|
// ── Intrinsics / pseudo-parameters ─────────────────────────────────
|
package/src/serializer.ts
CHANGED
|
@@ -43,8 +43,13 @@ function getGVKMap(): Record<string, GVKEntry> {
|
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Resolve entityType to apiVersion and kind.
|
|
46
|
+
*
|
|
47
|
+
* Exported for the read paths (./describe-resources.ts): the CNRM kind is the
|
|
48
|
+
* key into the applier's mapper table, and the packaged map is the only place
|
|
49
|
+
* that knows `GCP::Pubsub::Topic` is `PubSubTopic` rather than the naive
|
|
50
|
+
* `PubsubTopic` the fallback derivation would produce.
|
|
46
51
|
*/
|
|
47
|
-
function resolveGVK(entityType: string): { apiVersion: string; kind: string } | null {
|
|
52
|
+
export function resolveGVK(entityType: string): { apiVersion: string; kind: string } | null {
|
|
48
53
|
const gvkMap = getGVKMap();
|
|
49
54
|
|
|
50
55
|
for (const entry of Object.values(gvkMap)) {
|