From dd63248d0730037127504e3e915316fde6eb4e0a Mon Sep 17 00:00:00 2001 From: gary-hessler Date: Tue, 24 Jun 2014 12:11:39 -0600 Subject: [PATCH 1/4] Fixing Keystone URL to be base URL only. --- monagent/collector/checks_d/http_check.py | 2 +- monagent/forwarder/api/__init__.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/monagent/collector/checks_d/http_check.py b/monagent/collector/checks_d/http_check.py index 9ab19cb5..3619da76 100644 --- a/monagent/collector/checks_d/http_check.py +++ b/monagent/collector/checks_d/http_check.py @@ -37,7 +37,7 @@ class HTTPCheck(ServicesCheck): config = get_config() api_config = config['Api'] if use_keystone: - keystone = Keystone(api_config['keystone_url'] + '/tokens', + keystone = Keystone(api_config['keystone_url'].rstrip('/') + '/auth/tokens', api_config['username'], api_config['password'], api_config['project_name']) diff --git a/monagent/forwarder/api/__init__.py b/monagent/forwarder/api/__init__.py index e8a7beef..cc25557e 100644 --- a/monagent/forwarder/api/__init__.py +++ b/monagent/forwarder/api/__init__.py @@ -30,7 +30,7 @@ class MonAPI(object): try: log.debug("Getting token from Keystone") - self.keystone_url = config['keystone_url'] + '/tokens' + self.keystone_url = config['keystone_url'].rstrip('/') + '/auth/tokens' self.username = config['username'] self.password = config['password'] self.project_name = config['project_name'] @@ -39,7 +39,7 @@ class MonAPI(object): self.username, self.password, self.project_name) - self.token = self.keystone.get_token() + self.token = None except Exception as ex: log.error("Error getting token from Keystone: {0}". @@ -61,6 +61,8 @@ class MonAPI(object): 'jsonbody': data } try: + if not self.token: + self.token = self.keystone.get_token() done = False while not done: response = self.mon_client.metrics.create(**kwargs) From 52604d7864844594483dc2f5284686ac537173b9 Mon Sep 17 00:00:00 2001 From: gary-hessler Date: Thu, 26 Jun 2014 10:22:11 -0600 Subject: [PATCH 2/4] Removed the try/except in constructor, moved the client object creation to separate method. --- monagent/collector/checks_d/http_check.py | 2 +- monagent/common/keystone.py | 2 +- monagent/forwarder/api/__init__.py | 62 +++++++++++------------ 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/monagent/collector/checks_d/http_check.py b/monagent/collector/checks_d/http_check.py index 3619da76..9e210d7d 100644 --- a/monagent/collector/checks_d/http_check.py +++ b/monagent/collector/checks_d/http_check.py @@ -37,7 +37,7 @@ class HTTPCheck(ServicesCheck): config = get_config() api_config = config['Api'] if use_keystone: - keystone = Keystone(api_config['keystone_url'].rstrip('/') + '/auth/tokens', + keystone = Keystone(api_config['keystone_url'], api_config['username'], api_config['password'], api_config['project_name']) diff --git a/monagent/common/keystone.py b/monagent/common/keystone.py index ef62d86c..aed4519f 100644 --- a/monagent/common/keystone.py +++ b/monagent/common/keystone.py @@ -40,7 +40,7 @@ class Keystone(object): return cls._instance def __init__(self, endpoint, user_id, password, project_name): - self.endpoint = endpoint + self.endpoint = endpoint.rstrip('/') + '/auth/tokens' self.user_id = user_id self.password = password self.project_name = project_name diff --git a/monagent/forwarder/api/__init__.py b/monagent/forwarder/api/__init__.py index cc25557e..65c5d26a 100644 --- a/monagent/forwarder/api/__init__.py +++ b/monagent/forwarder/api/__init__.py @@ -28,29 +28,17 @@ class MonAPI(object): if not 'hostname' in self.default_dimensions: self.default_dimensions['hostname'] = get_hostname() - try: - log.debug("Getting token from Keystone") - self.keystone_url = config['keystone_url'].rstrip('/') + '/auth/tokens' - self.username = config['username'] - self.password = config['password'] - self.project_name = config['project_name'] - - self.keystone = Keystone(self.keystone_url, - self.username, - self.password, - self.project_name) - self.token = None - - except Exception as ex: - log.error("Error getting token from Keystone: {0}". - format(str(ex.message))) - raise ex - - # construct the mon client - self.kwargs = { - 'token': self.token - } - self.mon_client = client.Client(self.api_version, self.url, **self.kwargs) + log.debug("Getting token from Keystone") + self.keystone_url = config['keystone_url'] + self.username = config['username'] + self.password = config['password'] + self.project_name = config['project_name'] + + self.keystone = Keystone(self.keystone_url, + self.username, + self.password, + self.project_name) + self.mon_client = None def _post(self, measurements): """Does the actual http post @@ -61,8 +49,10 @@ class MonAPI(object): 'jsonbody': data } try: - if not self.token: - self.token = self.keystone.get_token() + if not self.mon_client: + # construct the mon client + self.mon_client = self.get_client() + done = False while not done: response = self.mon_client.metrics.create(**kwargs) @@ -74,12 +64,8 @@ class MonAPI(object): # Good status from web service but some type of issue # with the data if response.status_code == 401: - # Get a new token and retry - self.token = self.keystone.refresh_token() - # Re-create the client. This is temporary until - # the client is updated to be able to reset the - # token. - self.mon_client = client.Client(self.api_version, self.url, **self.kwargs) + # Get a new token/client and retry + self.mon_client = self.get_client() continue else: error_msg = "Successful web service call but there" + \ @@ -107,3 +93,17 @@ class MonAPI(object): measurement.dimensions.update({dimension: self.default_dimensions[dimension]}) self._post(measurements) + + def get_client(self): + """get_client + get a new mon-client object + """ + token = self.keystone.refresh_token() + # Re-create the client. This is temporary until + # the client is updated to be able to reset the + # token. + kwargs = { + 'token': token + } + return client.Client(self.api_version, self.url, **self.kwargs) + From 974bd5a28924e4c329c8ed5df2ba531ebb397275 Mon Sep 17 00:00:00 2001 From: gary-hessler Date: Thu, 26 Jun 2014 14:24:24 -0600 Subject: [PATCH 3/4] Fixed one minor bug in MonAPI class --- monagent/forwarder/api/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/monagent/forwarder/api/__init__.py b/monagent/forwarder/api/__init__.py index 65c5d26a..a6d06b68 100644 --- a/monagent/forwarder/api/__init__.py +++ b/monagent/forwarder/api/__init__.py @@ -105,5 +105,4 @@ class MonAPI(object): kwargs = { 'token': token } - return client.Client(self.api_version, self.url, **self.kwargs) - + return client.Client(self.api_version, self.url, **kwargs) From b2125705f2138d075cc259d9bee94b32e644e759 Mon Sep 17 00:00:00 2001 From: gary-hessler Date: Thu, 26 Jun 2014 15:20:56 -0600 Subject: [PATCH 4/4] Moved modification of URL to get_token method. --- monagent/common/keystone.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monagent/common/keystone.py b/monagent/common/keystone.py index aed4519f..ff9a168c 100644 --- a/monagent/common/keystone.py +++ b/monagent/common/keystone.py @@ -40,7 +40,7 @@ class Keystone(object): return cls._instance def __init__(self, endpoint, user_id, password, project_name): - self.endpoint = endpoint.rstrip('/') + '/auth/tokens' + self.endpoint = endpoint self.user_id = user_id self.password = password self.project_name = project_name @@ -57,7 +57,7 @@ class Keystone(object): self.password_auth['auth']['scope']['project']['name'] = self.project_name data = json.dumps(self.password_auth) headers = {'Content-Type': 'application/json'} - response = requests.post(self.endpoint, data=data, headers=headers) + response = requests.post(self.endpoint.rstrip('/') + '/auth/tokens', data=data, headers=headers) response.raise_for_status() self.token = response.headers['X-Subject-Token'] return self.token