Complete conversion to API client
This commit is contained in:
parent
d2f27cc8fe
commit
d2af6f4508
|
@ -25,6 +25,7 @@ import click
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
import math
|
import math
|
||||||
|
import requests
|
||||||
|
|
||||||
import cli_lib.ansiprint as ansiprint
|
import cli_lib.ansiprint as ansiprint
|
||||||
|
|
||||||
|
@ -32,6 +33,18 @@ import cli_lib.ansiprint as ansiprint
|
||||||
# Supplemental functions
|
# Supplemental functions
|
||||||
#
|
#
|
||||||
|
|
||||||
|
def get_request_uri(config, endpoint):
|
||||||
|
"""
|
||||||
|
Return the fully-formed URI for {endpoint}
|
||||||
|
"""
|
||||||
|
uri = '{}://{}{}{}'.format(
|
||||||
|
config['api_scheme'],
|
||||||
|
config['api_host'],
|
||||||
|
config['api_prefix'],
|
||||||
|
endpoint
|
||||||
|
)
|
||||||
|
return uri
|
||||||
|
|
||||||
# Format byte sizes to/from human-readable units
|
# Format byte sizes to/from human-readable units
|
||||||
byte_unit_matrix = {
|
byte_unit_matrix = {
|
||||||
'B': 1,
|
'B': 1,
|
||||||
|
@ -99,6 +112,52 @@ def format_pct_tohuman(datapct):
|
||||||
#
|
#
|
||||||
# Status functions
|
# Status functions
|
||||||
#
|
#
|
||||||
|
def ceph_status(config):
|
||||||
|
"""
|
||||||
|
Get status of the Ceph cluster
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/status
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/status')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_util(config):
|
||||||
|
"""
|
||||||
|
Get utilization of the Ceph cluster
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/utilization
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/utilization')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
def format_raw_output(status_data):
|
def format_raw_output(status_data):
|
||||||
click.echo('{bold}Ceph cluster {stype} (primary node {end}{blue}{primary}{end}{bold}){end}\n'.format(bold=ansiprint.bold(), end=ansiprint.end(), blue=ansiprint.blue(), stype=status_data['type'], primary=status_data['primary_node']))
|
click.echo('{bold}Ceph cluster {stype} (primary node {end}{blue}{primary}{end}{bold}){end}\n'.format(bold=ansiprint.bold(), end=ansiprint.end(), blue=ansiprint.blue(), stype=status_data['type'], primary=status_data['primary_node']))
|
||||||
click.echo(status_data['ceph_data'])
|
click.echo(status_data['ceph_data'])
|
||||||
|
@ -107,6 +166,172 @@ def format_raw_output(status_data):
|
||||||
#
|
#
|
||||||
# OSD functions
|
# OSD functions
|
||||||
#
|
#
|
||||||
|
def ceph_osd_info(config, osd):
|
||||||
|
"""
|
||||||
|
Get information about Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/osd/{osd}
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/osd/{osd}'.format(osd=osd))
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_osd_list(config, limit):
|
||||||
|
"""
|
||||||
|
Get list information about Ceph OSDs (limited by {limit})
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/osd
|
||||||
|
API arguments: limit={limit}
|
||||||
|
API schema: [{json_data_object},{json_data_object},etc.]
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
if limit:
|
||||||
|
params['limit'] = limit
|
||||||
|
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/osd')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri,
|
||||||
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_osd_add(config, node, device, weight):
|
||||||
|
"""
|
||||||
|
Add new Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/osd
|
||||||
|
API arguments: node={node}, device={device}, weight={weight}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/osd')
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'node': node,
|
||||||
|
'device': device,
|
||||||
|
'weight': weight
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_osd_remove(config, osdid):
|
||||||
|
"""
|
||||||
|
Remove Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/osd/{osdid}
|
||||||
|
API arguments:
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/osd/{osdid}'.format(osdid=osdid))
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'yes-i-really-mean-it': 'yes'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: DELETE {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_osd_state(config, osdid, state):
|
||||||
|
"""
|
||||||
|
Set state of Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/osd/{osdid}/state
|
||||||
|
API arguments: state={state}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/osd/{osdid}/state'.format(osdid=osdid))
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'state': state
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_osd_option(config, option, action):
|
||||||
|
"""
|
||||||
|
Set cluster option of Ceph OSDs
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/option
|
||||||
|
API arguments: option={option}, action={action}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/option')
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'option': option,
|
||||||
|
'action': action
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
def getOutputColoursOSD(osd_information):
|
def getOutputColoursOSD(osd_information):
|
||||||
# Set the UP status
|
# Set the UP status
|
||||||
if osd_information['stats']['up'] == 1:
|
if osd_information['stats']['up'] == 1:
|
||||||
|
@ -127,6 +352,13 @@ def getOutputColoursOSD(osd_information):
|
||||||
return osd_up_flag, osd_up_colour, osd_in_flag, osd_in_colour
|
return osd_up_flag, osd_up_colour, osd_in_flag, osd_in_colour
|
||||||
|
|
||||||
def format_list_osd(osd_list):
|
def format_list_osd(osd_list):
|
||||||
|
# Handle empty list
|
||||||
|
if not osd_list:
|
||||||
|
osd_list = list()
|
||||||
|
# Handle single-item list
|
||||||
|
if isinstance(osd_list, dict):
|
||||||
|
osd_list = [ osd_list ]
|
||||||
|
|
||||||
osd_list_output = []
|
osd_list_output = []
|
||||||
|
|
||||||
osd_id_length = 3
|
osd_id_length = 3
|
||||||
|
@ -363,7 +595,123 @@ Wr: {osd_wrops: <{osd_wrops_length}} \
|
||||||
#
|
#
|
||||||
# Pool functions
|
# Pool functions
|
||||||
#
|
#
|
||||||
|
def ceph_pool_info(config, pool):
|
||||||
|
"""
|
||||||
|
Get information about Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/pool/{pool}
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/pool/{pool}'.format(pool=pool))
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_pool_list(config, limit):
|
||||||
|
"""
|
||||||
|
Get list information about Ceph OSDs (limited by {limit})
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/pool
|
||||||
|
API arguments: limit={limit}
|
||||||
|
API schema: [{json_data_object},{json_data_object},etc.]
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
if limit:
|
||||||
|
params['limit'] = limit
|
||||||
|
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/pool')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri,
|
||||||
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_pool_add(config, pool, pgs, replcfg):
|
||||||
|
"""
|
||||||
|
Add new Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/pool
|
||||||
|
API arguments: pool={pool}, pgs={pgs}, replcfg={replcfg}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/pool')
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'pool': pool,
|
||||||
|
'pgs': pgs,
|
||||||
|
'replcfg': replcfg
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_pool_remove(config, pool):
|
||||||
|
"""
|
||||||
|
Remove Ceph OSD
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/pool/{pool}
|
||||||
|
API arguments:
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/pool/{pool}'.format(pool=pool))
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'yes-i-really-mean-it': 'yes'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: DELETE {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
def format_list_pool(pool_list):
|
def format_list_pool(pool_list):
|
||||||
|
# Handle empty list
|
||||||
|
if not pool_list:
|
||||||
|
pool_list = list()
|
||||||
|
# Handle single-entry list
|
||||||
|
if isinstance(pool_list, dict):
|
||||||
|
pool_list = [ pool_list ]
|
||||||
|
|
||||||
pool_list_output = []
|
pool_list_output = []
|
||||||
|
|
||||||
pool_name_length = 5
|
pool_name_length = 5
|
||||||
|
@ -554,11 +902,186 @@ Wr: {pool_write_ops: <{pool_write_ops_length}} \
|
||||||
|
|
||||||
click.echo('\n'.join(sorted(pool_list_output)))
|
click.echo('\n'.join(sorted(pool_list_output)))
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Volume functions
|
# Volume functions
|
||||||
#
|
#
|
||||||
|
def ceph_volume_info(config, pool, volume):
|
||||||
|
"""
|
||||||
|
Get information about Ceph volume
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/volume/{pool}/{volume}
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/volume/{pool}/{volume}'.format(volume=volume, pool=pool))
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_volume_list(config, limit, pool):
|
||||||
|
"""
|
||||||
|
Get list information about Ceph volumes (limited by {limit} and by {pool})
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/volume
|
||||||
|
API arguments: limit={limit}, pool={pool}
|
||||||
|
API schema: [{json_data_object},{json_data_object},etc.]
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
if limit:
|
||||||
|
params['limit'] = limit
|
||||||
|
if pool:
|
||||||
|
params['pool'] = pool
|
||||||
|
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/volume')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri,
|
||||||
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_volume_add(config, pool, volume, size):
|
||||||
|
"""
|
||||||
|
Add new Ceph volume
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/volume
|
||||||
|
API arguments: volume={volume}, pool={pool}, size={size}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/volume')
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'volume': volume,
|
||||||
|
'pool': pool,
|
||||||
|
'size': size
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_volume_remove(config, pool, volume):
|
||||||
|
"""
|
||||||
|
Remove Ceph volume
|
||||||
|
|
||||||
|
API endpoint: DELETE /api/v1/storage/ceph/volume/{pool}/{volume}
|
||||||
|
API arguments:
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/volume/{pool}/{volume}'.format(volume=volume, pool=pool))
|
||||||
|
response = requests.delete(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: DELETE {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_volume_modify(config, pool, volume, new_name=None, new_size=None):
|
||||||
|
"""
|
||||||
|
Modify Ceph volume
|
||||||
|
|
||||||
|
API endpoint: PUT /api/v1/storage/ceph/volume/{pool}/{volume}
|
||||||
|
API arguments:
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
|
||||||
|
params = dict()
|
||||||
|
if new_name:
|
||||||
|
params['new_name'] = new_name
|
||||||
|
if new_size:
|
||||||
|
params['new_size'] = new_size
|
||||||
|
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/volume/{pool}/{volume}'.format(volume=volume, pool=pool))
|
||||||
|
response = requests.put(
|
||||||
|
request_uri,
|
||||||
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: PUT {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_volume_clone(config, pool, volume, new_volume):
|
||||||
|
"""
|
||||||
|
Clone Ceph volume
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/volume/{pool}/{volume}
|
||||||
|
API arguments: new_volume={new_volume
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/volume/{pool}/{volume}/clone'.format(volume=volume, pool=pool))
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'new_volume': new_volume
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
def format_list_volume(volume_list):
|
def format_list_volume(volume_list):
|
||||||
|
# Handle empty list
|
||||||
|
if not volume_list:
|
||||||
|
volume_list = list()
|
||||||
|
# Handle single-entry list
|
||||||
|
if isinstance(volume_list, dict):
|
||||||
|
volume_list = [ volume_list ]
|
||||||
|
|
||||||
volume_list_output = []
|
volume_list_output = []
|
||||||
|
|
||||||
volume_name_length = 5
|
volume_name_length = 5
|
||||||
|
@ -669,7 +1192,155 @@ def format_list_volume(volume_list):
|
||||||
#
|
#
|
||||||
# Snapshot functions
|
# Snapshot functions
|
||||||
#
|
#
|
||||||
|
def ceph_snapshot_info(config, pool, volume, snapshot):
|
||||||
|
"""
|
||||||
|
Get information about Ceph snapshot
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/snapshot/{pool}/{volume}/{snapshot}
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/snapshot/{pool}/{volume}/{snapshot}'.format(snapshot=snapshot, volume=volume, pool=pool))
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_snapshot_list(config, limit, volume, pool):
|
||||||
|
"""
|
||||||
|
Get list information about Ceph snapshots (limited by {limit}, by {pool}, or by {volume})
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/storage/ceph/snapshot
|
||||||
|
API arguments: limit={limit}, volume={volume}, pool={pool}
|
||||||
|
API schema: [{json_data_object},{json_data_object},etc.]
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
if limit:
|
||||||
|
params['limit'] = limit
|
||||||
|
if volume:
|
||||||
|
params['volume'] = volume
|
||||||
|
if pool:
|
||||||
|
params['pool'] = pool
|
||||||
|
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/snapshot')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri,
|
||||||
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_snapshot_add(config, pool, volume, snapshot):
|
||||||
|
"""
|
||||||
|
Add new Ceph snapshot
|
||||||
|
|
||||||
|
API endpoint: POST /api/v1/storage/ceph/snapshot
|
||||||
|
API arguments: snapshot={snapshot}, volume={volume}, pool={pool}
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/snapshot')
|
||||||
|
response = requests.post(
|
||||||
|
request_uri,
|
||||||
|
params={
|
||||||
|
'snapshot': snapshot,
|
||||||
|
'volume': volume,
|
||||||
|
'pool': pool
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_snapshot_remove(config, pool, volume, snapshot):
|
||||||
|
"""
|
||||||
|
Remove Ceph snapshot
|
||||||
|
|
||||||
|
API endpoint: DELETE /api/v1/storage/ceph/snapshot/{pool}/{volume}/{snapshot}
|
||||||
|
API arguments:
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/snapshot/{pool}/{volume}/{snapshot}'.format(snapshot=snapshot, volume=volume, pool=pool))
|
||||||
|
response = requests.delete(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: DELETE {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def ceph_snapshot_modify(config, pool, volume, snapshot, new_name=None):
|
||||||
|
"""
|
||||||
|
Modify Ceph snapshot
|
||||||
|
|
||||||
|
API endpoint: PUT /api/v1/storage/ceph/snapshot/{pool}/{volume}/{snapshot}
|
||||||
|
API arguments:
|
||||||
|
API schema: {"message":"{data}"}
|
||||||
|
"""
|
||||||
|
|
||||||
|
params = dict()
|
||||||
|
if new_name:
|
||||||
|
params['new_name'] = new_name
|
||||||
|
|
||||||
|
request_uri = get_request_uri(config, '/storage/ceph/snapshot/{pool}/{volume}/{snapshot}'.format(snapshot=snapshot, volume=volume, pool=pool))
|
||||||
|
response = requests.put(
|
||||||
|
request_uri,
|
||||||
|
params=params
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: PUT {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
def format_list_snapshot(snapshot_list):
|
def format_list_snapshot(snapshot_list):
|
||||||
|
# Handle empty list
|
||||||
|
if not snapshot_list:
|
||||||
|
snapshot_list = list()
|
||||||
|
# Handle single-entry list
|
||||||
|
if isinstance(snapshot_list, dict):
|
||||||
|
snapshot_list = [ snapshot_list ]
|
||||||
|
|
||||||
snapshot_list_output = []
|
snapshot_list_output = []
|
||||||
|
|
||||||
snapshot_name_length = 5
|
snapshot_name_length = 5
|
||||||
|
@ -677,8 +1348,9 @@ def format_list_snapshot(snapshot_list):
|
||||||
snapshot_pool_length = 5
|
snapshot_pool_length = 5
|
||||||
|
|
||||||
for snapshot in snapshot_list:
|
for snapshot in snapshot_list:
|
||||||
volume, snapshot_name = snapshot.split('@')
|
snapshot_name = snapshot['snapshot']
|
||||||
snapshot_pool, snapshot_volume = volume.split('/')
|
snapshot_volume = snapshot['volume']
|
||||||
|
snapshot_pool = snapshot['pool']
|
||||||
|
|
||||||
# Set the Snapshot name length
|
# Set the Snapshot name length
|
||||||
_snapshot_name_length = len(snapshot_name) + 1
|
_snapshot_name_length = len(snapshot_name) + 1
|
||||||
|
@ -713,8 +1385,9 @@ def format_list_snapshot(snapshot_list):
|
||||||
)
|
)
|
||||||
|
|
||||||
for snapshot in snapshot_list:
|
for snapshot in snapshot_list:
|
||||||
volume, snapshot_name = snapshot.split('@')
|
snapshot_name = snapshot['snapshot']
|
||||||
snapshot_pool, snapshot_volume = volume.split('/')
|
snapshot_volume = snapshot['volume']
|
||||||
|
snapshot_pool = snapshot['pool']
|
||||||
snapshot_list_output.append('{bold}\
|
snapshot_list_output.append('{bold}\
|
||||||
{snapshot_name: <{snapshot_name_length}} \
|
{snapshot_name: <{snapshot_name_length}} \
|
||||||
{snapshot_volume: <{snapshot_volume_length}} \
|
{snapshot_volume: <{snapshot_volume_length}} \
|
||||||
|
|
|
@ -22,9 +22,70 @@
|
||||||
|
|
||||||
import click
|
import click
|
||||||
import json
|
import json
|
||||||
|
import requests
|
||||||
|
|
||||||
import cli_lib.ansiprint as ansiprint
|
import cli_lib.ansiprint as ansiprint
|
||||||
|
|
||||||
|
def get_request_uri(config, endpoint):
|
||||||
|
"""
|
||||||
|
Return the fully-formed URI for {endpoint}
|
||||||
|
"""
|
||||||
|
uri = '{}://{}{}{}'.format(
|
||||||
|
config['api_scheme'],
|
||||||
|
config['api_host'],
|
||||||
|
config['api_prefix'],
|
||||||
|
endpoint
|
||||||
|
)
|
||||||
|
return uri
|
||||||
|
|
||||||
|
def initialize(config):
|
||||||
|
"""
|
||||||
|
Initialize the PVC cluster
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/initialize
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/initialize')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
retstatus = True
|
||||||
|
else:
|
||||||
|
retstatus = False
|
||||||
|
|
||||||
|
return retstatus, response.json()['message']
|
||||||
|
|
||||||
|
def get_info(config):
|
||||||
|
"""
|
||||||
|
Get status of the PVC cluster
|
||||||
|
|
||||||
|
API endpoint: GET /api/v1/status
|
||||||
|
API arguments:
|
||||||
|
API schema: {json_data_object}
|
||||||
|
"""
|
||||||
|
request_uri = get_request_uri(config, '/status')
|
||||||
|
response = requests.get(
|
||||||
|
request_uri
|
||||||
|
)
|
||||||
|
|
||||||
|
if config['debug']:
|
||||||
|
print('API endpoint: POST {}'.format(request_uri))
|
||||||
|
print('Response code: {}'.format(response.status_code))
|
||||||
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True, response.json()
|
||||||
|
else:
|
||||||
|
return False, response.json()['message']
|
||||||
|
|
||||||
def format_info(cluster_information, oformat):
|
def format_info(cluster_information, oformat):
|
||||||
if oformat == 'json':
|
if oformat == 'json':
|
||||||
print(json.dumps(cluster_information))
|
print(json.dumps(cluster_information))
|
||||||
|
|
|
@ -82,7 +82,7 @@ def net_info(config, net):
|
||||||
)
|
)
|
||||||
|
|
||||||
if config['debug']:
|
if config['debug']:
|
||||||
print('API endpoint: POST {}'.format(request_uri))
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
print('Response code: {}'.format(response.status_code))
|
print('Response code: {}'.format(response.status_code))
|
||||||
print('Response headers: {}'.format(response.headers))
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ def net_list(config, limit):
|
||||||
)
|
)
|
||||||
|
|
||||||
if config['debug']:
|
if config['debug']:
|
||||||
print('API endpoint: POST {}'.format(request_uri))
|
print('API endpoint: GET {}'.format(request_uri))
|
||||||
print('Response code: {}'.format(response.status_code))
|
print('Response code: {}'.format(response.status_code))
|
||||||
print('Response headers: {}'.format(response.headers))
|
print('Response headers: {}'.format(response.headers))
|
||||||
|
|
||||||
|
@ -716,6 +716,9 @@ def format_list_dhcp(dhcp_lease_list):
|
||||||
click.echo('\n'.join(sorted(dhcp_lease_list_output)))
|
click.echo('\n'.join(sorted(dhcp_lease_list_output)))
|
||||||
|
|
||||||
def format_list_acl(acl_list):
|
def format_list_acl(acl_list):
|
||||||
|
# Handle when we get an empty entry
|
||||||
|
if not acl_list:
|
||||||
|
acl_list = list()
|
||||||
# Handle when we get a single entry
|
# Handle when we get a single entry
|
||||||
if isinstance(acl_list, dict):
|
if isinstance(acl_list, dict):
|
||||||
acl_list = [ acl_list ]
|
acl_list = [ acl_list ]
|
||||||
|
|
|
@ -237,7 +237,7 @@ def vm_define(config, target_node, node_limit, node_selector, node_autostart):
|
||||||
config_data = config.read()
|
config_data = config.read()
|
||||||
config.close()
|
config.close()
|
||||||
|
|
||||||
retcode, retmsg = pvc_vm.define_vm(zk_conn, config_data, target_node, node_limit, node_selector, node_autostart)
|
retcode, retmsg = pvc_vm.define_vm(config, config_data, target_node, node_limit, node_selector, node_autostart)
|
||||||
cleanup(retcode, retmsg)
|
cleanup(retcode, retmsg)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -1099,28 +1099,26 @@ def ceph_status():
|
||||||
Show detailed status of the storage cluster.
|
Show detailed status of the storage cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_ceph.ceph_status(config)
|
||||||
retcode, retdata = pvc_ceph.get_status(zk_conn)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_ceph.format_raw_output(retdata)
|
pvc_ceph.format_raw_output(retdata)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph df
|
# pvc storage ceph util
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@click.command(name='df', short_help='Show storage cluster utilization.')
|
@click.command(name='util', short_help='Show storage cluster utilization.')
|
||||||
def ceph_radosdf():
|
def ceph_util():
|
||||||
"""
|
"""
|
||||||
Show utilization of the storage cluster.
|
Show utilization of the storage cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_ceph.ceph_util(config)
|
||||||
retcode, retdata = pvc_ceph.get_radosdf(zk_conn)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_ceph.format_raw_output(retdata)
|
pvc_ceph.format_raw_output(retdata)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd
|
# pvc storage ceph osd
|
||||||
|
@ -1163,9 +1161,8 @@ def ceph_osd_add(node, device, weight, yes):
|
||||||
if choice != 'y' and choice != 'Y':
|
if choice != 'y' and choice != 'Y':
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_osd_add(config, node, device, weight)
|
||||||
retcode, retmsg = pvc_ceph.add_osd(zk_conn, node, device, weight)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd remove
|
# pvc storage ceph osd remove
|
||||||
|
@ -1190,9 +1187,8 @@ def ceph_osd_remove(osdid, yes):
|
||||||
if choice != 'y' and choice != 'Y':
|
if choice != 'y' and choice != 'Y':
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_osd_remove(config, osdid)
|
||||||
retcode, retmsg = pvc_ceph.remove_osd(zk_conn, osdid)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd in
|
# pvc storage ceph osd in
|
||||||
|
@ -1206,9 +1202,8 @@ def ceph_osd_in(osdid):
|
||||||
Set a Ceph OSD with ID OSDID online in the cluster.
|
Set a Ceph OSD with ID OSDID online in the cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_osd_state(config, osdid, 'in')
|
||||||
retcode, retmsg = pvc_ceph.in_osd(zk_conn, osdid)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd out
|
# pvc storage ceph osd out
|
||||||
|
@ -1222,9 +1217,8 @@ def ceph_osd_out(osdid):
|
||||||
Set a Ceph OSD with ID OSDID offline in the cluster.
|
Set a Ceph OSD with ID OSDID offline in the cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_osd_state(config, osdid, 'out')
|
||||||
retcode, retmsg = pvc_ceph.out_osd(zk_conn, osdid)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd set
|
# pvc storage ceph osd set
|
||||||
|
@ -1242,9 +1236,8 @@ def ceph_osd_set(osd_property):
|
||||||
full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds
|
full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_osd_option(config, osd_property, 'set')
|
||||||
retcode, retmsg = pvc_ceph.set_osd(zk_conn, osd_property)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd unset
|
# pvc storage ceph osd unset
|
||||||
|
@ -1262,9 +1255,8 @@ def ceph_osd_unset(osd_property):
|
||||||
full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds
|
full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_osd_option(config, osd_property, 'unset')
|
||||||
retcode, retmsg = pvc_ceph.unset_osd(zk_conn, osd_property)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph osd list
|
# pvc storage ceph osd list
|
||||||
|
@ -1278,12 +1270,11 @@ def ceph_osd_list(limit):
|
||||||
List all Ceph OSDs in the cluster; optionally only match elements matching ID regex LIMIT.
|
List all Ceph OSDs in the cluster; optionally only match elements matching ID regex LIMIT.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_ceph.ceph_osd_list(config, limit)
|
||||||
retcode, retdata = pvc_ceph.get_list_osd(zk_conn, limit)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_ceph.format_list_osd(retdata)
|
pvc_ceph.format_list_osd(retdata)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph pool
|
# pvc storage ceph pool
|
||||||
|
@ -1319,9 +1310,8 @@ def ceph_pool_add(name, pgs, replcfg):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_pool_add(config, name, pgs, replcfg)
|
||||||
retcode, retmsg = pvc_ceph.add_pool(zk_conn, name, pgs, replcfg)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph pool remove
|
# pvc storage ceph pool remove
|
||||||
|
@ -1348,9 +1338,8 @@ def ceph_pool_remove(name, yes):
|
||||||
if pool_name_check != name:
|
if pool_name_check != name:
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_pool_remove(config, name)
|
||||||
retcode, retmsg = pvc_ceph.remove_pool(zk_conn, name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph pool list
|
# pvc storage ceph pool list
|
||||||
|
@ -1364,12 +1353,11 @@ def ceph_pool_list(limit):
|
||||||
List all Ceph RBD pools in the cluster; optionally only match elements matching name regex LIMIT.
|
List all Ceph RBD pools in the cluster; optionally only match elements matching name regex LIMIT.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_ceph.ceph_pool_list(config, limit)
|
||||||
retcode, retdata = pvc_ceph.get_list_pool(zk_conn, limit)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_ceph.format_list_pool(retdata)
|
pvc_ceph.format_list_pool(retdata)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume
|
# pvc storage ceph volume
|
||||||
|
@ -1399,9 +1387,8 @@ def ceph_volume_add(pool, name, size):
|
||||||
Add a new Ceph RBD volume with name NAME and size SIZE [in human units, e.g. 1024M, 20G, etc.] to pool POOL.
|
Add a new Ceph RBD volume with name NAME and size SIZE [in human units, e.g. 1024M, 20G, etc.] to pool POOL.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_volume_add(config, pool, name, size)
|
||||||
retcode, retmsg = pvc_ceph.add_volume(zk_conn, pool, name, size)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume remove
|
# pvc storage ceph volume remove
|
||||||
|
@ -1429,9 +1416,8 @@ def ceph_volume_remove(pool, name, yes):
|
||||||
if choice != 'y' and choice != 'Y':
|
if choice != 'y' and choice != 'Y':
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_volume_remove(config, pool, name)
|
||||||
retcode, retmsg = pvc_ceph.remove_volume(zk_conn, pool, name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume resize
|
# pvc storage ceph volume resize
|
||||||
|
@ -1450,9 +1436,8 @@ def ceph_volume_resize(pool, name, size):
|
||||||
"""
|
"""
|
||||||
Resize an existing Ceph RBD volume with name NAME in pool POOL to size SIZE [in human units, e.g. 1024M, 20G, etc.].
|
Resize an existing Ceph RBD volume with name NAME in pool POOL to size SIZE [in human units, e.g. 1024M, 20G, etc.].
|
||||||
"""
|
"""
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_volume_modify(config, pool, name, new_size=size)
|
||||||
retcode, retmsg = pvc_ceph.resize_volume(zk_conn, pool, name, size)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume rename
|
# pvc storage ceph volume rename
|
||||||
|
@ -1471,14 +1456,13 @@ def ceph_volume_rename(pool, name, new_name):
|
||||||
"""
|
"""
|
||||||
Rename an existing Ceph RBD volume with name NAME in pool POOL to name NEW_NAME.
|
Rename an existing Ceph RBD volume with name NAME in pool POOL to name NEW_NAME.
|
||||||
"""
|
"""
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_volume_modify(config, pool, name, new_name=new_name)
|
||||||
retcode, retmsg = pvc_ceph.rename_volume(zk_conn, pool, name, new_name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume clone
|
# pvc storage ceph volume clone
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@click.command(name='rename', short_help='Clone RBD volume.')
|
@click.command(name='clone', short_help='Clone RBD volume.')
|
||||||
@click.argument(
|
@click.argument(
|
||||||
'pool'
|
'pool'
|
||||||
)
|
)
|
||||||
|
@ -1492,9 +1476,8 @@ def ceph_volume_clone(pool, name, new_name):
|
||||||
"""
|
"""
|
||||||
Clone a Ceph RBD volume with name NAME in pool POOL to name NEW_NAME in pool POOL.
|
Clone a Ceph RBD volume with name NAME in pool POOL to name NEW_NAME in pool POOL.
|
||||||
"""
|
"""
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_volume_clone(config, pool, name, new_name)
|
||||||
retcode, retmsg = pvc_ceph.clone_volume(zk_conn, pool, name, new_name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume list
|
# pvc storage ceph volume list
|
||||||
|
@ -1513,12 +1496,11 @@ def ceph_volume_list(limit, pool):
|
||||||
List all Ceph RBD volumes in the cluster; optionally only match elements matching name regex LIMIT.
|
List all Ceph RBD volumes in the cluster; optionally only match elements matching name regex LIMIT.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_ceph.ceph_volume_list(config, limit, pool)
|
||||||
retcode, retdata = pvc_ceph.get_list_volume(zk_conn, pool, limit)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_ceph.format_list_volume(retdata)
|
pvc_ceph.format_list_volume(retdata)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume snapshot
|
# pvc storage ceph volume snapshot
|
||||||
|
@ -1548,9 +1530,8 @@ def ceph_volume_snapshot_add(pool, volume, name):
|
||||||
Add a snapshot with name NAME of Ceph RBD volume VOLUME in pool POOL.
|
Add a snapshot with name NAME of Ceph RBD volume VOLUME in pool POOL.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_snapshot_add(config, pool, volume, name)
|
||||||
retcode, retmsg = pvc_ceph.add_snapshot(zk_conn, pool, volume, name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume snapshot rename
|
# pvc storage ceph volume snapshot rename
|
||||||
|
@ -1572,9 +1553,8 @@ def ceph_volume_snapshot_rename(pool, volume, name, new_name):
|
||||||
"""
|
"""
|
||||||
Rename an existing Ceph RBD volume snapshot with name NAME to name NEW_NAME for volume VOLUME in pool POOL.
|
Rename an existing Ceph RBD volume snapshot with name NAME to name NEW_NAME for volume VOLUME in pool POOL.
|
||||||
"""
|
"""
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_snapshot_modify(config, pool, volume, name, new_name=new_name)
|
||||||
retcode, retmsg = pvc_ceph.rename_snapshot(zk_conn, pool, volume, name, new_name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume snapshot remove
|
# pvc storage ceph volume snapshot remove
|
||||||
|
@ -1605,9 +1585,8 @@ def ceph_volume_snapshot_remove(pool, volume, name, yes):
|
||||||
if choice != 'y' and choice != 'Y':
|
if choice != 'y' and choice != 'Y':
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retmsg = pvc_ceph.ceph_snapshot_remove(config, pool, volume, name)
|
||||||
retcode, retmsg = pvc_ceph.remove_snapshot(zk_conn, pool, volume, name)
|
cleanup(retcode, retmsg)
|
||||||
cleanup(retcode, retmsg, zk_conn)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc storage ceph volume snapshot list
|
# pvc storage ceph volume snapshot list
|
||||||
|
@ -1631,12 +1610,11 @@ def ceph_volume_snapshot_list(pool, volume, limit):
|
||||||
List all Ceph RBD volume snapshots; optionally only match elements matching name regex LIMIT.
|
List all Ceph RBD volume snapshots; optionally only match elements matching name regex LIMIT.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_ceph.ceph_snapshot_list(config, limit, volume, pool)
|
||||||
retcode, retdata = pvc_ceph.get_list_snapshot(zk_conn, pool, volume, limit)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_ceph.format_list_snapshot(retdata)
|
pvc_ceph.format_list_snapshot(retdata)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -1652,12 +1630,11 @@ def status_cluster(oformat):
|
||||||
"""
|
"""
|
||||||
Show basic information and health for the active PVC cluster.
|
Show basic information and health for the active PVC cluster.
|
||||||
"""
|
"""
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
retcode, retdata = pvc_cluster.get_info(config)
|
||||||
retcode, retdata = pvc_cluster.get_info(zk_conn)
|
|
||||||
if retcode:
|
if retcode:
|
||||||
pvc_cluster.format_info(retdata, oformat)
|
pvc_cluster.format_info(retdata, oformat)
|
||||||
retdata = ''
|
retdata = ''
|
||||||
cleanup(retcode, retdata, zk_conn)
|
cleanup(retcode, retdata)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc init
|
# pvc init
|
||||||
|
@ -1684,40 +1661,8 @@ def init_cluster(yes):
|
||||||
# Easter-egg
|
# Easter-egg
|
||||||
click.echo("Some music while we're Layin' Pipe? https://youtu.be/sw8S_Kv89IU")
|
click.echo("Some music while we're Layin' Pipe? https://youtu.be/sw8S_Kv89IU")
|
||||||
|
|
||||||
# Open a Zookeeper connection
|
retcode, retmsg = pvc_cluster.initialize()
|
||||||
zk_conn = pvc_common.startZKConnection(zk_host)
|
cleanup(retcode, retmsg)
|
||||||
|
|
||||||
# Destroy the existing data
|
|
||||||
try:
|
|
||||||
zk_conn.delete('/networks', recursive=True)
|
|
||||||
zk_conn.delete('/domains', recursive=True)
|
|
||||||
zk_conn.delete('/nodes', recursive=True)
|
|
||||||
zk_conn.delete('/primary_node', recursive=True)
|
|
||||||
zk_conn.delete('/ceph', recursive=True)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Create the root keys
|
|
||||||
transaction = zk_conn.transaction()
|
|
||||||
transaction.create('/nodes', ''.encode('ascii'))
|
|
||||||
transaction.create('/primary_node', 'none'.encode('ascii'))
|
|
||||||
transaction.create('/domains', ''.encode('ascii'))
|
|
||||||
transaction.create('/networks', ''.encode('ascii'))
|
|
||||||
transaction.create('/ceph', ''.encode('ascii'))
|
|
||||||
transaction.create('/ceph/osds', ''.encode('ascii'))
|
|
||||||
transaction.create('/ceph/pools', ''.encode('ascii'))
|
|
||||||
transaction.create('/ceph/volumes', ''.encode('ascii'))
|
|
||||||
transaction.create('/ceph/snapshots', ''.encode('ascii'))
|
|
||||||
transaction.create('/cmd', ''.encode('ascii'))
|
|
||||||
transaction.create('/cmd/domains', ''.encode('ascii'))
|
|
||||||
transaction.create('/cmd/ceph', ''.encode('ascii'))
|
|
||||||
transaction.commit()
|
|
||||||
|
|
||||||
# Close the Zookeeper connection
|
|
||||||
pvc_common.stopZKConnection(zk_conn)
|
|
||||||
|
|
||||||
click.echo('Successfully initialized new cluster. Any running PVC daemons will need to be restarted.')
|
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# pvc
|
# pvc
|
||||||
|
@ -1823,6 +1768,7 @@ ceph_pool.add_command(ceph_pool_list)
|
||||||
ceph_volume.add_command(ceph_volume_add)
|
ceph_volume.add_command(ceph_volume_add)
|
||||||
ceph_volume.add_command(ceph_volume_resize)
|
ceph_volume.add_command(ceph_volume_resize)
|
||||||
ceph_volume.add_command(ceph_volume_rename)
|
ceph_volume.add_command(ceph_volume_rename)
|
||||||
|
ceph_volume.add_command(ceph_volume_clone)
|
||||||
ceph_volume.add_command(ceph_volume_remove)
|
ceph_volume.add_command(ceph_volume_remove)
|
||||||
ceph_volume.add_command(ceph_volume_list)
|
ceph_volume.add_command(ceph_volume_list)
|
||||||
ceph_volume.add_command(ceph_volume_snapshot)
|
ceph_volume.add_command(ceph_volume_snapshot)
|
||||||
|
@ -1833,7 +1779,7 @@ ceph_volume_snapshot.add_command(ceph_volume_snapshot_remove)
|
||||||
ceph_volume_snapshot.add_command(ceph_volume_snapshot_list)
|
ceph_volume_snapshot.add_command(ceph_volume_snapshot_list)
|
||||||
|
|
||||||
cli_ceph.add_command(ceph_status)
|
cli_ceph.add_command(ceph_status)
|
||||||
cli_ceph.add_command(ceph_radosdf)
|
cli_ceph.add_command(ceph_util)
|
||||||
cli_ceph.add_command(ceph_osd)
|
cli_ceph.add_command(ceph_osd)
|
||||||
cli_ceph.add_command(ceph_pool)
|
cli_ceph.add_command(ceph_pool)
|
||||||
cli_ceph.add_command(ceph_volume)
|
cli_ceph.add_command(ceph_volume)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue