@aifabrix/builder 2.6.3 → 2.7.0
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/bin/aifabrix.js +4 -0
- package/lib/cli.js +51 -2
- package/lib/commands/datasource.js +94 -0
- package/lib/datasource-deploy.js +182 -0
- package/lib/datasource-diff.js +73 -0
- package/lib/datasource-list.js +138 -0
- package/lib/datasource-validate.js +63 -0
- package/lib/diff.js +266 -0
- package/lib/schema/application-schema.json +829 -687
- package/lib/schema/external-datasource.schema.json +464 -0
- package/lib/schema/external-system.schema.json +262 -0
- package/lib/secrets.js +20 -1
- package/lib/utils/env-copy.js +24 -0
- package/lib/utils/env-endpoints.js +50 -11
- package/lib/utils/schema-loader.js +220 -0
- package/lib/utils/schema-resolver.js +174 -0
- package/lib/utils/secrets-helpers.js +65 -17
- package/lib/validate.js +299 -0
- package/package.json +1 -1
|
@@ -1,725 +1,867 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema":
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
2
|
+
"$schema":"http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id":"https://aifabrix.ai/schemas/application-schema.json",
|
|
4
|
+
"title":"AI Fabrix Application Configuration Schema",
|
|
5
|
+
"description":"Schema for AI Fabrix applications deployed via the API-Driven Deployment System",
|
|
6
|
+
"metadata":{
|
|
7
|
+
"key":"application-schema",
|
|
8
|
+
"name":"Application Configuration Schema",
|
|
9
|
+
"description":"JSON schema for validating AI Fabrix application configuration files",
|
|
10
|
+
"version":"1.1.0",
|
|
11
|
+
"type":"schema",
|
|
12
|
+
"category":"infrastructure",
|
|
13
|
+
"author":"AI Fabrix Team",
|
|
14
|
+
"createdAt":"2024-01-01T00:00:00Z",
|
|
15
|
+
"updatedAt":"2025-11-26T00:00:00Z",
|
|
16
|
+
"compatibility":{
|
|
17
|
+
"minVersion":"1.0.0",
|
|
18
|
+
"maxVersion":"2.0.0",
|
|
19
|
+
"deprecated":false
|
|
20
|
+
},
|
|
21
|
+
"tags":[
|
|
22
|
+
"schema",
|
|
23
|
+
"application",
|
|
24
|
+
"validation",
|
|
25
|
+
"configuration",
|
|
26
|
+
"external-integration"
|
|
27
|
+
],
|
|
28
|
+
"dependencies":[
|
|
29
|
+
|
|
30
|
+
],
|
|
31
|
+
"changelog":[
|
|
32
|
+
{
|
|
33
|
+
"version":"1.1.0",
|
|
34
|
+
"date":"2025-11-26T00:00:00Z",
|
|
35
|
+
"changes":[
|
|
36
|
+
"Added externalIntegration block for ExternalSystem + ExternalDataSource pipeline deployments",
|
|
37
|
+
"Added schemaBasePath, systems, dataSources and autopublish fields"
|
|
38
|
+
],
|
|
39
|
+
"breaking":false
|
|
40
|
+
}
|
|
41
|
+
]
|
|
35
42
|
},
|
|
36
|
-
"type":
|
|
37
|
-
"required":
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
"type":
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
"
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
43
|
+
"type":"object",
|
|
44
|
+
"required":[
|
|
45
|
+
"key",
|
|
46
|
+
"displayName",
|
|
47
|
+
"description",
|
|
48
|
+
"type",
|
|
49
|
+
"image",
|
|
50
|
+
"registryMode",
|
|
51
|
+
"port",
|
|
52
|
+
"deploymentKey"
|
|
53
|
+
],
|
|
54
|
+
"properties":{
|
|
55
|
+
"key":{
|
|
56
|
+
"type":"string",
|
|
57
|
+
"description":"Unique application identifier (cannot be changed after registration)",
|
|
58
|
+
"pattern":"^[a-z0-9-]+$",
|
|
59
|
+
"minLength":3,
|
|
60
|
+
"maxLength":40
|
|
61
|
+
},
|
|
62
|
+
"displayName":{
|
|
63
|
+
"type":"string",
|
|
64
|
+
"description":"Human-readable application name",
|
|
65
|
+
"minLength":1,
|
|
66
|
+
"maxLength":100
|
|
67
|
+
},
|
|
68
|
+
"description":{
|
|
69
|
+
"type":"string",
|
|
70
|
+
"description":"Application description",
|
|
71
|
+
"minLength":1,
|
|
72
|
+
"maxLength":500
|
|
73
|
+
},
|
|
74
|
+
"type":{
|
|
75
|
+
"type":"string",
|
|
76
|
+
"description":"Azure application type",
|
|
77
|
+
"enum":[
|
|
78
|
+
"webapp",
|
|
79
|
+
"functionapp",
|
|
80
|
+
"api",
|
|
81
|
+
"service"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"image":{
|
|
85
|
+
"type":"string",
|
|
86
|
+
"description":"Container image reference",
|
|
87
|
+
"pattern":"^[a-zA-Z0-9._/-]+:[a-zA-Z0-9._-]+$"
|
|
88
|
+
},
|
|
89
|
+
"registryMode":{
|
|
90
|
+
"type":"string",
|
|
91
|
+
"description":"Registry mode for image authentication",
|
|
92
|
+
"enum":[
|
|
93
|
+
"acr",
|
|
94
|
+
"external",
|
|
95
|
+
"public"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"port":{
|
|
99
|
+
"type":"number",
|
|
100
|
+
"description":"Application port number",
|
|
101
|
+
"minimum":1,
|
|
102
|
+
"maximum":65535
|
|
103
|
+
},
|
|
104
|
+
"deploymentKey":{
|
|
105
|
+
"type":"string",
|
|
106
|
+
"description":"SHA256 hash of deployment manifest (excluding deploymentKey field)",
|
|
107
|
+
"pattern":"^[a-f0-9]{64}$"
|
|
108
|
+
},
|
|
109
|
+
"requiresDatabase":{
|
|
110
|
+
"type":"boolean",
|
|
111
|
+
"description":"Whether application requires database"
|
|
112
|
+
},
|
|
113
|
+
"databases":{
|
|
114
|
+
"type":"array",
|
|
115
|
+
"description":"Database configurations",
|
|
116
|
+
"items":{
|
|
117
|
+
"type":"object",
|
|
118
|
+
"required":[
|
|
119
|
+
"name"
|
|
120
|
+
],
|
|
121
|
+
"properties":{
|
|
122
|
+
"name":{
|
|
123
|
+
"type":"string",
|
|
124
|
+
"description":"Database name",
|
|
125
|
+
"pattern":"^[a-z0-9-_]+$"
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"additionalProperties":false
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"requiresRedis":{
|
|
132
|
+
"type":"boolean",
|
|
133
|
+
"description":"Whether application requires Redis"
|
|
134
|
+
},
|
|
135
|
+
"requiresStorage":{
|
|
136
|
+
"type":"boolean",
|
|
137
|
+
"description":"Whether application requires storage.Physical storage is mapped to /mnt/data/. Blob storage is mapped to SMB File share /data/{app-key}/."
|
|
138
|
+
},
|
|
139
|
+
"configuration":{
|
|
140
|
+
"type":"array",
|
|
141
|
+
"description":"Core application configuration",
|
|
142
|
+
"items":{
|
|
143
|
+
"type":"object",
|
|
144
|
+
"required":[
|
|
145
|
+
"name",
|
|
146
|
+
"value",
|
|
147
|
+
"location",
|
|
148
|
+
"required"
|
|
149
|
+
],
|
|
150
|
+
"properties":{
|
|
151
|
+
"name":{
|
|
152
|
+
"type":"string",
|
|
153
|
+
"description":"Configuration variable name",
|
|
154
|
+
"pattern":"^[A-Z_][A-Z0-9_]*$"
|
|
148
155
|
},
|
|
149
|
-
"
|
|
150
|
-
|
|
151
|
-
|
|
156
|
+
"value":{
|
|
157
|
+
"type":"string",
|
|
158
|
+
"description":"Configuration value (literal or ready-made parameter reference)"
|
|
152
159
|
},
|
|
153
|
-
"
|
|
154
|
-
|
|
155
|
-
|
|
160
|
+
"location":{
|
|
161
|
+
"type":"string",
|
|
162
|
+
"description":"Where the value is stored",
|
|
163
|
+
"enum":[
|
|
164
|
+
"variable",
|
|
165
|
+
"keyvault"
|
|
166
|
+
]
|
|
156
167
|
},
|
|
157
|
-
"
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
"minLength": {
|
|
161
|
-
"type": "integer",
|
|
162
|
-
"minimum": 1
|
|
163
|
-
},
|
|
164
|
-
"maxLength": {
|
|
165
|
-
"type": "integer",
|
|
166
|
-
"minimum": 1
|
|
167
|
-
},
|
|
168
|
-
"pattern": {
|
|
169
|
-
"type": "string",
|
|
170
|
-
"description": "Regex pattern for validation"
|
|
171
|
-
},
|
|
172
|
-
"required": {
|
|
173
|
-
"type": "boolean"
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
"additionalProperties": false
|
|
168
|
+
"required":{
|
|
169
|
+
"type":"boolean",
|
|
170
|
+
"description":"Whether this configuration is required"
|
|
177
171
|
},
|
|
178
|
-
"
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"additionalProperties": false
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
"conditionalConfiguration": {
|
|
194
|
-
"type": "array",
|
|
195
|
-
"description": "Conditional configuration based on service requirements",
|
|
196
|
-
"items": {
|
|
197
|
-
"type": "object",
|
|
198
|
-
"required": ["condition", "configuration"],
|
|
199
|
-
"properties": {
|
|
200
|
-
"condition": {
|
|
201
|
-
"type": "string",
|
|
202
|
-
"description": "Condition for including this configuration",
|
|
203
|
-
"pattern": "^\\{\\{.*\\}\\}$"
|
|
204
|
-
},
|
|
205
|
-
"configuration": {
|
|
206
|
-
"type": "array",
|
|
207
|
-
"description": "Configuration items to include when condition is true",
|
|
208
|
-
"items": {
|
|
209
|
-
"type": "object",
|
|
210
|
-
"required": ["name", "value", "location", "required"],
|
|
211
|
-
"properties": {
|
|
212
|
-
"name": {
|
|
213
|
-
"type": "string",
|
|
214
|
-
"description": "Configuration variable name",
|
|
215
|
-
"pattern": "^[A-Z_][A-Z0-9_]*$"
|
|
216
|
-
},
|
|
217
|
-
"value": {
|
|
218
|
-
"type": "string",
|
|
219
|
-
"description": "Configuration value (literal or ready-made parameter reference)"
|
|
220
|
-
},
|
|
221
|
-
"location": {
|
|
222
|
-
"type": "string",
|
|
223
|
-
"description": "Where the value is stored",
|
|
224
|
-
"enum": ["variable", "keyvault"]
|
|
225
|
-
},
|
|
226
|
-
"required": {
|
|
227
|
-
"type": "boolean",
|
|
228
|
-
"description": "Whether this configuration is required"
|
|
229
|
-
},
|
|
230
|
-
"portalInput": {
|
|
231
|
-
"type": "object",
|
|
232
|
-
"description": "Portal input configuration for user-provided values",
|
|
233
|
-
"properties": {
|
|
234
|
-
"field": {
|
|
235
|
-
"type": "string",
|
|
236
|
-
"enum": ["password", "text", "textarea", "select"]
|
|
172
|
+
"portalInput":{
|
|
173
|
+
"type":"object",
|
|
174
|
+
"description":"Portal input configuration for user-provided values",
|
|
175
|
+
"properties":{
|
|
176
|
+
"field":{
|
|
177
|
+
"type":"string",
|
|
178
|
+
"enum":[
|
|
179
|
+
"password",
|
|
180
|
+
"text",
|
|
181
|
+
"textarea",
|
|
182
|
+
"select"
|
|
183
|
+
]
|
|
237
184
|
},
|
|
238
|
-
"label":
|
|
239
|
-
|
|
240
|
-
|
|
185
|
+
"label":{
|
|
186
|
+
"type":"string",
|
|
187
|
+
"description":"Display label for the input field"
|
|
241
188
|
},
|
|
242
|
-
"placeholder":
|
|
243
|
-
|
|
244
|
-
|
|
189
|
+
"placeholder":{
|
|
190
|
+
"type":"string",
|
|
191
|
+
"description":"Placeholder text for the input field"
|
|
245
192
|
},
|
|
246
|
-
"masked":
|
|
247
|
-
|
|
248
|
-
|
|
193
|
+
"masked":{
|
|
194
|
+
"type":"boolean",
|
|
195
|
+
"description":"Whether to mask the input (for passwords)"
|
|
249
196
|
},
|
|
250
|
-
"validation":
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
197
|
+
"validation":{
|
|
198
|
+
"type":"object",
|
|
199
|
+
"properties":{
|
|
200
|
+
"minLength":{
|
|
201
|
+
"type":"integer",
|
|
202
|
+
"minimum":1
|
|
203
|
+
},
|
|
204
|
+
"maxLength":{
|
|
205
|
+
"type":"integer",
|
|
206
|
+
"minimum":1
|
|
207
|
+
},
|
|
208
|
+
"pattern":{
|
|
209
|
+
"type":"string",
|
|
210
|
+
"description":"Regex pattern for validation"
|
|
211
|
+
},
|
|
212
|
+
"required":{
|
|
213
|
+
"type":"boolean"
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
"additionalProperties":false
|
|
270
217
|
},
|
|
271
|
-
"options":
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
218
|
+
"options":{
|
|
219
|
+
"type":"array",
|
|
220
|
+
"description":"Options for select fields",
|
|
221
|
+
"items":{
|
|
222
|
+
"type":"string"
|
|
223
|
+
}
|
|
277
224
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
"additionalProperties": false
|
|
288
|
-
}
|
|
289
|
-
},
|
|
290
|
-
"healthCheck": {
|
|
291
|
-
"type": "object",
|
|
292
|
-
"description": "Health check configuration. The health check endpoint must return HTTP 200 and a JSON response with one of the following formats: {\"status\": \"UP\"} (Keycloak format), {\"status\": \"ok\"} (standard format, optionally with {\"database\": \"connected\"}), {\"status\": \"healthy\"} (alternative format), or {\"success\": true} (success-based format). For non-JSON responses, HTTP 200 status code is sufficient.",
|
|
293
|
-
"required": ["path", "interval"],
|
|
294
|
-
"properties": {
|
|
295
|
-
"path": {
|
|
296
|
-
"type": "string",
|
|
297
|
-
"description": "Health check endpoint path",
|
|
298
|
-
"pattern": "^/"
|
|
299
|
-
},
|
|
300
|
-
"interval": {
|
|
301
|
-
"type": "integer",
|
|
302
|
-
"description": "Health check interval in seconds",
|
|
303
|
-
"minimum": 10,
|
|
304
|
-
"maximum": 300
|
|
305
|
-
},
|
|
306
|
-
"probePath": {
|
|
307
|
-
"type": "string",
|
|
308
|
-
"description": "Front Door health probe path (defaults to path if not specified)",
|
|
309
|
-
"pattern": "^/"
|
|
310
|
-
},
|
|
311
|
-
"probeRequestType": {
|
|
312
|
-
"type": "string",
|
|
313
|
-
"description": "HTTP method for Front Door probe",
|
|
314
|
-
"enum": ["GET", "POST", "HEAD", "PUT", "DELETE"]
|
|
315
|
-
},
|
|
316
|
-
"probeProtocol": {
|
|
317
|
-
"type": "string",
|
|
318
|
-
"description": "Protocol for Front Door probe",
|
|
319
|
-
"enum": ["Http", "Https"]
|
|
320
|
-
},
|
|
321
|
-
"probeIntervalInSeconds": {
|
|
322
|
-
"type": "integer",
|
|
323
|
-
"description": "Front Door probe interval in seconds (default 120)",
|
|
324
|
-
"minimum": 60,
|
|
325
|
-
"maximum": 600
|
|
225
|
+
},
|
|
226
|
+
"required":[
|
|
227
|
+
"field",
|
|
228
|
+
"label"
|
|
229
|
+
],
|
|
230
|
+
"additionalProperties":false
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
"additionalProperties":false
|
|
326
234
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
235
|
+
},
|
|
236
|
+
"conditionalConfiguration":{
|
|
237
|
+
"type":"array",
|
|
238
|
+
"description":"Conditional configuration based on service requirements",
|
|
239
|
+
"items":{
|
|
240
|
+
"type":"object",
|
|
241
|
+
"required":[
|
|
242
|
+
"condition",
|
|
243
|
+
"configuration"
|
|
244
|
+
],
|
|
245
|
+
"properties":{
|
|
246
|
+
"condition":{
|
|
247
|
+
"type":"string",
|
|
248
|
+
"description":"Condition for including this configuration",
|
|
249
|
+
"pattern":"^\\{\\{.*\\}\\}$"
|
|
250
|
+
},
|
|
251
|
+
"configuration":{
|
|
252
|
+
"type":"array",
|
|
253
|
+
"description":"Configuration items to include when condition is true",
|
|
254
|
+
"items":{
|
|
255
|
+
"type":"object",
|
|
256
|
+
"required":[
|
|
257
|
+
"name",
|
|
258
|
+
"value",
|
|
259
|
+
"location",
|
|
260
|
+
"required"
|
|
261
|
+
],
|
|
262
|
+
"properties":{
|
|
263
|
+
"name":{
|
|
264
|
+
"type":"string",
|
|
265
|
+
"description":"Configuration variable name",
|
|
266
|
+
"pattern":"^[A-Z_][A-Z0-9_]*$"
|
|
267
|
+
},
|
|
268
|
+
"value":{
|
|
269
|
+
"type":"string",
|
|
270
|
+
"description":"Configuration value (literal or ready-made parameter reference)"
|
|
271
|
+
},
|
|
272
|
+
"location":{
|
|
273
|
+
"type":"string",
|
|
274
|
+
"description":"Where the value is stored",
|
|
275
|
+
"enum":[
|
|
276
|
+
"variable",
|
|
277
|
+
"keyvault"
|
|
278
|
+
]
|
|
279
|
+
},
|
|
280
|
+
"required":{
|
|
281
|
+
"type":"boolean",
|
|
282
|
+
"description":"Whether this configuration is required"
|
|
283
|
+
},
|
|
284
|
+
"portalInput":{
|
|
285
|
+
"type":"object",
|
|
286
|
+
"description":"Portal input configuration for user-provided values",
|
|
287
|
+
"properties":{
|
|
288
|
+
"field":{
|
|
289
|
+
"type":"string",
|
|
290
|
+
"enum":[
|
|
291
|
+
"password",
|
|
292
|
+
"text",
|
|
293
|
+
"textarea",
|
|
294
|
+
"select"
|
|
295
|
+
]
|
|
296
|
+
},
|
|
297
|
+
"label":{
|
|
298
|
+
"type":"string",
|
|
299
|
+
"description":"Display label for the input field"
|
|
300
|
+
},
|
|
301
|
+
"placeholder":{
|
|
302
|
+
"type":"string",
|
|
303
|
+
"description":"Placeholder text for the input field"
|
|
304
|
+
},
|
|
305
|
+
"masked":{
|
|
306
|
+
"type":"boolean",
|
|
307
|
+
"description":"Whether to mask the input (for passwords)"
|
|
308
|
+
},
|
|
309
|
+
"validation":{
|
|
310
|
+
"type":"object",
|
|
311
|
+
"properties":{
|
|
312
|
+
"minLength":{
|
|
313
|
+
"type":"integer",
|
|
314
|
+
"minimum":1
|
|
315
|
+
},
|
|
316
|
+
"maxLength":{
|
|
317
|
+
"type":"integer",
|
|
318
|
+
"minimum":1
|
|
319
|
+
},
|
|
320
|
+
"pattern":{
|
|
321
|
+
"type":"string",
|
|
322
|
+
"description":"Regex pattern for validation"
|
|
323
|
+
},
|
|
324
|
+
"required":{
|
|
325
|
+
"type":"boolean"
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
"additionalProperties":false
|
|
329
|
+
},
|
|
330
|
+
"options":{
|
|
331
|
+
"type":"array",
|
|
332
|
+
"description":"Options for select fields",
|
|
333
|
+
"items":{
|
|
334
|
+
"type":"string"
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
"required":[
|
|
339
|
+
"field",
|
|
340
|
+
"label"
|
|
341
|
+
],
|
|
342
|
+
"additionalProperties":false
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"additionalProperties":false
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
"additionalProperties":false
|
|
341
350
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
"
|
|
345
|
-
"formats":
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
351
|
+
},
|
|
352
|
+
"healthCheck":{
|
|
353
|
+
"type":"object",
|
|
354
|
+
"description":"Health check configuration. The health check endpoint must return HTTP 200 and a JSON response with one of the following formats: {\"status\": \"UP\"} (Keycloak format), {\"status\": \"ok\"} (standard format, optionally with {\"database\": \"connected\"}), {\"status\": \"healthy\"} (alternative format), or {\"success\": true} (success-based format). For non-JSON responses, HTTP 200 status code is sufficient.",
|
|
355
|
+
"required":[
|
|
356
|
+
"path",
|
|
357
|
+
"interval"
|
|
358
|
+
],
|
|
359
|
+
"properties":{
|
|
360
|
+
"path":{
|
|
361
|
+
"type":"string",
|
|
362
|
+
"description":"Health check endpoint path",
|
|
363
|
+
"pattern":"^/"
|
|
364
|
+
},
|
|
365
|
+
"interval":{
|
|
366
|
+
"type":"integer",
|
|
367
|
+
"description":"Health check interval in seconds",
|
|
368
|
+
"minimum":10,
|
|
369
|
+
"maximum":300
|
|
370
|
+
},
|
|
371
|
+
"probePath":{
|
|
372
|
+
"type":"string",
|
|
373
|
+
"description":"Front Door health probe path (defaults to path if not specified)",
|
|
374
|
+
"pattern":"^/"
|
|
375
|
+
},
|
|
376
|
+
"probeRequestType":{
|
|
377
|
+
"type":"string",
|
|
378
|
+
"description":"HTTP method for Front Door probe",
|
|
379
|
+
"enum":[
|
|
380
|
+
"GET",
|
|
381
|
+
"POST",
|
|
382
|
+
"HEAD",
|
|
383
|
+
"PUT",
|
|
384
|
+
"DELETE"
|
|
385
|
+
]
|
|
386
|
+
},
|
|
387
|
+
"probeProtocol":{
|
|
388
|
+
"type":"string",
|
|
389
|
+
"description":"Protocol for Front Door probe",
|
|
390
|
+
"enum":[
|
|
391
|
+
"Http",
|
|
392
|
+
"Https"
|
|
393
|
+
]
|
|
394
|
+
},
|
|
395
|
+
"probeIntervalInSeconds":{
|
|
396
|
+
"type":"integer",
|
|
397
|
+
"description":"Front Door probe interval in seconds (default 120)",
|
|
398
|
+
"minimum":60,
|
|
399
|
+
"maximum":600
|
|
400
|
+
}
|
|
386
401
|
},
|
|
387
|
-
"
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
402
|
+
"additionalProperties":false,
|
|
403
|
+
"examples":[
|
|
404
|
+
{
|
|
405
|
+
"path":"/health",
|
|
406
|
+
"interval":30
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"path":"/api/health",
|
|
410
|
+
"interval":60,
|
|
411
|
+
"probePath":"/api/health",
|
|
412
|
+
"probeRequestType":"GET",
|
|
413
|
+
"probeProtocol":"Http",
|
|
414
|
+
"probeIntervalInSeconds":120
|
|
415
|
+
}
|
|
416
|
+
],
|
|
417
|
+
"responseFormats":{
|
|
418
|
+
"description":"Valid health check response formats",
|
|
419
|
+
"formats":[
|
|
420
|
+
{
|
|
421
|
+
"format":"Keycloak",
|
|
422
|
+
"example":"{\"status\": \"UP\", \"checks\": []}",
|
|
423
|
+
"validation":"status === 'UP'"
|
|
396
424
|
},
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
425
|
+
{
|
|
426
|
+
"format":"Standard",
|
|
427
|
+
"example":"{\"status\": \"ok\", \"database\": \"connected\"}",
|
|
428
|
+
"validation":"status === 'ok' && (database === 'connected' || !database)"
|
|
400
429
|
},
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
},
|
|
410
|
-
"ruleSetActions": {
|
|
411
|
-
"type": "array",
|
|
412
|
-
"description": "Rule set actions for URL rewriting",
|
|
413
|
-
"items": {
|
|
414
|
-
"type": "object",
|
|
415
|
-
"properties": {
|
|
416
|
-
"type": {
|
|
417
|
-
"type": "string",
|
|
418
|
-
"description": "Action type (e.g., 'UrlRewrite')"
|
|
430
|
+
{
|
|
431
|
+
"format":"Alternative",
|
|
432
|
+
"example":"{\"status\": \"healthy\", \"service\": \"dataplane\"}",
|
|
433
|
+
"validation":"status === 'healthy'"
|
|
419
434
|
},
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
435
|
+
{
|
|
436
|
+
"format":"Success-based",
|
|
437
|
+
"example":"{\"success\": true, \"message\": \"Service is running\"}",
|
|
438
|
+
"validation":"success === true"
|
|
423
439
|
},
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
440
|
+
{
|
|
441
|
+
"format":"Non-JSON",
|
|
442
|
+
"example":"OK",
|
|
443
|
+
"validation":"HTTP status code === 200"
|
|
427
444
|
}
|
|
428
|
-
|
|
429
|
-
}
|
|
445
|
+
]
|
|
430
446
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
+
},
|
|
448
|
+
"frontDoorRouting":{
|
|
449
|
+
"type":"object",
|
|
450
|
+
"description":"Front Door routing configuration",
|
|
451
|
+
"properties":{
|
|
452
|
+
"pattern":{
|
|
453
|
+
"type":"string",
|
|
454
|
+
"description":"URL pattern for routing (e.g., '/app/*')",
|
|
455
|
+
"pattern":"^/.+"
|
|
456
|
+
},
|
|
457
|
+
"requiresRuleSet":{
|
|
458
|
+
"type":"boolean",
|
|
459
|
+
"description":"Whether URL rewriting rule set is required"
|
|
460
|
+
},
|
|
461
|
+
"ruleSetConditions":{
|
|
462
|
+
"type":"array",
|
|
463
|
+
"description":"Rule set conditions for URL rewriting",
|
|
464
|
+
"items":{
|
|
465
|
+
"type":"object",
|
|
466
|
+
"properties":{
|
|
467
|
+
"type":{
|
|
468
|
+
"type":"string",
|
|
469
|
+
"description":"Condition type (e.g., 'UrlPath')"
|
|
470
|
+
},
|
|
471
|
+
"operator":{
|
|
472
|
+
"type":"string",
|
|
473
|
+
"description":"Condition operator (e.g., 'BeginsWith')"
|
|
474
|
+
},
|
|
475
|
+
"matchValues":{
|
|
476
|
+
"type":"array",
|
|
477
|
+
"items":{
|
|
478
|
+
"type":"string"
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
"ruleSetActions":{
|
|
485
|
+
"type":"array",
|
|
486
|
+
"description":"Rule set actions for URL rewriting",
|
|
487
|
+
"items":{
|
|
488
|
+
"type":"object",
|
|
489
|
+
"properties":{
|
|
490
|
+
"type":{
|
|
491
|
+
"type":"string",
|
|
492
|
+
"description":"Action type (e.g., 'UrlRewrite')"
|
|
493
|
+
},
|
|
494
|
+
"sourcePattern":{
|
|
495
|
+
"type":"string",
|
|
496
|
+
"description":"Source URL pattern for rewriting"
|
|
497
|
+
},
|
|
498
|
+
"destination":{
|
|
499
|
+
"type":"string",
|
|
500
|
+
"description":"Destination URL pattern"
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
447
505
|
},
|
|
448
|
-
"
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
506
|
+
"additionalProperties":false
|
|
507
|
+
},
|
|
508
|
+
"authentication":{
|
|
509
|
+
"type":"object",
|
|
510
|
+
"description":"Authentication configuration. When enableSSO is false, only enableSSO is required. When enableSSO is true, type and requiredRoles are also required.",
|
|
511
|
+
"required":[
|
|
512
|
+
"enableSSO"
|
|
513
|
+
],
|
|
514
|
+
"properties":{
|
|
515
|
+
"type":{
|
|
516
|
+
"type":"string",
|
|
517
|
+
"description":"Authentication type",
|
|
518
|
+
"enum":[
|
|
519
|
+
"azure",
|
|
520
|
+
"local",
|
|
521
|
+
"none"
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
"enableSSO":{
|
|
525
|
+
"type":"boolean",
|
|
526
|
+
"description":"Whether to enable SSO"
|
|
527
|
+
},
|
|
528
|
+
"requiredRoles":{
|
|
529
|
+
"type":"array",
|
|
530
|
+
"description":"Required roles for access",
|
|
531
|
+
"items":{
|
|
532
|
+
"type":"string",
|
|
533
|
+
"pattern":"^[a-z-]+$"
|
|
534
|
+
}
|
|
535
|
+
},
|
|
536
|
+
"endpoints":{
|
|
537
|
+
"type":"object",
|
|
538
|
+
"description":"Authentication endpoints",
|
|
539
|
+
"properties":{
|
|
540
|
+
"local":{
|
|
541
|
+
"type":"string",
|
|
542
|
+
"description":"Local authentication endpoint",
|
|
543
|
+
"pattern":"^(http|https)://.*$"
|
|
544
|
+
},
|
|
545
|
+
"custom":{
|
|
546
|
+
"type":"string",
|
|
547
|
+
"description":"Custom authentication endpoint",
|
|
548
|
+
"pattern":"^(http|https)://.*$"
|
|
549
|
+
}
|
|
550
|
+
},
|
|
551
|
+
"additionalProperties":false
|
|
552
|
+
}
|
|
455
553
|
},
|
|
456
|
-
"
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
"
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
554
|
+
"additionalProperties":false,
|
|
555
|
+
"allOf":[
|
|
556
|
+
{
|
|
557
|
+
"if":{
|
|
558
|
+
"properties":{
|
|
559
|
+
"enableSSO":{
|
|
560
|
+
"const":true
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
},
|
|
564
|
+
"then":{
|
|
565
|
+
"required":[
|
|
566
|
+
"type",
|
|
567
|
+
"enableSSO",
|
|
568
|
+
"requiredRoles"
|
|
569
|
+
]
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
]
|
|
573
|
+
},
|
|
574
|
+
"roles":{
|
|
575
|
+
"type":"array",
|
|
576
|
+
"description":"Application roles for Azure AD group mapping",
|
|
577
|
+
"items":{
|
|
578
|
+
"type":"object",
|
|
579
|
+
"required":[
|
|
580
|
+
"name",
|
|
581
|
+
"value",
|
|
582
|
+
"description"
|
|
583
|
+
],
|
|
584
|
+
"properties":{
|
|
585
|
+
"name":{
|
|
586
|
+
"type":"string",
|
|
587
|
+
"description":"Human-readable role name",
|
|
588
|
+
"minLength":1,
|
|
589
|
+
"maxLength":100
|
|
590
|
+
},
|
|
591
|
+
"value":{
|
|
592
|
+
"type":"string",
|
|
593
|
+
"description":"Role identifier (used in JWT and ACL)",
|
|
594
|
+
"pattern":"^[a-z-]+$"
|
|
595
|
+
},
|
|
596
|
+
"description":{
|
|
597
|
+
"type":"string",
|
|
598
|
+
"description":"Role description",
|
|
599
|
+
"minLength":1,
|
|
600
|
+
"maxLength":500
|
|
601
|
+
},
|
|
602
|
+
"Groups":{
|
|
603
|
+
"type":"array",
|
|
604
|
+
"description":"Azure AD groups mapped to this role",
|
|
605
|
+
"items":{
|
|
606
|
+
"type":"string",
|
|
607
|
+
"minLength":1,
|
|
608
|
+
"maxLength":100
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
},
|
|
612
|
+
"additionalProperties":false
|
|
472
613
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
614
|
+
},
|
|
615
|
+
"permissions":{
|
|
616
|
+
"type":"array",
|
|
617
|
+
"description":"Application permissions with role mappings for access control",
|
|
618
|
+
"items":{
|
|
619
|
+
"type":"object",
|
|
620
|
+
"required":[
|
|
621
|
+
"name",
|
|
622
|
+
"roles",
|
|
623
|
+
"description"
|
|
624
|
+
],
|
|
625
|
+
"properties":{
|
|
626
|
+
"name":{
|
|
627
|
+
"type":"string",
|
|
628
|
+
"description":"Permission identifier (e.g., 'documentstore:read', 'flowise:dev:access')",
|
|
629
|
+
"pattern":"^[a-z0-9-:]+$",
|
|
630
|
+
"minLength":1,
|
|
631
|
+
"maxLength":100
|
|
632
|
+
},
|
|
633
|
+
"roles":{
|
|
634
|
+
"type":"array",
|
|
635
|
+
"description":"Roles that have this permission",
|
|
636
|
+
"items":{
|
|
637
|
+
"type":"string",
|
|
638
|
+
"pattern":"^[a-z-]+$",
|
|
639
|
+
"minLength":1,
|
|
640
|
+
"maxLength":50
|
|
641
|
+
},
|
|
642
|
+
"minItems":1
|
|
643
|
+
},
|
|
644
|
+
"description":{
|
|
645
|
+
"type":"string",
|
|
646
|
+
"description":"Permission description",
|
|
647
|
+
"minLength":1,
|
|
648
|
+
"maxLength":500
|
|
481
649
|
}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
"then": {
|
|
485
|
-
"required": ["type", "enableSSO", "requiredRoles"]
|
|
486
|
-
}
|
|
650
|
+
},
|
|
651
|
+
"additionalProperties":false
|
|
487
652
|
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
},
|
|
503
|
-
"value": {
|
|
504
|
-
"type": "string",
|
|
505
|
-
"description": "Role identifier (used in JWT and ACL)",
|
|
506
|
-
"pattern": "^[a-z-]+$"
|
|
507
|
-
},
|
|
508
|
-
"description": {
|
|
509
|
-
"type": "string",
|
|
510
|
-
"description": "Role description",
|
|
511
|
-
"minLength": 1,
|
|
512
|
-
"maxLength": 500
|
|
513
|
-
},
|
|
514
|
-
"Groups": {
|
|
515
|
-
"type": "array",
|
|
516
|
-
"description": "Azure AD groups mapped to this role",
|
|
517
|
-
"items": {
|
|
518
|
-
"type": "string",
|
|
519
|
-
"minLength": 1,
|
|
520
|
-
"maxLength": 100
|
|
521
|
-
}
|
|
522
|
-
}
|
|
653
|
+
},
|
|
654
|
+
"repository":{
|
|
655
|
+
"type":"object",
|
|
656
|
+
"description":"Repository deployment configuration",
|
|
657
|
+
"properties":{
|
|
658
|
+
"enabled":{
|
|
659
|
+
"type":"boolean",
|
|
660
|
+
"description":"Whether repository deployment is enabled"
|
|
661
|
+
},
|
|
662
|
+
"repositoryUrl":{
|
|
663
|
+
"type":"string",
|
|
664
|
+
"description":"Full repository URL for pipeline validation (same as OAuth callback)",
|
|
665
|
+
"pattern":"^(https://github.com/[^/]+/[^/]+|https://gitlab.com/[^/]+/[^/]+|https://dev.azure.com/[^/]+/[^/]+/[^/]+)$"
|
|
666
|
+
}
|
|
523
667
|
},
|
|
524
|
-
"
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
"
|
|
532
|
-
"
|
|
533
|
-
"
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
"type":
|
|
546
|
-
"
|
|
547
|
-
"
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
"description": "Permission description",
|
|
555
|
-
"minLength": 1,
|
|
556
|
-
"maxLength": 500
|
|
557
|
-
}
|
|
668
|
+
"required":[
|
|
669
|
+
"enabled"
|
|
670
|
+
],
|
|
671
|
+
"additionalProperties":false
|
|
672
|
+
},
|
|
673
|
+
"startupCommand":{
|
|
674
|
+
"type":"string",
|
|
675
|
+
"description":"Application startup command (e.g., 'pnpm start', 'python app.py')",
|
|
676
|
+
"minLength":1,
|
|
677
|
+
"maxLength":200
|
|
678
|
+
},
|
|
679
|
+
"runtimeVersion":{
|
|
680
|
+
"type":"object",
|
|
681
|
+
"description":"Runtime version configuration",
|
|
682
|
+
"properties":{
|
|
683
|
+
"node":{
|
|
684
|
+
"type":"string",
|
|
685
|
+
"description":"Node.js version (e.g., '18.17.0')",
|
|
686
|
+
"pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
687
|
+
},
|
|
688
|
+
"python":{
|
|
689
|
+
"type":"string",
|
|
690
|
+
"description":"Python version (e.g., '3.11')",
|
|
691
|
+
"pattern":"^[0-9]+\\.[0-9]+$"
|
|
692
|
+
},
|
|
693
|
+
"dotnet":{
|
|
694
|
+
"type":"string",
|
|
695
|
+
"description":".NET version (e.g., '8.0')",
|
|
696
|
+
"pattern":"^[0-9]+\\.[0-9]+$"
|
|
697
|
+
}
|
|
558
698
|
},
|
|
559
|
-
"additionalProperties":
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
699
|
+
"additionalProperties":false
|
|
700
|
+
},
|
|
701
|
+
"scaling":{
|
|
702
|
+
"type":"object",
|
|
703
|
+
"description":"Application scaling configuration",
|
|
704
|
+
"properties":{
|
|
705
|
+
"minInstances":{
|
|
706
|
+
"type":"integer",
|
|
707
|
+
"description":"Minimum number of instances",
|
|
708
|
+
"minimum":1,
|
|
709
|
+
"maximum":20
|
|
710
|
+
},
|
|
711
|
+
"maxInstances":{
|
|
712
|
+
"type":"integer",
|
|
713
|
+
"description":"Maximum number of instances",
|
|
714
|
+
"minimum":1,
|
|
715
|
+
"maximum":20
|
|
716
|
+
},
|
|
717
|
+
"cpuThreshold":{
|
|
718
|
+
"type":"number",
|
|
719
|
+
"description":"CPU threshold for scaling (percentage)",
|
|
720
|
+
"minimum":10,
|
|
721
|
+
"maximum":90
|
|
722
|
+
}
|
|
569
723
|
},
|
|
570
|
-
"
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
724
|
+
"additionalProperties":false
|
|
725
|
+
},
|
|
726
|
+
"build":{
|
|
727
|
+
"type":"object",
|
|
728
|
+
"description":"Build and local development configuration",
|
|
729
|
+
"properties":{
|
|
730
|
+
"envOutputPath":{
|
|
731
|
+
"type":"string",
|
|
732
|
+
"description":"Path where .env file is copied for local development (relative to builder/)",
|
|
733
|
+
"pattern":"^[^/].*"
|
|
734
|
+
},
|
|
735
|
+
"localPort":{
|
|
736
|
+
"type":"integer",
|
|
737
|
+
"description":"Port for local development (different from Docker port)",
|
|
738
|
+
"minimum":1000,
|
|
739
|
+
"maximum":65535
|
|
740
|
+
},
|
|
741
|
+
"containerPort":{
|
|
742
|
+
"type":"integer",
|
|
743
|
+
"description":"Container internal port (defaults to port if not specified)",
|
|
744
|
+
"minimum":1,
|
|
745
|
+
"maximum":65535
|
|
746
|
+
},
|
|
747
|
+
"language":{
|
|
748
|
+
"type":"string",
|
|
749
|
+
"description":"Runtime language for template selection",
|
|
750
|
+
"enum":[
|
|
751
|
+
"typescript",
|
|
752
|
+
"python"
|
|
753
|
+
]
|
|
754
|
+
},
|
|
755
|
+
"context":{
|
|
756
|
+
"type":"string",
|
|
757
|
+
"description":"Docker build context path (relative to builder/)",
|
|
758
|
+
"pattern":"^[^/].*"
|
|
759
|
+
},
|
|
760
|
+
"dockerfile":{
|
|
761
|
+
"type":"string",
|
|
762
|
+
"description":"Dockerfile name (empty or missing = use auto-generated template)",
|
|
763
|
+
"pattern":"^[^/].*"
|
|
764
|
+
}
|
|
593
765
|
},
|
|
594
|
-
"
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
766
|
+
"additionalProperties":false
|
|
767
|
+
},
|
|
768
|
+
"deployment":{
|
|
769
|
+
"type":"object",
|
|
770
|
+
"description":"Deployment configuration for pipeline API",
|
|
771
|
+
"properties":{
|
|
772
|
+
"controllerUrl":{
|
|
773
|
+
"type":"string",
|
|
774
|
+
"description":"Controller API URL for deployment",
|
|
775
|
+
"pattern":"^https://.*$"
|
|
776
|
+
}
|
|
598
777
|
},
|
|
599
|
-
"
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
778
|
+
"additionalProperties":false
|
|
779
|
+
},
|
|
780
|
+
"externalIntegration":{
|
|
781
|
+
"type":"object",
|
|
782
|
+
"description":"Defines External Systems & External Data Sources shipped with this application. Pipeline registers these in Miso-Controller and publishes schemas to Dataplane.",
|
|
783
|
+
"required":[
|
|
784
|
+
"schemaBasePath"
|
|
785
|
+
],
|
|
786
|
+
"properties":{
|
|
787
|
+
"schemaBasePath":{
|
|
788
|
+
"type":"string",
|
|
789
|
+
"description":"Base folder path containing external-system.json and external-datasource.json files.",
|
|
790
|
+
"pattern":"^[^ ].*$"
|
|
791
|
+
},
|
|
792
|
+
"systems":{
|
|
793
|
+
"type":"array",
|
|
794
|
+
"description":"List of external-system JSON files to deploy via pipeline.",
|
|
795
|
+
"items":{
|
|
796
|
+
"type":"string",
|
|
797
|
+
"pattern":"^[^ ].+\\.json$"
|
|
798
|
+
},
|
|
799
|
+
"uniqueItems":true
|
|
800
|
+
},
|
|
801
|
+
"dataSources":{
|
|
802
|
+
"type":"array",
|
|
803
|
+
"description":"List of external-datasource JSON files belonging to this app.",
|
|
804
|
+
"items":{
|
|
805
|
+
"type":"string",
|
|
806
|
+
"pattern":"^[^ ].+\\.json$"
|
|
807
|
+
},
|
|
808
|
+
"uniqueItems":true
|
|
809
|
+
},
|
|
810
|
+
"autopublish":{
|
|
811
|
+
"type":"boolean",
|
|
812
|
+
"default":true,
|
|
813
|
+
"description":"If true, pipeline automatically publishes ExternalSystems + ExternalDataSources to Dataplane after deployment."
|
|
814
|
+
},
|
|
815
|
+
"version":{
|
|
816
|
+
"type":"string",
|
|
817
|
+
"description":"Version of the integration set (used for schema diffing & migrations).",
|
|
818
|
+
"pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
819
|
+
}
|
|
616
820
|
},
|
|
617
|
-
"
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
821
|
+
"additionalProperties":false
|
|
822
|
+
}
|
|
823
|
+
},
|
|
824
|
+
"additionalProperties":false,
|
|
825
|
+
"allOf":[
|
|
826
|
+
{
|
|
827
|
+
"if":{
|
|
828
|
+
"properties":{
|
|
829
|
+
"requiresDatabase":{
|
|
830
|
+
"const":true
|
|
831
|
+
}
|
|
832
|
+
}
|
|
622
833
|
},
|
|
623
|
-
"
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
"maximum": 90
|
|
834
|
+
"then":{
|
|
835
|
+
"required":[
|
|
836
|
+
"databases"
|
|
837
|
+
]
|
|
628
838
|
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
"type": "string",
|
|
638
|
-
"description": "Path where .env file is copied for local development (relative to builder/)",
|
|
639
|
-
"pattern": "^[^/].*"
|
|
640
|
-
},
|
|
641
|
-
"localPort": {
|
|
642
|
-
"type": "integer",
|
|
643
|
-
"description": "Port for local development (different from Docker port)",
|
|
644
|
-
"minimum": 1000,
|
|
645
|
-
"maximum": 65535
|
|
646
|
-
},
|
|
647
|
-
"containerPort": {
|
|
648
|
-
"type": "integer",
|
|
649
|
-
"description": "Container internal port (defaults to port if not specified)",
|
|
650
|
-
"minimum": 1,
|
|
651
|
-
"maximum": 65535
|
|
652
|
-
},
|
|
653
|
-
"language": {
|
|
654
|
-
"type": "string",
|
|
655
|
-
"description": "Runtime language for template selection",
|
|
656
|
-
"enum": ["typescript", "python"]
|
|
657
|
-
},
|
|
658
|
-
"context": {
|
|
659
|
-
"type": "string",
|
|
660
|
-
"description": "Docker build context path (relative to builder/)",
|
|
661
|
-
"pattern": "^[^/].*"
|
|
839
|
+
},
|
|
840
|
+
{
|
|
841
|
+
"if":{
|
|
842
|
+
"properties":{
|
|
843
|
+
"registryMode":{
|
|
844
|
+
"const":"external"
|
|
845
|
+
}
|
|
846
|
+
}
|
|
662
847
|
},
|
|
663
|
-
"
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
"description": "Controller API URL for deployment",
|
|
678
|
-
"pattern": "^https://.*$"
|
|
679
|
-
}
|
|
680
|
-
},
|
|
681
|
-
"additionalProperties": false
|
|
682
|
-
}
|
|
683
|
-
},
|
|
684
|
-
"additionalProperties": false,
|
|
685
|
-
"allOf": [
|
|
686
|
-
{
|
|
687
|
-
"if": {
|
|
688
|
-
"properties": {
|
|
689
|
-
"requiresDatabase": {
|
|
690
|
-
"const": true
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
},
|
|
694
|
-
"then": {
|
|
695
|
-
"required": ["databases"]
|
|
696
|
-
}
|
|
697
|
-
},
|
|
698
|
-
{
|
|
699
|
-
"if": {
|
|
700
|
-
"properties": {
|
|
701
|
-
"registryMode": {
|
|
702
|
-
"const": "external"
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
},
|
|
706
|
-
"then": {
|
|
707
|
-
"properties": {
|
|
708
|
-
"configuration": {
|
|
709
|
-
"items": {
|
|
710
|
-
"properties": {
|
|
711
|
-
"name": {
|
|
712
|
-
"enum": [
|
|
713
|
-
"DOCKER_REGISTRY_SERVER_URL",
|
|
714
|
-
"DOCKER_REGISTRY_SERVER_USERNAME",
|
|
715
|
-
"DOCKER_REGISTRY_SERVER_PASSWORD"
|
|
716
|
-
]
|
|
717
|
-
}
|
|
848
|
+
"then":{
|
|
849
|
+
"properties":{
|
|
850
|
+
"configuration":{
|
|
851
|
+
"items":{
|
|
852
|
+
"properties":{
|
|
853
|
+
"name":{
|
|
854
|
+
"enum":[
|
|
855
|
+
"DOCKER_REGISTRY_SERVER_URL",
|
|
856
|
+
"DOCKER_REGISTRY_SERVER_USERNAME",
|
|
857
|
+
"DOCKER_REGISTRY_SERVER_PASSWORD"
|
|
858
|
+
]
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
718
862
|
}
|
|
719
|
-
|
|
720
|
-
}
|
|
863
|
+
}
|
|
721
864
|
}
|
|
722
|
-
|
|
723
|
-
}
|
|
865
|
+
}
|
|
724
866
|
]
|
|
725
|
-
}
|
|
867
|
+
}
|