# -*- coding: utf-8 -*-
# The MIT License (MIT)
#
# Copyright (c) 2014-2018 Thorsten Simons (sw@snomis.de)
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import logging
from json import loads
from pprint import pprint
import hcpsdk
__all__ = ['TenantError', 'listtenants', 'Tenant']
logging.getLogger('hcpsdk.mapi.tenant').addHandler(logging.NullHandler())
[docs]class TenantError(Exception):
"""
Base Exception used by the *hcpsdk.mapi.Tenant()* class
"""
def __init__(self, reason):
"""
:param reason: An error description
"""
self.args = (reason,)
[docs]def listtenants(target, timeout=60, debuglevel=0):
"""
Get a list of available Tenants
:param target: an hcpsdk.Target object
:param timeout: the connection timeout in seconds
:param debuglevel: 0..9 (used in *http.client*)
:returns: a list() of *Tenant()* objects
:raises: *hcpsdk.HcpsdkPortError* in case *target* is
initialized with a port different that *P_MAPI*
"""
logger = logging.getLogger(__name__)
logger.debug('getting a list of Tenants')
hcpsdk.checkport(target, hcpsdk.P_MAPI)
tenantslist = []
try:
con = hcpsdk.Connection(target, timeout=timeout, debuglevel=debuglevel)
except Exception as e:
raise hcpsdk.HcpsdkError(str(e))
try:
con.GET('/mapi/tenants', headers={'Accept': 'application/json'},
params={'verbose': 'true'})
except Exception as e:
logger.debug('getting a list of Tenants failed: {}'.format(e))
raise TenantError('get Tenant list failed: {}'.format(e))
else:
if con.response_status == 200:
for t in loads(con.read().decode())['name']:
tenantslist.append(Tenant(target, t, debuglevel=debuglevel))
logger.debug('got a list of {} Tenants'.format(len(tenantslist)))
else:
con.close()
logger.debug('getting a list of Tenants failed: {}-{}'
.format(con.response_status, con.response_reason))
raise TenantError('unable to list Tenants ({} - {})'
.format(con.response_status,
con.response_reason))
con.close()
return tenantslist
[docs]class Tenant(object):
"""
A class representing a Tenant
"""
# TODO: this object is simply a container for a single tenants settings
# remove all the other stuff...
def __init__(self, target, name, timeout=60, debuglevel=0):
"""
:param target: an hcpsdk.Target object
:param name: the Tenants name
:param timeout: the connection timeout in seconds
:param debuglevel: 0..9 (used in *http.client*)
"""
self.logger = logging.getLogger(__name__ + '.Tenant')
self.target = target
try:
self.con = hcpsdk.Connection(self.target, timeout=timeout,
debuglevel=debuglevel)
except Exception as e:
raise hcpsdk.HcpsdkError(str(e))
self.name = name # the Tenants name
self._settings = {} # the Tenants base settings
self.logger.debug('initialized for "{}"'.format(self.name))
[docs] def info(self, cache=True):
"""
Get the settings of the Tenant
:param cache: a bool indicating if cached information shall be used
:return: a dict holding the Tenants settings
"""
if not self._settings or not cache:
try:
self.con.GET('/mapi/tenants/{}'.format(self.name),
headers={'Accept': 'application/json'})
except Exception as e:
raise hcpsdk.HcpsdkError(str(e))
else:
if self.con.response_status == 200:
self._settings = loads(self.con.read().decode())
self.logger.debug('got settings of Tenant {}'
.format(self.name))
else:
self.logger.debug('getting settings of Tenant {} '
'failed: {}-{}'
.format(self.con.response_status,
self.con.response_reason))
raise TenantError('unable to list Tenants ({} - {})'
.format(self.con.response_status,
self.con.response_reason))
return self._settings
[docs] def close(self):
"""
Close the underlying *hcpsdk.Connection()* object
"""
self.con.close()