Skip to content

Commit 4f87237

Browse files
vjeffreyclaude
andcommitted
🐛 Fix 21 incorrect GCP IAM permissions in auto-generated manifest
The permission extraction heuristics produced several invalid GCP IAM permission strings. This fixes the generator and regenerates the manifest. **Service name prefix fixes (gcpServiceNameMap):** - cloudresourcemanager.* → resourcemanager.* (9 permissions) - sqladmin.* → cloudsql.* (2 permissions) - security.* → privateca.* (3 permissions) **Method-to-permission override table (new):** - accessapproval.accessApprovalSettings.get → accessapproval.settings.get - binaryauthorization.systemPolicy.get → binaryauthorization.policy.get - cloudkms.cryptoKey.get → cloudkms.cryptoKeys.get - cloudkms.iamPolicy.get → cloudkms.cryptoKeys.getIamPolicy - secretmanager.iamPolicy.get → secretmanager.secrets.getIamPolicy - secretmanager.secretVersions.list → secretmanager.versions.list - artifactregistry.iamPolicy.get → artifactregistry.repositories.getIamPolicy - serviceusage.service.get → serviceusage.services.get **Non-API method filtering (new skip list):** - monitoring.conditionAbsent.get, monitoring.conditionThreshold.get, monitoring.conditionMatchedLog.get, monitoring.conditionMonitoringQueryLanguage.get (protobuf getters, not real API calls) **Other generator fixes:** - Strip "Iter" suffix from gRPC iterator methods (iam.rolesIter.list → iam.roles.list) - Map REST "Aggregated" verb to "list" (dataflow.jobs.aggregated → dataflow.jobs.list) - Skip bare gRPC Get() calls with no resource qualifier (compute.compute.get) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent da25948 commit 4f87237

File tree

2 files changed

+186
-171
lines changed

2 files changed

+186
-171
lines changed

providers-sdk/v1/util/permissions/permissions.go

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -635,15 +635,15 @@ func classifyGCPImport(path string) *gcpImportInfo {
635635
// gcpServiceName normalizes GCP service names.
636636
var gcpServiceNameMap = map[string]string{
637637
"compute": "compute",
638-
"cloudresourcemanager": "cloudresourcemanager",
638+
"cloudresourcemanager": "resourcemanager",
639639
"iam": "iam",
640640
"dns": "dns",
641641
"bigquery": "bigquery",
642642
"logging": "logging",
643643
"monitoring": "monitoring",
644644
"container": "container",
645645
"storage": "storage",
646-
"sqladmin": "sqladmin",
646+
"sqladmin": "cloudsql",
647647
"serviceusage": "serviceusage",
648648
"apikeys": "apikeys",
649649
"kms": "cloudkms",
@@ -653,6 +653,7 @@ var gcpServiceNameMap = map[string]string{
653653
"alloydb": "alloydb",
654654
"aiplatform": "aiplatform",
655655
"privateca": "privateca",
656+
"security": "privateca",
656657
"binaryauthorization": "binaryauthorization",
657658
"spanner": "spanner",
658659
"redis": "redis",
@@ -892,8 +893,57 @@ func isGCPAPIMethod(name string) bool {
892893
return false
893894
}
894895

896+
// gcpPermissionOverrides maps (service, method) to the correct IAM permission
897+
// for cases where the automatic derivation produces incorrect results.
898+
var gcpPermissionOverrides = map[string]map[string]string{
899+
"accessapproval": {
900+
"GetAccessApprovalSettings": "accessapproval.settings.get",
901+
},
902+
"binaryauthorization": {
903+
"GetSystemPolicy": "binaryauthorization.policy.get",
904+
},
905+
"cloudkms": {
906+
"GetCryptoKey": "cloudkms.cryptoKeys.get",
907+
"GetIamPolicy": "cloudkms.cryptoKeys.getIamPolicy",
908+
},
909+
"secretmanager": {
910+
"ListSecretVersions": "secretmanager.versions.list",
911+
"GetIamPolicy": "secretmanager.secrets.getIamPolicy",
912+
},
913+
"artifactregistry": {
914+
"GetIamPolicy": "artifactregistry.repositories.getIamPolicy",
915+
},
916+
"serviceusage": {
917+
"GetService": "serviceusage.services.get",
918+
},
919+
}
920+
921+
// gcpSkipMethods lists method names that match isGCPAPIMethod patterns but are
922+
// actually protobuf getter methods or internal helpers, not real API calls.
923+
var gcpSkipMethods = map[string]bool{
924+
"GetConditionAbsent": true,
925+
"GetConditionThreshold": true,
926+
"GetConditionMatchedLog": true,
927+
"GetConditionMonitoringQueryLanguage": true,
928+
}
929+
895930
// gcpMethodToPermission maps a gRPC method to a GCP IAM permission.
896931
func gcpMethodToPermission(service, method string) string {
932+
// Skip known non-API methods
933+
if gcpSkipMethods[method] {
934+
return ""
935+
}
936+
937+
// Strip "Iter" suffix from iterator helper methods (e.g., ListRolesIter -> ListRoles)
938+
method = strings.TrimSuffix(method, "Iter")
939+
940+
// Check for explicit overrides
941+
if overrides, ok := gcpPermissionOverrides[service]; ok {
942+
if perm, ok := overrides[method]; ok {
943+
return perm
944+
}
945+
}
946+
897947
// gRPC methods: ListKeyRings -> cloudkms.keyRings.list
898948
// ListServiceAccounts -> iam.serviceAccounts.list
899949
// GetKeyRotationStatus -> cloudkms.cryptoKeys.get
@@ -911,7 +961,7 @@ func gcpMethodToPermission(service, method string) string {
911961
verb = "get"
912962
resource = strings.TrimPrefix(method, "Get")
913963
if resource == "" {
914-
resource = service
964+
return "" // bare Get without resource name is ambiguous
915965
}
916966
} else if strings.HasPrefix(method, "Create") {
917967
verb = "create"
@@ -952,7 +1002,7 @@ func gcpRESTToPermission(service, resource, method string) string {
9521002
}
9531003
verb := ""
9541004
switch method {
955-
case "List", "AggregatedList", "Pages":
1005+
case "List", "AggregatedList", "Aggregated", "Pages":
9561006
verb = "list"
9571007
case "Get", "Do":
9581008
verb = "get"

0 commit comments

Comments
 (0)