diff --git a/client-api/api_lib/pvcapi.py b/client-api/api_lib/pvcapi.py index 91931816..c00c098e 100755 --- a/client-api/api_lib/pvcapi.py +++ b/client-api/api_lib/pvcapi.py @@ -203,6 +203,55 @@ def vm_is_migrated(vm): retdata = pvc_vm.is_migrated(zk_conn, vm) return retdata +def vm_state(vm): + """ + Return the state of virtual machine VM. + """ + zk_conn = pvc_common.startZKConnection(config['coordinators']) + retflag, retdata = pvc_vm.get_list(zk_conn, None, None, vm, is_fuzzy=False) + if retflag: + if retdata: + retcode = 200 + retdata = { + 'name': vm, + 'state': retdata[0]['state'] + } + else: + retcode = 404 + retdata = { + 'message': 'VM not found.' + } + else: + retcode = 400 + + pvc_common.stopZKConnection(zk_conn) + return flask.jsonify(retdata), retcode + +def vm_node(vm): + """ + Return the current node of virtual machine VM. + """ + zk_conn = pvc_common.startZKConnection(config['coordinators']) + retflag, retdata = pvc_vm.get_list(zk_conn, None, None, vm, is_fuzzy=False) + if retflag: + if retdata: + retcode = 200 + retdata = { + 'name': vm, + 'node': retdata[0]['node'], + 'last_node': retdata[0]['last_node'] + } + else: + retcode = 404 + retdata = { + 'message': 'VM not found.' + } + else: + retcode = 400 + + pvc_common.stopZKConnection(zk_conn) + return flask.jsonify(retdata), retcode + def vm_list(node=None, state=None, limit=None, is_fuzzy=True): """ Return a list of VMs with limit LIMIT. @@ -417,6 +466,23 @@ def vm_unmigrate(name): } return flask.jsonify(output), retcode +def vm_flush_locks(name): + """ + Flush locks of a (stopped) VM. + """ + zk_conn = pvc_common.startZKConnection(config['coordinators']) + retflag, retdata = pvc_vm.flush_locks(zk_conn, name) + if retflag: + retcode = 200 + else: + retcode = 400 + + pvc_common.stopZKConnection(zk_conn) + output = { + 'message': retdata.replace('\"', '\'') + } + return flask.jsonify(output), retcode + # # Network functions # diff --git a/client-api/pvc-api.py b/client-api/pvc-api.py index 6efdc056..38fd0d05 100755 --- a/client-api/pvc-api.py +++ b/client-api/pvc-api.py @@ -274,7 +274,7 @@ def api_vm_element(vm): @authenticator def api_vm_state(vm): if flask.request.method == 'GET': - return "Test", 200 + return pvcapi.vm_state(vm) if flask.request.method == 'POST': if not 'state' in flask.request.values: @@ -294,7 +294,7 @@ def api_vm_state(vm): @authenticator def api_vm_node(vm): if flask.request.method == 'GET': - return "Test", 200 + return pvcapi.vm_node(vm) if flask.request.method == 'POST': if 'action' in flask.request.values: @@ -335,6 +335,15 @@ def api_vm_node(vm): flask.abort(400) +@api.route('/api/v1/vm//locks', methods=['GET', 'POST']) +@authenticator +def api_vm_locks(vm): + if flask.request.method == 'GET': + return "Not implemented", 400 + + if flask.request.method == 'POST': + return pvcapi.vm_flush_locks(vm) + # # Network endpoints diff --git a/docs/manuals/api.md b/docs/manuals/api.md index 976669e9..99fa9a03 100644 --- a/docs/manuals/api.md +++ b/docs/manuals/api.md @@ -325,7 +325,7 @@ Valid `state` values are: `start`, `shutdown`, `stop`, `restart` * Mandatory values: N/A * Optional values: N/A -Return the current host node and previous node, if applicable, for ``. +Return the current host node, and last host node if applicable, for ``. ###### `POST` * Mandatory values: `action` @@ -343,6 +343,21 @@ If `permanent` is specified, the PVC system will not track the previous node and If `force` is specified, and the VM has been previously migrated, force through a new migration to the selected target and do not update the previous node value. +#### `/api/v1/vm//locks` + * Methods: `GET`, `POST` + +###### `GET` + * Mandatory values: N/A + * Optional values: N/A + +Not yet implemented and not planned. Return the list of RBD locks for the VM. + +###### `POST` + * Mandatory values: N/A + * Optional values: N/A + +Clear all RBD locks for volumes attached to ``. + ### Network endpoints These endpoints manage PVC client virtual network state and operation.