Support reservation policy in heat-translator
Implementation of reservation policy in heat-translator Tacker Blueprint: https://blueprints.launchpad.net/tacker/+spec/reservation-vnfm Tacker Spec: https://review.openstack.org/#/c/561840/ Depends-On: Ic5d790df938b40d75bc50252e1e688e9c09eb568 Change-Id: I2b989a49ac3447995a82ddb7193bf478bb847b73
This commit is contained in:
parent
c1c09eef75
commit
30f4d2ff83
@ -75,7 +75,7 @@ stevedore==1.20.0
|
||||
testrepository==0.0.18
|
||||
testscenarios==0.4
|
||||
testtools==2.2.0
|
||||
tosca-parser==1.0.0
|
||||
tosca-parser==1.4.0
|
||||
traceback2==1.4.0
|
||||
unittest2==1.1.0
|
||||
warlock==1.2.0
|
||||
|
@ -7,7 +7,7 @@ cliff!=2.9.0,>=2.8.0 # Apache-2.0
|
||||
PyYAML>=3.12 # MIT
|
||||
python-dateutil>=2.5.3 # BSD
|
||||
six>=1.10.0 # MIT
|
||||
tosca-parser>=1.0.0 # Apache-2.0
|
||||
tosca-parser>=1.4.0 # Apache-2.0
|
||||
keystoneauth1>=3.4.0 # Apache-2.0
|
||||
python-novaclient>=9.1.0 # Apache-2.0
|
||||
python-heatclient>=1.10.0 # Apache-2.0
|
||||
|
@ -30,7 +30,8 @@ SECTIONS = (TYPE, PROPERTIES, MEDADATA, DEPENDS_ON, UPDATE_POLICY,
|
||||
policy_type = ['tosca.policies.Placement',
|
||||
'tosca.policies.Scaling',
|
||||
'tosca.policies.Scaling.Cluster',
|
||||
'tosca.policies.Monitoring']
|
||||
'tosca.policies.Monitoring',
|
||||
'tosca.policies.Reservation']
|
||||
log = logging.getLogger('heat-translator')
|
||||
|
||||
|
||||
|
64
translator/hot/tosca/tosca_policies_reservation.py
Normal file
64
translator/hot/tosca/tosca_policies_reservation.py
Normal file
@ -0,0 +1,64 @@
|
||||
# Copyright (C) 2018 NTT DATA
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# 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.
|
||||
|
||||
import logging
|
||||
from translator.hot.syntax.hot_resource import HotResource
|
||||
|
||||
# Name used to dynamically load appropriate map class.
|
||||
TARGET_CLASS_NAME = 'ToscaReservation'
|
||||
|
||||
log = logging.getLogger('heat-translator')
|
||||
|
||||
|
||||
class ToscaReservation(HotResource):
|
||||
'''Translate TOSCA node type tosca.policies.Reservation'''
|
||||
|
||||
toscatype = 'tosca.policies.Reservation'
|
||||
|
||||
def __init__(self, policy, csar_dir=None):
|
||||
hot_type = "OS::Aodh::EventAlarm"
|
||||
super(ToscaReservation, self).__init__(policy,
|
||||
type=hot_type,
|
||||
csar_dir=csar_dir)
|
||||
self.policy = policy
|
||||
self.filter = list()
|
||||
|
||||
def handle_expansion(self):
|
||||
extra_resources = list()
|
||||
hot_type = 'OS::Aodh::EventAlarm'
|
||||
for action_name in self.filter:
|
||||
prop = self._get_event_type(action_name)
|
||||
resrv_resources = HotResource(self.nodetemplate,
|
||||
type=hot_type,
|
||||
name=action_name,
|
||||
properties=prop)
|
||||
extra_resources.append(resrv_resources)
|
||||
return extra_resources
|
||||
|
||||
def handle_properties(self):
|
||||
if self.policy.entity_tpl.get('reservation'):
|
||||
reservation_prop = self.policy.entity_tpl["reservation"].items()
|
||||
for action_name, action_dict in reservation_prop:
|
||||
if action_name != 'properties':
|
||||
self.filter.append(action_name)
|
||||
self.name = self.filter[0]
|
||||
|
||||
def _get_event_type(self, action):
|
||||
if action == 'start_actions':
|
||||
return {'event_type': 'lease.event.start_lease'}
|
||||
if action == 'before_end_actions':
|
||||
return {'event_type': 'lease.event.before_end_lease'}
|
||||
if action == 'end_actions':
|
||||
return {'event_type': 'lease.event.end_lease'}
|
@ -25,7 +25,8 @@ ALARM_STATISTIC = {'mean': 'mean', 'median': 'median', 'summary': 'sum',
|
||||
'maximum': 'max', 'minimum': 'min', 'last': 'last',
|
||||
'std': 'std', 'first': 'first', 'count': 'count'}
|
||||
SCALING_RESOURCES = ["OS::Heat::ScalingPolicy", "OS::Heat::AutoScalingGroup",
|
||||
"OS::Aodh::GnocchiAggregationByResourcesAlarm"]
|
||||
"OS::Aodh::GnocchiAggregationByResourcesAlarm",
|
||||
"OS::Aodh::EventAlarm"]
|
||||
|
||||
|
||||
class ToscaAutoscaling(HotResource):
|
||||
|
@ -276,6 +276,9 @@ class TranslateNodeTemplates(object):
|
||||
if policy.is_derived_from('tosca.policies.Placement'):
|
||||
TOSCA_TO_HOT_TYPE[policy_type.type] = \
|
||||
TOSCA_TO_HOT_TYPE['tosca.policies.Placement']
|
||||
if policy.is_derived_from('tosca.policies.Reservation'):
|
||||
TOSCA_TO_HOT_TYPE[policy_type.type] = \
|
||||
TOSCA_TO_HOT_TYPE['tosca.policies.Reservation']
|
||||
if policy_type.type not in TOSCA_TO_HOT_TYPE:
|
||||
raise UnsupportedTypeError(type=_('%s') % policy_type.type)
|
||||
elif policy_type.type == 'tosca.policies.Scaling.Cluster':
|
||||
|
23
translator/tests/data/hot_output/reservation/SP_RSV_res.yaml
Normal file
23
translator/tests/data/hot_output/reservation/SP_RSV_res.yaml
Normal file
@ -0,0 +1,23 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: Tacker Scaling template
|
||||
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
image: cirros-0.4.0-x86_64-disk
|
||||
flavor:
|
||||
get_param: flavor
|
||||
networks:
|
||||
- port: { get_resource: CP1 }
|
||||
config_drive: false
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
management: true
|
||||
network: net_mgmt
|
||||
VL1:
|
||||
type: OS::Neutron::Net
|
@ -0,0 +1,44 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
VNF TOSCA template with reservation_id input parameters.
|
||||
|
||||
parameters:
|
||||
flavor: {type: string, description: Flavor Information}
|
||||
lease_id: {type: string, description: lease id}
|
||||
resources:
|
||||
start_actions:
|
||||
type: OS::Aodh::EventAlarm
|
||||
properties:
|
||||
event_type: lease.event.start_lease
|
||||
SP_RSV_scale_out:
|
||||
type: OS::Heat::ScalingPolicy
|
||||
properties:
|
||||
auto_scaling_group_id: {get_resource: SP_RSV_group}
|
||||
adjustment_type: change_in_capacity
|
||||
scaling_adjustment: 2
|
||||
cooldown: 120
|
||||
SP_RSV_group:
|
||||
type: OS::Heat::AutoScalingGroup
|
||||
properties:
|
||||
min_size: 0
|
||||
desired_capacity: 0
|
||||
cooldown: 120
|
||||
resource: {type: SP_RSV_res.yaml}
|
||||
max_size: 3
|
||||
SP_RSV_scale_in:
|
||||
type: OS::Heat::ScalingPolicy
|
||||
properties:
|
||||
auto_scaling_group_id: {get_resource: SP_RSV_group}
|
||||
adjustment_type: change_in_capacity
|
||||
scaling_adjustment: -2
|
||||
cooldown: 120
|
||||
before_end_actions:
|
||||
type: OS::Aodh::EventAlarm
|
||||
properties:
|
||||
event_type: lease.event.before_end_lease
|
||||
end_actions:
|
||||
type: OS::Aodh::EventAlarm
|
||||
properties:
|
||||
event_type: lease.event.end_lease
|
||||
outputs: {}
|
@ -198,3 +198,26 @@ policy_types:
|
||||
required: false
|
||||
default: 120
|
||||
description: Wait time (in seconds) between consecutive scaling operations. During the cooldown period...
|
||||
|
||||
tosca.policies.tacker.Reservation:
|
||||
derived_from: tosca.policies.Reservation
|
||||
reservation:
|
||||
start_actions:
|
||||
type: list
|
||||
entry_schema:
|
||||
type: string
|
||||
required: True
|
||||
before_end_actions:
|
||||
type: list
|
||||
entry_schema:
|
||||
type: string
|
||||
required: True
|
||||
end_actions:
|
||||
type: list
|
||||
entry_schema:
|
||||
type: string
|
||||
required: True
|
||||
properties:
|
||||
lease_id:
|
||||
type: string
|
||||
required: True
|
||||
|
@ -0,0 +1,60 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
|
||||
|
||||
description: VNF TOSCA template with reservation_id input parameters.
|
||||
|
||||
imports:
|
||||
- translator/tests/data/nfv/tacker_defs.yaml
|
||||
- translator/tests/data/nfv/tacker_nfv_defs.yaml
|
||||
|
||||
topology_template:
|
||||
inputs:
|
||||
flavor:
|
||||
type: string
|
||||
description: Flavor Information
|
||||
|
||||
lease_id:
|
||||
type: string
|
||||
description: lease id
|
||||
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.nfv.VDU.Tacker
|
||||
properties:
|
||||
image: cirros-0.4.0-x86_64-disk
|
||||
flavor: { get_input: flavor }
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.nfv.CP.Tacker
|
||||
properties:
|
||||
management: true
|
||||
order: 0
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
VL1:
|
||||
type: tosca.nodes.nfv.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Tacker
|
||||
|
||||
policies:
|
||||
- RSV:
|
||||
type: tosca.policies.tacker.Reservation
|
||||
reservation:
|
||||
start_actions: [SP_RSV]
|
||||
before_end_actions: [SP_RSV]
|
||||
end_actions: [noop]
|
||||
properties:
|
||||
lease_id: { get_input: lease_id }
|
||||
- SP_RSV:
|
||||
type: tosca.policies.tacker.Scaling
|
||||
properties:
|
||||
increment: 2
|
||||
cooldown: 120
|
||||
min_instances: 0
|
||||
max_instances: 3
|
||||
default_instances: 0
|
||||
targets: [VDU1]
|
@ -601,3 +601,12 @@ class ToscaHotTranslationTest(TestCase):
|
||||
]
|
||||
params = {}
|
||||
self._test_successful_translation(tosca_file, hot_files, params)
|
||||
|
||||
def test_hot_translate_reservation_policy(self):
|
||||
tosca_file = '../tests/data/reservation/tosca-vnfd-reservation-id.yaml'
|
||||
hot_files = [
|
||||
'../tests/data/hot_output/reservation/'
|
||||
'hot_reservation_scaling.yaml',
|
||||
'../tests/data/hot_output/reservation/SP_RSV_res.yaml',
|
||||
]
|
||||
self._test_successful_translation(tosca_file, hot_files, params={})
|
||||
|
Loading…
Reference in New Issue
Block a user