Merge "Added support for TOSCA policies in Heat translator"
This commit is contained in:
commit
47b0ec8b91
|
@ -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)
|
|
@ -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}}
|
|
@ -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 = []
|
||||
|
|
|
@ -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: {}
|
|
@ -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 application’s servers
|
||||
targets: [ my_server ]
|
Loading…
Reference in New Issue