167 lines
5.1 KiB
Python
Executable File
167 lines
5.1 KiB
Python
Executable File
#
|
|
# Copyright (c) 2015-2016 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
import six
|
|
|
|
from nfv_common import debug
|
|
|
|
from nfv_common.helpers import Constant
|
|
from nfv_common.helpers import Constants
|
|
from nfv_common.helpers import coroutine
|
|
from nfv_common.helpers import Singleton
|
|
|
|
from nfv_vim import nfvi
|
|
from nfv_vim import objects
|
|
from nfv_vim import tables
|
|
|
|
DLOG = debug.debug_get_logger('nfv_vim.volume_director')
|
|
|
|
_volume_director = None
|
|
|
|
|
|
@six.add_metaclass(Singleton)
|
|
class OperationTypes(Constants):
|
|
"""
|
|
Operation - Type Constants
|
|
"""
|
|
VOLUME_CREATE = Constant('volume-create')
|
|
VOLUME_UPDATE = Constant('volume-update')
|
|
VOLUME_DELETE = Constant('volume-delete')
|
|
|
|
|
|
@six.add_metaclass(Singleton)
|
|
class OperationStates(Constants):
|
|
"""
|
|
Operation - State Constants
|
|
"""
|
|
READY = Constant('ready')
|
|
INPROGRESS = Constant('inprogress')
|
|
COMPLETED = Constant('completed')
|
|
FAILED = Constant('failed')
|
|
TIMED_OUT = Constant('timed-out')
|
|
|
|
|
|
# Constant Instantiation
|
|
OPERATION_TYPE = OperationTypes()
|
|
OPERATION_STATE = OperationStates()
|
|
|
|
|
|
@six.add_metaclass(Singleton)
|
|
class VolumeDirector(object):
|
|
"""
|
|
Volume Director
|
|
"""
|
|
@coroutine
|
|
def _volume_create_callback(self, volume_name, callback):
|
|
"""
|
|
Volume Create Callback
|
|
"""
|
|
response = (yield)
|
|
DLOG.verbose("Volume-Create callback response=%s." % response)
|
|
if response['completed']:
|
|
nfvi_volume = response['result-data']
|
|
volume_table = tables.tables_get_volume_table()
|
|
volume = volume_table.get(nfvi_volume.uuid, None)
|
|
if volume is None:
|
|
volume = objects.Volume(nfvi_volume)
|
|
volume_table[nfvi_volume.uuid] = volume
|
|
volume.nfvi_volume_update(nfvi_volume)
|
|
|
|
callback(response['completed'], nfvi_volume.uuid, volume_name,
|
|
nfvi_volume.description, nfvi_volume.size_gb,
|
|
nfvi_volume.bootable, nfvi_volume.encrypted,
|
|
nfvi_volume.avail_status, nfvi_volume.action)
|
|
else:
|
|
callback(response['completed'], None, volume_name, None, None,
|
|
None, None, None, None)
|
|
|
|
def volume_create(self, volume_name, volume_description, size_gb,
|
|
image_uuid, callback):
|
|
"""
|
|
Volume Create
|
|
"""
|
|
volume_create_callback = self._volume_create_callback(volume_name,
|
|
callback)
|
|
nfvi.nfvi_create_volume(volume_name, volume_description, size_gb,
|
|
volume_create_callback, image_uuid)
|
|
|
|
@coroutine
|
|
def _volume_update_callback(self, volume_uuid, callback):
|
|
"""
|
|
Volume Update Callback
|
|
"""
|
|
response = (yield)
|
|
DLOG.verbose("Volume-Update callback response=%s." % response)
|
|
if response['completed']:
|
|
nfvi_volume = response['result-data']
|
|
volume_table = tables.tables_get_volume_table()
|
|
volume = volume_table.get(nfvi_volume.uuid, None)
|
|
if volume is not None:
|
|
volume = objects.Volume(nfvi_volume)
|
|
volume_table[nfvi_volume.uuid] = volume
|
|
volume.nfvi_volume_update(nfvi_volume)
|
|
|
|
callback(response['completed'], volume_uuid, nfvi_volume.name,
|
|
nfvi_volume.description, nfvi_volume.size_gb,
|
|
nfvi_volume.bootable, nfvi_volume.encrypted,
|
|
nfvi_volume.avail_status, nfvi_volume.action)
|
|
else:
|
|
callback(response['completed'], volume_uuid, None, None, None,
|
|
None, None, None, None)
|
|
|
|
def volume_update(self, volume_uuid, volume_description, callback):
|
|
"""
|
|
Volume Update
|
|
"""
|
|
nfvi.nfvi_update_volume(volume_uuid, volume_description,
|
|
self._volume_update_callback(volume_uuid,
|
|
callback))
|
|
|
|
@coroutine
|
|
def _volume_delete_callback(self, volume_uuid, callback):
|
|
"""
|
|
Volume Delete Callback
|
|
"""
|
|
response = (yield)
|
|
DLOG.verbose("Volume-Delete callback response=%s." % response)
|
|
if response['completed']:
|
|
volume_table = tables.tables_get_volume_table()
|
|
volume = volume_table.get(volume_uuid, None)
|
|
if volume is not None:
|
|
if volume.is_deleted():
|
|
del volume_table[volume_uuid]
|
|
callback(response['completed'], volume_uuid)
|
|
|
|
def volume_delete(self, volume_uuid, callback):
|
|
"""
|
|
Volume Delete
|
|
"""
|
|
nfvi.nfvi_delete_volume(volume_uuid,
|
|
self._volume_delete_callback(volume_uuid,
|
|
callback))
|
|
|
|
|
|
def get_volume_director():
|
|
"""
|
|
Returns the Volume Director
|
|
"""
|
|
return _volume_director
|
|
|
|
|
|
def volume_director_initialize():
|
|
"""
|
|
Initialize Volume Director
|
|
"""
|
|
global _volume_director
|
|
|
|
_volume_director = VolumeDirector()
|
|
|
|
|
|
def volume_director_finalize():
|
|
"""
|
|
Finalize Volume Director
|
|
"""
|
|
pass
|