diff options
Diffstat (limited to 'snaps/config/volume_type.py')
-rw-r--r-- | snaps/config/volume_type.py | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/snaps/config/volume_type.py b/snaps/config/volume_type.py new file mode 100644 index 0000000..35ca1d4 --- /dev/null +++ b/snaps/config/volume_type.py @@ -0,0 +1,146 @@ +# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs") +# and others. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import enum +from neutronclient.common.utils import str2bool + + +class VolumeTypeConfig(object): + def __init__(self, **kwargs): + """ + Constructor + :param name: the volume's name (required) + :param description: the volume's name (optional) + :param encryption: VolumeTypeEncryptionConfig (optional) + :param qos_spec_name: name of the QoS Spec to associate (optional) + :param public: volume visibility where True denotes global + (default - False) + + TODO - Implement project_access parameter that will associate this + VolumeType to a list of project names + """ + + self.name = kwargs.get('name') + self.description = kwargs.get('description') + self.qos_spec_name = kwargs.get('qos_spec_name') + + if 'encryption' in kwargs: + if isinstance(kwargs['encryption'], dict): + self.encryption = VolumeTypeEncryptionConfig( + **kwargs['encryption']) + elif isinstance(kwargs['encryption'], + VolumeTypeEncryptionConfig): + self.encryption = kwargs['encryption'] + else: + self.encryption = None + + if 'public' in kwargs: + if isinstance(kwargs['public'], str): + self.public = str2bool(kwargs['public']) + else: + self.public = kwargs['public'] + else: + self.public = False + + if not self.name: + raise VolumeTypeConfigError("The attribute name is required") + + def __eq__(self, other): + return (self.name == other.name + and self.description == other.description + and self.qos_spec_name == other.qos_spec_name + and self.encryption == other.encryption + and self.public == other.public) + + +class ControlLocation(enum.Enum): + """ + QoS Specification consumer types + """ + front_end = 'front-end' + back_end = 'back-end' + + +class VolumeTypeEncryptionConfig(object): + def __init__(self, **kwargs): + """ + Constructor + :param name: the volume's name (required) + :param provider_class: the volume's provider class (e.g. LuksEncryptor) + :param control_location: the notional service where encryption is + performed (e.g., front-end=Nova). The default + value is 'front-end.' + :param cipher: the encryption algorithm/mode to use + (e.g., aes-xts-plain64). If the field is left empty, + the provider default will be used + :param key_size: the size of the encryption key, in bits + (e.g., 128, 256). If the field is left empty, the + provider default will be used + """ + + self.name = kwargs.get('name') + self.provider_class = kwargs.get('provider_class') + self.control_location = kwargs.get('control_location') + if kwargs.get('control_location'): + self.control_location = map_control_location( + kwargs['control_location']) + else: + self.control_location = None + + self.cipher = kwargs.get('cipher') + self.key_size = kwargs.get('key_size') + + if (not self.name or not self.provider_class + or not self.control_location): + raise VolumeTypeConfigError( + 'The attributes name, provider_class, and control_location ' + 'are required') + + def __eq__(self, other): + return (self.name == other.name + and self.provider_class == other.provider_class + and self.control_location == other.control_location + and self.cipher == other.cipher + and self.key_size == other.key_size) + + +def map_control_location(control_location): + """ + Takes a the protocol value maps it to the Consumer enum. When None return + None + :param control_location: the value to map to the Enum + :return: a ControlLocation enum object + :raise: Exception if control_location parameter is invalid + """ + if not control_location: + return None + elif isinstance(control_location, ControlLocation): + return control_location + else: + proto_str = str(control_location) + if proto_str == 'front-end': + return ControlLocation.front_end + elif proto_str == 'back-end': + return ControlLocation.back_end + else: + raise VolumeTypeConfigError('Invalid Consumer - ' + proto_str) + + +class VolumeTypeConfigError(Exception): + """ + Exception to be thrown when an volume settings are incorrect + """ + + def __init__(self, message): + Exception.__init__(self, message) |