1 # -*- coding: utf-8 -*-
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
18 from http
import HTTPStatus
19 from urllib
.parse
import quote
20 from osm_nbi
.base_topic
import EngineException
22 __author__
= "Vijay R S <vijay.r@tataelxsi.co.in>"
26 def __init__(self
, db
, host
=None, port
=None):
28 self
.url
= 'http://{}:{}'.format(host
, port
)
29 self
.nfvi_metric_list
= ['cpu_utilization', 'average_memory_utilization', 'disk_read_ops',
30 'disk_write_ops', 'disk_read_bytes', 'disk_write_bytes',
31 'packets_dropped', 'packets_sent', 'packets_received']
33 def _get_vnf_metric_list(self
, ns_id
):
34 metric_list
= self
.nfvi_metric_list
.copy()
35 vnfr_desc
= self
.db
.get_list("vnfrs", {"nsr-id-ref": ns_id
})
37 raise EngineException("NS not found with id {}".format(ns_id
), http_code
=HTTPStatus
.NOT_FOUND
)
39 for vnfr
in vnfr_desc
:
40 vnfd_desc
= self
.db
.get_one("vnfds", {"_id": vnfr
["vnfd-id"]}, fail_on_empty
=True, fail_on_more
=False)
41 if vnfd_desc
.get("vdu"):
42 for vdu
in vnfd_desc
['vdu']:
43 # Checks for vdu metric in vdu-configuration
44 if 'vdu-configuration' in vdu
and 'metrics' in vdu
['vdu-configuration']:
45 metric_list
.extend([quote(metric
['name'])
46 for metric
in vdu
["vdu-configuration"]["metrics"]])
47 # Checks for vnf metric in vnf-configutaion
48 if 'vnf-configuration' in vnfd_desc
and 'metrics' in vnfd_desc
['vnf-configuration']:
49 metric_list
.extend([quote(metric
['name']) for metric
in vnfd_desc
["vnf-configuration"]["metrics"]])
50 metric_list
= list(set(metric_list
))
53 async def _prom_metric_request(self
, ns_id
, metrics_list
):
55 async with aiohttp
.ClientSession() as session
:
57 for metlist
in metrics_list
:
58 request_url
= self
.url
+'/api/v1/query?query=osm_'+metlist
+"{ns_id='"+ns_id
+"'}"
59 async with session
.get(request_url
) as resp
:
60 resp
= await resp
.json()
61 resp
= resp
['data']['result']
65 except aiohttp
.client_exceptions
.ClientConnectorError
as e
:
66 raise EngineException("Connection to '{}'Failure: {}".format(self
.url
, e
))
68 def show(self
, session
, ns_id
):
69 metrics_list
= self
._get
_vnf
_metric
_list
(ns_id
)
70 loop
= asyncio
.new_event_loop()
71 asyncio
.set_event_loop(loop
)
72 prom_metric
= loop
.run_until_complete(self
._prom
_metric
_request
(ns_id
, metrics_list
))
75 for index_list
in prom_metric
:
76 for index
in index_list
:
77 process_metric
= {'performanceValue': {'performanceValue': {}}}
78 process_metric
['objectInstanceId'] = index
['metric']['ns_id']
79 process_metric
['performanceMetric'] = index
['metric']['__name__']
80 process_metric
['performanceValue']['timestamp'] = index
['value'][0]
81 process_metric
['performanceValue']['performanceValue']['performanceValue'] = index
['value'][1]
82 process_metric
['performanceValue']['performanceValue']['vnfMemberIndex'] \
83 = index
['metric']['vnf_member_index']
84 if 'vdu_name' not in index
['metric']:
87 process_metric
['performanceValue']['performanceValue']['vduName'] = index
['metric']['vdu_name']
88 metric_temp
.append(process_metric
)
89 metric
['entries'] = metric_temp