v0.5.0: 3 стенда — изоляция состояния, WSGI middleware, OpenAPI server selector, POLYGON_STANDS env

- loader.py: STANDS dict, get_services/get_ops_index per stand, POLYGON_STANDS env
- mock_state.py: get_state(stand_id) — ленивая инициализация
- app.py: StandMiddleware — перезапись PATH_INFO до Flask-роутинга
- Все роуты: LocalProxy(state), LocalProxy(SERVICES/OPS_INDEX) через g.stand_id
- openapi.py: _build_servers() — по одному серверу на стенд
- services/stand{1,2,3}/ — 37 YAML на стенд из STANDS/dev и STANDS/test
- tests/test_api.py: +4 multi-stand теста (изоляция, fail-next, OpenAPI servers)
- Обратная совместимость: /api/v1/svc/... → стенд по умолчанию
This commit is contained in:
2026-08-01 20:10:19 +04:00
parent 11f98738d0
commit 58d54f2a95
122 changed files with 25223 additions and 76 deletions
+314
View File
@@ -0,0 +1,314 @@
name: dummy
service_id: 1
service_display_name: Болванка
service_short_name: dummy
service_man: '## Болванка для тестов.<br/><br/>А это просто много букв, чтобы посмотреть, как ведет себя текст при переполнении контейнера. <br/><br/><br/>``` json<br/>{<br/> "iamServiceUrl": "https://auth-api-test.ngcloud.ru/api/v1/user",<br/> "idpResponse":
{<br/> "prefix": {<br/> "charset": "",<br/> "status_text": "Request Time-out",<br/> "text": true,<br/> "errordetail": "",<br/> "filecontent":
"Connection Timeout",<br/> "responseheader": {},<br/> "header": "",<br/> "statuscode": "408 Request Time-out",<br/> "status_code": 408,<br/> "mimetype":
"Unable to determine MIME type of file."<br/> }<br/> }<br/>}<br/>```'
lifecycle:
suspendOnDestroyDefault: true
adoptExistingOnCreateDefault: false
operations:
- svcOperationId: 18
operation: create
kind: instance
action: create
- svcOperationId: 71
operation: delete
kind: instance
action: delete
- svcOperationId: 92
operation: modify
kind: instance
action: modify
- svcOperationId: 257
operation: reconcile
kind: action
action: reconcile
- svcOperationId: 240
operation: redeploy
kind: action
action: redeploy
- svcOperationId: 94
operation: resume
kind: instance
action: resume
- svcOperationId: 93
operation: suspend
kind: instance
action: suspend
stateOut: {}
cfsParams:
- svcOperationCfsParamId: 198
svcOperationCfsParam: durationMs
dataType: integer >= 0
isRequired: true
defaultValue: '0'
isModifiable: true
- svcOperationCfsParamId: 199
svcOperationCfsParam: failAtStart
dataType: boolean
isRequired: true
defaultValue: 'false'
isModifiable: true
valueList:
- 'false'
- 'true'
- svcOperationCfsParamId: 200
svcOperationCfsParam: failInProgress
dataType: boolean
isRequired: true
defaultValue: 'false'
isModifiable: true
valueList:
- 'false'
- 'true'
- svcOperationCfsParamId: 201
svcOperationCfsParam: whereFail
dataType: integer > 0
isRequired: false
defaultValue: '1'
isModifiable: true
valueList:
- '1'
- '2'
- '3'
- svcOperationCfsParamId: 242
svcOperationCfsParam: resourceRealm
dataType: string
isRequired: true
defaultValue: dummy
isModifiable: false
valueList:
- dummy
- svcOperationCfsParamId: 286
svcOperationCfsParam: bodymessage
dataType: string
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 321
svcOperationCfsParam: mapExample
dataType: map
isRequired: false
defaultValue: ''
isModifiable: true
dataDescriptor:
subparam1:
dataType: string
defaultValue: ''
isRequired: false
isModifiable: false
secret:
dataType: string
defaultValue: ''
isRequired: false
isModifiable: false
subparam2:
dataType: string
defaultValue: ''
isRequired: false
isModifiable: false
- svcOperationCfsParamId: 322
svcOperationCfsParam: jsonExample
dataType: json
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 396
svcOperationCfsParam: nestedRefExample
dataType: string
isRequired: false
defaultValue: ''
isModifiable: false
- svcOperationCfsParamId: 647
svcOperationCfsParam: mapFixed
dataType: map-fixed
isRequired: false
defaultValue: ''
isModifiable: false
dataDescriptor:
bol1:
dataType: boolean
defaultValue: 'false'
isRequired: true
isModifiable: false
valueList:
- 'false'
- 'true'
minStr1:
dataType: string
defaultValue: abracadabra
isRequired: true
isModifiable: false
valueList:
- abracadabra
param1:
dataType: integer > 0
defaultValue: '1'
isRequired: true
isModifiable: false
param2:
dataType: string
defaultValue: '1'
isRequired: true
isModifiable: false
valueList:
- '["1"'
- '"2"'
- '"3"]'
param3:
dataType: integer > 0
defaultValue: '1'
isRequired: true
isModifiable: false
- svcOperationCfsParamId: 654
svcOperationCfsParam: arrayMapFixedExample
dataType: array-map-fixed
isRequired: false
defaultValue: ''
isModifiable: false
dataDescriptor:
bol1:
dataType: boolean
defaultValue: ''
isRequired: true
isModifiable: false
valueList:
- 'false'
- 'true'
minStr1:
dataType: string
defaultValue: ''
isRequired: true
isModifiable: false
valueList:
- abracadabra
param1:
dataType: integer > 0
defaultValue: ''
isRequired: true
isModifiable: false
param2:
dataType: string
defaultValue: ''
isRequired: true
isModifiable: false
valueList:
- '["1"'
- '"2"'
- '"3"]'
param3:
dataType: integer > 0
defaultValue: '1'
isRequired: true
isModifiable: false
- svcOperationCfsParamId: 863
svcOperationCfsParam: arr
dataType: array
isRequired: true
defaultValue: ''
isModifiable: false
valueList:
- test
- '2'
- val1
- svcOperationCfsParamId: 287
svcOperationCfsParam: durationMs
dataType: integer >= 0
isRequired: true
defaultValue: '0'
isModifiable: true
- svcOperationCfsParamId: 288
svcOperationCfsParam: failAtStart
dataType: boolean
isRequired: true
defaultValue: 'false'
isModifiable: true
valueList:
- 'false'
- 'true'
- svcOperationCfsParamId: 289
svcOperationCfsParam: failInProgress
dataType: boolean
isRequired: true
defaultValue: 'false'
isModifiable: true
valueList:
- 'false'
- 'true'
- svcOperationCfsParamId: 290
svcOperationCfsParam: whereFail
dataType: integer > 0
isRequired: false
defaultValue: ''
isModifiable: true
valueList:
- '1'
- '2'
- '3'
- svcOperationCfsParamId: 291
svcOperationCfsParam: bodymessage
dataType: string
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 373
svcOperationCfsParam: mapExample
dataType: map
isRequired: false
defaultValue: '{}'
isModifiable: true
dataDescriptor:
secret:
dataType: string
defaultValue: ''
isRequired: true
isModifiable: false
- svcOperationCfsParamId: 374
svcOperationCfsParam: jsonExample
dataType: string
isRequired: false
defaultValue: ''
isModifiable: true
cfsParamsByOp:
18:
- 198
- 199
- 200
- 201
- 242
- 286
- 321
- 322
- 396
- 647
- 654
- 863
71: []
92:
- 287
- 288
- 289
- 290
- 291
- 373
- 374
257: []
240: []
94: []
93: []
stateParams:
durationMs: '0'
failAtStart: 'false'
failInProgress: 'false'
whereFail: '1'
resourceRealm: dummy
bodymessage: ''
mapExample: '{"subparam1": "", "secret": "", "subparam2": ""}'
jsonExample: ''
nestedRefExample: ''
mapFixed: '{"bol1": false, "minStr1": "abracadabra", "param1": 1, "param2": "1", "param3": 1}'
arrayMapFixedExample: '{"bol1": false, "minStr1": "", "param1": 0, "param2": "", "param3": 1}'
arr: ''