Simplify integration tests configuration
- Make it more OpenStack-aligned
This commit is contained in:
parent
15710f6cd4
commit
207bc86f3e
68
README.md
68
README.md
@ -190,66 +190,20 @@ Testing: Integration
|
|||||||
Integration tests are dependent on following env variables:
|
Integration tests are dependent on following env variables:
|
||||||
|
|
||||||
* TEST_DB_URI - similar to functional tests, database endpoint
|
* TEST_DB_URI - similar to functional tests, database endpoint
|
||||||
* FUNCTIONS_HOST - IronFunctions API host
|
* FUNCTIONS_API_URL - IronFunctions API URL (default value - `http://localhost:8080/v1`)
|
||||||
* FUNCTIONS_PORT - IronFunctions API port
|
|
||||||
* FUNCTIONS_API_PROTO - IronFunctions API protocol
|
|
||||||
* FUNCTIONS_API_VERSION - IronFunctions API version
|
|
||||||
* OS_AUTH_URL - OpenStack Identity endpoint
|
* OS_AUTH_URL - OpenStack Identity endpoint
|
||||||
* OS_PROJECT_ID - OpenStack user-specific project ID
|
* OS_PROJECT_NAME - OpenStack user-specific project name
|
||||||
* OS_TOKEN - OpenStack user project-bound auth token
|
* OS_USERNAME - OpenStack user name
|
||||||
|
* OS_PASSWORD - OpenStack user user password
|
||||||
How to get token? - Set env variables:
|
|
||||||
|
|
||||||
* OS_USERNAME
|
|
||||||
* OS_PASSWORD
|
|
||||||
* OS_PROJECT_NAME
|
|
||||||
|
|
||||||
and run following command:
|
|
||||||
|
|
||||||
echo -e "{
|
|
||||||
\"auth\": {
|
|
||||||
\"identity\": {
|
|
||||||
\"methods\": [\"password\"],
|
|
||||||
\"password\": {
|
|
||||||
\"user\": {
|
|
||||||
\"name\": \"${OS_USERNAME:-admin}\",
|
|
||||||
\"domain\": { \"id\": \"${OS_DOMAIN:-default}\" },
|
|
||||||
\"password\": \"${OS_PASSWORD:-root}\"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
\"scope\": {
|
|
||||||
\"project\": {
|
|
||||||
\"name\": \"${OS_PROJECT_NAME:-admin}\",
|
|
||||||
\"domain\": {\"id\": \"${OS_DOMAIN:-default}\" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}" >> token_request.json
|
|
||||||
|
|
||||||
After that:
|
|
||||||
|
|
||||||
export OS_TOKEN=`curl -si -d @token_request.json -H "Content-type: application/json" ${OS_AUTH_URL}/auth/tokens | awk '/X-Subject-Token/ {print $2}'`
|
|
||||||
|
|
||||||
If variable remains empty, please check your authentication parameters specified in `token_request.json`.
|
|
||||||
|
|
||||||
How to get project ID? - Use following command
|
|
||||||
|
|
||||||
export RAW_PrID=`curl -si -d @token_request.json -H "Content-type: application/json" ${OS_AUTH_URL}/auth/tokens | grep Default | awk '{print $20}'`
|
|
||||||
export OS_PROJECT_ID=${RAW_PrID:1:-2}
|
|
||||||
|
|
||||||
If variable remains empty, please check your authentication parameters specified in `token_request.json`.
|
|
||||||
|
|
||||||
To run tests use following command:
|
To run tests use following command:
|
||||||
|
|
||||||
export TEST_DB_URI=mysql://<your-user>:<your-user-password>@<mysql-host>:<mysql-port>/<functions-db>
|
export TEST_DB_URI=mysql://<your-user>:<your-user-password>@<mysql-host>:<mysql-port>/<functions-db>
|
||||||
export FUNCTIONS_HOST=<functions-host>
|
export FUNCTIONS_API_URL=<functions-api-protocol>://<functions-host>:<functions-port>/<functions-api-version>
|
||||||
export FUNCTIONS_PORT=<functions-port>
|
export OS_AUTH_URL=<identity-api-protocol>://<identity-host>:<identity-port>/<identity-api-version>
|
||||||
export FUNCTIONS_API_PROTO=<functions-api-protocol>
|
export OS_PROJECT_NAME=<project-name>
|
||||||
export FUNCTIONS_API_VERSION=<functions-api-version>
|
export OS_USERNAME=<project-name>
|
||||||
export OS_AUTH_URL=<openstack-idenitity-url>
|
export OS_PASSWORD=<project-name>
|
||||||
export OS_PROJECT_ID=<project-id>
|
|
||||||
export OS_TOKEN=<project-bound-auth-token>
|
|
||||||
tox -epy35-integration
|
tox -epy35-integration
|
||||||
|
|
||||||
Testing: Coverage regression
|
Testing: Coverage regression
|
||||||
@ -271,10 +225,6 @@ IronFunctions:
|
|||||||
* https://github.com/iron-io/functions/issues/275
|
* https://github.com/iron-io/functions/issues/275
|
||||||
* https://github.com/iron-io/functions/issues/274
|
* https://github.com/iron-io/functions/issues/274
|
||||||
|
|
||||||
aiohttp_swagger:
|
|
||||||
|
|
||||||
* https://github.com/cr0hn/aiohttp-swagger/issues/12 ([fix proposed](https://github.com/cr0hn/aiohttp-swagger/pull/13))
|
|
||||||
|
|
||||||
TODOs
|
TODOs
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
@ -21,35 +23,75 @@ from laos.service import laos_api
|
|||||||
from laos.tests.common import base
|
from laos.tests.common import base
|
||||||
from laos.tests.common import client
|
from laos.tests.common import client
|
||||||
|
|
||||||
|
from urllib import parse
|
||||||
|
|
||||||
|
|
||||||
class LaosIntegrationTestsBase(base.LaosTestsBase, testtools.TestCase):
|
class LaosIntegrationTestsBase(base.LaosTestsBase, testtools.TestCase):
|
||||||
|
|
||||||
|
async def authenticate(self, os_user, os_pass, os_project, url):
|
||||||
|
auth_request_data = {
|
||||||
|
"auth": {
|
||||||
|
"identity": {
|
||||||
|
"methods": ["password"],
|
||||||
|
"password": {
|
||||||
|
"user": {
|
||||||
|
"name": os_user,
|
||||||
|
"domain": {"id": "default"},
|
||||||
|
"password": os_pass
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": {
|
||||||
|
"project": {
|
||||||
|
"name": os_project,
|
||||||
|
"domain": {"id": "default"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
with aiohttp.ClientSession(loop=self.testloop) as session:
|
||||||
|
response = await session.post(
|
||||||
|
"{}/auth/tokens".format(url),
|
||||||
|
data=json.dumps(auth_request_data),
|
||||||
|
headers={
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
timeout=20)
|
||||||
|
response.raise_for_status()
|
||||||
|
result = await response.json()
|
||||||
|
return (response.headers["X-Subject-Token"],
|
||||||
|
result["token"]["project"]["id"])
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
||||||
self.testloop, logger = self.get_loop_and_logger("integration")
|
self.testloop, logger = self.get_loop_and_logger("integration")
|
||||||
|
|
||||||
(functions_host, functions_port,
|
(functions_url, db_uri,
|
||||||
functions_api_protocol,
|
os_auth_url, os_user, os_pass, os_project) = (
|
||||||
functions_api_version, db_uri,
|
os.getenv("FUNCTIONS_API_URL", "http://localhost:8080/v1"),
|
||||||
keystone_endpoint, project_id, os_token) = (
|
os.getenv("TEST_DB_URI"),
|
||||||
os.getenv("FUNCTIONS_HOST"), os.getenv("FUNCTIONS_PORT", 8080),
|
os.getenv("OS_AUTH_URL"),
|
||||||
os.getenv("FUNCTIONS_API_PROTO", "http"),
|
os.getenv("OS_USERNAME"),
|
||||||
os.getenv("FUNCTIONS_API_VERSION", "v1"), os.getenv("TEST_DB_URI"),
|
os.getenv("OS_PASSWORD"),
|
||||||
os.getenv("OS_AUTH_URL"), os.getenv("OS_PROJECT_ID"),
|
os.getenv("OS_PROJECT_NAME"),
|
||||||
os.getenv("OS_TOKEN"),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not all([db_uri, os_auth_url, os_user, os_pass, os_project]):
|
||||||
|
raise self.skipTest("Not all test env variables were set.")
|
||||||
|
|
||||||
|
parts = parse.urlparse(functions_url)
|
||||||
|
|
||||||
fnclient = config.FunctionsClient(
|
fnclient = config.FunctionsClient(
|
||||||
functions_host,
|
parts.hostname,
|
||||||
api_port=functions_port,
|
api_port=parts.port,
|
||||||
api_protocol=functions_api_protocol,
|
api_protocol=parts.scheme,
|
||||||
api_version=functions_api_version,
|
api_version=parts.path[1:]
|
||||||
)
|
)
|
||||||
self.testloop.run_until_complete(fnclient.ping(loop=self.testloop))
|
self.testloop.run_until_complete(fnclient.ping(loop=self.testloop))
|
||||||
connection_pool = config.Connection(db_uri, loop=self.testloop)
|
connection_pool = config.Connection(db_uri, loop=self.testloop)
|
||||||
|
|
||||||
config.Config(
|
config.Config(
|
||||||
auth_url=keystone_endpoint,
|
auth_url=os_auth_url,
|
||||||
functions_client=fnclient,
|
functions_client=fnclient,
|
||||||
logger=logger,
|
logger=logger,
|
||||||
connection=connection_pool,
|
connection=connection_pool,
|
||||||
@ -59,6 +101,11 @@ class LaosIntegrationTestsBase(base.LaosTestsBase, testtools.TestCase):
|
|||||||
self.test_app = laos_api.API(
|
self.test_app = laos_api.API(
|
||||||
loop=self.testloop, logger=logger, debug=True)
|
loop=self.testloop, logger=logger, debug=True)
|
||||||
|
|
||||||
|
os_token, project_id = self.testloop.run_until_complete(
|
||||||
|
self.authenticate(
|
||||||
|
os_user, os_pass,
|
||||||
|
os_project, os_auth_url))
|
||||||
|
|
||||||
self.test_client = client.ProjectBoundLaosTestClient(
|
self.test_client = client.ProjectBoundLaosTestClient(
|
||||||
self.test_app.root, project_id, headers={
|
self.test_app.root, project_id, headers={
|
||||||
"X-Auth-Token": os_token
|
"X-Auth-Token": os_token
|
||||||
|
10
tox.ini
10
tox.ini
@ -9,13 +9,11 @@ skipsdist = True
|
|||||||
passenv =
|
passenv =
|
||||||
PYTHONASYNCIODEBUG
|
PYTHONASYNCIODEBUG
|
||||||
TEST_DB_URI
|
TEST_DB_URI
|
||||||
FUNCTIONS_HOST
|
FUNCTIONS_API_URL
|
||||||
FUNCTIONS_PORT
|
|
||||||
FUNCTIONS_API_PROTO
|
|
||||||
FUNCTIONS_API_VERSION
|
|
||||||
OS_AUTH_URL
|
OS_AUTH_URL
|
||||||
OS_PROJECT_ID
|
OS_PASSWORD
|
||||||
OS_TOKEN
|
OS_USERNAME
|
||||||
|
OS_PROJECT_NAME
|
||||||
setenv = VIRTUAL_ENV={envdir}
|
setenv = VIRTUAL_ENV={envdir}
|
||||||
usedevelop = True
|
usedevelop = True
|
||||||
install_command = pip install -U {opts} {packages}
|
install_command = pip install -U {opts} {packages}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user