poppy/poppy/model/helpers/domain.py

131 lines
3.8 KiB
Python

# Copyright (c) 2014 Rackspace, Inc.
#
# 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.
AVAILABLE_PROTOCOLS = [
u'http',
u'https']
CERTIFICATE_OPTIONS = [
None,
u'shared',
u'san',
u'custom']
from poppy.model import common
class Domain(common.DictSerializableModel):
def __init__(self, domain, protocol='http',
certificate=None):
self._domain = domain.lower().strip()
if (protocol in AVAILABLE_PROTOCOLS):
self._protocol = protocol
else:
raise ValueError(
u'Protocol: {0} not in currently available'
' protocols: {1}'.format(
protocol,
AVAILABLE_PROTOCOLS)
)
# certificate option only effective when protocol is https
self._certificate = certificate
if self._protocol == 'https':
if self._certificate not in CERTIFICATE_OPTIONS:
raise ValueError(
u'Certificate option: {0} is not valid.'
'Valid certificate options are: {1}'.format(
certificate,
CERTIFICATE_OPTIONS)
)
@property
def domain(self):
"""domain.
:returns domain
"""
return self._domain
@domain.setter
def domain(self, value):
"""domain setter."""
self._domain = value.lower().strip()
@property
def certificate(self):
"""certificate option.
:returns certificate
"""
return self._certificate
@certificate.setter
def certificate(self, value):
"""domain certificate setter."""
if self._protocol != 'https':
raise ValueError('Cannot set certificate option for'
' non-https domain')
if value not in CERTIFICATE_OPTIONS:
raise ValueError(
u'Certificate option: {0} is not valid.'
'Valid certificate options are: {1}'.format(
value,
CERTIFICATE_OPTIONS)
)
self._certificate = value
@property
def protocol(self):
return self._protocol
@protocol.setter
def protocol(self, value):
if (value in AVAILABLE_PROTOCOLS):
self._protocol = value
else:
raise ValueError(
u'Protocol: {0} not in currently available'
' protocols: {1}'.format(
value,
AVAILABLE_PROTOCOLS)
)
@classmethod
def init_from_dict(cls, dict_obj):
"""Construct a model instance from a dictionary.
This serves as a 2nd constructor
:param dict_obj: dictionary object
:returns o
"""
o = cls("")
o.domain = dict_obj.get("domain").lower().strip()
o.protocol = dict_obj.get("protocol", "http")
if o.protocol == 'https':
o.certificate = dict_obj.get("certificate", None)
return o
def to_dict(self):
res = super(Domain, self).to_dict()
# cert info is a temporary property when
# trying to create cert, so skip serialization
if 'cert_info' in res and res['cert_info'] is not None:
res['cert_info'] = res['cert_info'].to_dict()
return res