Remove Health Checker
This commit deletes the health_checker and the associated unit test. Change-Id: I0a1e4d2609c42607b021a1a5b1d3e7f29cbfea5f
This commit is contained in:
parent
f973b8acfc
commit
6fe9c32e4a
@ -1,163 +0,0 @@
|
||||
#
|
||||
# Copyright 2014-2017 AT&T Intellectual Property
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import uuid
|
||||
|
||||
from oslo_config import cfg
|
||||
|
||||
from valet.common.conf import get_logger
|
||||
from valet.common.music import REST
|
||||
from valet.engine.conf import init_engine
|
||||
|
||||
CONF = cfg.CONF
|
||||
LOG = get_logger(__name__)
|
||||
|
||||
|
||||
class HealthCheck(object):
|
||||
|
||||
rest = None
|
||||
|
||||
def __init__(self, hosts=[]):
|
||||
# default health_timeout=10
|
||||
self.tries = CONF.engine.health_timeout * 2
|
||||
self.uuid = str(uuid.uuid4())
|
||||
|
||||
kwargs = {
|
||||
'hosts': hosts,
|
||||
'port': CONF.music.port,
|
||||
'path': '/MUSIC/rest',
|
||||
'timeout': CONF.music.interval,
|
||||
}
|
||||
self.rest = REST(**kwargs)
|
||||
|
||||
def ping(self):
|
||||
|
||||
engine_id = None
|
||||
try:
|
||||
if self._send():
|
||||
engine_id = self._read_response()
|
||||
finally:
|
||||
self._delete_result()
|
||||
return engine_id
|
||||
|
||||
def _send(self):
|
||||
request = [
|
||||
{
|
||||
"action": "ping",
|
||||
"stack_id": self.uuid
|
||||
}
|
||||
]
|
||||
|
||||
data = {
|
||||
"values": {
|
||||
"stack_id": self.uuid,
|
||||
"request": request
|
||||
},
|
||||
"consistencyInfo": {
|
||||
"type": "eventual"
|
||||
}
|
||||
}
|
||||
|
||||
path = '/keyspaces/%(keyspace)s/tables/%(table)s/rows' % {
|
||||
'keyspace': CONF.music.keyspace,
|
||||
'table': CONF.music.request_table,
|
||||
}
|
||||
response = self.rest.request(method='post', path=path, data=data)
|
||||
|
||||
return response.status_code == 204 if response else False
|
||||
|
||||
def _read_response(self):
|
||||
|
||||
engine_id = None
|
||||
pre = '/keyspaces/%(keyspace)s/tables/%(table)s/rows?stack_id=%(uid)s'
|
||||
path = pre % {
|
||||
'keyspace': CONF.music.keyspace,
|
||||
'table': CONF.music.response_table,
|
||||
'uid': self.uuid,
|
||||
}
|
||||
|
||||
# default 20 tries * 0.5 sec = 10 sec. timeout
|
||||
for i in range(self.tries):
|
||||
time.sleep(0.5)
|
||||
try:
|
||||
response = self.rest.request(method='get', path=path)
|
||||
|
||||
if response.status_code == 200 and len(response.text) > 3:
|
||||
|
||||
j = json.loads(response.text)
|
||||
if j['row 0']['stack_id'] != self.uuid:
|
||||
continue
|
||||
|
||||
placement = json.loads(j['row 0']['placement'])
|
||||
engine_id = placement['resources']['id']
|
||||
break
|
||||
except Exception as e:
|
||||
LOG.warning("HealthCheck exception in read response, ", str(e))
|
||||
|
||||
return engine_id
|
||||
|
||||
def _delete_result(self):
|
||||
# leave a clean table - delete from requests and responses
|
||||
data = {
|
||||
"consistencyInfo": {"type": "eventual"}
|
||||
}
|
||||
|
||||
base = '/keyspaces/%(keyspace)s/tables/%(table)s/rows?stack_id=%(uid)s'
|
||||
try:
|
||||
path = base % {
|
||||
'keyspace': CONF.music.keyspace,
|
||||
'table': CONF.music.request_table,
|
||||
'uid': self.uuid
|
||||
}
|
||||
self.rest.request(method='delete', path=path, data=data)
|
||||
except Exception as e:
|
||||
LOG.warning("HealthCheck exception in delete request, ", str(e))
|
||||
|
||||
try:
|
||||
path = base % {
|
||||
'keyspace': CONF.music.keyspace,
|
||||
'table': CONF.music.response_table,
|
||||
'uid': self.uuid
|
||||
}
|
||||
self.rest.request(method='delete', path=path, data=data)
|
||||
except Exception as e:
|
||||
LOG.warning("HealthCheck exception in delete response, ", str(e))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
respondent_id = None
|
||||
code = 0
|
||||
init_engine(default_config_files=['/etc/valet/valet.conf'])
|
||||
|
||||
if os.path.exists(CONF.engine.pid):
|
||||
respondent_id = HealthCheck().ping()
|
||||
|
||||
if respondent_id == CONF.engine.priority:
|
||||
code = CONF.engine.priority
|
||||
LOG.info("HealthCheck - Alive, "
|
||||
"respondent instance id: {}".format(respondent_id))
|
||||
else:
|
||||
LOG.warning("HealthCheck - pid file exists, "
|
||||
"engine {} did not respond in a timely manner "
|
||||
"(respondent id {})".format(CONF.engine.priority,
|
||||
respondent_id))
|
||||
else:
|
||||
LOG.info("HealthCheck - no pid file, engine is not running!")
|
||||
sys.exit(code)
|
@ -1,93 +0,0 @@
|
||||
#
|
||||
# Copyright 2014-2017 AT&T Intellectual Property
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
import mock
|
||||
|
||||
import valet.engine.optimizer.ostro_server.health_checker as ping
|
||||
from valet.engine.optimizer.ostro_server.health_checker import HealthCheck
|
||||
from valet.tests.base import Base
|
||||
|
||||
json = (r'{"row 0":{"placement": "{\"status\": {\"message\": '
|
||||
r'\"ping\", \"type\": \"ok\"},\"resources\": '
|
||||
r'{\"ip\": \"localhost\", \"id\": %d}}","stack_id":"%s"}}')
|
||||
|
||||
|
||||
class TestHealthCheck(Base):
|
||||
|
||||
def setUp(self):
|
||||
super(TestHealthCheck, self).setUp()
|
||||
ping.CONF = mock.MagicMock()
|
||||
ping.REST = mock.MagicMock()
|
||||
self.pingger = HealthCheck()
|
||||
|
||||
@mock.patch.object(HealthCheck, '_send')
|
||||
@mock.patch.object(HealthCheck, '_read_response')
|
||||
def test_ping(self, mock_read, mock_send):
|
||||
mock_send.return_value = True
|
||||
mock_read.return_value = True
|
||||
|
||||
self.validate_test(self.pingger.ping() == 1)
|
||||
|
||||
@mock.patch.object(HealthCheck, '_send')
|
||||
@mock.patch.object(HealthCheck, '_read_response')
|
||||
def test_ping_unhappy(self, mock_read, mock_send):
|
||||
mock_send.return_value = False
|
||||
mock_read.return_value = True
|
||||
|
||||
self.validate_test(self.pingger.ping() is None)
|
||||
|
||||
@mock.patch.object(HealthCheck, '_send')
|
||||
@mock.patch.object(HealthCheck, '_read_response')
|
||||
def test_ping_unhappy_2(self, mock_read, mock_send):
|
||||
mock_send.return_value = True
|
||||
mock_read.return_value = False
|
||||
|
||||
self.validate_test(not self.pingger.ping())
|
||||
|
||||
def test_send(self):
|
||||
self.pingger.rest.request.return_value.status_code = 204
|
||||
self.validate_test(self.pingger._send())
|
||||
|
||||
def test_send_unhappy(self):
|
||||
self.pingger.rest.request.return_value.status_code = 200
|
||||
self.validate_test(not self.pingger._send())
|
||||
|
||||
def test_read_response(self):
|
||||
mid = 1
|
||||
self.pingger.rest.request.return_value.status_code = 200
|
||||
self.pingger.rest.request.return_value.text = json % (
|
||||
mid, self.pingger.uuid)
|
||||
self.validate_test(self.pingger._read_response())
|
||||
|
||||
def test_read_response_from_other_engine(self):
|
||||
my_id = 1
|
||||
self.pingger.rest.request.return_value.status_code = 200
|
||||
self.pingger.rest.request.return_value.text = json % (
|
||||
my_id, self.pingger.uuid)
|
||||
self.validate_test(not self.pingger._read_response() == 2)
|
||||
|
||||
def test_read_response_unhappy_wrong_res_code(self):
|
||||
self.pingger.rest.request.return_value.status_code = 204
|
||||
self.pingger.rest.request.return_value.text = self.pingger.uuid
|
||||
self.validate_test(not self.pingger._read_response())
|
||||
|
||||
def test_read_response_unhappy_wrong_body(self):
|
||||
self.pingger.rest.request.return_value.status_code = 200
|
||||
self.pingger.rest.request.return_value.text = ""
|
||||
self.validate_test(not self.pingger._read_response())
|
||||
|
||||
def test_read_response_unhappy_wrong_both(self):
|
||||
self.pingger.rest.request.return_value.status_code = 204
|
||||
self.pingger.rest.request.return_value.text = ""
|
||||
self.validate_test(not self.pingger._read_response())
|
Loading…
Reference in New Issue
Block a user