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 Record energy during method execution.
25 Decorator to record energy during "method" exection.
27 param method: Method to suround with start and stop
28 :type method: function
30 .. note:: "method" should belong to a class having a "case_name"
35 Record energy during method execution (implementation).
37 Wrapper for decorator to handle method arguments.
39 current_scenario = EnergyRecorder.get_current_scenario()
40 EnergyRecorder.start(args[0].case_name)
41 return_value = method(*args)
42 if current_scenario is None:
45 EnergyRecorder.submit_scenario(
46 current_scenario["scenario"],
47 current_scenario["step"]
53 # Class to manage energy recording sessions
54 class EnergyRecorder(object):
55 """Manage Energy recording session."""
57 logger = logging.getLogger(__name__)
58 # Energy recording API connectivity settings
59 # see load_config method
60 energy_recorder_api = None
62 # Default initial step
63 INITIAL_STEP = "running"
68 Load connectivity settings from yaml.
70 Load connectivity settings to Energy recording API
71 Use functest global config yaml file
72 (see functest_utils.get_functest_config)
74 # Singleton pattern for energy_recorder_api static member
75 # Load only if not previouly done
76 if EnergyRecorder.energy_recorder_api is None:
77 environment = ft_utils.get_pod_name()
80 energy_recorder_uri = ft_utils.get_functest_config(
81 "energy_recorder.api_url")
82 assert energy_recorder_uri
85 energy_recorder_uri += "/recorders/environment/"
86 energy_recorder_uri += urllib.quote_plus(environment)
87 EnergyRecorder.logger.debug(
88 "API recorder at: " + energy_recorder_uri)
91 user = ft_utils.get_functest_config(
92 "energy_recorder.api_user")
93 password = ft_utils.get_functest_config(
94 "energy_recorder.api_password")
96 if user != "" and password != "":
97 energy_recorder_api_auth = (user, password)
99 energy_recorder_api_auth = None
102 EnergyRecorder.energy_recorder_api = {
103 "uri": energy_recorder_uri,
104 "auth": energy_recorder_api_auth
108 def submit_scenario(scenario, step):
110 Submit a complet scenario definition to Energy recorder API.
112 param scenario: Scenario name
113 :type scenario: string
114 param step: Step name
119 EnergyRecorder.logger.debug("Submitting scenario")
120 # Ensure that connectyvity settings are loaded
121 EnergyRecorder.load_config()
128 # Call API to start energy recording
129 response = requests.post(
130 EnergyRecorder.energy_recorder_api["uri"],
131 data=json.dumps(payload),
132 auth=EnergyRecorder.energy_recorder_api["auth"],
134 'content-type': 'application/json'
137 if response.status_code != 200:
138 log_msg = "Error while submitting scenario\n{}"
139 log_msg = log_msg.format(response.text)
140 EnergyRecorder.logger.info(log_msg)
141 return_status = False
142 except Exception: # pylint: disable=broad-except
143 # Default exception handler to ensure that method
145 EnergyRecorder.logger.exception(
146 "Error while submitting scenarion to energy recorder API"
148 return_status = False
154 Start a recording session for scenario.
156 param scenario: Starting scenario
157 :type scenario: string
161 EnergyRecorder.logger.debug("Starting recording")
162 return_status = EnergyRecorder.submit_scenario(
164 EnergyRecorder.INITIAL_STEP
167 except Exception: # pylint: disable=broad-except
168 # Default exception handler to ensure that method
170 EnergyRecorder.logger.exception(
171 "Error while starting energy recorder API"
173 return_status = False
178 """Stop current recording session."""
179 EnergyRecorder.logger.debug("Stopping recording")
182 # Ensure that connectyvity settings are loaded
183 EnergyRecorder.load_config()
185 # Call API to stop energy recording
186 response = requests.delete(
187 EnergyRecorder.energy_recorder_api["uri"],
188 auth=EnergyRecorder.energy_recorder_api["auth"],
190 'content-type': 'application/json'
193 if response.status_code != 200:
194 log_msg = "Error while stating energy recording session\n{}"
195 log_msg = log_msg.format(response.text)
196 EnergyRecorder.logger.error(log_msg)
197 return_status = False
198 except Exception: # pylint: disable=broad-except
199 # Default exception handler to ensure that method
201 EnergyRecorder.logger.exception(
202 "Error while stoping energy recorder API"
204 return_status = False
209 """Notify energy recording service of current step of the testcase."""
210 EnergyRecorder.logger.debug("Setting step")
213 # Ensure that connectyvity settings are loaded
214 EnergyRecorder.load_config()
221 # Call API to define step
222 response = requests.post(
223 EnergyRecorder.energy_recorder_api["uri"] + "/step",
224 data=json.dumps(payload),
225 auth=EnergyRecorder.energy_recorder_api["auth"],
227 'content-type': 'application/json'
230 if response.status_code != 200:
231 log_msg = "Error while setting current step of testcase\n{}"
232 log_msg = log_msg.format(response.text)
233 EnergyRecorder.logger.error(log_msg)
234 return_status = False
235 except Exception: # pylint: disable=broad-except
236 # Default exception handler to ensure that method
238 EnergyRecorder.logger.exception(
239 "Error while setting step on energy recorder API"
241 return_status = False
245 def get_current_scenario():
246 """Get current running scenario (if any, None else)."""
247 EnergyRecorder.logger.debug("Getting current scenario")
249 print "In get current"
251 # Ensure that connectyvity settings are loaded
252 EnergyRecorder.load_config()
254 # Call API get running scenario
255 response = requests.get(
256 EnergyRecorder.energy_recorder_api["uri"],
257 auth=EnergyRecorder.energy_recorder_api["auth"]
259 if response.status_code == 200:
260 return_value = json.loads(response.text)
261 elif response.status_code == 404:
262 log_msg = "No current running scenario at {}"
263 log_msg = log_msg.format(
264 EnergyRecorder.energy_recorder_api["uri"])
265 EnergyRecorder.logger.error(log_msg)
269 log_msg = "Error while getting current scenario\n{}"
270 log_msg = log_msg.format(response.text)
271 EnergyRecorder.logger.error(log_msg)
274 except Exception: # pylint: disable=broad-except
275 # Default exception handler to ensure that method
277 EnergyRecorder.logger.exception(
278 "Error while getting current scenario from energy recorder API"