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."""
17 from functools import wraps
20 import functest.utils.functest_utils as ft_utils
23 def finish_session(current_scenario):
24 """Finish a recording session."""
25 if current_scenario is None:
28 EnergyRecorder.submit_scenario(
29 current_scenario["scenario"],
30 current_scenario["step"]
34 def enable_recording(method):
36 Record energy during method execution.
38 Decorator to record energy during "method" exection.
40 param method: Method to suround with start and stop
41 :type method: function
43 .. note:: "method" should belong to a class having a "case_name"
49 Record energy during method execution (implementation).
51 Wrapper for decorator to handle method arguments.
53 current_scenario = EnergyRecorder.get_current_scenario()
54 EnergyRecorder.start(args[0].case_name)
56 return_value = method(*args)
57 finish_session(current_scenario)
58 except Exception: # pylint: disable=broad-except
59 finish_session(current_scenario)
65 # Class to manage energy recording sessions
66 class EnergyRecorder(object):
67 """Manage Energy recording session."""
69 logger = logging.getLogger(__name__)
70 # Energy recording API connectivity settings
71 # see load_config method
72 energy_recorder_api = None
74 # Default initial step
75 INITIAL_STEP = "running"
80 Load connectivity settings from yaml.
82 Load connectivity settings to Energy recording API
83 Use functest global config yaml file
84 (see functest_utils.get_functest_config)
86 # Singleton pattern for energy_recorder_api static member
87 # Load only if not previouly done
88 if EnergyRecorder.energy_recorder_api is None:
89 environment = ft_utils.get_pod_name()
92 energy_recorder_uri = ft_utils.get_functest_config(
93 "energy_recorder.api_url")
94 assert energy_recorder_uri
97 energy_recorder_uri += "/recorders/environment/"
98 energy_recorder_uri += urllib.quote_plus(environment)
99 EnergyRecorder.logger.debug(
100 "API recorder at: " + energy_recorder_uri)
103 user = ft_utils.get_functest_config(
104 "energy_recorder.api_user")
105 password = ft_utils.get_functest_config(
106 "energy_recorder.api_password")
108 if user != "" and password != "":
109 energy_recorder_api_auth = (user, password)
111 energy_recorder_api_auth = None
114 EnergyRecorder.energy_recorder_api = {
115 "uri": energy_recorder_uri,
116 "auth": energy_recorder_api_auth
120 def submit_scenario(scenario, step):
122 Submit a complet scenario definition to Energy recorder API.
124 param scenario: Scenario name
125 :type scenario: string
126 param step: Step name
131 EnergyRecorder.logger.debug("Submitting scenario")
132 # Ensure that connectyvity settings are loaded
133 EnergyRecorder.load_config()
140 # Call API to start energy recording
141 response = requests.post(
142 EnergyRecorder.energy_recorder_api["uri"],
143 data=json.dumps(payload),
144 auth=EnergyRecorder.energy_recorder_api["auth"],
146 'content-type': 'application/json'
149 if response.status_code != 200:
150 log_msg = "Error while submitting scenario\n{}"
151 log_msg = log_msg.format(response.text)
152 EnergyRecorder.logger.info(log_msg)
153 return_status = False
154 except Exception: # pylint: disable=broad-except
155 # Default exception handler to ensure that method
157 EnergyRecorder.logger.exception(
158 "Error while submitting scenarion to energy recorder API"
160 return_status = False
166 Start a recording session for scenario.
168 param scenario: Starting scenario
169 :type scenario: string
173 EnergyRecorder.logger.debug("Starting recording")
174 return_status = EnergyRecorder.submit_scenario(
176 EnergyRecorder.INITIAL_STEP
179 except Exception: # pylint: disable=broad-except
180 # Default exception handler to ensure that method
182 EnergyRecorder.logger.exception(
183 "Error while starting energy recorder API"
185 return_status = False
190 """Stop current recording session."""
191 EnergyRecorder.logger.debug("Stopping recording")
194 # Ensure that connectyvity settings are loaded
195 EnergyRecorder.load_config()
197 # Call API to stop energy recording
198 response = requests.delete(
199 EnergyRecorder.energy_recorder_api["uri"],
200 auth=EnergyRecorder.energy_recorder_api["auth"],
202 'content-type': 'application/json'
205 if response.status_code != 200:
206 log_msg = "Error while stating energy recording session\n{}"
207 log_msg = log_msg.format(response.text)
208 EnergyRecorder.logger.error(log_msg)
209 return_status = False
210 except Exception: # pylint: disable=broad-except
211 # Default exception handler to ensure that method
213 EnergyRecorder.logger.exception(
214 "Error while stoping energy recorder API"
216 return_status = False
221 """Notify energy recording service of current step of the testcase."""
222 EnergyRecorder.logger.debug("Setting step")
225 # Ensure that connectyvity settings are loaded
226 EnergyRecorder.load_config()
233 # Call API to define step
234 response = requests.post(
235 EnergyRecorder.energy_recorder_api["uri"] + "/step",
236 data=json.dumps(payload),
237 auth=EnergyRecorder.energy_recorder_api["auth"],
239 'content-type': 'application/json'
242 if response.status_code != 200:
243 log_msg = "Error while setting current step of testcase\n{}"
244 log_msg = log_msg.format(response.text)
245 EnergyRecorder.logger.error(log_msg)
246 return_status = False
247 except Exception: # pylint: disable=broad-except
248 # Default exception handler to ensure that method
250 EnergyRecorder.logger.exception(
251 "Error while setting step on energy recorder API"
253 return_status = False
257 def get_current_scenario():
258 """Get current running scenario (if any, None else)."""
259 EnergyRecorder.logger.debug("Getting current scenario")
262 # Ensure that connectyvity settings are loaded
263 EnergyRecorder.load_config()
265 # Call API get running scenario
266 response = requests.get(
267 EnergyRecorder.energy_recorder_api["uri"],
268 auth=EnergyRecorder.energy_recorder_api["auth"]
270 if response.status_code == 200:
271 return_value = json.loads(response.text)
272 elif response.status_code == 404:
273 log_msg = "No current running scenario at {}"
274 log_msg = log_msg.format(
275 EnergyRecorder.energy_recorder_api["uri"])
276 EnergyRecorder.logger.error(log_msg)
279 log_msg = "Error while getting current scenario\n{}"
280 log_msg = log_msg.format(response.text)
281 EnergyRecorder.logger.error(log_msg)
283 except Exception: # pylint: disable=broad-except
284 # Default exception handler to ensure that method
286 EnergyRecorder.logger.exception(
287 "Error while getting current scenario from energy recorder API"