python-tripleoclient/tripleoclient/tests/test_plugin.py
Juan Antonio Osorio Robles 24ac1f137c Use OS_CACERT for zaqar's websocket connection
The CA certificatge was hardcoded. This was not the right thing to do,
since we do have the ability to provide our own cert for TripleO.

python-openstackclient already has a way for us to know what certificate
was used. This is provided via the OS_CACERT environment variable (or
the --os-cacert command line argument). So we use this instead.

Change-Id: Ib7b3860378fce2cda7f80c1ad8b8dd14a4b22581
Closes-Bug: #1817634
2019-03-11 09:53:06 +02:00

141 lines
5.2 KiB
Python

# -*- coding: utf-8 -*-
# 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 mock
import socket
from tripleoclient import plugin
from tripleoclient.tests import base
from tripleoclient.tests import fakes
class TestPlugin(base.TestCase):
@mock.patch("websocket.create_connection")
def test_make_client(self, ws_create_connection):
clientmgr = mock.MagicMock()
clientmgr.get_endpoint_for_service_type.return_value = fakes.WS_URL
clientmgr.auth.get_token.return_value = "TOKEN"
clientmgr.auth_ref.project_id = "ID"
clientmgr.cacert = None
ws_create_connection.return_value.recv.return_value = json.dumps({
"headers": {
"status": 200
}
})
client = plugin.make_client(clientmgr)
websocket = client.messaging_websocket()
# The second access should not return the same client:
self.assertIsNot(client.messaging_websocket(), websocket)
plugin.make_client(clientmgr)
# And the functions should only be called when the client is created:
self.assertEqual(clientmgr.auth.get_token.call_count, 2)
self.assertEqual(clientmgr.get_endpoint_for_service_type.call_count, 2)
ws_create_connection.assert_called_with("ws://0.0.0.0")
@mock.patch.object(plugin.WebsocketClient, "recv")
@mock.patch("websocket.create_connection")
def test_handle_websocket_multiple(self, ws_create_connection, recv_mock):
send_ack = {
"headers": {
"status": 200
}
}
# Creating the websocket sends three messages and closing sends one.
# The one being tested is wrapped between these
recv_mock.side_effect = [send_ack, send_ack, send_ack, {
"body": {
"payload": {
"status": 200,
"message": "Result for IDID",
"execution_id": "IDID",
}
}
}, send_ack]
clientmgr = mock.MagicMock()
clientmgr.get_endpoint_for_service_type.return_value = fakes.WS_URL
clientmgr.auth.get_token.return_value = "TOKEN"
clientmgr.auth_ref.project_id = "ID"
clientmgr.cacert = None
client = plugin.make_client(clientmgr)
with client.messaging_websocket() as ws:
for payload in ws.wait_for_messages():
self.assertEqual(payload, {
"status": 200,
"message": "Result for IDID",
"execution_id": "IDID",
})
# We only want to test the first message, as there is only one.
# The last one, the send_ack will be used by the context
# manager when it is closed.
break
@mock.patch("websocket.create_connection")
def test_websocket_creation_error(self, ws_create_connection):
ws_create_connection.side_effect = socket.error
clientmgr = mock.MagicMock()
clientmgr.get_endpoint_for_service_type.return_value = fakes.WS_URL
clientmgr.auth.get_token.return_value = "TOKEN"
clientmgr.auth_ref.project_id = "ID"
clientmgr.cacert = None
client = plugin.make_client(clientmgr)
msg = ("Could not establish a connection to the Zaqar websocket. The "
"command was sent but the answer could not be read.")
with mock.patch('tripleoclient.plugin.LOG') as mock_log:
self.assertRaises(socket.error, client.messaging_websocket)
mock_log.error.assert_called_once_with(msg)
@mock.patch("websocket.create_connection")
def test_make_tls_client(self, ws_create_connection):
clientmgr = mock.MagicMock()
clientmgr.get_endpoint_for_service_type.return_value = fakes.WSS_URL
clientmgr.auth.get_token.return_value = "TOKEN"
clientmgr.auth_ref.project_id = "ID"
clientmgr.cacert = '/etc/pki/ca-trust/source/anchors/cm-local-ca.pem'
ws_create_connection.return_value.recv.return_value = json.dumps({
"headers": {
"status": 200
}
})
client = plugin.make_client(clientmgr)
websocket = client.messaging_websocket()
# The second access should not return the same client:
self.assertIsNot(client.messaging_websocket(), websocket)
plugin.make_client(clientmgr)
# And the functions should only be called when the client is created:
self.assertEqual(clientmgr.auth.get_token.call_count, 2)
self.assertEqual(clientmgr.get_endpoint_for_service_type.call_count, 2)
ws_create_connection.assert_called_with(
"wss://0.0.0.0",
sslopt={'ca_certs':
'/etc/pki/ca-trust/source/anchors/cm-local-ca.pem'})