Skip to content

Commit a2da1e1

Browse files
authored
CLOUDP-307054: Add support for hidden-env properties and schemas (#560)
1 parent 262ca2e commit a2da1e1

21 files changed

+673
-27
lines changed

openapi/v2/openapi-2025-03-12.json

-26
Original file line numberDiff line numberDiff line change
@@ -32902,24 +32902,6 @@
3290232902
},
3290332903
"ApiSearchDeploymentResponseView": {
3290432904
"properties": {
32905-
"encryptionAtRestProvider": {
32906-
"description": "Cloud service provider that manages your customer keys to provide an additional layer of Encryption At Rest for the cluster.",
32907-
"enum": [
32908-
"NONE",
32909-
"AWS",
32910-
"AZURE",
32911-
"GCP"
32912-
],
32913-
"externalDocs": {
32914-
"description": "Encryption at Rest using Customer Key Management",
32915-
"url": "https://www.mongodb.com/docs/atlas/security-kms-encryption/"
32916-
},
32917-
"readOnly": true,
32918-
"type": "string",
32919-
"x-xgen-hidden-env": {
32920-
"envs": "qa,prod,stage"
32921-
}
32922-
},
3292332905
"groupId": {
3292432906
"description": "Unique 24-hexadecimal character string that identifies the project.",
3292532907
"example": "32b6e34b3d91647abb20e7b8",
@@ -47634,14 +47616,6 @@
4763447616
"azureKeyVault": {
4763547617
"$ref": "#/components/schemas/AzureKeyVault"
4763647618
},
47637-
"enabledForSearchNodes": {
47638-
"description": "Flag that indicates whether Encryption at Rest for Dedicated Search Nodes is enabled in the specified project.",
47639-
"nullable": true,
47640-
"type": "boolean",
47641-
"x-xgen-hidden-env": {
47642-
"envs": "qa,prod,stage"
47643-
}
47644-
},
4764547619
"googleCloudKms": {
4764647620
"$ref": "#/components/schemas/GoogleCloudKMS"
4764747621
}

tools/cli/internal/openapi/filter/hidden_envs.go

+78
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,87 @@ func (f *HiddenEnvsFilter) Apply() error {
5050
f.oas.Paths.Delete(path)
5151
}
5252
}
53+
54+
if f.oas.Components == nil || f.oas.Components.Schemas == nil {
55+
return nil
56+
}
57+
58+
return f.applyOnSchemas(f.oas.Components.Schemas)
59+
}
60+
61+
func (f *HiddenEnvsFilter) applyOnSchemas(schemas openapi3.Schemas) error {
62+
for name, schema := range schemas {
63+
if err := f.removeSchemaIfHiddenForEnv(name, schema, schemas); err != nil {
64+
return err
65+
}
66+
}
67+
return nil
68+
}
69+
70+
func (f *HiddenEnvsFilter) removeSchemaIfHiddenForEnv(name string, schema *openapi3.SchemaRef, schemas openapi3.Schemas) error {
71+
if schema == nil {
72+
return nil
73+
}
74+
75+
// Remove the schema if it is hidden for the target environment
76+
if extension, ok := schema.Extensions[hiddenEnvsExtension]; ok {
77+
log.Printf("Found x-hidden-envs in schema: K: %q, V: %q", hiddenEnvsExtension, extension)
78+
if isHiddenExtensionEqualToTargetEnv(extension, f.metadata.targetEnv) {
79+
log.Printf("Removing schema: %q because is hidden for target env: %q", name, f.metadata.targetEnv)
80+
delete(schemas, name)
81+
return nil
82+
}
83+
84+
// Remove the Hidden extension from the final OAS
85+
delete(schema.Extensions, hiddenEnvsExtension)
86+
}
87+
88+
if schema.Value == nil {
89+
return nil
90+
}
91+
92+
if schema.Value.Extensions != nil {
93+
if extension, ok := schema.Value.Extensions[hiddenEnvsExtension]; ok {
94+
log.Printf("Found x-hidden-envs in schema: K: %q, V: %q", hiddenEnvsExtension, extension)
95+
if isHiddenExtensionEqualToTargetEnv(extension, f.metadata.targetEnv) {
96+
log.Printf("Removing schema: %q because is hidden for target env: %q", name, f.metadata.targetEnv)
97+
delete(schemas, name)
98+
return nil
99+
}
100+
101+
// Remove the Hidden extension from the final OAS
102+
delete(schema.Value.Extensions, hiddenEnvsExtension)
103+
}
104+
}
105+
106+
// Remove properties and items if they are hidden for the target environment
107+
if schema.Value.Properties != nil {
108+
if err := f.applyOnSchemas(schema.Value.Properties); err != nil {
109+
return err
110+
}
111+
}
112+
113+
f.removeItemsIfHiddenForEnv(schema)
53114
return nil
54115
}
55116

117+
func (f *HiddenEnvsFilter) removeItemsIfHiddenForEnv(schema *openapi3.SchemaRef) {
118+
if schema.Value == nil || schema.Value.Items == nil {
119+
return
120+
}
121+
122+
if extension, ok := schema.Value.Items.Extensions[hiddenEnvsExtension]; ok {
123+
log.Printf("Found x-hidden-envs in items: K: %q, V: %q", hiddenEnvsExtension, extension)
124+
if isHiddenExtensionEqualToTargetEnv(extension, f.metadata.targetEnv) {
125+
log.Printf("Removing items because is hidden for target env: %q", f.metadata.targetEnv)
126+
schema.Value.Items = nil
127+
} else {
128+
// Remove the Hidden extension from the final OAS
129+
delete(schema.Value.Items.Extensions, hiddenEnvsExtension)
130+
}
131+
}
132+
}
133+
56134
func (f *HiddenEnvsFilter) applyOnPath(pathItem *openapi3.PathItem) error {
57135
for k, operation := range pathItem.Operations() {
58136
f.removeOperationIfHiddenForEnv(k, pathItem, operation)

0 commit comments

Comments
 (0)