Fixing the standard things when making code py27/p35 compatible. Also, removing the logging of the passed value of an HTTP header. If the value could not be encoded to log, then there are Tracebacks that showed up with Python 3.5. Since the value can be passed by a user, it should either be scrubbed before logging or not logged, to prevent possible content injection in the log stream. Change-Id: I8df1553acb6c7e5f75a1b50f024dc032ca982a93
254 lines
9.0 KiB
Python
254 lines
9.0 KiB
Python
# Copyright (c) 2014 Rackspace, Inc.
|
|
#
|
|
# 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.
|
|
from testtools import testcase
|
|
|
|
from barbican.tests import utils
|
|
from functionaltests.api import base
|
|
from functionaltests.api.v1.behaviors import container_behaviors
|
|
from functionaltests.api.v1.behaviors import secret_behaviors
|
|
from functionaltests.api.v1.models import container_models
|
|
from functionaltests.api.v1.models import secret_models
|
|
|
|
create_secret_defaults_data = {
|
|
"name": "AES key",
|
|
"expiration": "2018-02-28T19:14:44.180394",
|
|
"algorithm": "aes",
|
|
"bit_length": 256,
|
|
"mode": "cbc",
|
|
"payload": b"gF6+lLoF3ohA9aPRpt+6bQ==",
|
|
"payload_content_type": "application/octet-stream",
|
|
"payload_content_encoding": "base64",
|
|
}
|
|
|
|
create_container_defaults_data = {
|
|
"name": "containername",
|
|
"type": "generic",
|
|
"secret_refs": [
|
|
{
|
|
"name": "secret1",
|
|
},
|
|
{
|
|
"name": "secret2",
|
|
},
|
|
{
|
|
"name": "secret3"
|
|
}
|
|
]
|
|
}
|
|
|
|
create_container_rsa_data = {
|
|
"name": "rsacontainer",
|
|
"type": "rsa",
|
|
"secret_refs": [
|
|
{
|
|
"name": "public_key",
|
|
},
|
|
{
|
|
"name": "private_key",
|
|
},
|
|
{
|
|
"name": "private_key_passphrase"
|
|
}
|
|
]
|
|
}
|
|
|
|
create_container_empty_data = {
|
|
"name": None,
|
|
"type": "generic",
|
|
"secret_refs": []
|
|
}
|
|
|
|
|
|
@utils.parameterized_test_case
|
|
class ContainersTestCase(base.TestCase):
|
|
|
|
def setUp(self):
|
|
super(ContainersTestCase, self).setUp()
|
|
self.secret_behaviors = secret_behaviors.SecretBehaviors(self.client)
|
|
self.behaviors = container_behaviors.ContainerBehaviors(
|
|
self.client)
|
|
|
|
# Set up three secrets
|
|
secret_ref_1 = self._create_a_secret()
|
|
secret_ref_2 = self._create_a_secret()
|
|
secret_ref_3 = self._create_a_secret()
|
|
|
|
create_container_defaults_data[
|
|
'secret_refs'][0]['secret_ref'] = secret_ref_1
|
|
create_container_defaults_data[
|
|
'secret_refs'][1]['secret_ref'] = secret_ref_2
|
|
create_container_defaults_data[
|
|
'secret_refs'][2]['secret_ref'] = secret_ref_3
|
|
|
|
create_container_rsa_data[
|
|
'secret_refs'][0]['secret_ref'] = secret_ref_1
|
|
create_container_rsa_data[
|
|
'secret_refs'][1]['secret_ref'] = secret_ref_2
|
|
create_container_rsa_data[
|
|
'secret_refs'][2]['secret_ref'] = secret_ref_3
|
|
|
|
self.secret_id_1 = secret_ref_1.split('/')[-1]
|
|
self.secret_id_2 = secret_ref_2.split('/')[-1]
|
|
self.secret_id_3 = secret_ref_3.split('/')[-1]
|
|
|
|
def tearDown(self):
|
|
self.secret_behaviors.delete_all_created_secrets()
|
|
self.behaviors.delete_all_created_containers()
|
|
super(ContainersTestCase, self).tearDown()
|
|
|
|
def _create_a_secret(self):
|
|
secret_model = secret_models.SecretModel(**create_secret_defaults_data)
|
|
resp, secret_ref = self.secret_behaviors.create_secret(secret_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertIsNotNone(secret_ref)
|
|
|
|
return secret_ref
|
|
|
|
def _get_a_secret(self, secret_id):
|
|
resp = self.client.get('secrets/{0}'.format(secret_id))
|
|
self.assertEqual(200, resp.status_code)
|
|
return resp.json()
|
|
|
|
@testcase.attr('positive')
|
|
def test_container_create_empty(self):
|
|
"""Covers creating an empty generic container."""
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_empty_data)
|
|
|
|
resp, container_ref = self.behaviors.create_container(
|
|
test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
@testcase.attr('positive')
|
|
def test_container_create_defaults(self):
|
|
"""Covers creating a container with three secret refs."""
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_defaults_data)
|
|
|
|
resp, container_ref = self.behaviors.create_container(test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
@testcase.attr('positive')
|
|
def test_container_create_rsa(self):
|
|
"""Create an RSA container with expected secret refs."""
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_rsa_data)
|
|
|
|
resp, container_ref = self.behaviors.create_container(test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
@utils.parameterized_dataset({
|
|
'alphanumeric': ['a2j3j6ll9'],
|
|
'punctuation': ['~!@#$%^&*()_+`-={}[]|:;<>,.?'],
|
|
'len_255': [base.TestCase.max_sized_field],
|
|
'uuid': ['54262d9d-4bc7-4821-8df0-dc2ca8e112bb'],
|
|
'empty': ['']
|
|
})
|
|
@testcase.attr('positive')
|
|
def test_container_get_defaults_w_valid_name(self, name):
|
|
"""Covers getting a generic container with a three secrets."""
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_defaults_data)
|
|
overrides = {'name': name}
|
|
test_model.override_values(**overrides)
|
|
|
|
secret_refs = []
|
|
for secret_ref in test_model.secret_refs:
|
|
secret_refs.append(secret_ref['secret_ref'])
|
|
|
|
resp, container_ref = self.behaviors.create_container(test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
get_resp = self.behaviors.get_container(container_ref)
|
|
|
|
# Verify the response data
|
|
self.assertEqual(200, get_resp.status_code)
|
|
self.assertEqual(test_model.name, get_resp.model.name)
|
|
self.assertEqual(container_ref, get_resp.model.container_ref)
|
|
self.assertEqual(test_model.type, get_resp.model.type)
|
|
|
|
# Verify the secret refs in the response
|
|
self.assertEqual(3, len(get_resp.model.secret_refs))
|
|
self.assertIn(get_resp.model.secret_refs[0].secret_ref, secret_refs)
|
|
self.assertIn(get_resp.model.secret_refs[1].secret_ref, secret_refs)
|
|
self.assertIn(get_resp.model.secret_refs[2].secret_ref, secret_refs)
|
|
|
|
@testcase.attr('positive')
|
|
def test_container_get_rsa(self):
|
|
"""Covers getting an rsa container."""
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_rsa_data)
|
|
secret_refs = []
|
|
for secret_ref in test_model.secret_refs:
|
|
secret_refs.append(secret_ref['secret_ref'])
|
|
|
|
resp, container_ref = self.behaviors.create_container(test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
get_resp = self.behaviors.get_container(
|
|
container_ref)
|
|
|
|
# Verify the response data
|
|
self.assertEqual(200, get_resp.status_code)
|
|
self.assertEqual("rsacontainer", get_resp.model.name)
|
|
self.assertEqual(container_ref, get_resp.model.container_ref)
|
|
self.assertEqual("rsa", get_resp.model.type)
|
|
|
|
# Verify the secret refs in the response
|
|
self.assertEqual(3, len(get_resp.model.secret_refs))
|
|
self.assertIn(get_resp.model.secret_refs[0].secret_ref, secret_refs)
|
|
self.assertIn(get_resp.model.secret_refs[1].secret_ref, secret_refs)
|
|
self.assertIn(get_resp.model.secret_refs[2].secret_ref, secret_refs)
|
|
|
|
@testcase.attr('positive')
|
|
def test_containers_get_defaults(self):
|
|
"""Covers getting a list of containers."""
|
|
limit = 10
|
|
offset = 0
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_defaults_data)
|
|
for i in range(11):
|
|
resp, container_ref = self.behaviors.create_container(test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
resp, containers, next_ref, prev_ref = self.behaviors.get_containers(
|
|
limit=limit,
|
|
offset=offset
|
|
)
|
|
|
|
self.assertEqual(200, resp.status_code)
|
|
self.assertEqual(limit, len(containers))
|
|
self.assertIsNone(prev_ref)
|
|
self.assertIsNotNone(next_ref)
|
|
|
|
def test_container_delete_defaults(self):
|
|
"""Covers deleting a container."""
|
|
test_model = container_models.ContainerModel(
|
|
**create_container_defaults_data)
|
|
|
|
resp, container_ref = self.behaviors.create_container(test_model)
|
|
self.assertEqual(201, resp.status_code)
|
|
self.assertGreater(len(container_ref), 0)
|
|
|
|
del_resp = self.behaviors.delete_container(container_ref)
|
|
self.assertEqual(204, del_resp.status_code)
|
|
self.assertEqual(0, len(del_resp.content))
|