181 lines
4.9 KiB
Python
Executable File
181 lines
4.9 KiB
Python
Executable File
#
|
|
# Copyright (c) 2015-2016 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
import json
|
|
import six
|
|
|
|
from nfv_common import debug
|
|
from nfv_common.helpers import Constant
|
|
from nfv_common.helpers import Constants
|
|
from nfv_common.helpers import Singleton
|
|
|
|
from nfv_plugins.nfvi_plugins.openstack.objects import OPENSTACK_SERVICE
|
|
from nfv_plugins.nfvi_plugins.openstack.rest_api import rest_api_request
|
|
|
|
DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.openstack.cinder')
|
|
|
|
|
|
@six.add_metaclass(Singleton)
|
|
class VolumeStatus(Constants):
|
|
"""
|
|
VOLUME STATUS Constants
|
|
"""
|
|
CREATING = Constant('creating')
|
|
AVAILABLE = Constant('available')
|
|
ATTACHING = Constant('attaching')
|
|
IN_USE = Constant('in-use')
|
|
BACKING_UP = Constant('backing-up')
|
|
RESTORING_BACKUP = Constant('restoring-backup')
|
|
DOWNLOADING = Constant('downloading')
|
|
DELETING = Constant('deleting')
|
|
ERROR = Constant('error')
|
|
ERROR_DELETING = Constant('error_deleting')
|
|
ERROR_RESTORING = Constant('error_restoring')
|
|
ERROR_EXTENDING = Constant('error_extending')
|
|
|
|
|
|
# Constant Instantiation
|
|
VOLUME_STATUS = VolumeStatus()
|
|
|
|
|
|
def get_volumes(token, page_limit=None, next_page=None, all_tenants=True):
|
|
"""
|
|
Asks OpenStack Cinder for a list of volumes
|
|
"""
|
|
if next_page is None:
|
|
url = token.get_service_url(OPENSTACK_SERVICE.CINDER)
|
|
if url is None:
|
|
raise ValueError("OpenStack Cinder URL is invalid")
|
|
|
|
api_cmd = url + "/volumes"
|
|
|
|
if page_limit is not None:
|
|
api_cmd += "?limit=%s" % page_limit
|
|
if all_tenants:
|
|
api_cmd += "&all_tenants=1"
|
|
elif all_tenants:
|
|
api_cmd += "?all_tenants=1"
|
|
else:
|
|
api_cmd = next_page
|
|
|
|
api_cmd_headers = dict()
|
|
api_cmd_headers['wrs-header'] = 'true'
|
|
|
|
response = rest_api_request(token, "GET", api_cmd, api_cmd_headers)
|
|
return response
|
|
|
|
|
|
def create_volume(token, volume_name, volume_description, size_gb,
|
|
image_id=None, bootable=None):
|
|
"""
|
|
Asks OpenStack Cinder to create a volume
|
|
"""
|
|
url = token.get_service_url(OPENSTACK_SERVICE.CINDER)
|
|
if url is None:
|
|
raise ValueError("OpenStack Cinder URL is invalid")
|
|
|
|
api_cmd = url + "/volumes"
|
|
|
|
api_cmd_headers = dict()
|
|
api_cmd_headers['wrs-header'] = 'true'
|
|
api_cmd_headers['Content-Type'] = "application/json"
|
|
|
|
volume = dict()
|
|
volume['name'] = volume_name
|
|
volume['description'] = volume_description
|
|
volume['size'] = size_gb
|
|
|
|
if image_id is not None:
|
|
volume['imageRef'] = image_id
|
|
|
|
if bootable is not None:
|
|
volume['bootable'] = bootable
|
|
|
|
api_cmd_payload = dict()
|
|
api_cmd_payload['volume'] = volume
|
|
|
|
response = rest_api_request(token, "POST", api_cmd, api_cmd_headers,
|
|
json.dumps(api_cmd_payload))
|
|
return response
|
|
|
|
|
|
def update_volume(token, volume_id, volume_description):
|
|
"""
|
|
Asks OpenStack Cinder to update a volume
|
|
"""
|
|
url = token.get_service_url(OPENSTACK_SERVICE.CINDER)
|
|
if url is None:
|
|
raise ValueError("OpenStack Cinder URL is invalid")
|
|
|
|
api_cmd = url + "/volumes/%s" % volume_id
|
|
|
|
api_cmd_headers = dict()
|
|
api_cmd_headers['wrs-header'] = 'true'
|
|
api_cmd_headers['Content-Type'] = "application/json"
|
|
|
|
volume = dict()
|
|
volume['description'] = volume_description
|
|
|
|
api_cmd_payload = dict()
|
|
api_cmd_payload['volume'] = volume
|
|
|
|
response = rest_api_request(token, "PUT", api_cmd, api_cmd_headers,
|
|
json.dumps(api_cmd_payload))
|
|
return response
|
|
|
|
|
|
def delete_volume(token, volume_id):
|
|
"""
|
|
Asks OpenStack Cinder to delete a volume
|
|
"""
|
|
url = token.get_service_url(OPENSTACK_SERVICE.CINDER)
|
|
if url is None:
|
|
raise ValueError("OpenStack Cinder URL is invalid")
|
|
|
|
api_cmd = url + "/volumes/%s" % volume_id
|
|
|
|
api_cmd_headers = dict()
|
|
api_cmd_headers['wrs-header'] = 'true'
|
|
|
|
response = rest_api_request(token, "DELETE", api_cmd, api_cmd_headers)
|
|
return response
|
|
|
|
|
|
def get_volume(token, volume_id):
|
|
"""
|
|
Asks OpenStack Cinder for volume details
|
|
"""
|
|
url = token.get_service_url(OPENSTACK_SERVICE.CINDER)
|
|
if url is None:
|
|
raise ValueError("OpenStack Cinder URL is invalid")
|
|
|
|
api_cmd = url + "/volumes/%s" % volume_id
|
|
|
|
api_cmd_headers = dict()
|
|
api_cmd_headers['wrs-header'] = 'true'
|
|
|
|
response = rest_api_request(token, "GET", api_cmd, api_cmd_headers)
|
|
return response
|
|
|
|
|
|
def get_volume_snapshots(token, all_tenants=True):
|
|
"""
|
|
Asks OpenStack Cinder for a list of volume snapshots
|
|
"""
|
|
url = token.get_service_url(OPENSTACK_SERVICE.CINDER)
|
|
if url is None:
|
|
raise ValueError("OpenStack Cinder URL is invalid")
|
|
|
|
api_cmd = url + "/snapshots"
|
|
|
|
if all_tenants:
|
|
api_cmd += "?all_tenants=1"
|
|
|
|
api_cmd_headers = dict()
|
|
api_cmd_headers['wrs-header'] = 'true'
|
|
|
|
response = rest_api_request(token, "GET", api_cmd, api_cmd_headers)
|
|
return response
|