Merge "Added support for TOSCA policies in Heat translator"

This commit is contained in:
Jenkins 2016-03-01 16:54:12 +00:00 committed by Gerrit Code Review
commit 47b0ec8b91
5 changed files with 182 additions and 1 deletions

View File

@ -0,0 +1,80 @@
# 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 toscaparser.nodetemplate import NodeTemplate
from toscaparser.policy import Policy
from toscaparser.tests.base import TestCase
import toscaparser.utils.yamlparser
from translator.hot.tosca.tosca_compute import ToscaCompute
from translator.hot.tosca.tosca_policies import ToscaPolicies
class ToscaPoicyTest(TestCase):
def _tosca_policy_test(self, tpl_snippet, expectedprops):
nodetemplates = (toscaparser.utils.yamlparser.
simple_parse(tpl_snippet)['node_templates'])
policies = (toscaparser.utils.yamlparser.
simple_parse(tpl_snippet)['policies'])
name = list(nodetemplates.keys())[0]
policy_name = list(policies[0].keys())[0]
for policy in policies:
tpl = policy[policy_name]
targets = tpl["targets"]
try:
nodetemplate = NodeTemplate(name, nodetemplates)
toscacompute = ToscaCompute(nodetemplate)
toscacompute.handle_properties()
policy = Policy(policy_name, tpl, targets,
"node_templates")
toscapolicy = ToscaPolicies(policy)
nodetemplate = [toscacompute]
toscapolicy.handle_properties(nodetemplate)
self.assertEqual(toscacompute.properties, expectedprops)
except Exception:
raise
def test_compute_with_policies(self):
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
capabilities:
host:
properties:
disk_size: 10 GB
num_cpus: 4
mem_size: 4 GB
os:
properties:
architecture: x86_64
type: Linux
distribution: Fedora
version: 18.0
policies:
- my_compute_placement_policy:
type: tosca.policies.Placement
description: Apply my placement policy to my application servers
targets: [ server ]
'''
expectedprops = {'flavor': 'm1.large',
'image': 'fedora-amd64-heat-config',
'scheduler_hints': {
'group': {
'get_resource':
'my_compute_placement_policy'}},
'user_data_format': 'SOFTWARE_CONFIG'}
self._tosca_policy_test(
tpl_snippet,
expectedprops)

View File

@ -0,0 +1,36 @@
#
# 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 translator.hot.syntax.hot_resource import HotResource
# Name used to dynamically load appropriate map class.
TARGET_CLASS_NAME = 'ToscaPolicies'
class ToscaPolicies(HotResource):
'''Translate TOSCA policy type tosca.poicies.Placement.'''
toscatype = 'tosca.policies.Placement'
def __init__(self, policy):
super(ToscaPolicies, self).__init__(policy,
type='OS::Nova::ServerGroup')
self.policy = policy
def handle_properties(self, resources):
self.properties["name"] = self.name
self.properties["policies"] = ["affinity"]
for resource in resources:
if resource.name in self.policy.targets:
resource.properties["scheduler_hints"] = {
"group": {"get_resource": self.name}}

View File

@ -145,6 +145,7 @@ class TranslateNodeTemplates(object):
# mapping between TOSCA nodetemplate and HOT resource
log.debug(_('Mapping between TOSCA nodetemplate and HOT resource.'))
self.hot_lookup = {}
self.policies = self.tosca.topology_template.policies
def translate(self):
return self._translate_nodetemplates()
@ -158,7 +159,10 @@ class TranslateNodeTemplates(object):
for depend_on in resource.depends_on_nodes:
self._recursive_handle_properties(depend_on)
resource.handle_properties()
if resource.type == "OS::Nova::ServerGroup":
resource.handle_properties(self.hot_resources)
else:
resource.handle_properties()
def _translate_nodetemplates(self):
@ -206,6 +210,11 @@ class TranslateNodeTemplates(object):
prop = Property(i.name, value, schema)
node._properties.append(prop)
for policy in self.policies:
policy_type = policy.type_definition
policy_node = TOSCA_TO_HOT_TYPE[policy_type.type](policy)
self.hot_resources.append(policy_node)
# Handle life cycle operations: this may expand each node
# into multiple HOT resources and may change their name
lifecycle_resources = []

View File

@ -0,0 +1,28 @@
heat_template_version: 2013-05-23
description: >
Template for deploying a single server with predefined properties.
parameters:
receiver_port:
type: string
description: Port to be used for receiving messages.
default: 1
resources:
my_server:
type: OS::Nova::Server
properties:
flavor: m1.medium
image: rhel-6.5-test-image
key_name: userkey
scheduler_hints:
group:
get_resource: my_compute_placement_policy
user_data_format: SOFTWARE_CONFIG
my_compute_placement_policy:
type: OS::Nova::ServerGroup
properties:
name: my_compute_placement_policy
policies:
- affinity
outputs: {}

View File

@ -0,0 +1,28 @@
tosca_definitions_version: tosca_simple_yaml_1_0
description: Template for deploying the nodes based on given policies.
topology_template:
node_templates:
my_server:
type: tosca.nodes.Compute
capabilities:
# Host container properties
host:
properties:
num_cpus: 2
disk_size: 10 GB
mem_size: 512 MB
# Guest Operating System properties
os:
properties:
# host Operating System image properties
architecture: x86_64
type: Linux
distribution: RHEL
version: 6.5
policies:
- my_compute_placement_policy:
type: tosca.policies.Placement
description: Apply my placement policy to my applications servers
targets: [ my_server ]