OpenAPI Specification
swagger: '2.0'
info:
description: XMS is the controller of distributed storage system
version: SDS_4.2.000.0.200302
title: XMS access-paths pools API
contact: {}
license:
name: Commercial
basePath: /v1
tags:
- name: pools
description: 'PoolController Operations about Pools
'
paths:
/pools/:
get:
tags:
- pools
description: List pools
operationId: ListPools
consumes:
- application/json
produces:
- application/json
parameters:
- name: limit
in: query
description: paging param
required: false
type: integer
format: int64
x-exportParamName: Limit
- name: offset
in: query
description: paging param
required: false
type: integer
format: int64
x-exportParamName: Offset
- name: all
in: query
description: show all pools
required: false
type: boolean
x-exportParamName: All
- name: protection_domain_id
in: query
description: protection domain id
required: false
type: integer
format: int64
x-exportParamName: ProtectionDomainId
- name: compound_osd_only
in: query
description: filter pool with only compound osds
required: false
type: boolean
x-exportParamName: CompoundOsdOnly
- name: osd_group_id
in: query
description: osd group id
required: false
type: integer
format: int64
x-exportParamName: OsdGroupId
- name: pool_type
in: query
description: filter pool by type
required: false
type: string
x-exportParamName: PoolType
- name: pool_role
in: query
description: filter pool by role
required: false
type: string
x-exportParamName: PoolRole
- name: pool_mode
in: query
description: filter pool by pool_mode
required: false
type: string
x-exportParamName: PoolMode
- name: stretched
in: query
description: filter stretched pool
required: false
type: boolean
x-exportParamName: Stretched
- name: with_compound
in: query
description: with compound pool
required: false
type: boolean
x-exportParamName: WithCompound
- name: os_policy_id
in: query
description: filter data pool by object storage policy id
required: false
type: integer
format: int64
x-exportParamName: OsPolicyId
- name: storage_class_id
in: query
description: filter data pool by os storage class id
required: false
type: integer
format: int64
x-exportParamName: StorageClassId
- name: storage_class_pool_type
in: query
description: storage class pool type(active inactive) to query
required: false
type: string
x-exportParamName: StorageClassPoolType
- name: q
in: query
description: query param of search
required: false
type: string
x-exportParamName: Q
- name: sort
in: query
description: sort param of search
required: false
type: string
x-exportParamName: Sort
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolsResp'
400:
description: BadRequest
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
post:
tags:
- pools
description: Create pool
operationId: CreatePool
consumes:
- application/json
produces:
- application/json
parameters:
- in: body
name: body
description: the pool info
required: true
schema:
$ref: '#/definitions/PoolCreateReq'
x-exportParamName: Body
responses:
202:
description: Accepted
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}:
get:
tags:
- pools
description: get pool
operationId: GetPool
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
500:
description: InternalServerError
security:
- tokenInHeader: []
- tokenInQuery: []
delete:
tags:
- pools
description: Delete pool
operationId: DeletePool
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
- name: force
in: query
description: force delete or not
required: false
type: boolean
x-exportParamName: Force
responses:
202:
description: Accepted
schema:
$ref: '#/definitions/PoolResp'
404:
description: NotFound
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
patch:
tags:
- pools
description: update pool info
operationId: UpdatePool
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
- in: body
name: body
description: pool info
required: true
schema:
$ref: '#/definitions/PoolUpdateReq'
x-exportParamName: Body
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
409:
description: Conflict
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}/osds:
put:
tags:
- pools
description: Add osds to pool
operationId: AddOsdsToPool
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
- in: body
name: body
description: osd infos
required: true
schema:
$ref: '#/definitions/OsdsAddReq'
x-exportParamName: Body
responses:
202:
description: Accepted
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
delete:
tags:
- pools
description: Remove multiple osds from a pool
operationId: RemoveOsdsFromPool
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
- in: body
name: body
description: osd infos
required: true
schema:
$ref: '#/definitions/OsdsRemoveReq'
x-exportParamName: Body
responses:
202:
description: Accepted
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
409:
description: Conflict
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}/predictions:
get:
tags:
- pools
description: get a pool's prediction
operationId: GetPoolPredictions
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolPredictionsResp'
404:
description: NotFound
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}/samples:
get:
tags:
- pools
description: get pool's samples
operationId: GetPoolSamples
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
- name: duration_begin
in: query
description: duration begin timestamp
required: false
type: string
x-exportParamName: DurationBegin
- name: duration_end
in: query
description: duration end timestamp
required: false
type: string
x-exportParamName: DurationEnd
- name: period
in: query
description: samples period
required: false
type: string
x-exportParamName: Period
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolSamplesResp'
400:
description: BadRequest
404:
description: NotFound
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}/topology:
get:
tags:
- pools
description: get pool topology
operationId: GetPoolTopology
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolTopologyResp'
400:
description: BadRequest
404:
description: NotFound
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}:disable-device-type-check:
post:
tags:
- pools
description: Disable device type check when add osd
operationId: DisableDeviceTypeCheck
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
409:
description: Conflict
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}:enable-device-type-check:
post:
tags:
- pools
description: Enable device type check when add osd
operationId: EnableDeviceTypeCheck
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
409:
description: Conflict
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}:reweight:
post:
tags:
- pools
description: Reweight a pool
operationId: ReweightPool
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
409:
description: Conflict
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
/pools/{pool_id}:switch-role:
post:
tags:
- pools
description: Switch pool role to compound
operationId: SwitchPoolRole
consumes:
- application/json
produces:
- application/json
parameters:
- name: pool_id
in: path
description: pool id
required: true
type: integer
format: int64
x-exportParamName: PoolId
responses:
200:
description: OK
schema:
$ref: '#/definitions/PoolResp'
202:
description: Accepted
schema:
$ref: '#/definitions/PoolResp'
400:
description: BadRequest
404:
description: NotFound
409:
description: Conflict
500:
description: InternalServerError
security:
- tokenInQuery: []
- tokenInHeader: []
definitions:
PoolTopologyResp:
type: object
required:
- pool_topology
properties:
pool_topology:
description: pool topology
$ref: '#/definitions/PoolPlacementNode'
title: PoolTopologyResp
example:
pool_topology:
children:
- null
- null
create: '2000-01-23T04:56:07.000+00:00'
replicate_num: 1
update: '2000-01-23T04:56:07.000+00:00'
id: 0
placement_node:
parent: null
name: name
create: '2000-01-23T04:56:07.000+00:00'
update: '2000-01-23T04:56:07.000+00:00'
id: 6
type: type
properties:
is_witness: true
status: status
PoolUpdateReq_Pool:
type: object
properties:
default_managed_volume_format:
type: integer
format: int64
description: 'default managed volume format: 128 or 129'
failure_domain_type:
type: string
io_bypass_enabled:
type: boolean
io_bypass_threshold:
type: integer
format: int64
name:
type: string
primary_placement_node_id:
type: integer
format: int64
property:
type: object
additionalProperties:
$ref: '#/definitions/RawMessage'
qos:
$ref: '#/definitions/OsdQos'
ruleset:
type: array
items:
$ref: '#/definitions/PoolRuleReq'
size:
type: integer
format: int64
title: PoolUpdateReq_Pool
example:
failure_domain_type: failure_domain_type
io_bypass_enabled: true
qos:
mode: 5
bandwidth: 0
bandwidth_max: 6
id: 5
client_threshold: 1
recovery_rate_type: recovery_rate_type
size: 5
name: name
property:
key: ''
ruleset:
- placement_node_id: 2
replicate_num: 7
- placement_node_id: 2
replicate_num: 7
primary_placement_node_id: 1
default_managed_volume_format: 0
io_bypass_threshold: 6
PoolRecord:
title: PoolRecord
allOf:
- $ref: '#/definitions/Pool'
- properties:
samples:
type: array
items:
$ref: '#/definitions/PoolStat'
description: PoolRecord is used to combine Pool and PoolStat to let API comfortable
OsdsRemoveReq:
type: object
required:
- osd_ids
properties:
osd_ids:
type: array
items:
type: integer
format: int64
title: OsdsRemoveReq
example:
osd_ids:
- 0
- 0
PoolSamplesResp:
type: object
required:
- pool_samples
properties:
pool_samples:
type: array
description: pool samples
items:
$ref: '#/definitions/PoolStat'
title: PoolSamplesResp
example:
pool_samples:
- healthy_percent: 9.301444243932576
error_kbyte: 2
recovery_percent: 1.1730742509559433
total_bandwidth_kbyte: 4.965218492984954
read_latency_us: 1.0246457001441578
data_kbyte: 1
read_bandwidth_kbyte: 7.386281948385884
healthy_num: 7
recovery_iops: 6.84685269835264
omap_total_kbyte: 3.616076749251911
degraded_num: 5
create: '2000-01-23T04:56:07.000+00:00'
recovery_bandwidth_kbyte: 1.4894159098541704
write_iops: 3.5571952270680973
total_kbyte: 9
degraded_percent: 5.637376656633329
unavailable_num: 9
write_latency_us: 6.965117697638846
total_iops: 5.025004791520295
unavailable_percent: 6.683562403749608
read_iops: 1.2315135367772556
actual_kbyte: 0
omap_used_kbyte: 2.027123023002322
omap_used_percent: 4.145608029883936
used_kbyte: 8
write_bandwidth_kbyte: 6.438423552598547
creating_num: 6
used_percent: 9.018348186070783
recovery_num: 7
- healthy_percent: 9.301444243932576
error_kbyte: 2
recovery_percent: 1.1730742509559433
total_bandwidth_kbyte: 4.965218492984954
read_latency_us: 1.0246457001441578
data_kbyte: 1
read_bandwidth_kbyte: 7.386281948385884
healthy_num: 7
recovery_iops: 6.84685269835264
omap_total_kbyte: 3.616076749251911
degraded_num: 5
create: '2000-01-23T04:56:07.000+00:00'
recovery_bandwidth_kbyte: 1.4894159098541704
write_iops: 3.5571952270680973
total_kbyte: 9
degraded_percent: 5.637376656633329
unavailable_num: 9
write_latency_us: 6.965117697638846
total_iops: 5.025004791520295
unavailable_percent: 6.683562403749608
read_iops: 1.2315135367772556
actual_kbyte: 0
omap_used_kbyte: 2.027123023002322
omap_used_percent: 4.145608029883936
used_kbyte: 8
write_bandwidth_kbyte: 6.438423552598547
creating_num: 6
used_percent: 9.018348186070783
recovery_num: 7
PlacementNode:
type: object
properties:
create:
type: string
format: date-time
description: time of creating placement node
id:
type: integer
format: int64
description: id of placement node
name:
type: string
description: name of placement node
parent:
description: parent of placement node
$ref: '#/definitions/PlacementNode'
properties:
description: properties for this placement node like is_witness
$ref: '#/definitions/PlacementNodeProperties'
type:
type: string
description: type of placement node
update:
type: string
format: date-time
description: time of updating placement node
title: PlacementNode
description: PlacementNode defines a placement node managing a range of hosts
example:
parent: null
name: name
create: '2000-01-23T04:56:07.000+00:00'
update: '2000-01-23T04:56:07.000+00:00'
id: 6
type: type
properties:
is_witness: true
PoolRuleReq:
type: object
properties:
placement_node_id:
type: integer
format: int64
replicate_num:
type: integer
format: int64
title: PoolRuleReq
example:
placement_node_id: 2
replicate_num: 7
RawMessage:
type: array
description: 'RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler
and can be used to delay JSON decoding or precompute a JSON encoding.'
items:
type: string
format: byte
pattern: ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
ProtectionDomain_Nestview:
type: object
properties:
id:
type: integer
format: int64
description: id of protection domain
name:
type: string
description: name of protection domain
title: ProtectionDomain_Nestview
example:
name: name
id: 5
PredictionPoint:
type: object
properties:
create:
type: string
format: date-time
used_kbyte:
type: integer
format: int64
title: PredictionPoint
description: PredictionPoint is a point in a prediction graph
example:
used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
PoolsResp:
type: object
required:
- pools
properties:
pools:
type: array
description: pools
items:
$ref: '#/definitions/PoolRecord'
title: PoolsResp
example:
pools:
- ''
- ''
PlacementNodeProperties:
type: object
properties:
is_witness:
type: boolean
description: whether this is a witness node
title: PlacementNodeProperties
description: PlacementNodeProperties contains properties for a placement node.
example:
is_witness: true
PoolPredictionsResp:
type: object
required:
- pool_predictions
properties:
pool_predictions:
type: array
description: pool predictions
items:
$ref: '#/definitions/PoolPrediction'
title: PoolPredictionsResp
example:
pool_predictions:
- used_kbyte_30days: 2
data_kbyte_1day: 0
used_kbyte_7days: 7
used_kbyte_points:
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
data_kbyte_7days: 1
used_kbyte_1day: 5
create: '2000-01-23T04:56:07.000+00:00'
data_kbyte_points:
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
id: 5
data_kbyte_30days: 6
- used_kbyte_30days: 2
data_kbyte_1day: 0
used_kbyte_7days: 7
used_kbyte_points:
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
data_kbyte_7days: 1
used_kbyte_1day: 5
create: '2000-01-23T04:56:07.000+00:00'
data_kbyte_points:
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
- used_kbyte: 5
create: '2000-01-23T04:56:07.000+00:00'
id: 5
data_kbyte_30days: 6
PoolUpdateReq:
type: object
required:
- pool
properties:
pool:
$ref: '#/definitions/PoolUpdateReq_Pool'
title: PoolUpdateReq
example:
pool:
failure_domain_type: failure_domain_type
io_bypass_enabled: true
qos:
mode: 5
bandwidth: 0
bandwidth_max: 6
id: 5
client_threshold: 1
recovery_rate_type: recovery_rate_type
size: 5
name: name
property:
key: ''
ruleset:
- placement_node_id: 2
replicate_num: 7
- placement_node_id: 2
replicate_num: 7
primary_placement_node_id: 1
default_managed_volume_format: 0
io_bypass_threshold: 6
PoolResp:
type: object
required:
- pool
properties:
pool:
description: pool
$ref: '#/definitions/PoolRecord'
title: PoolResp
example:
pool: ''
OsdQos:
type: object
properties:
bandwidth:
type: integer
format: int64
bandwidth_max:
type: integer
format: int64
client_threshold:
type: integer
format: int64
id:
type: integer
format: int64
mode:
type: integer
format: int64
recovery_rate_type:
type: string
title: OsdQos
description: OsdQos defines qos for osd
example:
mode: 5
bandwidth: 0
bandwidth_max: 6
id: 5
client_threshold: 1
recovery_rate_type: recovery_rate_type
OsdsAddReq:
type: object
required:
- osd_ids
properties:
osd_ids:
type: array
items:
type: integer
format: int64
title: OsdsAddReq
example:
osd_ids:
- 0
- 0
Pool:
type: object
properties:
action_status:
type: string
block_volume_num:
type: integer
format: int64
coding_chunk_num:
type: integer
format: int64
create:
type: string
format: date-time
data_chunk_num:
type: integer
format: int64
default_managed_volume_format:
type: integer
format: int64
device_type:
type: string
device_type_check_disabled:
type: boolean
failure_domain_type:
type: string
hidden:
type: boolean
id:
type: integer
format: int64
io_bypass_enabled:
type: boolean
io_bypass_threshold:
type: integer
format: int64
name:
type: string
osd_group:
$ref: '#/definitions/OsdGroup_Nestview'
osd_num:
type: integer
format: int64
pool_id:
type: integer
format: int32
pool_mode:
type: string
pool_name:
type: string
pool_role:
type: string
pool_type:
type: string
primary_placement_node:
description: placement node with the primary replica
$ref: '#/definitions/PlacementNode_Nestview'
property:
type: object
protection_domain:
$ref: '#/definitions/ProtectionDomain_Nestview'
qos:
$ref: '#/definitions/OsdQos'
replicate_size:
type: integer
format: int64
status:
type: string
stretched:
type: boolean
update:
type: string
format: date-time
title: Pool
description: 'A Pool is a set of temporary objects that may be individually saved and
retrieved.
Any item stored in the Pool may be removed automatically at any time without
notification. If the Pool holds the only reference when this happens, the item
might be deallocated.
A Pool is safe for use by multiple goroutines simultaneously.
Pool''s purpose is to cache allocated but unused items for later reuse, relieving
pressure on the garbage collector. That is, it makes it easy to build efficient,
thread-safe free lists. However, it is not suitable for all free lists.
An appropriate use of a Pool is to manage a group of temporary items silently
shared among and potentially reused by concurrent independent clients of a
package. Pool provides a way to amortize allocation overhead across many
clients.
An example of good use of a Pool is in the fmt package, which maintains a
dynamically-sized store of temporary output buffers. The store scales under load
(when many goroutines are actively printing) and shrinks when quiescent.
On the other hand, a free list maintained as part of a short-lived object is not
a suitable use for a Pool, since the overhead does not amortize well in that
scenario. It is more efficient to have such objects implement their own free
list.
A Pool must not be copied after first use.'
PoolCreateReq_Pool:
type: object
properties:
coding_chunk_num:
type: integer
format: int64
data_chunk_num:
type: integer
format: int64
failure_domain_type:
type: string
name:
type: string
osd_ids:
type: array
items:
type: integer
format: int64
pool_role:
type: string
pool_type:
type: string
primary_placement_node_id:
type: integer
format: int64
protection_domain_id:
type: integer
format: int64
ruleset:
type: array
items:
$ref: '#/definitions/PoolRuleReq'
shared_pool_id:
type: integer
format: int64
size:
type: integer
format: int64
stretched:
type: boolean
title: PoolCreateReq_Pool
example:
data_chunk_num: 6
failure_domain_type: failure_domain_type
osd_ids:
- 1
- 1
ruleset:
- placement_node_id: 2
replicate_num: 7
- placement_node_id: 2
replicate_num: 7
coding_chunk_num: 0
primary_placement_node_id: 5
protection_domain_id: 5
stretched: true
size: 3
name: name
pool_role: pool_role
pool_type: pool_type
shared_pool_id: 9
PlacementNode_Nestview:
type: object
properties:
id:
type: integer
format: int64
description: id of placement node
parent:
$ref: '#/definitions/PlacementNode_Nestview_parent'
title: PlacementNode_Nestview
PoolPlacementNode:
type: object
properties:
children:
type: array
items:
$ref: '#/definitions/PoolPlacementNode'
create:
type: string
format: date-time
id:
type: integer
format: int64
placement_node:
$ref: '#/definitions/PlacementNode'
replicate_num:
type: integer
format: int64
status:
type: string
update:
type: string
format: date-time
title: PoolPlacementNode
description: PoolPlacementNode defines a shadow placement node in a pool
example:
children:
- null
- null
create: '2000-01-23T04:56:07.000+00:00'
replicate_num: 1
update: '2000-01-23T04:56:07.000+00:00'
id: 0
placement_node:
parent: null
name: name
create: '2000-01-23T04:56:07.000+00:00'
update: '2000-01-23T04:56:07.000+00:00'
id: 6
type: type
properties:
is_witness: true
status: status
PoolCreateReq:
type: object
properties:
pool:
$ref: '#/definitions/PoolCreateReq_Pool'
title: PoolCreateReq
example:
pool:
data_chunk_num: 6
failure_domain_type: failure_domain_type
osd_ids:
- 1
- 1
ruleset:
- placement_node_id: 2
replicate_num: 7
- placement_node_id: 2
replicate_num: 7
coding_chunk_num: 0
primary_placement_node_id: 5
protection_domain_id: 5
stretched: true
size: 3
name: name
pool_role: pool_role
pool_type: pool_type
shared_pool_id: 9
PoolStat:
type: object
properties:
actual_kbyte:
type: integer
format: int64
create:
type: string
format: date-time
creating_num:
type: integer
format: int64
data_kbyte:
type: integer
format: int64
degraded_num:
type: in
# --- truncated at 32 KB (37 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/xsky/refs/heads/main/openapi/xsky-pools-api-openapi.yml