From 48caa7e4af3f54f0e7540edb9b1e7cc48345ca34 Mon Sep 17 00:00:00 2001 From: Octavian Preda Date: Wed, 20 May 2020 19:32:35 +0300 Subject: [PATCH 1/5] Added multi tenant support --- vmanage/__main__.py | 14 ++++++++++---- vmanage/api/authentication.py | 26 +++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/vmanage/__main__.py b/vmanage/__main__.py index da93fce..0475f9f 100644 --- a/vmanage/__main__.py +++ b/vmanage/__main__.py @@ -22,17 +22,18 @@ def __call__(self, *args, **kwargs): class Viptela(object): - def __init__(self, host, username, password): + def __init__(self, host, username, password, tenant): self.host = host self.username = username self.password = password + self.tenant = tenant self.__auth = None # use this to defer authentication until it's needed @property def auth(self): if self.__auth is None: - self.__auth = Authentication(host=self.host, user=self.username, password=self.password).login() + self.__auth = Authentication(host=self.host, user=self.username, password=self.password, tenant=self.tenant).login() return self.__auth @@ -46,9 +47,14 @@ def auth(self): hide_input=True, help='vManage Password (env: VMANAGE_PASSWORD)', required=True) +@click.option('--tenant', + envvar='VMANAGE_TENANT', + default=None, + help='vManage Tenant Name (env: VMANAGE_TENANT)', + required=False) @click.pass_context -def vmanage(ctx, host, username, password): - ctx.obj = Viptela(host, username, password) +def vmanage(ctx, host, username, password, tenant): + ctx.obj = Viptela(host, username, password, tenant) vmanage.add_command(activate) diff --git a/vmanage/api/authentication.py b/vmanage/api/authentication.py index 46f296b..ed807f0 100644 --- a/vmanage/api/authentication.py +++ b/vmanage/api/authentication.py @@ -3,6 +3,7 @@ from __future__ import (absolute_import, division, print_function) +import json import requests import urllib3 from vmanage.api.utilities import Utilities @@ -19,7 +20,7 @@ class Authentication(object): HTTP(S) Request session object will be returned. """ - def __init__(self, host=None, user=None, password=None, port=443, validate_certs=False, timeout=10): + def __init__(self, host=None, user=None, password=None, tenant=None, port=443, validate_certs=False, timeout=10): """Initialize Authentication object with session parameters. Args: @@ -37,6 +38,7 @@ def __init__(self, host=None, user=None, password=None, port=443, validate_certs self.host = host self.user = user self.password = password + self.tenant = tenant self.port = port self.timeout = timeout self.base_url = f'https://{self.host}:{self.port}/dataservice/' @@ -80,6 +82,28 @@ def login(self): response = self.session.get(url=url, timeout=self.timeout) self.session.headers['X-XSRF-TOKEN'] = response.content + if self.tenant: + api = 'tenant' + url = f'{self.base_url}{api}' + response = self.session.get(url=url, timeout=self.timeout) + tenant_list = json.loads(response.content)['data'] + tenant_pair = dict((i['name'], i['tenantId']) for i in tenant_list) + + if self.tenant in tenant_pair: + tenant_id = tenant_pair[self.tenant] + else: + raise Exception('Tenant not found, check tenant name.') + + api = f'tenant/{tenant_id}/switch' + url = f'{self.base_url}{api}' + response = self.session.post(url=url, + timeout=self.timeout) + + if (response.status_code != 200 or response.text.startswith('')): + raise Exception('Tenant login failed, check user credentials.') + + self.session.headers["VSessionId"] = json.loads(response.content)['VSessionId'] + except requests.exceptions.RequestException as e: raise Exception(f'Could not connect to {self.host}: {e}') From 6a23425a2eea8ceff5daf55366d69a97d55b7872 Mon Sep 17 00:00:00 2001 From: Octavian Preda Date: Wed, 20 May 2020 20:14:18 +0300 Subject: [PATCH 2/5] Defaulting Viptela class to non multi tenant --- vmanage/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vmanage/__main__.py b/vmanage/__main__.py index 0475f9f..a7915cf 100644 --- a/vmanage/__main__.py +++ b/vmanage/__main__.py @@ -22,7 +22,7 @@ def __call__(self, *args, **kwargs): class Viptela(object): - def __init__(self, host, username, password, tenant): + def __init__(self, host, username, password, tenant=None): self.host = host self.username = username self.password = password @@ -53,7 +53,7 @@ def auth(self): help='vManage Tenant Name (env: VMANAGE_TENANT)', required=False) @click.pass_context -def vmanage(ctx, host, username, password, tenant): +def vmanage(ctx, host, username, password, tenant=None): ctx.obj = Viptela(host, username, password, tenant) From 3a4299fb20a243bf28eca419a2d6895d49df5216 Mon Sep 17 00:00:00 2001 From: Octavian Preda Date: Wed, 20 May 2020 20:27:44 +0300 Subject: [PATCH 3/5] Format fix --- vmanage/api/authentication.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/vmanage/api/authentication.py b/vmanage/api/authentication.py index ed807f0..f019d11 100644 --- a/vmanage/api/authentication.py +++ b/vmanage/api/authentication.py @@ -91,18 +91,17 @@ def login(self): if self.tenant in tenant_pair: tenant_id = tenant_pair[self.tenant] - else: - raise Exception('Tenant not found, check tenant name.') - - api = f'tenant/{tenant_id}/switch' - url = f'{self.base_url}{api}' - response = self.session.post(url=url, - timeout=self.timeout) + api = f'tenant/{tenant_id}/switch' + url = f'{self.base_url}{api}' + response = self.session.post(url=url, + timeout=self.timeout) - if (response.status_code != 200 or response.text.startswith('')): - raise Exception('Tenant login failed, check user credentials.') + if (response.status_code != 200 or response.text.startswith('')): + raise Exception('Tenant login failed, check user credentials.') - self.session.headers["VSessionId"] = json.loads(response.content)['VSessionId'] + self.session.headers["VSessionId"] = json.loads(response.content)['VSessionId'] + else: + raise Exception('Tenant not found, check tenant name.') except requests.exceptions.RequestException as e: raise Exception(f'Could not connect to {self.host}: {e}') From 20637a1ab09a6813f1c1a3ecd1961bfcb90be532 Mon Sep 17 00:00:00 2001 From: Octavian Preda Date: Wed, 20 May 2020 20:53:32 +0300 Subject: [PATCH 4/5] Format fix --- vmanage/__main__.py | 3 ++- vmanage/api/authentication.py | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vmanage/__main__.py b/vmanage/__main__.py index a7915cf..ab9a777 100644 --- a/vmanage/__main__.py +++ b/vmanage/__main__.py @@ -33,7 +33,8 @@ def __init__(self, host, username, password, tenant=None): @property def auth(self): if self.__auth is None: - self.__auth = Authentication(host=self.host, user=self.username, password=self.password, tenant=self.tenant).login() + self.__auth = Authentication(host=self.host, user=self.username, password=self.password, + tenant=self.tenant).login() return self.__auth diff --git a/vmanage/api/authentication.py b/vmanage/api/authentication.py index f019d11..81c5fcc 100644 --- a/vmanage/api/authentication.py +++ b/vmanage/api/authentication.py @@ -93,8 +93,7 @@ def login(self): tenant_id = tenant_pair[self.tenant] api = f'tenant/{tenant_id}/switch' url = f'{self.base_url}{api}' - response = self.session.post(url=url, - timeout=self.timeout) + response = self.session.post(url=url, timeout=self.timeout) if (response.status_code != 200 or response.text.startswith('')): raise Exception('Tenant login failed, check user credentials.') From 4d107dcedbbb250d8eb480e7236d5ca7a34995ed Mon Sep 17 00:00:00 2001 From: Jason King Date: Wed, 19 Aug 2020 15:53:57 -0700 Subject: [PATCH 5/5] Fix formatting errors --- vmanage/__main__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vmanage/__main__.py b/vmanage/__main__.py index 2341609..41f5182 100644 --- a/vmanage/__main__.py +++ b/vmanage/__main__.py @@ -35,8 +35,11 @@ def __init__(self, host, port, username, password, tenant=None): @property def auth(self): if self.__auth is None: - self.__auth = Authentication(host=self.host, port=self.port, user=self.username, - password=self.password, tenant=self.tenant).login() + self.__auth = Authentication(host=self.host, + port=self.port, + user=self.username, + password=self.password, + tenant=self.tenant).login() return self.__auth