2 # -*- coding: UTF-8 -*-
4 # Copyright (c) 2017 Orange and others.
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 """This module manages calls to Energy recording API."""
18 import functest.utils.functest_utils as ft_utils
21 def enable_recording(method):
23 Decorator to record energy during "method" exection.
25 param method: Method to suround with start and stop
26 :type method: function
28 .. note:: "method" should belong to a class having a "case_name"
32 """Wrapper for decorator to handle method arguments."""
33 EnergyRecorder.start(args[0].case_name)
34 return_value = method(*args)
40 # Class to manage energy recording sessions
41 class EnergyRecorder(object):
42 """Manage Energy recording session."""
44 logger = logging.getLogger(__name__)
45 # Energy recording API connectivity settings
46 # see load_config method
47 energy_recorder_api = None
49 # Default initial step
50 INITIAL_STEP = "starting"
55 Load connectivity settings from yaml.
57 Load connectivity settings to Energy recording API
58 Use functest global config yaml file
59 (see functest_utils.get_functest_config)
61 # Singleton pattern for energy_recorder_api static member
62 # Load only if not previouly done
63 if EnergyRecorder.energy_recorder_api is None:
64 environment = ft_utils.get_pod_name()
67 energy_recorder_uri = ft_utils.get_functest_config(
68 "energy_recorder.api_url")
69 assert energy_recorder_uri
72 energy_recorder_uri += "/recorders/environment/"
73 energy_recorder_uri += urllib.quote_plus(environment)
74 EnergyRecorder.logger.debug(
75 "API recorder at: " + energy_recorder_uri)
78 user = ft_utils.get_functest_config(
79 "energy_recorder.api_user")
80 password = ft_utils.get_functest_config(
81 "energy_recorder.api_password")
83 if user != "" and password != "":
84 energy_recorder_api_auth = (user, password)
86 energy_recorder_api_auth = None
89 EnergyRecorder.energy_recorder_api = {
90 "uri": energy_recorder_uri,
91 "auth": energy_recorder_api_auth
97 Start a recording session for scenario.
99 param scenario: Starting scenario
100 :type scenario: string
104 EnergyRecorder.logger.debug("Starting recording")
105 # Ensure that connectyvity settings are loaded
106 EnergyRecorder.load_config()
110 "step": EnergyRecorder.INITIAL_STEP,
113 # Call API to start energy recording
114 response = requests.post(
115 EnergyRecorder.energy_recorder_api["uri"],
116 data=json.dumps(payload),
117 auth=EnergyRecorder.energy_recorder_api["auth"],
119 'content-type': 'application/json'
122 if response.status_code != 200:
123 log_msg = "Error while starting energy recording session\n{}"
124 log_msg = log_msg.format(response.text)
125 EnergyRecorder.logger.info(log_msg)
126 return_status = False
128 except Exception: # pylint: disable=broad-except
129 # Default exception handler to ensure that method
131 EnergyRecorder.logger.exception(
132 "Error while starting energy recorder API"
134 return_status = False
139 """Stop current recording session."""
140 EnergyRecorder.logger.debug("Stopping recording")
143 # Ensure that connectyvity settings are loaded
144 EnergyRecorder.load_config()
146 # Call API to stop energy recording
147 response = requests.delete(
148 EnergyRecorder.energy_recorder_api["uri"],
149 auth=EnergyRecorder.energy_recorder_api["auth"],
151 'content-type': 'application/json'
154 if response.status_code != 200:
155 log_msg = "Error while stating energy recording session\n{}"
156 log_msg = log_msg.format(response.text)
157 EnergyRecorder.logger.error(log_msg)
158 return_status = False
159 except Exception: # pylint: disable=broad-except
160 # Default exception handler to ensure that method
162 EnergyRecorder.logger.exception(
163 "Error while stoping energy recorder API"
165 return_status = False
170 """Notify energy recording service of current step of the testcase."""
171 EnergyRecorder.logger.debug("Setting step")
174 # Ensure that connectyvity settings are loaded
175 EnergyRecorder.load_config()
182 # Call API to define step
183 response = requests.post(
184 EnergyRecorder.energy_recorder_api["uri"] + "/step",
185 data=json.dumps(payload),
186 auth=EnergyRecorder.energy_recorder_api["auth"],
188 'content-type': 'application/json'
191 if response.status_code != 200:
192 log_msg = "Error while setting current step of testcase\n{}"
193 log_msg = log_msg.format(response.text)
194 EnergyRecorder.logger.error(log_msg)
195 return_status = False
196 except Exception: # pylint: disable=broad-except
197 # Default exception handler to ensure that method
199 EnergyRecorder.logger.exception(
200 "Error while setting step on energy recorder API"
202 return_status = False