Merge "Add relative_path metadata to a stored file"

This commit is contained in:
Jenkins 2015-03-23 08:07:08 +00:00 committed by Gerrit Code Review
commit b5a4dc37be
8 changed files with 56 additions and 11 deletions

View File

@ -0,0 +1,24 @@
# 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 oslo.db.sqlalchemy import utils
from sqlalchemy import Column, String
def upgrade(migrate_engine):
stored_file = utils.get_table(migrate_engine, 'stored_file')
relative_path = Column('relative_path', String(256), nullable=True)
stored_file.create_column(relative_path)
def downgrade(migrate_engine):
raise NotImplementedError('Downgrade is unsupported.')

View File

@ -234,5 +234,8 @@ class StoredFile(Base):
#: Names provide a short human readable description of a file.
name = Column(String(length=64), nullable=True)
#: Relative path to which the file belongs
relative_path = Column(String(length=256), nullable=True)
#: Versions are an automatic incrementing count.
version = Column(Integer(), nullable=True)

View File

@ -13,7 +13,8 @@
class Role(object):
def __init__(self, uuid, name, version, description, template):
def __init__(self, uuid, name, version, description, template,
relative_path=None):
super(Role, self).__init__()
self.uuid = uuid
@ -21,6 +22,7 @@ class Role(object):
self.version = version
self.description = description
self.template = template
self.relative_path = relative_path
class DeploymentPlan(object):

View File

@ -20,6 +20,8 @@ such as:
resource
"""
import os
def generate_role_namespace(role_name, role_version):
"""Creates a unique namespace for the given role name and version.
@ -44,16 +46,22 @@ def parse_role_namespace(role_namespace):
return role_namespace.rsplit('-', 1)
def role_template_filename(role_name, role_version):
def role_template_filename(role_name, role_version, role_relative_path):
"""Generates the filename a role's template should be stored in when
creating the deployment plan's Heat files.
:type role_name: str
:type role_version: str
:type role_relative_path: str or None
:rtype: str
"""
namespace = generate_role_namespace(role_name, role_version)
return 'provider-%s.yaml' % namespace
filename = 'provider-%s.yaml' % namespace
if role_relative_path:
filename = os.path.join(role_relative_path, filename)
return filename
def master_template_filename(plan_name):

View File

@ -151,8 +151,9 @@ class PlansManager(object):
# Use the combination logic to perform the addition.
role_namespace = name_utils.generate_role_namespace(db_role.name,
db_role.version)
template_filename = name_utils.role_template_filename(db_role.name,
db_role.version)
template_filename = (
name_utils.role_template_filename(db_role.name, db_role.version,
db_role.relative_path))
deployment_plan.add_template(role_namespace, role_template,
template_filename,
override_properties=special_properties)
@ -375,7 +376,8 @@ class PlansManager(object):
for role in plan_roles:
contents = composer.compose_template(role.template)
filename = name_utils.role_template_filename(role.name,
role.version)
role.version,
role.relative_path)
files_dict[filename] = contents
def _add_template_extra_data_for(templates, template_store):
@ -423,7 +425,8 @@ class PlansManager(object):
# Convert to the Tuskar domain model.
tuskar_role = models.Role(db_role.uuid, name, version,
role.description, role)
role.description, role,
relative_path=db_role.relative_path)
return tuskar_role
reg_mapping = self.registry_mapping_store.list()

View File

@ -21,7 +21,7 @@ class StoredFile(object):
"""
def __init__(self, uuid, contents, store, name=None, created_at=None,
updated_at=None, version=None):
updated_at=None, version=None, relative_path=None):
"""The constructor requires uuid, contents and store which are the
common attributes in all drivers.
@ -56,6 +56,7 @@ class StoredFile(object):
self.created_at = created_at
self.updated_at = updated_at
self.version = version
self.relative_path = relative_path
def __eq__(self, other):
return (isinstance(other, self.__class__)

View File

@ -32,9 +32,13 @@ class NameUtilsTestCases(unittest.TestCase):
self.assertEqual('v1', version)
def test_role_template_filename(self):
filename = name_utils.role_template_filename('r1', 'v1')
filename = name_utils.role_template_filename('r1', 'v1', None)
self.assertEqual('provider-r1-v1.yaml', filename)
def test_role_template_filename_with_relative_path(self):
filename = name_utils.role_template_filename('r1', 'v1', 'l1')
self.assertEqual('l1/provider-r1-v1.yaml', filename)
def test_master_template_filename(self):
filename = name_utils.master_template_filename('p1')
self.assertEqual('p1-template.yaml', filename)

View File

@ -395,7 +395,7 @@ class PlansManagerTestCase(TestCase):
parsed_env = parser.parse_environment(templates['environment.yaml'])
self.assertEqual(1, len(parsed_env.registry_entries))
role_filename = name_utils.role_template_filename('r1', '1')
role_filename = name_utils.role_template_filename('r1', '1', None)
self.assertTrue(role_filename in templates)
parsed_role = parser.parse_template(templates[role_filename])
self.assertEqual(parsed_role.description, 'Test provider resource foo')
@ -428,7 +428,7 @@ class PlansManagerTestCase(TestCase):
parsed_env = parser.parse_environment(templates['environment.yaml'])
self.assertEqual(2, len(parsed_env.registry_entries))
role_filename = name_utils.role_template_filename('r1', '1')
role_filename = name_utils.role_template_filename('r1', '1', None)
self.assertTrue(role_filename in templates)
parsed_role = parser.parse_template(templates[role_filename])
self.assertEqual(parsed_role.description, 'Test provider resource foo')