1 # Copyright 2017 Intel Research and Development Ireland Limited
2 # *************************************************************
4 # This file is part of OSM Monitoring module
5 # All Rights Reserved to Intel Corporation
7 # Licensed under the Apache License, Version 2.0 (the "License"); you may
8 # not use this file except in compliance with the License. You may obtain
9 # a copy of the License at
11 # http://www.apache.org/licenses/LICENSE-2.0
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16 # License for the specific language governing permissions and limitations
19 # For those usages not covered by the Apache License, Version 2.0 please
20 # contact: helena.mcgough@intel.com or adrian.hoban@intel.com
22 # __author__ = "Helena McGough"
23 """Test an end to end Openstack metric requests."""
29 from osm_mon
.core
.message_bus
.producer
import KafkaProducer
as prod
31 from kafka
import KafkaConsumer
32 from kafka
import KafkaProducer
36 from osm_mon
.plugins
.OpenStack
import response
38 from osm_mon
.plugins
.OpenStack
.Gnocchi
import metrics
40 from osm_mon
.plugins
.OpenStack
.common
import Common
42 log
= logging
.getLogger(__name__
)
44 # Instances for the openstack common and metric classes
45 metric_req
= metrics
.Metrics()
46 openstack_auth
= Common()
48 # A metric_request consumer and a producer for testing purposes
49 producer
= KafkaProducer(bootstrap_servers
='localhost:9092')
50 req_consumer
= KafkaConsumer(bootstrap_servers
='localhost:9092',
52 req_consumer
.subscribe("metric_request")
55 @mock.patch
.object(metrics
.Metrics
, "configure_metric")
56 @mock.patch
.object(prod
, "create_metrics_resp")
57 @mock.patch
.object(response
.OpenStack_Response
, "generate_response")
58 def test_create_metric_req(resp
, create_resp
, config_metric
):
59 """Test Gnocchi create metric request message from producer."""
60 # Set-up message, producer and consumer for tests
61 payload
= {"vim_type": "OpenSTACK",
62 "correlation_id": 123,
64 {"metric_name": "my_metric",
65 "resource_uuid": "resource_id"}}
67 producer
.send('metric_request', key
="create_metric_request",
68 value
=json
.dumps(payload
))
70 for message
in req_consumer
:
71 # Check the vim desired by the message
72 vim_type
= json
.loads(message
.value
)["vim_type"].lower()
73 if vim_type
== "openstack":
74 # A valid metric is created
75 config_metric
.return_value
= "metric_id", "resource_id", True
76 metric_req
.metric_calls(message
, openstack_auth
, None)
78 # A response message is generated and sent by MON's producer
79 resp
.assert_called_with(
80 'create_metric_response', status
=True, cor_id
=123,
81 metric_id
="metric_id", r_id
="resource_id")
82 create_resp
.assert_called_with(
83 'create_metric_response', resp
.return_value
, 'metric_response')
88 @mock.patch
.object(metrics
.Metrics
, "delete_metric")
89 @mock.patch
.object(prod
, "delete_metric_response")
90 @mock.patch
.object(response
.OpenStack_Response
, "generate_response")
91 def test_delete_metric_req(resp
, del_resp
, del_metric
):
92 """Test Gnocchi delete metric request message from producer."""
93 # Set-up message, producer and consumer for tests
94 payload
= {"vim_type": "OpenSTACK",
95 "correlation_id": 123,
96 "metric_uuid": "metric_id",
97 "metric_name": "metric_name",
98 "resource_uuid": "resource_id"}
100 producer
.send('metric_request', key
="delete_metric_request",
101 value
=json
.dumps(payload
))
103 for message
in req_consumer
:
104 # Check the vim desired by the message
105 vim_type
= json
.loads(message
.value
)["vim_type"].lower()
106 if vim_type
== "openstack":
107 # Metric has been deleted
108 del_metric
.return_value
= True
109 metric_req
.metric_calls(message
, openstack_auth
, None)
111 # A response message is generated and sent by MON's producer
112 resp
.assert_called_with(
113 'delete_metric_response', m_id
="metric_id",
114 m_name
="metric_name", status
=True, r_id
="resource_id",
116 del_resp
.assert_called_with(
117 'delete_metric_response', resp
.return_value
, 'metric_response')
122 @mock.patch
.object(metrics
.Metrics
, "read_metric_data")
123 @mock.patch
.object(prod
, "read_metric_data_response")
124 @mock.patch
.object(response
.OpenStack_Response
, "generate_response")
125 def test_read_metric_data_req(resp
, read_resp
, read_data
):
126 """Test Gnocchi read metric data request message from producer."""
127 # Set-up message, producer and consumer for tests
128 payload
= {"vim_type": "OpenSTACK",
129 "correlation_id": 123,
130 "metric_uuid": "metric_id",
131 "metric_name": "metric_name",
132 "resource_uuid": "resource_id"}
134 producer
.send('metric_request', key
="read_metric_data_request",
135 value
=json
.dumps(payload
))
137 for message
in req_consumer
:
138 # Check the vim desired by the message
139 vim_type
= json
.loads(message
.value
)["vim_type"].lower()
140 if vim_type
== "openstack":
141 # Mock empty lists generated by the request message
142 read_data
.return_value
= [], []
143 metric_req
.metric_calls(message
, openstack_auth
, None)
145 # A response message is generated and sent by MON's producer
146 resp
.assert_called_with(
147 'read_metric_data_response', m_id
="metric_id",
148 m_name
="metric_name", r_id
="resource_id", cor_id
=123, times
=[],
150 read_resp
.assert_called_with(
151 'read_metric_data_response', resp
.return_value
,
157 @mock.patch
.object(metrics
.Metrics
, "list_metrics")
158 @mock.patch
.object(prod
, "list_metric_response")
159 @mock.patch
.object(response
.OpenStack_Response
, "generate_response")
160 def test_list_metrics_req(resp
, list_resp
, list_metrics
):
161 """Test Gnocchi list metrics request message from producer."""
162 # Set-up message, producer and consumer for tests
163 payload
= {"vim_type": "OpenSTACK",
164 "metrics_list_request":
165 {"correlation_id": 123, }}
167 producer
.send('metric_request', key
="list_metric_request",
168 value
=json
.dumps(payload
))
170 for message
in req_consumer
:
171 # Check the vim desired by the message
172 vim_type
= json
.loads(message
.value
)["vim_type"].lower()
173 if vim_type
== "openstack":
174 # Mock an empty list generated by the request
175 list_metrics
.return_value
= []
176 metric_req
.metric_calls(message
, openstack_auth
, None)
178 # A response message is generated and sent by MON's producer
179 resp
.assert_called_with(
180 'list_metric_response', m_list
=[], cor_id
=123)
181 list_resp
.assert_called_with(
182 'list_metric_response', resp
.return_value
, 'metric_response')
187 @mock.patch
.object(metrics
.Metrics
, "get_metric_id")
188 @mock.patch
.object(prod
, "update_metric_response")
189 @mock.patch
.object(response
.OpenStack_Response
, "generate_response")
190 def test_update_metrics_req(resp
, update_resp
, get_id
):
191 """Test Gnocchi update metric request message from KafkaProducer."""
192 # Set-up message, producer and consumer for tests
193 payload
= {"vim_type": "OpenSTACK",
194 "correlation_id": 123,
196 {"metric_name": "my_metric",
197 "resource_uuid": "resource_id", }}
199 producer
.send('metric_request', key
="update_metric_request",
200 value
=json
.dumps(payload
))
202 for message
in req_consumer
:
203 # Check the vim desired by the message
204 vim_type
= json
.loads(message
.value
)["vim_type"].lower()
205 if vim_type
== "openstack":
206 # Gnocchi doesn't support metric updates
207 get_id
.return_value
= "metric_id"
208 metric_req
.metric_calls(message
, openstack_auth
, None)
210 # Reponse message is generated and sent via MON's producer
211 # No metric update has taken place
212 resp
.assert_called_with(
213 'update_metric_response', status
=False, cor_id
=123,
214 r_id
="resource_id", m_id
="metric_id")
215 update_resp
.assert_called_with(
216 'update_metric_response', resp
.return_value
, 'metric_response')