Skip to content

Commit 0e4f1b9

Browse files
authored
Merge pull request #112 from Helene/singleton
make MetadataHandler class Singleton
2 parents f0b66b5 + 98504c6 commit 0e4f1b9

File tree

3 files changed

+87
-12
lines changed

3 files changed

+87
-12
lines changed

source/metaclasses.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'''
2+
##############################################################################
3+
# Copyright 2023 IBM Corp.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
##############################################################################
17+
18+
Created on Sep 22, 2023
19+
20+
@author: HWASSMAN
21+
'''
22+
23+
24+
class Singleton(type):
25+
"""metaclass to make a class a singleton"""
26+
_instances = {}
27+
28+
def __call__(cls, *args, **kwargs):
29+
if cls not in cls._instances:
30+
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
31+
return cls._instances[cls]

source/zimonGrafanaIntf.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,28 @@
3434
from queryHandler import SensorConfig
3535
from __version__ import __version__
3636
from messages import ERR, MSG
37+
from metaclasses import Singleton
3738
from bridgeLogger import configureLogging
3839
from confParser import getSettings
3940
from collections import defaultdict
4041
from timeit import default_timer as timer
4142
from time import sleep
4243

4344

44-
class MetadataHandler():
45+
class MetadataHandler(metaclass=Singleton):
4546

46-
def __init__(self, logger, server, port, apiKeyName, apiKeyValue, caCertPath=False, includeDiskData=False, sleepTime=None):
47+
def __init__(self, **kwargs):
4748
self.__qh = None
4849
self.__sensorsConf = None
4950
self.__metaData = None
50-
self.logger = logger
51-
self.server = server
52-
self.port = port
53-
self.apiKeyName = apiKeyName
54-
self.apiKeyValue = apiKeyValue
55-
self.caCertPath = caCertPath
56-
self.includeDiskData = includeDiskData
57-
self.sleepTime = sleepTime or 60
51+
self.logger = kwargs['logger']
52+
self.server = kwargs['server']
53+
self.port = kwargs['port']
54+
self.apiKeyName = kwargs['apiKeyName']
55+
self.apiKeyValue = kwargs['apiKeyValue']
56+
self.caCertPath = kwargs.get('caCertPath', False)
57+
self.includeDiskData = kwargs.get('includeDiskData', False)
58+
self.sleepTime = kwargs.get('sleepTime', 60)
5859

5960
self.__initializeTables()
6061

@@ -625,8 +626,8 @@ def main(argv):
625626
logger.info("%s", MSG['BridgeVersionInfo'].format(__version__))
626627
logger.details('zimonGrafanaItf invoked with parameters:\n %s', "\n".join("{}={}".format(k, v) for k, v in args.items() if not k == 'apiKeyValue'))
627628
# logger.details('zimonGrafanaItf invoked with parameters:\n %s', "\n".join("{}={}".format(k, type(v)) for k, v in args.items()))
628-
mdHandler = MetadataHandler(logger, args.get('server'), args.get('serverPort'), args.get('apiKeyName'), resolveAPIKeyValue(args.get('apiKeyValue')),
629-
args.get('caCertPath'), args.get('includeDiskData'), args.get('retryDelay', None))
629+
mdHandler = MetadataHandler(logger=logger, server=args.get('server'), port=args.get('serverPort'), apiKeyName=args.get('apiKeyName'), apiKeyValue=resolveAPIKeyValue(args.get('apiKeyValue')),
630+
caCertPath=args.get('caCertPath'), includeDiskData=args.get('includeDiskData'), sleepTime=args.get('retryDelay', None))
630631
except (AttributeError, TypeError, ValueError) as e:
631632
logger.details('%s', MSG['IntError'].format(str(e)))
632633
logger.error(MSG['MetaError'])

tests/test_metadatahandler.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import os
2+
from source.bridgeLogger import configureLogging
3+
from source.zimonGrafanaIntf import MetadataHandler
4+
from nose2.tools.such import helper as assert_helper
5+
from nose2.tools.decorators import with_setup
6+
7+
8+
def my_setup():
9+
global path, logger, mainSensorsConfig, wrongSensorsConfig, sensorsCount, myFile
10+
path = os.getcwd()
11+
logger = configureLogging(path, None)
12+
mainSensorsConfig = 'ZIMonSensors.cfg'
13+
wrongSensorsConfig = 'ZIMonSensors-protocols-wrong.cfg'
14+
myFile = os.path.join(path, "tests", "test_data", mainSensorsConfig)
15+
sensorsCount = 0
16+
17+
18+
@with_setup(my_setup)
19+
def test_case01():
20+
with assert_helper.assertRaises(KeyError):
21+
MetadataHandler()
22+
23+
24+
@with_setup(my_setup)
25+
def test_case02():
26+
with assert_helper.assertRaises(KeyError):
27+
MetadataHandler(logger=logger, apiKeyName='scale_grafana')
28+
29+
30+
@with_setup(my_setup)
31+
def test_case03():
32+
with assert_helper.assertRaises(KeyError):
33+
MetadataHandler(logger=logger, server='localhost', port='4242', apiKeyName='scale_grafana')
34+
35+
36+
@with_setup(my_setup)
37+
def test_case04():
38+
with assert_helper.assertRaises(OSError):
39+
md = MetadataHandler(logger=logger, server='localhost', port='4242', apiKeyName='scale_grafana', apiKeyValue='85bbe7f2-5f0f-43c8-88dd-9673c9e61390')
40+
md1 = MetadataHandler()
41+
assert md == md1
42+
assert md1.logger == logger
43+
assert md1.apiKeyName == 'scale_grafana'

0 commit comments

Comments
 (0)